From 7daf389f1cbc477b266587411c00930763a8bda6 Mon Sep 17 00:00:00 2001 From: "gigi.mamaladze@autStand.com" Date: Tue, 8 Apr 2025 12:16:15 +0400 Subject: [PATCH] Created project --- .../script-python/AWS/build_url/code.py | 101 + .../script-python/AWS/build_url/resource.json | 16 + .../script-python/AWS/credentials/code.py | 43 + .../AWS/credentials/resource.json | 16 + .../script-python/AWS/wbsckt_abort/code.py | 19 + .../AWS/wbsckt_abort/resource.json | 16 + .../script-python/AWS/web_socket/code.py | 66 + .../AWS/web_socket/resource.json | 16 + .../script-python/AWS/web_socket_send/code.py | 21 + .../AWS/web_socket_send/resource.json | 16 + .../page-config/config.json | 119 + .../page-config/resource.json | 16 + .../session-permissions/data.bin | 9 + .../session-permissions/resource.json | 16 + .../session-props/props.json | 223 + .../session-props/resource.json | 16 + .../session-scripts/data.bin | 1 + .../session-scripts/resource.json | 16 + .../Alt-Colours/Critical/resource.json | 16 + .../Alt-Colours/Critical/style.json | 16 + .../Alt-Colours/Diagnostic/resource.json | 16 + .../Alt-Colours/Diagnostic/style.json | 16 + .../Alt-Colours/High/resource.json | 16 + .../Alarms-Styles/Alt-Colours/High/style.json | 15 + .../Alt-Colours/Low/resource.json | 16 + .../Alarms-Styles/Alt-Colours/Low/style.json | 15 + .../Alt-Colours/Medium/resource.json | 16 + .../Alt-Colours/Medium/style.json | 15 + .../Alarms-Styles/Critical/resource.json | 16 + .../Alarms-Styles/Critical/style.json | 16 + .../Alarms-Styles/Diagnostic/resource.json | 16 + .../Alarms-Styles/Diagnostic/style.json | 16 + .../Alarms-Styles/High/resource.json | 16 + .../Alarms-Styles/High/style.json | 15 + .../Alarms-Styles/Low/resource.json | 16 + .../Alarms-Styles/Low/style.json | 15 + .../Alarms-Styles/Medium/resource.json | 16 + .../Alarms-Styles/Medium/style.json | 15 + .../Alarms-Styles/NoAlarm-Black/resource.json | 16 + .../Alarms-Styles/NoAlarm-Black/style.json | 15 + .../Alarms-Styles/NoAlarm/resource.json | 16 + .../Alarms-Styles/NoAlarm/style.json | 15 + .../Alarms-Styles/Shelved/resource.json | 16 + .../Alarms-Styles/Shelved/style.json | 16 + .../Alerts/alertButton/resource.json | 16 + .../Alerts/alertButton/style.json | 38 + .../Alerts/alertButtonSecondary/resource.json | 16 + .../Alerts/alertButtonSecondary/style.json | 30 + .../Alerts/alertClose/resource.json | 16 + .../Alerts/alertClose/style.json | 16 + .../Alerts/alertMessage/resource.json | 16 + .../Alerts/alertMessage/style.json | 8 + .../Alerts/alertTitle/resource.json | 16 + .../Alerts/alertTitle/style.json | 9 + .../Alerts/states/error/resource.json | 16 + .../Alerts/states/error/style.json | 11 + .../Alerts/states/errorBtn1/resource.json | 16 + .../Alerts/states/errorBtn1/style.json | 25 + .../Alerts/states/errorBtn2/resource.json | 16 + .../Alerts/states/errorBtn2/style.json | 33 + .../Alerts/states/info/resource.json | 16 + .../Alerts/states/info/style.json | 11 + .../Alerts/states/infoBtn1/resource.json | 16 + .../Alerts/states/infoBtn1/style.json | 25 + .../Alerts/states/infoBtn2/resource.json | 16 + .../Alerts/states/infoBtn2/style.json | 33 + .../Alerts/states/success/resource.json | 16 + .../Alerts/states/success/style.json | 11 + .../Alerts/states/successBtn1/resource.json | 16 + .../Alerts/states/successBtn1/style.json | 25 + .../Alerts/states/successBtn2/resource.json | 16 + .../Alerts/states/successBtn2/style.json | 33 + .../Alerts/states/warning/resource.json | 16 + .../Alerts/states/warning/style.json | 11 + .../Alerts/states/warningBtn1/resource.json | 16 + .../Alerts/states/warningBtn1/style.json | 25 + .../Alerts/states/warningBtn2/resource.json | 16 + .../Alerts/states/warningBtn2/style.json | 33 + .../Controller/resource.json | 16 + .../Background-Styles/Controller/style.json | 8 + .../Grey-Background/resource.json | 16 + .../Grey-Background/style.json | 7 + .../Main-Background/resource.json | 16 + .../Main-Background/style.json | 7 + .../Buttons/Button-Menu/resource.json | 16 + .../Buttons/Button-Menu/style.json | 8 + .../Buttons/Clear-Background/resource.json | 16 + .../Buttons/Clear-Background/style.json | 7 + .../style-classes/Buttons/PB_1/resource.json | 16 + .../style-classes/Buttons/PB_1/style.json | 9 + .../DeviceManagerRows/resource.json | 16 + .../DeviceManagerRows/style.json | 12 + .../Device-Connected/resource.json | 16 + .../Disconnects/Device-Connected/style.json | 7 + .../Device-Disconnected/resource.json | 16 + .../Device-Disconnected/style.json | 9 + .../Dropdown/DropDownBox/resource.json | 16 + .../Dropdown/DropDownBox/style.json | 9 + .../EstopActivated/resource.json | 16 + .../EstopActivated/style.json | 8 + .../EstopActivated101/resource.json | 16 + .../EstopActivated101/style.json | 12 + .../EstopDeactivated/resource.json | 16 + .../EstopDeactivated/style.json | 8 + .../EstopDeactivated100/resource.json | 16 + .../EstopDeactivated100/style.json | 12 + .../Framework/Card/Bold_Text/resource.json | 16 + .../Framework/Card/Bold_Text/style.json | 7 + .../Framework/Card/Card/resource.json | 16 + .../Framework/Card/Card/style.json | 13 + .../Card/Card_transparent/resource.json | 16 + .../Card/Card_transparent/style.json | 8 + .../Card/Data/value_error/resource.json | 16 + .../Card/Data/value_error/style.json | 17 + .../Card/Data/value_info/resource.json | 16 + .../Framework/Card/Data/value_info/style.json | 17 + .../Card/Data/value_off/resource.json | 16 + .../Framework/Card/Data/value_off/style.json | 17 + .../Card/Data/value_success/resource.json | 16 + .../Card/Data/value_success/style.json | 17 + .../Card/Data/value_warning/resource.json | 16 + .../Card/Data/value_warning/style.json | 17 + .../Framework/Card/Embedded/resource.json | 16 + .../Framework/Card/Embedded/style.json | 7 + .../Card/Embedded_transparent/resource.json | 16 + .../Card/Embedded_transparent/style.json | 9 + .../Framework/Card/Item/resource.json | 16 + .../Framework/Card/Item/style.json | 10 + .../Framework/Card/Item_Border/resource.json | 16 + .../Framework/Card/Item_Border/style.json | 9 + .../Framework/Card/Label/resource.json | 16 + .../Framework/Card/Label/style.json | 12 + .../Framework/Card/Row/resource.json | 16 + .../Framework/Card/Row/style.json | 7 + .../Framework/Card/Title/resource.json | 16 + .../Framework/Card/Title/style.json | 17 + .../Card/Title_transparent/resource.json | 16 + .../Card/Title_transparent/style.json | 17 + .../Framework/Card/Value/resource.json | 16 + .../Framework/Card/Value/style.json | 10 + .../Framework/Cards/Bold_Text/data.bin | 1 + .../Framework/Cards/Bold_Text/resource.json | 16 + .../Framework/Cards/Card/resource.json | 16 + .../Framework/Cards/Card/style.json | 13 + .../Framework/Cards/Embedded/resource.json | 16 + .../Framework/Cards/Embedded/style.json | 7 + .../Framework/Cards/Item/data.bin | 1 + .../Framework/Cards/Item/resource.json | 16 + .../Framework/Cards/Item_Border/data.bin | 1 + .../Framework/Cards/Item_Border/resource.json | 16 + .../Framework/Cards/Label/resource.json | 16 + .../Framework/Cards/Label/style.json | 12 + .../Framework/Cards/Row/resource.json | 16 + .../Framework/Cards/Row/style.json | 7 + .../Framework/Cards/Title/data.bin | 1 + .../Framework/Cards/Title/resource.json | 16 + .../Framework/Cards/Value/resource.json | 16 + .../Framework/Cards/Value/style.json | 10 + .../ColorPicker/Container/resource.json | 16 + .../ColorPicker/Container/style.json | 11 + .../Input/Button/Action_Button/resource.json | 16 + .../Input/Button/Action_Button/style.json | 9 + .../Action_Button_Disabled/resource.json | 16 + .../Button/Action_Button_Disabled/style.json | 10 + .../Button/Action_Button_Error/resource.json | 16 + .../Button/Action_Button_Error/style.json | 10 + .../Input/Button/Export_Button/resource.json | 16 + .../Input/Button/Export_Button/style.json | 12 + .../Input/Button/General_Button/resource.json | 16 + .../Input/Button/General_Button/style.json | 12 + .../Button/Secondary_minimal/resource.json | 16 + .../Input/Button/Secondary_minimal/style.json | 8 + .../style-classes/Labels/Label/resource.json | 16 + .../style-classes/Labels/Label/style.json | 11 + .../Labels/Label_1/resource.json | 16 + .../style-classes/Labels/Label_1/style.json | 11 + .../PopUp-Styles/InfoButton/resource.json | 16 + .../PopUp-Styles/InfoButton/style.json | 10 + .../PopUp-Styles/InfoLabel/resource.json | 16 + .../PopUp-Styles/InfoLabel/style.json | 18 + .../Information-Device/resource.json | 16 + .../Information-Device/style.json | 18 + .../State-Styles/AAA-Style/resource.json | 16 + .../State-Styles/AAA-Style/style.json | 7 + .../Alt-Background-Fill/State0/resource.json | 16 + .../Alt-Background-Fill/State0/style.json | 10 + .../Alt-Background-Fill/State1/resource.json | 16 + .../Alt-Background-Fill/State1/style.json | 10 + .../Alt-Background-Fill/State2/resource.json | 16 + .../Alt-Background-Fill/State2/style.json | 10 + .../Alt-Background-Fill/State3/resource.json | 16 + .../Alt-Background-Fill/State3/style.json | 10 + .../Alt-Background-Fill/State4/resource.json | 16 + .../Alt-Background-Fill/State4/style.json | 10 + .../Alt-Background-Fill/State5/resource.json | 16 + .../Alt-Background-Fill/State5/style.json | 10 + .../Background-Fill/State0/resource.json | 16 + .../Background-Fill/State0/style.json | 10 + .../Background-Fill/State1/resource.json | 16 + .../Background-Fill/State1/style.json | 10 + .../Background-Fill/State1_Alt/resource.json | 16 + .../Background-Fill/State1_Alt/style.json | 10 + .../Background-Fill/State2/resource.json | 16 + .../Background-Fill/State2/style.json | 10 + .../Background-Fill/State2_Alt/resource.json | 16 + .../Background-Fill/State2_Alt/style.json | 10 + .../Background-Fill/State3/resource.json | 16 + .../Background-Fill/State3/style.json | 10 + .../Background-Fill/State3_Alt/resource.json | 16 + .../Background-Fill/State3_Alt/style.json | 10 + .../Background-Fill/State4/resource.json | 16 + .../Background-Fill/State4/style.json | 10 + .../Background-Fill/State4_Alt/resource.json | 16 + .../Background-Fill/State4_Alt/style.json | 10 + .../Background-Fill/State5/resource.json | 16 + .../Background-Fill/State5/style.json | 10 + .../Background-Fill/State5_Alt/resource.json | 16 + .../Background-Fill/State5_Alt/style.json | 10 + .../Background-Fill/State6/resource.json | 16 + .../Background-Fill/State6/style.json | 10 + .../State-Styles/State0/resource.json | 16 + .../State-Styles/State0/style.json | 7 + .../State-Styles/State1/resource.json | 16 + .../State-Styles/State1/style.json | 7 + .../State-Styles/State101/resource.json | 16 + .../State-Styles/State101/style.json | 13 + .../State-Styles/State102/resource.json | 16 + .../State-Styles/State102/style.json | 13 + .../State-Styles/State103/resource.json | 16 + .../State-Styles/State103/style.json | 13 + .../State-Styles/State104/resource.json | 16 + .../State-Styles/State104/style.json | 13 + .../State-Styles/State105/resource.json | 16 + .../State-Styles/State105/style.json | 13 + .../State-Styles/State106/resource.json | 16 + .../State-Styles/State106/style.json | 13 + .../State-Styles/State2/resource.json | 16 + .../State-Styles/State2/style.json | 7 + .../State-Styles/State201/resource.json | 16 + .../State-Styles/State201/style.json | 13 + .../State-Styles/State202/resource.json | 16 + .../State-Styles/State202/style.json | 13 + .../State-Styles/State203/resource.json | 16 + .../State-Styles/State203/style.json | 13 + .../State-Styles/State204/resource.json | 16 + .../State-Styles/State204/style.json | 13 + .../State-Styles/State205/resource.json | 16 + .../State-Styles/State205/style.json | 13 + .../State-Styles/State3/resource.json | 16 + .../State-Styles/State3/style.json | 7 + .../State-Styles/State4/resource.json | 16 + .../State-Styles/State4/style.json | 7 + .../State-Styles/State5/resource.json | 16 + .../State-Styles/State5/style.json | 7 + .../State-Styles/State6/resource.json | 16 + .../State-Styles/State6/style.json | 7 + .../Text-Styles/Ariel-Bold-12pt/resource.json | 16 + .../Text-Styles/Ariel-Bold-12pt/style.json | 10 + .../Ariel-Bold-White-12pt/resource.json | 16 + .../Ariel-Bold-White-12pt/style.json | 10 + .../Text-Styles/Controller/resource.json | 16 + .../Text-Styles/Controller/style.json | 10 + .../Text-Styles/Docked-Buttons/resource.json | 16 + .../Text-Styles/Docked-Buttons/style.json | 9 + .../CenterAlign_with_Padding/resource.json | 16 + .../Text/CenterAlign_with_Padding/style.json | 10 + .../style-classes/Text/InfoText/resource.json | 16 + .../style-classes/Text/InfoText/style.json | 8 + .../style-classes/Text/Label/resource.json | 16 + .../style-classes/Text/Label/style.json | 7 + .../Text/LeftAlign_with_Padding/resource.json | 16 + .../Text/LeftAlign_with_Padding/style.json | 8 + .../RightAlign_with_Padding/resource.json | 16 + .../Text/RightAlign_with_Padding/style.json | 8 + .../Text/TitleText/resource.json | 16 + .../style-classes/Text/TitleText/style.json | 10 + .../Text/labelText/resource.json | 16 + .../style-classes/Text/labelText/style.json | 5 + .../stylesheet/resource.json | 16 + .../stylesheet/stylesheet.css | 70 + .../MAP-Home/resource.json | 17 + .../MAP-Home/thumbnail.png | Bin 0 -> 62407 bytes .../Additional-Home-View/MAP-Home/view.json | 108 + .../Alarm-Views/AlarmTable/resource.json | 17 + .../Alarm-Views/AlarmTable/thumbnail.png | Bin 0 -> 2983 bytes .../views/Alarm-Views/AlarmTable/view.json | 1281 +++ .../Alarm-Views/Docked-Alarm/resource.json | 17 + .../Alarm-Views/Docked-Alarm/thumbnail.png | Bin 0 -> 6144 bytes .../views/Alarm-Views/Docked-Alarm/view.json | 1978 +++++ .../HistoricalAlarms/resource.json | 17 + .../HistoricalAlarms/thumbnail.png | Bin 0 -> 46524 bytes .../Alarm-Views/HistoricalAlarms/view.json | 2897 +++++++ .../views/Alarm-Views/RealTime/resource.json | 17 + .../views/Alarm-Views/RealTime/thumbnail.png | Bin 0 -> 33328 bytes .../views/Alarm-Views/RealTime/view.json | 5771 +++++++++++++ .../views/Alerts/alert/resource.json | 17 + .../views/Alerts/alert/thumbnail.png | Bin 0 -> 5440 bytes .../views/Alerts/alert/view.json | 749 ++ .../views/Alerts/info-examples/resource.json | 17 + .../views/Alerts/info-examples/thumbnail.png | Bin 0 -> 50184 bytes .../views/Alerts/info-examples/view.json | 479 ++ .../views/Custom-Views/Detail/resource.json | 17 + .../views/Custom-Views/Detail/thumbnail.png | Bin 0 -> 9222 bytes .../views/Custom-Views/Detail/view.json | 59 + .../views/Detailed-Views/Detail/resource.json | 17 + .../views/Detailed-Views/Detail/thumbnail.png | Bin 0 -> 9998 bytes .../views/Detailed-Views/Detail/view.json | 175 + .../Detailed-Views/Template/resource.json | 17 + .../Detailed-Views/Template/thumbnail.png | Bin 0 -> 3224 bytes .../views/Detailed-Views/Template/view.json | 59 + .../views/Detailed-Views/Test/resource.json | 17 + .../views/Detailed-Views/Test/thumbnail.png | Bin 0 -> 5882 bytes .../views/Detailed-Views/Test/view.json | 87 + .../Breakpoint Embedded/resource.json | 17 + .../Breakpoint Embedded/thumbnail.png | Bin 0 -> 3433 bytes .../Framework/Breakpoint Embedded/view.json | 113 + .../views/Framework/Breakpoint/resource.json | 17 + .../views/Framework/Breakpoint/thumbnail.png | Bin 0 -> 5203 bytes .../views/Framework/Breakpoint/view.json | 123 + .../Framework/Card/Card (1)/resource.json | 17 + .../Framework/Card/Card (1)/thumbnail.png | Bin 0 -> 2825 bytes .../views/Framework/Card/Card (1)/view.json | 125 + .../views/Framework/Card/Card/resource.json | 17 + .../views/Framework/Card/Card/thumbnail.png | Bin 0 -> 3811 bytes .../views/Framework/Card/Card/view.json | 151 + .../Card/Card_Collapsible/resource.json | 17 + .../Card/Card_Collapsible/thumbnail.png | Bin 0 -> 12867 bytes .../Framework/Card/Card_Collapsible/view.json | 212 + .../resource.json | 17 + .../thumbnail.png | Bin 0 -> 2306 bytes .../Card_Collapsible_Transparent/view.json | 237 + .../resource.json | 17 + .../thumbnail.png | Bin 0 -> 24845 bytes .../view.json | 431 + .../Nested/Card_Collapsible/resource.json | 17 + .../Nested/Card_Collapsible/thumbnail.png | Bin 0 -> 12852 bytes .../Card/Nested/Card_Collapsible/view.json | 213 + .../resource.json | 17 + .../thumbnail.png | Bin 0 -> 10667 bytes .../Card_Collapsible_Transparent/view.json | 237 + .../Color Picker/Color Picker/resource.json | 17 + .../Color Picker/Color Picker/thumbnail.png | Bin 0 -> 11197 bytes .../Color Picker/Color Picker/view.json | 787 ++ .../Color Picker/Color/resource.json | 16 + .../Framework/Color Picker/Color/view.json | 65 + .../views/Header/Header/resource.json | 17 + .../views/Header/Header/thumbnail.png | Bin 0 -> 2604 bytes .../views/Header/Header/view.json | 1102 +++ .../views/Main-Views/ATLAS/resource.json | 17 + .../views/Main-Views/ATLAS/thumbnail.png | Bin 0 -> 3233 bytes .../views/Main-Views/ATLAS/view.json | 14 + .../CommandControl (OLD)/resource.json | 17 + .../CommandControl (OLD)/thumbnail.png | Bin 0 -> 9629 bytes .../Main-Views/CommandControl (OLD)/view.json | 228 + .../Main-Views/CommandControl/resource.json | 17 + .../Main-Views/CommandControl/thumbnail.png | Bin 0 -> 35668 bytes .../views/Main-Views/CommandControl/view.json | 1808 ++++ .../Commissioning Tool/CT_Main/resource.json | 17 + .../Commissioning Tool/CT_Main/thumbnail.png | Bin 0 -> 11059 bytes .../Commissioning Tool/CT_Main/view.json | 7467 +++++++++++++++++ .../Commissioning Tool/Column/resource.json | 17 + .../Commissioning Tool/Column/thumbnail.png | Bin 0 -> 960 bytes .../Commissioning Tool/Column/view.json | 110 + .../Commissioning Tool/Message/resource.json | 17 + .../Commissioning Tool/Message/thumbnail.png | Bin 0 -> 889 bytes .../Commissioning Tool/Message/view.json | 115 + .../Commissioning Tool/Row/resource.json | 17 + .../Commissioning Tool/Row/thumbnail.png | Bin 0 -> 4590 bytes .../Commissioning Tool/Row/view.json | 318 + .../SequenceTester/resource.json | 17 + .../SequenceTester/thumbnail.png | Bin 0 -> 21061 bytes .../SequenceTester/view.json | 709 ++ .../Upload_files/resource.json | 17 + .../Upload_files/thumbnail.png | Bin 0 -> 10161 bytes .../Commissioning Tool/Upload_files/view.json | 198 + .../UserFeedBack/resource.json | 17 + .../UserFeedBack/thumbnail.png | Bin 0 -> 1839 bytes .../Commissioning Tool/UserFeedBack/view.json | 242 + .../AddDetailedViewMapping/resource.json | 17 + .../AddDetailedViewMapping/thumbnail.png | Bin 0 -> 14345 bytes .../AddDetailedViewMapping/view.json | 778 ++ .../Config-Tool/AddDevice/resource.json | 17 + .../Config-Tool/AddDevice/thumbnail.png | Bin 0 -> 16011 bytes .../Config-Tool/AddDevice/view.json | 1001 +++ .../Config-Tool/MainView/resource.json | 17 + .../Config-Tool/MainView/thumbnail.png | Bin 0 -> 35508 bytes .../Main-Views/Config-Tool/MainView/view.json | 2408 ++++++ .../Config-Tool/SideMenu/resource.json | 17 + .../Config-Tool/SideMenu/thumbnail.png | Bin 0 -> 9344 bytes .../Main-Views/Config-Tool/SideMenu/view.json | 66 + .../Config-Tool/TagViewer/resource.json | 17 + .../Config-Tool/TagViewer/thumbnail.png | Bin 0 -> 25360 bytes .../Config-Tool/TagViewer/view.json | 237 + .../Device-Manager/Device/resource.json | 17 + .../Device-Manager/Device/thumbnail.png | Bin 0 -> 773 bytes .../Device-Manager/Device/view.json | 244 + .../DeviceManager/resource.json | 17 + .../DeviceManager/thumbnail.png | Bin 0 -> 18826 bytes .../Device-Manager/DeviceManager/view.json | 1713 ++++ .../DriverDropDown/resource.json | 17 + .../DriverDropDown/thumbnail.png | Bin 0 -> 325 bytes .../Device-Manager/DriverDropDown/view.json | 97 + .../views/Main-Views/Help/resource.json | 17 + .../views/Main-Views/Help/thumbnail.png | Bin 0 -> 19548 bytes .../views/Main-Views/Help/view.json | 792 ++ .../views/Main-Views/Home/resource.json | 17 + .../views/Main-Views/Home/thumbnail.png | Bin 0 -> 2798 bytes .../views/Main-Views/Home/view.json | 198 + .../views/Main-Views/Monitron/resource.json | 17 + .../views/Main-Views/Monitron/thumbnail.png | Bin 0 -> 19550 bytes .../views/Main-Views/Monitron/view.json | 55 + .../Notify-Tool/Notify-Main/resource.json | 17 + .../Notify-Tool/Notify-Main/thumbnail.png | Bin 0 -> 26414 bytes .../Notify-Tool/Notify-Main/view.json | 2890 +++++++ .../Main-Views/OilMonitoring/resource.json | 17 + .../Main-Views/OilMonitoring/thumbnail.png | Bin 0 -> 14217 bytes .../views/Main-Views/OilMonitoring/view.json | 55 + .../views/Main-Views/S3/manage/resource.json | 17 + .../views/Main-Views/S3/manage/thumbnail.png | Bin 0 -> 35196 bytes .../views/Main-Views/S3/manage/view.json | 918 ++ .../Main-Views/TempMonitoring/resource.json | 17 + .../Main-Views/TempMonitoring/thumbnail.png | Bin 0 -> 5947 bytes .../views/Main-Views/TempMonitoring/view.json | 55 + .../views/Main-Views/ToolBox/resource.json | 17 + .../views/Main-Views/ToolBox/thumbnail.png | Bin 0 -> 21151 bytes .../views/Main-Views/ToolBox/view.json | 155 + .../Docked-South/resource.json | 17 + .../Docked-South/thumbnail.png | Bin 0 -> 24407 bytes .../Navigation-Views/Docked-South/view.json | 151 + .../Docked-West/resource.json | 17 + .../Docked-West/thumbnail.png | Bin 0 -> 9114 bytes .../Navigation-Views/Docked-West/view.json | 832 ++ .../views/Navigation-Views/Key/resource.json | 17 + .../views/Navigation-Views/Key/thumbnail.png | Bin 0 -> 9829 bytes .../views/Navigation-Views/Key/view.json | 155 + .../Navigation-Views/NavLabel/resource.json | 17 + .../Navigation-Views/NavLabel/thumbnail.png | Bin 0 -> 763 bytes .../views/Navigation-Views/NavLabel/view.json | 146 + .../Navigation-Views/Nav_Button/resource.json | 17 + .../Navigation-Views/Nav_Button/thumbnail.png | Bin 0 -> 214 bytes .../Navigation-Views/Nav_Button/view.json | 97 + .../NavigationButton/resource.json | 17 + .../NavigationButton/thumbnail.png | Bin 0 -> 278 bytes .../NavigationButton/view.json | 141 + .../PowerTable/ColumnSelection/resource.json | 17 + .../PowerTable/ColumnSelection/thumbnail.png | Bin 0 -> 5991 bytes .../PowerTable/ColumnSelection/view.json | 147 + .../ColumnSelectionTile/resource.json | 17 + .../ColumnSelectionTile/thumbnail.png | Bin 0 -> 494 bytes .../PowerTable/ColumnSelectionTile/view.json | 84 + .../PowerTable/FilterMenuGroup/resource.json | 17 + .../PowerTable/FilterMenuGroup/thumbnail.png | Bin 0 -> 2377 bytes .../PowerTable/FilterMenuGroup/view.json | 171 + .../PowerTable/FilterMenuItem/resource.json | 17 + .../PowerTable/FilterMenuItem/thumbnail.png | Bin 0 -> 123 bytes .../PowerTable/FilterMenuItem/view.json | 172 + .../PowerTable/FilterTile/resource.json | 16 + .../Objects/PowerTable/FilterTile/view.json | 157 + .../Input/Generic Numeric Input/resource.json | 17 + .../Input/Generic Numeric Input/thumbnail.png | Bin 0 -> 327 bytes .../Input/Generic Numeric Input/view.json | 144 + .../Generic Text Field Input/resource.json | 17 + .../Generic Text Field Input/thumbnail.png | Bin 0 -> 184 bytes .../Input/Generic Text Field Input/view.json | 92 + .../Input/password_field/resource.json | 17 + .../Input/password_field/thumbnail.png | Bin 0 -> 1045 bytes .../Templates/Input/password_field/view.json | 141 + .../Templates/Input/text_field/resource.json | 17 + .../Templates/Input/text_field/thumbnail.png | Bin 0 -> 847 bytes .../Templates/Input/text_field/view.json | 129 + .../TextInput_centerAlign/resource.json | 17 + .../TextInput_centerAlign/thumbnail.png | Bin 0 -> 737 bytes .../Labels/TextInput_centerAlign/view.json | 99 + .../Templates/Labels/label/resource.json | 17 + .../Templates/Labels/label/thumbnail.png | Bin 0 -> 288 bytes .../Objects/Templates/Labels/label/view.json | 68 + .../Labels/label_CenterAlign/resource.json | 17 + .../Labels/label_CenterAlign/thumbnail.png | Bin 0 -> 130 bytes .../Labels/label_CenterAlign/view.json | 58 + .../Labels/label_LeftAlign/resource.json | 17 + .../Labels/label_LeftAlign/thumbnail.png | Bin 0 -> 285 bytes .../Labels/label_LeftAlign/view.json | 58 + .../Labels/label_RightAlign/resource.json | 17 + .../Labels/label_RightAlign/thumbnail.png | Bin 0 -> 116 bytes .../Labels/label_RightAlign/view.json | 58 + .../Labels/label_legend/resource.json | 17 + .../Labels/label_legend/thumbnail.png | Bin 0 -> 4145 bytes .../Templates/Labels/label_legend/view.json | 710 ++ .../S3/Audit/Log_Table/resource.json | 17 + .../S3/Audit/Log_Table/thumbnail.png | Bin 0 -> 2638 bytes .../Templates/S3/Audit/Log_Table/view.json | 1123 +++ .../S3/Audit/Query_Options/resource.json | 17 + .../S3/Audit/Query_Options/thumbnail.png | Bin 0 -> 20387 bytes .../S3/Audit/Query_Options/view.json | 1954 +++++ .../S3/Management/copy/resource.json | 17 + .../S3/Management/copy/thumbnail.png | Bin 0 -> 16086 bytes .../Templates/S3/Management/copy/view.json | 2552 ++++++ .../S3/Management/file/resource.json | 17 + .../S3/Management/file/thumbnail.png | Bin 0 -> 10791 bytes .../Templates/S3/Management/file/view.json | 2092 +++++ .../S3/Management/manage/resource.json | 17 + .../S3/Management/manage/thumbnail.png | Bin 0 -> 6204 bytes .../Templates/S3/Management/manage/view.json | 1041 +++ .../S3/Management/site/resource.json | 17 + .../S3/Management/site/thumbnail.png | Bin 0 -> 3500 bytes .../Templates/S3/Management/site/view.json | 456 + .../S3/Versions/Log_Table/resource.json | 17 + .../S3/Versions/Log_Table/thumbnail.png | Bin 0 -> 2840 bytes .../Templates/S3/Versions/Log_Table/view.json | 1139 +++ .../S3/Versions/Query_Options/resource.json | 17 + .../S3/Versions/Query_Options/thumbnail.png | Bin 0 -> 6917 bytes .../S3/Versions/Query_Options/view.json | 773 ++ .../Command-Authenticate/resource.json | 17 + .../Command-Authenticate/thumbnail.png | Bin 0 -> 8362 bytes .../Command-Authenticate/view.json | 184 + .../Information-Docked-East/resource.json | 17 + .../Information-Docked-East/thumbnail.png | Bin 0 -> 8190 bytes .../Information-Docked-East/view.json | 1099 +++ .../Information/resource.json | 17 + .../Information/thumbnail.png | Bin 0 -> 55493 bytes .../Information/view.json | 4965 +++++++++++ .../Detail-View-Filter/resource.json | 17 + .../Detail-View-Filter/thumbnail.png | Bin 0 -> 20055 bytes .../PopUp-Views/Detail-View-Filter/view.json | 894 ++ .../Device/Information-Device/resource.json | 17 + .../Device/Information-Device/thumbnail.png | Bin 0 -> 2018 bytes .../Device/Information-Device/view.json | 447 + .../views/PopUp-Views/EditItem/resource.json | 17 + .../views/PopUp-Views/EditItem/thumbnail.png | Bin 0 -> 13173 bytes .../views/PopUp-Views/EditItem/view.json | 1004 +++ .../views/PopUp-Views/Error/resource.json | 17 + .../views/PopUp-Views/Error/thumbnail.png | Bin 0 -> 1495 bytes .../views/PopUp-Views/Error/view.json | 97 + .../Legend-popup-view/resource.json | 17 + .../Legend-popup-view/thumbnail.png | Bin 0 -> 16526 bytes .../Legend_Popup/Legend-popup-view/view.json | 954 +++ .../Legend_Popup/Legend-row/resource.json | 17 + .../Legend_Popup/Legend-row/thumbnail.png | Bin 0 -> 761 bytes .../Legend_Popup/Legend-row/view.json | 204 + .../Legend_Popup/Legend-table/resource.json | 17 + .../Legend_Popup/Legend-table/thumbnail.png | Bin 0 -> 11570 bytes .../Legend_Popup/Legend-table/view.json | 387 + .../Notify-Popup-Entry/resource.json | 17 + .../Notify-Popup-Entry/thumbnail.png | Bin 0 -> 479 bytes .../Notify-Tool/Notify-Popup-Entry/view.json | 522 ++ .../Notify-Tool/Notify-Popup/resource.json | 17 + .../Notify-Tool/Notify-Popup/thumbnail.png | Bin 0 -> 1035 bytes .../Notify-Tool/Notify-Popup/view.json | 176 + .../Notify-Submit-Popup/resource.json | 17 + .../Notify-Submit-Popup/thumbnail.png | Bin 0 -> 639 bytes .../Notify-Tool/Notify-Submit-Popup/view.json | 396 + .../Permissions Error/resource.json | 17 + .../Permissions Error/thumbnail.png | Bin 0 -> 2423 bytes .../PopUp-Views/Permissions Error/view.json | 46 + .../S3/Audit/Log_Viewer/resource.json | 17 + .../S3/Audit/Log_Viewer/thumbnail.png | Bin 0 -> 4696 bytes .../PopUp-Views/S3/Audit/Log_Viewer/view.json | 239 + .../S3/Versions/Log_Viewer/resource.json | 17 + .../S3/Versions/Log_Viewer/thumbnail.png | Bin 0 -> 6160 bytes .../S3/Versions/Log_Viewer/view.json | 238 + .../views/PopUp-Views/Search/resource.json | 17 + .../views/PopUp-Views/Search/thumbnail.png | Bin 0 -> 3619 bytes .../views/PopUp-Views/Search/view.json | 371 + .../views/PopUp-Views/UserInfo/resource.json | 17 + .../views/PopUp-Views/UserInfo/thumbnail.png | Bin 0 -> 1462 bytes .../views/PopUp-Views/UserInfo/view.json | 138 + .../State-Views/State-Table/resource.json | 17 + .../State-Views/State-Table/thumbnail.png | Bin 0 -> 5441 bytes .../views/State-Views/State-Table/view.json | 376 + .../CommandControl/resource.json | 17 + .../CommandControl/thumbnail.png | Bin 0 -> 5247 bytes .../Controller-Views/CommandControl/view.json | 592 ++ .../CommandControlActions/resource.json | 17 + .../CommandControlActions/thumbnail.png | Bin 0 -> 1709 bytes .../CommandControlActions/view.json | 431 + .../CommandControlAlarms/resource.json | 17 + .../CommandControlAlarms/thumbnail.png | Bin 0 -> 1360 bytes .../CommandControlAlarms/view.json | 367 + .../CommandControlStatus/resource.json | 17 + .../CommandControlStatus/thumbnail.png | Bin 0 -> 698 bytes .../CommandControlStatus/view.json | 249 + .../ControlCabinet/resource.json | 17 + .../ControlCabinet/thumbnail.png | Bin 0 -> 2073 bytes .../Controller-Views/ControlCabinet/view.json | 273 + .../ControllerStatus/resource.json | 17 + .../ControllerStatus/thumbnail.png | Bin 0 -> 7911 bytes .../ControllerStatus/view.json | 897 ++ .../Device-Views/DeviceStatus/resource.json | 17 + .../Device-Views/DeviceStatus/thumbnail.png | Bin 0 -> 76 bytes .../Device-Views/DeviceStatus/view.json | 280 + .../DeviceStatus_old/resource.json | 17 + .../DeviceStatus_old/thumbnail.png | Bin 0 -> 76 bytes .../Device-Views/DeviceStatus_old/view.json | 262 + .../Device-Views/Estop/resource.json | 17 + .../Device-Views/Estop/thumbnail.png | Bin 0 -> 76 bytes .../Symbol-Views/Device-Views/Estop/view.json | 227 + .../Equipment-Views/ARSAW/resource.json | 17 + .../Equipment-Views/ARSAW/thumbnail.png | Bin 0 -> 1508 bytes .../Equipment-Views/ARSAW/view.json | 537 ++ .../Equipment-Views/AUS/resource.json | 17 + .../Equipment-Views/AUS/thumbnail.png | Bin 0 -> 1865 bytes .../Equipment-Views/AUS/view.json | 608 ++ .../Equipment-Views/Camera/resource.json | 17 + .../Equipment-Views/Camera/thumbnail.png | Bin 0 -> 81 bytes .../Equipment-Views/Camera/view.json | 727 ++ .../CognexCamera/resource.json | 17 + .../CognexCamera/thumbnail.png | Bin 0 -> 81 bytes .../Equipment-Views/CognexCamera/view.json | 727 ++ .../ControlCabinet/resource.json | 17 + .../ControlCabinet/thumbnail.png | Bin 0 -> 473 bytes .../Equipment-Views/ControlCabinet/view.json | 551 ++ .../Equipment-Views/Estop/resource.json | 17 + .../Equipment-Views/Estop/thumbnail.png | Bin 0 -> 81 bytes .../Equipment-Views/Estop/view.json | 525 ++ .../Equipment-Views/GoodsLift/resource.json | 17 + .../Equipment-Views/GoodsLift/thumbnail.png | Bin 0 -> 1768 bytes .../Equipment-Views/GoodsLift/view.json | 627 ++ .../Equipment-Views/JAM/resource.json | 17 + .../Equipment-Views/JAM/thumbnail.png | Bin 0 -> 74 bytes .../Equipment-Views/JAM/view.json | 76 + .../Equipment-Views/Kobukuro/resource.json | 17 + .../Equipment-Views/Kobukuro/thumbnail.png | Bin 0 -> 2318 bytes .../Equipment-Views/Kobukuro/view.json | 1021 +++ .../Equipment-Views/Lift/resource.json | 17 + .../Equipment-Views/Lift/thumbnail.png | Bin 0 -> 1375 bytes .../Equipment-Views/Lift/view.json | 687 ++ .../Light_Curtain/resource.json | 16 + .../Equipment-Views/Light_Curtain/view.json | 497 ++ .../Equipment-Views/Main_Panel/resource.json | 17 + .../Equipment-Views/Main_Panel/thumbnail.png | Bin 0 -> 223 bytes .../Equipment-Views/Main_Panel/view.json | 522 ++ .../Equipment-Views/Network/resource.json | 17 + .../Equipment-Views/Network/thumbnail.png | Bin 0 -> 100 bytes .../Equipment-Views/Network/view.json | 589 ++ .../Equipment-Views/PPI/resource.json | 17 + .../Equipment-Views/PPI/thumbnail.png | Bin 0 -> 1810 bytes .../Equipment-Views/PPI/view.json | 656 ++ .../Photocell2_Lift/resource.json | 17 + .../Photocell2_Lift/thumbnail.png | Bin 0 -> 1194 bytes .../Equipment-Views/Photocell2_Lift/view.json | 603 ++ .../Photocell_Lift/resource.json | 17 + .../Photocell_Lift/thumbnail.png | Bin 0 -> 1532 bytes .../Equipment-Views/Photocell_Lift/view.json | 604 ++ .../PinDetection/resource.json | 17 + .../PinDetection/thumbnail.png | Bin 0 -> 2096 bytes .../Equipment-Views/PinDetection/view.json | 614 ++ .../Equipment-Views/Pointer/resource.json | 17 + .../Equipment-Views/Pointer/thumbnail.png | Bin 0 -> 793 bytes .../Equipment-Views/Pointer/view.json | 571 ++ .../PressureSwitch/resource.json | 17 + .../PressureSwitch/thumbnail.png | Bin 0 -> 78 bytes .../Equipment-Views/PressureSwitch/view.json | 648 ++ .../Equipment-Views/PullChord/resource.json | 17 + .../Equipment-Views/PullChord/thumbnail.png | Bin 0 -> 85 bytes .../Equipment-Views/PullChord/view.json | 586 ++ .../PullChord_End/resource.json | 16 + .../Equipment-Views/PullChord_End/view.json | 485 ++ .../PullChord_Line/resource.json | 16 + .../Equipment-Views/PullChord_Line/view.json | 555 ++ .../PullChord_Line_Vertical/resource.json | 16 + .../PullChord_Line_Vertical/view.json | 555 ++ .../Equipment-Views/RFID/resource.json | 17 + .../Equipment-Views/RFID/thumbnail.png | Bin 0 -> 526 bytes .../Equipment-Views/RFID/view.json | 449 + .../Equipment-Views/Robot/resource.json | 17 + .../Equipment-Views/Robot/thumbnail.png | Bin 0 -> 1844 bytes .../Equipment-Views/Robot/view.json | 578 ++ .../Equipment-Views/SLAMs/resource.json | 17 + .../Equipment-Views/SLAMs/thumbnail.png | Bin 0 -> 1581 bytes .../Equipment-Views/SLAMs/view.json | 628 ++ .../Equipment-Views/SafetyGate/resource.json | 17 + .../Equipment-Views/SafetyGate/thumbnail.png | Bin 0 -> 82 bytes .../Equipment-Views/SafetyGate/view.json | 736 ++ .../Equipment-Views/SmartPac/resource.json | 17 + .../Equipment-Views/SmartPac/thumbnail.png | Bin 0 -> 2612 bytes .../Equipment-Views/SmartPac/view.json | 659 ++ .../Equipment-Views/Spiral/resource.json | 17 + .../Equipment-Views/Spiral/thumbnail.png | Bin 0 -> 2164 bytes .../Equipment-Views/Spiral/view.json | 732 ++ .../Stacker_Destacker/resource.json | 17 + .../Stacker_Destacker/thumbnail.png | Bin 0 -> 1700 bytes .../Stacker_Destacker/view.json | 598 ++ .../Equipment-Views/Status/resource.json | 16 + .../Equipment-Views/Status/view.json | 931 ++ .../StatusNonPowered/resource.json | 16 + .../StatusNonPowered/view.json | 887 ++ .../StatusNonPowered_NS/resource.json | 16 + .../StatusNonPowered_NS/view.json | 888 ++ .../Equipment-Views/Status_NS/resource.json | 16 + .../Equipment-Views/Status_NS/view.json | 932 ++ .../Equipment-Views/THEA/resource.json | 17 + .../Equipment-Views/THEA/thumbnail.png | Bin 0 -> 2033 bytes .../Equipment-Views/THEA/view.json | 623 ++ .../Equipment-Views/Test/resource.json | 17 + .../Equipment-Views/Test/thumbnail.png | Bin 0 -> 3442 bytes .../Equipment-Views/Test/view.json | 58 + .../Selected-Symbol-Description/resource.json | 17 + .../Selected-Symbol-Description/thumbnail.png | Bin 0 -> 1355 bytes .../Selected-Symbol-Description/view.json | 45 + .../Symbol-Filter-View/resource.json | 17 + .../Symbol-Filter-View/thumbnail.png | Bin 0 -> 3234 bytes .../Symbol-Filter-View/view.json | 109 + .../Symbol-Icons-View/resource.json | 17 + .../Symbol-Icons-View/thumbnail.png | Bin 0 -> 51602 bytes .../Symbol-Icons-View/view.json | 384 + .../Symbol-Information-View/resource.json | 17 + .../Symbol-Information-View/thumbnail.png | Bin 0 -> 1183 bytes .../Symbol-Information-View/view.json | 46 + .../Symbol-Library-Views/Symbol/resource.json | 17 + .../Symbol-Library-Views/Symbol/thumbnail.png | Bin 0 -> 1536 bytes .../Symbol-Library-Views/Symbol/view.json | 155 + .../SymbolLibraryMain/resource.json | 17 + .../SymbolLibraryMain/thumbnail.png | Bin 0 -> 56022 bytes .../SymbolLibraryMain/view.json | 1142 +++ .../views/Test/resource.json | 17 + .../views/Test/thumbnail.png | Bin 0 -> 46641 bytes .../views/Test/view.json | 4007 +++++++++ .../client-tags/data.bin | Bin 0 -> 346 bytes .../client-tags/resource.json | 16 + .../login-properties/data.bin | Bin 0 -> 288 bytes .../login-properties/resource.json | 16 + .../Reset_Start_JamReset/data.bin | Bin 0 -> 6127 bytes .../Reset_Start_JamReset/resource.json | 17 + .../StatusControl_Bar_Has_Role/resource.json | 17 + .../StatusControl_Bar_Has_Role/template.bin | Bin 0 -> 6641 bytes ignition/event-scripts/data.bin | Bin 0 -> 1200 bytes ignition/event-scripts/resource.json | 16 + ignition/global-props/data.bin | Bin 0 -> 707 bytes ignition/global-props/resource.json | 16 + .../GetHistoricalAlarms/data.bin | Bin 0 -> 1258 bytes .../GetHistoricalAlarms/resource.json | 16 + ignition/script-python/AWS/build_url/code.py | 99 + .../script-python/AWS/build_url/resource.json | 17 + .../script-python/AWS/build_url_http/code.py | 293 + .../AWS/build_url_http/resource.json | 17 + .../script-python/AWS/create_tags/code.py | 31 + .../AWS/create_tags/resource.json | 17 + .../script-python/AWS/credentials/code.py | 53 + .../AWS/credentials/resource.json | 17 + ignition/script-python/AWS/errors/code.py | 11 + .../script-python/AWS/errors/resource.json | 17 + ignition/script-python/AWS/heartbeat/code.py | 16 + .../script-python/AWS/heartbeat/resource.json | 17 + .../script-python/AWS/message_types/code.py | 302 + .../AWS/message_types/resource.json | 17 + ignition/script-python/AWS/s3/code.py | 879 ++ ignition/script-python/AWS/s3/resource.json | 17 + .../script-python/AWS/secrets_manager/code.py | 33 + .../AWS/secrets_manager/resource.json | 17 + .../script-python/AWS/wbsckt_abort/code.py | 54 + .../AWS/wbsckt_abort/resource.json | 17 + ignition/script-python/AWS/web_socket/code.py | 211 + .../AWS/web_socket/resource.json | 17 + .../script-python/AWS/web_socket_send/code.py | 21 + .../AWS/web_socket_send/resource.json | 16 + ignition/script-python/Alerts/code.py | 17 + ignition/script-python/Alerts/resource.json | 17 + .../script-python/Commands/analytics/code.py | 15 + .../Commands/analytics/resource.json | 17 + .../Commands/button_commands/code.py | 122 + .../Commands/button_commands/resource.json | 17 + .../Commands/shelve_alarms/code.py | 31 + .../Commands/shelve_alarms/resource.json | 17 + .../script-python/DocStringTemplate/code.py | 16 + .../DocStringTemplate/resource.json | 17 + .../FileHandler/downloader/code.py | 96 + .../FileHandler/downloader/resource.json | 17 + .../FileHandler/uploader/code.py | 64 + .../FileHandler/uploader/resource.json | 17 + .../Gateway/timer_scripts/code.py | 59 + .../Gateway/timer_scripts/resource.json | 17 + .../Latency/CreateLatencyTags/code.py | 53 + .../Latency/CreateLatencyTags/resource.json | 17 + .../Latency/LatencyAvgCalculation/code.py | 24 + .../LatencyAvgCalculation/resource.json | 17 + .../Latency/LatencyCalculation/code.py | 82 + .../Latency/LatencyCalculation/resource.json | 17 + .../Latency/WriteToDynamo/code.py | 77 + .../Latency/WriteToDynamo/resource.json | 17 + ignition/script-python/SymbolLibrary/code.py | 105 + .../script-python/SymbolLibrary/resource.json | 17 + .../Visualisation/home_page/code.py | 92 + .../Visualisation/home_page/resource.json | 17 + .../Visualisation/status/code.py | 162 + .../Visualisation/status/resource.json | 17 + .../Visualisation/status_2/code.py | 66 + .../Visualisation/status_2/resource.json | 17 + .../script-python/activityLog/logger/code.py | 83 + .../activityLog/logger/resource.json | 17 + .../activityLog/productMetrics/code.py | 223 + .../activityLog/productMetrics/resource.json | 17 + .../script-python/alarms/alarm_count/code.py | 24 + .../alarms/alarm_count/resource.json | 17 + .../alarms/alarm_filters/code.py | 64 + .../alarms/alarm_filters/resource.json | 17 + .../script-python/alarms/alarm_state/code.py | 32 + .../alarms/alarm_state/resource.json | 17 + .../script-python/alarms/alarm_tables/code.py | 195 + .../alarms/alarm_tables/resource.json | 17 + ignition/script-python/alarms/shelve/code.py | 31 + .../script-python/alarms/shelve/resource.json | 17 + .../config/project_config/code.py | 124 + .../config/project_config/resource.json | 17 + ignition/script-python/helper/code.py | 284 + ignition/script-python/helper/resource.json | 17 + .../script-python/import_file/csv/code.py | 20 + .../import_file/csv/resource.json | 16 + ignition/script-python/loggerConfig/code.py | 34 + .../script-python/loggerConfig/resource.json | 17 + .../messaging/message_handler/code.py | 147 + .../messaging/message_handler/resource.json | 17 + .../navigation/additional_view/code.py | 20 + .../navigation/additional_view/resource.json | 16 + .../navigation/alarm_navigation/code.py | 79 + .../navigation/alarm_navigation/resource.json | 16 + .../navigation/amzl_navigation/code.py | 65 + .../navigation/amzl_navigation/resource.json | 17 + .../navigation/basic_navigation/code.py | 15 + .../navigation/basic_navigation/resource.json | 16 + .../navigation/navigate_to_page/code.py | 50 + .../navigation/navigate_to_page/resource.json | 17 + .../script-python/navigation/search/code.py | 44 + .../navigation/search/resource.json | 17 + .../navigation/show_alarms/code.py | 34 + .../navigation/show_alarms/resource.json | 16 + .../notifyTool/DeleteFromDynamo/code.py | 122 + .../notifyTool/DeleteFromDynamo/resource.json | 17 + .../notifyTool/ReadFromDynamo/code.py | 118 + .../notifyTool/ReadFromDynamo/resource.json | 17 + .../notifyTool/WriteToDynamo/code.py | 103 + .../notifyTool/WriteToDynamo/resource.json | 17 + ignition/script-python/row_builder/code.py | 32 + .../script-python/row_builder/resource.json | 17 + .../script-python/state/state_tables/code.py | 44 + .../state/state_tables/resource.json | 17 + .../script-python/tags/tag_utilities/code.py | 38 + .../tags/tag_utilities/resource.json | 17 + project.json | 6 + 838 files changed, 112860 insertions(+) create mode 100644 AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/build_url/code.py create mode 100644 AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/build_url/resource.json create mode 100644 AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/credentials/code.py create mode 100644 AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/credentials/resource.json create mode 100644 AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/wbsckt_abort/code.py create mode 100644 AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/wbsckt_abort/resource.json create mode 100644 AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/web_socket/code.py create mode 100644 AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/web_socket/resource.json create mode 100644 AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/web_socket_send/code.py create mode 100644 AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/web_socket_send/resource.json create mode 100644 com.inductiveautomation.perspective/page-config/config.json create mode 100644 com.inductiveautomation.perspective/page-config/resource.json create mode 100644 com.inductiveautomation.perspective/session-permissions/data.bin create mode 100644 com.inductiveautomation.perspective/session-permissions/resource.json create mode 100644 com.inductiveautomation.perspective/session-props/props.json create mode 100644 com.inductiveautomation.perspective/session-props/resource.json create mode 100644 com.inductiveautomation.perspective/session-scripts/data.bin create mode 100644 com.inductiveautomation.perspective/session-scripts/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Critical/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Critical/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Diagnostic/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Diagnostic/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/High/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/High/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Low/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Low/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Medium/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Medium/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Critical/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Critical/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Diagnostic/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Diagnostic/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/High/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/High/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Low/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Low/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Medium/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Medium/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/NoAlarm-Black/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/NoAlarm-Black/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/NoAlarm/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/NoAlarm/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Shelved/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alarms-Styles/Shelved/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/alertButton/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/alertButton/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/alertButtonSecondary/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/alertButtonSecondary/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/alertClose/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/alertClose/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/alertMessage/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/alertMessage/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/alertTitle/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/alertTitle/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/error/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/error/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/errorBtn1/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/errorBtn1/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/errorBtn2/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/errorBtn2/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/info/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/info/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/infoBtn1/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/infoBtn1/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/infoBtn2/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/infoBtn2/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/success/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/success/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/successBtn1/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/successBtn1/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/successBtn2/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/successBtn2/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/warning/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/warning/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/warningBtn1/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/warningBtn1/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/warningBtn2/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Alerts/states/warningBtn2/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Background-Styles/Controller/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Background-Styles/Controller/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Background-Styles/Grey-Background/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Background-Styles/Grey-Background/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Background-Styles/Main-Background/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Background-Styles/Main-Background/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Buttons/Button-Menu/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Buttons/Button-Menu/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Buttons/Clear-Background/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Buttons/Clear-Background/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Buttons/PB_1/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Buttons/PB_1/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/DeviceManager/DeviceManagerRows/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/DeviceManager/DeviceManagerRows/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Disconnects/Device-Connected/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Disconnects/Device-Connected/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Disconnects/Device-Disconnected/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Disconnects/Device-Disconnected/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Dropdown/DropDownBox/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Dropdown/DropDownBox/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopActivated/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopActivated/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopActivated101/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopActivated101/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopDeactivated/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopDeactivated/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopDeactivated100/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopDeactivated100/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Bold_Text/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Bold_Text/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Card/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Card/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Card_transparent/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Card_transparent/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_error/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_error/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_info/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_info/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_off/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_off/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_success/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_success/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_warning/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_warning/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Embedded/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Embedded/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Embedded_transparent/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Embedded_transparent/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Item/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Item/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Item_Border/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Item_Border/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Label/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Label/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Row/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Row/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Title/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Title/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Title_transparent/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Title_transparent/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Value/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Card/Value/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Cards/Bold_Text/data.bin create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Cards/Bold_Text/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Cards/Card/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Cards/Card/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Cards/Embedded/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Cards/Embedded/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Cards/Item/data.bin create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Cards/Item/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Cards/Item_Border/data.bin create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Cards/Item_Border/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Cards/Label/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Cards/Label/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Cards/Row/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Cards/Row/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Cards/Title/data.bin create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Cards/Title/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Cards/Value/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/Cards/Value/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/ColorPicker/Container/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Framework/ColorPicker/Container/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button_Disabled/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button_Disabled/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button_Error/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button_Error/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Input/Button/Export_Button/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Input/Button/Export_Button/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Input/Button/General_Button/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Input/Button/General_Button/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Input/Button/Secondary_minimal/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Input/Button/Secondary_minimal/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Labels/Label/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Labels/Label/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Labels/Label_1/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Labels/Label_1/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/PopUp-Styles/InfoButton/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/PopUp-Styles/InfoButton/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/PopUp-Styles/InfoLabel/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/PopUp-Styles/InfoLabel/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/PopUp-Styles/Information-Device/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/PopUp-Styles/Information-Device/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/AAA-Style/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/AAA-Style/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State0/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State0/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State1/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State1/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State2/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State2/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State3/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State3/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State4/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State4/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State5/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State5/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State0/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State0/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State1/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State1/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State1_Alt/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State1_Alt/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State2/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State2/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State2_Alt/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State2_Alt/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State3/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State3/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State3_Alt/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State3_Alt/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State4/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State4/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State4_Alt/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State4_Alt/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State5/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State5/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State5_Alt/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State5_Alt/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State6/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State6/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State0/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State0/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State1/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State1/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State101/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State101/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State102/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State102/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State103/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State103/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State104/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State104/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State105/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State105/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State106/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State106/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State2/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State2/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State201/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State201/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State202/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State202/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State203/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State203/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State204/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State204/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State205/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State205/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State3/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State3/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State4/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State4/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State5/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State5/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State6/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/State-Styles/State6/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text-Styles/Ariel-Bold-12pt/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text-Styles/Ariel-Bold-12pt/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text-Styles/Ariel-Bold-White-12pt/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text-Styles/Ariel-Bold-White-12pt/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text-Styles/Controller/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text-Styles/Controller/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text-Styles/Docked-Buttons/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text-Styles/Docked-Buttons/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text/CenterAlign_with_Padding/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text/CenterAlign_with_Padding/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text/InfoText/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text/InfoText/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text/Label/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text/Label/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text/LeftAlign_with_Padding/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text/LeftAlign_with_Padding/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text/RightAlign_with_Padding/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text/RightAlign_with_Padding/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text/TitleText/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text/TitleText/style.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text/labelText/resource.json create mode 100644 com.inductiveautomation.perspective/style-classes/Text/labelText/style.json create mode 100644 com.inductiveautomation.perspective/stylesheet/resource.json create mode 100644 com.inductiveautomation.perspective/stylesheet/stylesheet.css create mode 100644 com.inductiveautomation.perspective/views/Additional-Home-View/MAP-Home/resource.json create mode 100644 com.inductiveautomation.perspective/views/Additional-Home-View/MAP-Home/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Additional-Home-View/MAP-Home/view.json create mode 100644 com.inductiveautomation.perspective/views/Alarm-Views/AlarmTable/resource.json create mode 100644 com.inductiveautomation.perspective/views/Alarm-Views/AlarmTable/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Alarm-Views/AlarmTable/view.json create mode 100644 com.inductiveautomation.perspective/views/Alarm-Views/Docked-Alarm/resource.json create mode 100644 com.inductiveautomation.perspective/views/Alarm-Views/Docked-Alarm/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Alarm-Views/Docked-Alarm/view.json create mode 100644 com.inductiveautomation.perspective/views/Alarm-Views/HistoricalAlarms/resource.json create mode 100644 com.inductiveautomation.perspective/views/Alarm-Views/HistoricalAlarms/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Alarm-Views/HistoricalAlarms/view.json create mode 100644 com.inductiveautomation.perspective/views/Alarm-Views/RealTime/resource.json create mode 100644 com.inductiveautomation.perspective/views/Alarm-Views/RealTime/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Alarm-Views/RealTime/view.json create mode 100644 com.inductiveautomation.perspective/views/Alerts/alert/resource.json create mode 100644 com.inductiveautomation.perspective/views/Alerts/alert/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Alerts/alert/view.json create mode 100644 com.inductiveautomation.perspective/views/Alerts/info-examples/resource.json create mode 100644 com.inductiveautomation.perspective/views/Alerts/info-examples/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Alerts/info-examples/view.json create mode 100644 com.inductiveautomation.perspective/views/Custom-Views/Detail/resource.json create mode 100644 com.inductiveautomation.perspective/views/Custom-Views/Detail/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Custom-Views/Detail/view.json create mode 100644 com.inductiveautomation.perspective/views/Detailed-Views/Detail/resource.json create mode 100644 com.inductiveautomation.perspective/views/Detailed-Views/Detail/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Detailed-Views/Detail/view.json create mode 100644 com.inductiveautomation.perspective/views/Detailed-Views/Template/resource.json create mode 100644 com.inductiveautomation.perspective/views/Detailed-Views/Template/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Detailed-Views/Template/view.json create mode 100644 com.inductiveautomation.perspective/views/Detailed-Views/Test/resource.json create mode 100644 com.inductiveautomation.perspective/views/Detailed-Views/Test/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Detailed-Views/Test/view.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Breakpoint Embedded/resource.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Breakpoint Embedded/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Framework/Breakpoint Embedded/view.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Breakpoint/resource.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Breakpoint/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Framework/Breakpoint/view.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Card (1)/resource.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Card (1)/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Card (1)/view.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Card/resource.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Card/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Card/view.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible/resource.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible/view.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible_Transparent/resource.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible_Transparent/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible_Transparent/view.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible_Transparent_with_Anchor/resource.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible_Transparent_with_Anchor/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible_Transparent_with_Anchor/view.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible/resource.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible/view.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible_Transparent/resource.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible_Transparent/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible_Transparent/view.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Color Picker/Color Picker/resource.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Color Picker/Color Picker/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Framework/Color Picker/Color Picker/view.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Color Picker/Color/resource.json create mode 100644 com.inductiveautomation.perspective/views/Framework/Color Picker/Color/view.json create mode 100644 com.inductiveautomation.perspective/views/Header/Header/resource.json create mode 100644 com.inductiveautomation.perspective/views/Header/Header/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Header/Header/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/ATLAS/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/ATLAS/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/ATLAS/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/CommandControl (OLD)/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/CommandControl (OLD)/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/CommandControl (OLD)/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/CommandControl/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/CommandControl/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/CommandControl/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/CT_Main/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/CT_Main/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/CT_Main/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Column/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Column/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Column/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Message/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Message/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Message/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Row/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Row/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Row/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/SequenceTester/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/SequenceTester/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/SequenceTester/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Upload_files/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Upload_files/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Upload_files/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/UserFeedBack/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/UserFeedBack/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/UserFeedBack/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Config-Tool/AddDetailedViewMapping/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Config-Tool/AddDetailedViewMapping/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Config-Tool/AddDetailedViewMapping/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Config-Tool/AddDevice/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Config-Tool/AddDevice/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Config-Tool/AddDevice/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Config-Tool/MainView/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Config-Tool/MainView/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Config-Tool/MainView/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Config-Tool/SideMenu/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Config-Tool/SideMenu/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Config-Tool/SideMenu/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Config-Tool/TagViewer/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Config-Tool/TagViewer/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Config-Tool/TagViewer/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Device-Manager/Device/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Device-Manager/Device/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Device-Manager/Device/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DeviceManager/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DeviceManager/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DeviceManager/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DriverDropDown/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DriverDropDown/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DriverDropDown/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Help/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Help/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Help/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Home/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Home/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Home/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Monitron/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Monitron/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Monitron/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Notify-Tool/Notify-Main/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Notify-Tool/Notify-Main/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/Notify-Tool/Notify-Main/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/OilMonitoring/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/OilMonitoring/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/OilMonitoring/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/S3/manage/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/S3/manage/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/S3/manage/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/TempMonitoring/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/TempMonitoring/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/TempMonitoring/view.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/ToolBox/resource.json create mode 100644 com.inductiveautomation.perspective/views/Main-Views/ToolBox/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Main-Views/ToolBox/view.json create mode 100644 com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/resource.json create mode 100644 com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json create mode 100644 com.inductiveautomation.perspective/views/Navigation-Views/Docked-West/resource.json create mode 100644 com.inductiveautomation.perspective/views/Navigation-Views/Docked-West/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Navigation-Views/Docked-West/view.json create mode 100644 com.inductiveautomation.perspective/views/Navigation-Views/Key/resource.json create mode 100644 com.inductiveautomation.perspective/views/Navigation-Views/Key/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Navigation-Views/Key/view.json create mode 100644 com.inductiveautomation.perspective/views/Navigation-Views/NavLabel/resource.json create mode 100644 com.inductiveautomation.perspective/views/Navigation-Views/NavLabel/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Navigation-Views/NavLabel/view.json create mode 100644 com.inductiveautomation.perspective/views/Navigation-Views/Nav_Button/resource.json create mode 100644 com.inductiveautomation.perspective/views/Navigation-Views/Nav_Button/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Navigation-Views/Nav_Button/view.json create mode 100644 com.inductiveautomation.perspective/views/Navigation-Views/NavigationButton/resource.json create mode 100644 com.inductiveautomation.perspective/views/Navigation-Views/NavigationButton/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Navigation-Views/NavigationButton/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/PowerTable/ColumnSelection/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/PowerTable/ColumnSelection/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/PowerTable/ColumnSelection/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/PowerTable/ColumnSelectionTile/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/PowerTable/ColumnSelectionTile/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/PowerTable/ColumnSelectionTile/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuGroup/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuGroup/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuGroup/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuItem/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuItem/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuItem/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/PowerTable/FilterTile/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/PowerTable/FilterTile/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Input/Generic Numeric Input/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Input/Generic Numeric Input/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Input/Generic Numeric Input/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Input/Generic Text Field Input/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Input/Generic Text Field Input/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Input/Generic Text Field Input/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Input/password_field/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Input/password_field/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Input/password_field/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Input/text_field/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Input/text_field/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Input/text_field/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Labels/TextInput_centerAlign/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Labels/TextInput_centerAlign/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Labels/TextInput_centerAlign/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Labels/label/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Labels/label/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Labels/label/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_CenterAlign/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_CenterAlign/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_CenterAlign/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_LeftAlign/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_LeftAlign/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_LeftAlign/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_RightAlign/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_RightAlign/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_RightAlign/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_legend/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_legend/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_legend/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Log_Table/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Log_Table/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Log_Table/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Query_Options/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Query_Options/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Query_Options/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/copy/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/copy/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/copy/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/file/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/file/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/file/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/manage/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/manage/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/manage/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/site/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/site/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/site/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Versions/Log_Table/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Versions/Log_Table/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Versions/Log_Table/view.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Versions/Query_Options/resource.json create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Versions/Query_Options/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Objects/Templates/S3/Versions/Query_Options/view.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Command-Authenticate/resource.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Command-Authenticate/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Command-Authenticate/view.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information-Docked-East/resource.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information-Docked-East/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information-Docked-East/view.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information/resource.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information/view.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Detail-View-Filter/resource.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Detail-View-Filter/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Detail-View-Filter/view.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Device/Information-Device/resource.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Device/Information-Device/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Device/Information-Device/view.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/EditItem/resource.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/EditItem/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/EditItem/view.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Error/resource.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Error/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Error/view.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-popup-view/resource.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-popup-view/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-popup-view/view.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-row/resource.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-row/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-row/view.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-table/resource.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-table/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-table/view.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup-Entry/resource.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup-Entry/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup-Entry/view.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup/resource.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup/view.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Submit-Popup/resource.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Submit-Popup/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Submit-Popup/view.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Permissions Error/resource.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Permissions Error/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Permissions Error/view.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/S3/Audit/Log_Viewer/resource.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/S3/Audit/Log_Viewer/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/S3/Audit/Log_Viewer/view.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/S3/Versions/Log_Viewer/resource.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/S3/Versions/Log_Viewer/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/S3/Versions/Log_Viewer/view.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Search/resource.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Search/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/Search/view.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/UserInfo/resource.json create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/UserInfo/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/PopUp-Views/UserInfo/view.json create mode 100644 com.inductiveautomation.perspective/views/State-Views/State-Table/resource.json create mode 100644 com.inductiveautomation.perspective/views/State-Views/State-Table/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/State-Views/State-Table/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControl/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControl/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControl/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlActions/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlActions/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlActions/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlAlarms/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlAlarms/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlAlarms/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlStatus/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlStatus/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlStatus/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControlCabinet/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControlCabinet/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControlCabinet/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControllerStatus/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControllerStatus/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControllerStatus/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/DeviceStatus/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/DeviceStatus/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/DeviceStatus/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/DeviceStatus_old/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/DeviceStatus_old/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/DeviceStatus_old/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/Estop/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/Estop/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/Estop/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ARSAW/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ARSAW/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ARSAW/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/AUS/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/AUS/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/AUS/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Camera/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Camera/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Camera/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/CognexCamera/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/CognexCamera/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/CognexCamera/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ControlCabinet/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ControlCabinet/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ControlCabinet/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Estop/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Estop/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Estop/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/GoodsLift/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/GoodsLift/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/GoodsLift/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/JAM/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/JAM/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/JAM/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Kobukuro/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Kobukuro/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Kobukuro/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Lift/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Lift/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Lift/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Light_Curtain/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Light_Curtain/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Main_Panel/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Main_Panel/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Main_Panel/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Network/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Network/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Network/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PPI/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PPI/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PPI/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Photocell2_Lift/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Photocell2_Lift/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Photocell2_Lift/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Photocell_Lift/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Photocell_Lift/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Photocell_Lift/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PinDetection/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PinDetection/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PinDetection/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Pointer/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Pointer/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Pointer/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PressureSwitch/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PressureSwitch/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PressureSwitch/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_End/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_End/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_Line/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_Line/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_Line_Vertical/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_Line_Vertical/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/RFID/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/RFID/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/RFID/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Robot/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Robot/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Robot/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SLAMs/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SLAMs/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SLAMs/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SafetyGate/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SafetyGate/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SafetyGate/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SmartPac/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SmartPac/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SmartPac/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Spiral/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Spiral/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Spiral/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Stacker_Destacker/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Stacker_Destacker/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Stacker_Destacker/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Status/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Status/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/StatusNonPowered/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/StatusNonPowered/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/StatusNonPowered_NS/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/StatusNonPowered_NS/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Status_NS/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Status_NS/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/THEA/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/THEA/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/THEA/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Test/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Test/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Test/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Selected-Symbol-Description/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Selected-Symbol-Description/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Selected-Symbol-Description/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Filter-View/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Filter-View/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Filter-View/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Icons-View/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Icons-View/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Icons-View/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Information-View/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Information-View/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Information-View/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol/view.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/SymbolLibraryMain/resource.json create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/SymbolLibraryMain/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/SymbolLibraryMain/view.json create mode 100644 com.inductiveautomation.perspective/views/Test/resource.json create mode 100644 com.inductiveautomation.perspective/views/Test/thumbnail.png create mode 100644 com.inductiveautomation.perspective/views/Test/view.json create mode 100644 com.inductiveautomation.vision/client-tags/data.bin create mode 100644 com.inductiveautomation.vision/client-tags/resource.json create mode 100644 com.inductiveautomation.vision/login-properties/data.bin create mode 100644 com.inductiveautomation.vision/login-properties/resource.json create mode 100644 com.inductiveautomation.vision/templates/Site Specific/Reset_Start_JamReset/data.bin create mode 100644 com.inductiveautomation.vision/templates/Site Specific/Reset_Start_JamReset/resource.json create mode 100644 com.inductiveautomation.vision/templates/Site Specific/StatusControl_Bar_Has_Role/resource.json create mode 100644 com.inductiveautomation.vision/templates/Site Specific/StatusControl_Bar_Has_Role/template.bin create mode 100644 ignition/event-scripts/data.bin create mode 100644 ignition/event-scripts/resource.json create mode 100644 ignition/global-props/data.bin create mode 100644 ignition/global-props/resource.json create mode 100644 ignition/named-query/StoredProcedures/GetHistoricalAlarms/data.bin create mode 100644 ignition/named-query/StoredProcedures/GetHistoricalAlarms/resource.json create mode 100644 ignition/script-python/AWS/build_url/code.py create mode 100644 ignition/script-python/AWS/build_url/resource.json create mode 100644 ignition/script-python/AWS/build_url_http/code.py create mode 100644 ignition/script-python/AWS/build_url_http/resource.json create mode 100644 ignition/script-python/AWS/create_tags/code.py create mode 100644 ignition/script-python/AWS/create_tags/resource.json create mode 100644 ignition/script-python/AWS/credentials/code.py create mode 100644 ignition/script-python/AWS/credentials/resource.json create mode 100644 ignition/script-python/AWS/errors/code.py create mode 100644 ignition/script-python/AWS/errors/resource.json create mode 100644 ignition/script-python/AWS/heartbeat/code.py create mode 100644 ignition/script-python/AWS/heartbeat/resource.json create mode 100644 ignition/script-python/AWS/message_types/code.py create mode 100644 ignition/script-python/AWS/message_types/resource.json create mode 100644 ignition/script-python/AWS/s3/code.py create mode 100644 ignition/script-python/AWS/s3/resource.json create mode 100644 ignition/script-python/AWS/secrets_manager/code.py create mode 100644 ignition/script-python/AWS/secrets_manager/resource.json create mode 100644 ignition/script-python/AWS/wbsckt_abort/code.py create mode 100644 ignition/script-python/AWS/wbsckt_abort/resource.json create mode 100644 ignition/script-python/AWS/web_socket/code.py create mode 100644 ignition/script-python/AWS/web_socket/resource.json create mode 100644 ignition/script-python/AWS/web_socket_send/code.py create mode 100644 ignition/script-python/AWS/web_socket_send/resource.json create mode 100644 ignition/script-python/Alerts/code.py create mode 100644 ignition/script-python/Alerts/resource.json create mode 100644 ignition/script-python/Commands/analytics/code.py create mode 100644 ignition/script-python/Commands/analytics/resource.json create mode 100644 ignition/script-python/Commands/button_commands/code.py create mode 100644 ignition/script-python/Commands/button_commands/resource.json create mode 100644 ignition/script-python/Commands/shelve_alarms/code.py create mode 100644 ignition/script-python/Commands/shelve_alarms/resource.json create mode 100644 ignition/script-python/DocStringTemplate/code.py create mode 100644 ignition/script-python/DocStringTemplate/resource.json create mode 100644 ignition/script-python/FileHandler/downloader/code.py create mode 100644 ignition/script-python/FileHandler/downloader/resource.json create mode 100644 ignition/script-python/FileHandler/uploader/code.py create mode 100644 ignition/script-python/FileHandler/uploader/resource.json create mode 100644 ignition/script-python/Gateway/timer_scripts/code.py create mode 100644 ignition/script-python/Gateway/timer_scripts/resource.json create mode 100644 ignition/script-python/Latency/CreateLatencyTags/code.py create mode 100644 ignition/script-python/Latency/CreateLatencyTags/resource.json create mode 100644 ignition/script-python/Latency/LatencyAvgCalculation/code.py create mode 100644 ignition/script-python/Latency/LatencyAvgCalculation/resource.json create mode 100644 ignition/script-python/Latency/LatencyCalculation/code.py create mode 100644 ignition/script-python/Latency/LatencyCalculation/resource.json create mode 100644 ignition/script-python/Latency/WriteToDynamo/code.py create mode 100644 ignition/script-python/Latency/WriteToDynamo/resource.json create mode 100644 ignition/script-python/SymbolLibrary/code.py create mode 100644 ignition/script-python/SymbolLibrary/resource.json create mode 100644 ignition/script-python/Visualisation/home_page/code.py create mode 100644 ignition/script-python/Visualisation/home_page/resource.json create mode 100644 ignition/script-python/Visualisation/status/code.py create mode 100644 ignition/script-python/Visualisation/status/resource.json create mode 100644 ignition/script-python/Visualisation/status_2/code.py create mode 100644 ignition/script-python/Visualisation/status_2/resource.json create mode 100644 ignition/script-python/activityLog/logger/code.py create mode 100644 ignition/script-python/activityLog/logger/resource.json create mode 100644 ignition/script-python/activityLog/productMetrics/code.py create mode 100644 ignition/script-python/activityLog/productMetrics/resource.json create mode 100644 ignition/script-python/alarms/alarm_count/code.py create mode 100644 ignition/script-python/alarms/alarm_count/resource.json create mode 100644 ignition/script-python/alarms/alarm_filters/code.py create mode 100644 ignition/script-python/alarms/alarm_filters/resource.json create mode 100644 ignition/script-python/alarms/alarm_state/code.py create mode 100644 ignition/script-python/alarms/alarm_state/resource.json create mode 100644 ignition/script-python/alarms/alarm_tables/code.py create mode 100644 ignition/script-python/alarms/alarm_tables/resource.json create mode 100644 ignition/script-python/alarms/shelve/code.py create mode 100644 ignition/script-python/alarms/shelve/resource.json create mode 100644 ignition/script-python/config/project_config/code.py create mode 100644 ignition/script-python/config/project_config/resource.json create mode 100644 ignition/script-python/helper/code.py create mode 100644 ignition/script-python/helper/resource.json create mode 100644 ignition/script-python/import_file/csv/code.py create mode 100644 ignition/script-python/import_file/csv/resource.json create mode 100644 ignition/script-python/loggerConfig/code.py create mode 100644 ignition/script-python/loggerConfig/resource.json create mode 100644 ignition/script-python/messaging/message_handler/code.py create mode 100644 ignition/script-python/messaging/message_handler/resource.json create mode 100644 ignition/script-python/navigation/additional_view/code.py create mode 100644 ignition/script-python/navigation/additional_view/resource.json create mode 100644 ignition/script-python/navigation/alarm_navigation/code.py create mode 100644 ignition/script-python/navigation/alarm_navigation/resource.json create mode 100644 ignition/script-python/navigation/amzl_navigation/code.py create mode 100644 ignition/script-python/navigation/amzl_navigation/resource.json create mode 100644 ignition/script-python/navigation/basic_navigation/code.py create mode 100644 ignition/script-python/navigation/basic_navigation/resource.json create mode 100644 ignition/script-python/navigation/navigate_to_page/code.py create mode 100644 ignition/script-python/navigation/navigate_to_page/resource.json create mode 100644 ignition/script-python/navigation/search/code.py create mode 100644 ignition/script-python/navigation/search/resource.json create mode 100644 ignition/script-python/navigation/show_alarms/code.py create mode 100644 ignition/script-python/navigation/show_alarms/resource.json create mode 100644 ignition/script-python/notifyTool/DeleteFromDynamo/code.py create mode 100644 ignition/script-python/notifyTool/DeleteFromDynamo/resource.json create mode 100644 ignition/script-python/notifyTool/ReadFromDynamo/code.py create mode 100644 ignition/script-python/notifyTool/ReadFromDynamo/resource.json create mode 100644 ignition/script-python/notifyTool/WriteToDynamo/code.py create mode 100644 ignition/script-python/notifyTool/WriteToDynamo/resource.json create mode 100644 ignition/script-python/row_builder/code.py create mode 100644 ignition/script-python/row_builder/resource.json create mode 100644 ignition/script-python/state/state_tables/code.py create mode 100644 ignition/script-python/state/state_tables/resource.json create mode 100644 ignition/script-python/tags/tag_utilities/code.py create mode 100644 ignition/script-python/tags/tag_utilities/resource.json create mode 100644 project.json diff --git a/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/build_url/code.py b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/build_url/code.py new file mode 100644 index 0000000..d311f3b --- /dev/null +++ b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/build_url/code.py @@ -0,0 +1,101 @@ +import datetime +import hashlib +import hmac + +import boto3 + +try: + from urllib.parse import quote_plus +except ImportError: + from urllib import quote_plus + + +def sign(key, msg): + return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest() + + +def getSignatureKey(key, dateStamp, regionName, serviceName): + kDate = sign(("AWS4" + key).encode("utf-8"), dateStamp) + kRegion = sign(kDate, regionName) + kService = sign(kRegion, serviceName) + kSigning = sign(kService, "aws4_request") + return kSigning + + +def build_querystring(access_key, session_key, algorithm, amz_date, credential_scope): + query_strings = { + "X-Amz-Algorithm": algorithm, + "X-Amz-Credential": quote_plus(access_key + "/" + credential_scope), + "X-Amz-Date": amz_date, + #"X-Amz-Security-Token": quote_plus(session_key), + "X-Amz-SignedHeaders": "host", + } + keys = list(query_strings.keys()) + keys.sort() + query = [] + for key in keys: + query.append("{}={}".format(key, query_strings[key])) + + canonical_query_string = "&".join( + query + #["{}={}".format(key, value) for key, value in query_strings.items()] + ) + return canonical_query_string + + +def make_websocket_connection(api_id, region, stage, credentials): + method = "GET" + service = "execute-api" + host = "{}.{}.{}.amazonaws.com".format(api_id, service, region) + canonical_uri = "/{}".format(stage) + access_key = credentials["AccessKey"] + secret_key = credentials["SecretKey"] + session_key = credentials["SessionKey"] + now = datetime.datetime.utcnow() + + amz_date = now.strftime("%Y%m%dT%H%M%SZ") + datestamp = now.strftime("%Y%m%d") + canonical_headers = "host:" + host + "\n" + signed_headers = "host" + algorithm = "AWS4-HMAC-SHA256" + credential_scope = "/".join([datestamp, region, service, "aws4_request"]) + + canonical_querystring = build_querystring( + access_key, session_key, algorithm, amz_date, credential_scope + ) + payload_hash = hashlib.sha256(("").encode("utf-8")).hexdigest() + canonical_request = "\n".join( + [ + method, + canonical_uri, + "", + #canonical_querystring, + canonical_headers, + signed_headers, + payload_hash, + ] + ) + string_to_sign = "\n".join( + [ + algorithm, + amz_date, + credential_scope, + hashlib.sha256(canonical_request.encode("utf-8")).hexdigest(), + ] + ) + signing_key = getSignatureKey(secret_key, datestamp, region, service) + signature = hmac.new( + signing_key, string_to_sign.encode("utf-8"), hashlib.sha256 + ).hexdigest() + canonical_querystring += "&X-Amz-Signature=" + signature + request_url = "wss://{}/{}".format(host, stage) + auth_header = algorithm + " Credential=" + access_key + "/" + credential_scope + ", SignedHeaders=" + signed_headers + ", Signature=" + signature + #print('-H "Authorization":"' + auth_header +'" -H "X-Amz-Date":"' + amz_date + '" -H "X-Amz-Security-Token":"' + session_key + '" ') + request_headers = { + "Authorization":auth_header, + "X-Amz-Date": amz_date, + "X-Amz-Security-Token": session_key + } + return request_url, request_headers + + diff --git a/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/build_url/resource.json b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/build_url/resource.json new file mode 100644 index 0000000..58b68da --- /dev/null +++ b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/build_url/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol@amazon.co.uk", + "timestamp": "2022-07-04T10:32:46Z" + }, + "lastModificationSignature": "c6d362fd384c952e0c80ab7e63145e38bd4649796a935e38591861d391467c7d" + } +} \ No newline at end of file diff --git a/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/credentials/code.py b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/credentials/code.py new file mode 100644 index 0000000..cbf08c4 --- /dev/null +++ b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/credentials/code.py @@ -0,0 +1,43 @@ +import re, sys +import datetime +import base64 +import json +import com.amazonaws.services.s3.AmazonS3ClientBuilder as AmazonS3ClientBuilder +import com.amazonaws.auth.profile.ProfileCredentialsProvider as ProfileCredentialsProvider +import com.amazonaws.auth.AWSStaticCredentialsProvider as AWSStaticCredentialsProvider +import com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder as AWSSecretsManagerClientBuilder +import com.amazonaws.services.secretsmanager.model.GetSecretValueRequest as GetSecretValueRequest +import com.amazonaws.services.secretsmanager.model.AWSSecretsManagerException as AWSSecretsManagerException +import com.amazonaws.services.securitytoken.AWSSecurityTokenService as AWSSecurityTokenService ; +import com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClientBuilder as AWSSecurityTokenServiceClientBuilder; + + + + +# Constants + +class GetCredentials(): + ''' + Gets aws credentials for the provided path and region. + + ''' + + def __init__(self, path, profile, region): + self.path = path + self.profile = profile + self.region = region + self.credentials = self._get_credentials() +# self.client = self._get_s3_client() + + def _get_credentials(self): + '''Gets the credentials for the AWS account which the s3 bucket is in. + + Args: + + Returns: + credentials : The aws credentials for a given profile stored on the server. + ''' + credentials = ProfileCredentialsProvider(self.path, self.profile).getCredentials() + return credentials + + diff --git a/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/credentials/resource.json b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/credentials/resource.json new file mode 100644 index 0000000..55d8ba3 --- /dev/null +++ b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/credentials/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol@amazon.co.uk", + "timestamp": "2022-07-04T10:32:46Z" + }, + "lastModificationSignature": "ce24dfb3eb5265df488e4505cbdc17614b250f7af574fa7796bdbd68844f2025" + } +} \ No newline at end of file diff --git a/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/wbsckt_abort/code.py b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/wbsckt_abort/code.py new file mode 100644 index 0000000..816e70e --- /dev/null +++ b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/wbsckt_abort/code.py @@ -0,0 +1,19 @@ +import time + +def close_websckt(): + fc = system.tag.readBlocking(["Configuration/FC"]) + fc_value = fc[0].value + tag_provider = "[%s_SCADA_TAG_PROVIDER]" % (fc_value) + system.tag.writeBlocking([tag_provider + "System/close_socket"],[1]) + time.sleep(1) + system.tag.writeBlocking([tag_provider + "System/close_socket"],[0]) + logger = system.util.getLogger("%s-Project-Update" % (fc)) + logger.info("Web-Socket closed due to project update") + +def check_web_socket(): + request_to_close = system.tag.readBlocking(["System/close_socket"]) + request_to_close_val = request_to_close[0].value + if request_to_close_val: + return True + else: + return False diff --git a/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/wbsckt_abort/resource.json b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/wbsckt_abort/resource.json new file mode 100644 index 0000000..cc340d6 --- /dev/null +++ b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/wbsckt_abort/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol@amazon.co.uk", + "timestamp": "2022-07-04T10:32:46Z" + }, + "lastModificationSignature": "4a029aaa7d282ec98ddba452bec4b87704b0263dd802521a8b94e9d7fc0b1d0e" + } +} \ No newline at end of file diff --git a/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/web_socket/code.py b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/web_socket/code.py new file mode 100644 index 0000000..3f28796 --- /dev/null +++ b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/web_socket/code.py @@ -0,0 +1,66 @@ +from java.net.http import HttpClient; +from java.net.http import WebSocket; +from java.net import URI +import json + + +class listener(WebSocket.Listener): + + def __init__(self,whid): + self.whid = whid + self.alarms = {} + self.tag_provider ="[%s_SCADA_TAG_PROVIDER]" % (self.whid) + self.logger = system.util.getLogger("%s-Web-Socket-Listener" % (whid)) + + def onOpen(self, websocket): + on_open_subscribe = json.dumps({"action":"subscribe", + "parameters":{"siteId":self.whid}} + ) + websocket.sendText(on_open_subscribe, True) + logger = system.util.getLogger("Web-Socket-OnOpen") + logger.info("message sent =" + str(on_open_subscribe)) + + + def onText(self, websocket, data, last): + # + alarm_message = None + + try: + json_data = json.loads(str(data)) + alarm_message = json_data.get("type") + + except ValueError as e: + self.logger.info("Unable to load Json object, malformed message") + + + if alarm_message == "alarm": + + + id = json_data.get("sourceId") + state = json_data.get("state") + + if state == 1: + removed_value = self.alarms.pop(id, "No key found") + + else: + self.alarms[id]= json_data + self.logger.info("this has been triggered") + self.logger.info("State is equal to " + str(state)) + system.tag.writeBlocking([self.tag_provider + "System/aws_data"], + [system.util.jsonEncode(self.alarms)] + ) + self.logger.info("Data written to tag : " + str(self.alarms)) + + self.logger.info("Response from server: " + str(data)) + websocket.request(1) +# return None + + def onClose(self, websocket, error): +# print("Socket is closed") +# logger = system.util.getLogger("OnClose-Web-Socket") + self.logger.info("Onclose method closed " + str(error)) + + def onError(self, websocket, error): +# logger = system.util.getLogger("OnError-Web-Socket") + self.logger.info("OnError method closed " + str(error)) + diff --git a/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/web_socket/resource.json b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/web_socket/resource.json new file mode 100644 index 0000000..a3e5d38 --- /dev/null +++ b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/web_socket/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol@amazon.co.uk", + "timestamp": "2022-07-04T10:32:46Z" + }, + "lastModificationSignature": "ae3435d877ea0400d1c1e7bbecff127e6f6729cacc114a8287b80618e070f9ec" + } +} \ No newline at end of file diff --git a/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/web_socket_send/code.py b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/web_socket_send/code.py new file mode 100644 index 0000000..ea2f59a --- /dev/null +++ b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/web_socket_send/code.py @@ -0,0 +1,21 @@ +import json + +class SendMessage(): + + def __init__(self, whid): + self.whid = whid + tag_path = "[%s_SCADA_TAG_PROVIDER]System/wbsckt_messages_send" % (whid) + tags_to_read = system.tag.readBlocking([tag_path]) + self.messages_to_send = system.util.jsonDecode(tags_to_read[0].value) + system.tag.writeBlocking([tag_path],[system.util.jsonEncode({})]) + self.message_list ={} + + def build_message_list(self): + if self.messages_to_send: + self.message_list = json.dumps(self.messages_to_send) + else: + self.message_list = None + + + + diff --git a/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/web_socket_send/resource.json b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/web_socket_send/resource.json new file mode 100644 index 0000000..90ceb9e --- /dev/null +++ b/AMZL_PERSPECTIVE_PARENT_PROJECT/ignition/script-python/AWS/web_socket_send/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol@amazon.co.uk", + "timestamp": "2022-07-04T10:32:46Z" + }, + "lastModificationSignature": "32b06c82eacdc4b8bb650647598d50f33a9a8d9a42ef0d48d4660d227ed492c0" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/page-config/config.json b/com.inductiveautomation.perspective/page-config/config.json new file mode 100644 index 0000000..59f5b90 --- /dev/null +++ b/com.inductiveautomation.perspective/page-config/config.json @@ -0,0 +1,119 @@ +{ + "pages": { + "/": { + "title": "", + "viewPath": "Main-Views/Home" + }, + "/Command": { + "title": "", + "viewPath": "Main-Views/CommandControl" + }, + "/CustomView/:customView": { + "title": "", + "viewPath": "Custom-Views/Detail" + }, + "/DetailedView/:detailedView/:plcTagPath": { + "title": "DetailedView", + "viewPath": "Detailed-Views/Detail" + }, + "/Device-manager": { + "viewPath": "Main-Views/Device-Manager/DeviceManager" + }, + "/Help": { + "title": "Help", + "viewPath": "Main-Views/Help" + }, + "/MAP-Home": { + "title": "", + "viewPath": "Additional-Home-View/MAP-Home" + }, + "/Monitron": { + "viewPath": "Main-Views/Monitron" + }, + "/Oil": { + "viewPath": "Main-Views/OilMonitoring" + }, + "/Real-Time": { + "viewPath": "Alarm-Views/RealTime" + }, + "/Temperature": { + "title": "", + "viewPath": "Main-Views/TempMonitoring" + }, + "/Tools": { + "title": "Tools", + "viewPath": "Main-Views/ToolBox" + }, + "/config": { + "title": "", + "viewPath": "CommissioningTool/PageConfig" + } + }, + "sharedDocks": { + "bottom": [ + { + "anchor": "fixed", + "autoBreakpoint": 480, + "content": "cover", + "handle": "show", + "iconUrl": "material/notifications_active", + "id": "Docked-South", + "modal": false, + "resizable": false, + "show": "onDemand", + "size": 165, + "viewParams": {}, + "viewPath": "Navigation-Views/Docked-South" + } + ], + "cornerPriority": "top-bottom", + "left": [ + { + "anchor": "fixed", + "autoBreakpoint": 805, + "content": "auto", + "handle": "autoHide", + "iconUrl": "", + "id": "Docked-West", + "modal": false, + "resizable": false, + "show": "auto", + "size": 70, + "viewParams": {}, + "viewPath": "Navigation-Views/Docked-West" + } + ], + "right": [ + { + "anchor": "fixed", + "autoBreakpoint": 480, + "content": "cover", + "handle": "hide", + "iconUrl": "", + "id": "Docked-East", + "modal": false, + "resizable": false, + "show": "onDemand", + "size": 400, + "viewParams": {}, + "viewPath": "PopUp-Views/Controller-Equipment/Information-Docked-East" + } + ], + "top": [ + { + "anchor": "fixed", + "autoBreakpoint": 480, + "content": "auto", + "handle": "hide", + "iconUrl": "", + "id": "", + "modal": false, + "resizable": false, + "show": "visible", + "size": 50, + "viewParams": {}, + "viewPath": "Framework/Breakpoint" + } + ] + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/page-config/resource.json b/com.inductiveautomation.perspective/page-config/resource.json new file mode 100644 index 0000000..c01f403 --- /dev/null +++ b/com.inductiveautomation.perspective/page-config/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "config.json" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-26T14:18:40Z" + }, + "lastModificationSignature": "69d02759e0c143ac5bb897cbb32c2b40c7df3fa86441d88df4ad94c0f322a807" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/session-permissions/data.bin b/com.inductiveautomation.perspective/session-permissions/data.bin new file mode 100644 index 0000000..923c43f --- /dev/null +++ b/com.inductiveautomation.perspective/session-permissions/data.bin @@ -0,0 +1,9 @@ +{ + "type": "AllOf", + "securityLevels": [ + { + "name": "Authenticated", + "children": [] + } + ] +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/session-permissions/resource.json b/com.inductiveautomation.perspective/session-permissions/resource.json new file mode 100644 index 0000000..3dfa3c1 --- /dev/null +++ b/com.inductiveautomation.perspective/session-permissions/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "data.bin" + ], + "attributes": { + "lastModification": { + "actor": "pllincol@amazon.co.uk", + "timestamp": "2022-10-19T10:50:09Z" + }, + "lastModificationSignature": "4fa93d130e77471f2b4efa02f2ce5678c1f4cca44bcb78c5f4e622344e3716c6" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/session-props/props.json b/com.inductiveautomation.perspective/session-props/props.json new file mode 100644 index 0000000..2cea4ed --- /dev/null +++ b/com.inductiveautomation.perspective/session-props/props.json @@ -0,0 +1,223 @@ +{ + "custom": { + "alarm_filter": { + "magnificaiton": "x2", + "orderby": false, + "show_diagnostic": true, + "show_gateways": true, + "show_low_alarm": true, + "show_map": true, + "show_running": true, + "show_safety": true + }, + "alarms": [], + "aws": { + "prefix": "eu", + "region": "eu-west-1" + }, + "colours": { + "Fallback": "#00FF00", + "colour_impaired": false, + "state0": "#8C8C8C", + "state1": "#FF0000", + "state6": "#CCCCFF" + }, + "command_auth": { + "auth_time": { + "$": [ + "ts", + 192, + 1674052360661 + ], + "$ts": 1674052360661 + }, + "enabled": false, + "timeout_sp": 500 + }, + "covert": true, + "deviceSearchId": "", + "download_url": "https://scadacloud-storage-prod-downloadbucketdc1a1095-17r7vrw051y3t.s3.amazonaws.com/history/DNG2/58b56f26-c115-41b5-badb-a3394f312630-1672826106.csv?AWSAccessKeyId\u003dASIAVDEI3U6Y3J5KB2NA\u0026Signature\u003dzucRF2nCigK4y5M%2BNbjoI06UUng%3D\u0026x-amz-security-token\u003dIQoJb3JpZ2luX2VjEKL%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCWV1LXdlc3QtMSJIMEYCIQCy78peP6YRJ1gyf9RROmmcfk%2BRHyPhxv6ejHJgyEG0KQIhALXnJXYIyDiWzr9vxehoDIa2c7sx818gUyuiFXYY6rb2KsoDCOv%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQABoMMzUwMzI2ODU5Njk3IgzVrdKyNsVjl%2BNjqWQqngOJCTFOLVppHMmo1otgHZCXlVISlnBz6rz6ykr8SHgGQPc0EsaL9a1I0oQmS42i%2BlRHpEpQfMdjUbP3dr2OnVKXmopkkUJZ592SPzA3MZzS95SHXMvbbPDs0OAw5mKdS6LHQAQb90ZdQdeoEj%2FG1bPEIiifVT07PhHMA0JMS7ExgXmHzq1c6W%2Fjc%2BdfQOjl41qnWcE1GH5MaVfU%2FOKW5PffN6pLf%2BJ61YjjbXqPIpPHimJSGqMI5BmFzAfSlsYAtgFT8bMyJhbUDaPlDF7X42SSYLs1CeAbddPFMvrhDIUk%2BYTA3oV69SMjX91LrKBNqRhFS%2F0R4U8nbA4rSd%2BhMkdr5RSwa9Q22ZQpbzuqQU1H%2B4oQy6419lQg3lkBF5SBNGdvQajD6mav2ipHYe7OkX5GKq2pNzBLzJsqGGnsJvISB83ShA6SnuiZFx%2F2LXvDtEu3jTCS4yRjDegxiKRBs%2FiwH0dN2ztb8a3vnSJN0EqaoORf2eVb%2BozzAv1EBaqnUEZZAoOKb8iaxpbZtqLaUNOOd7VsHsUPoBQRkKqH2RAw95nVnQY6nQFAgIr2YAjgyrsuAfVgr2b41jc3Dj83zJ6I9LI%2BglDMgQFyfL0RNPmoxEu3DDfq5yLy8MtiPlYcs71J3J8Z%2B7xIkH%2BIPWKwmKLsvaEtN7Io1kOfvFgEcMhhIPRwwEj70AVokPncUQ8HtKQhXnq7l1YZ4yyAw2poT%2Ff%2FgJwv7suOu2dZeh%2BH%2B9OwE4M%2BRmVoFO7tTWIakPgODw2ZFzqs\u0026Expires\u003d1672829705", + "enable_activity_logging": false, + "fc": "", + "id_to_state": "{\"PLC01/0820_06_09\":1,\"PLC02/0820_91_16/B4510\":1,\"PLC03/0820_82_04/B312_3\":1,\"PLC09/0120_33_01/B425_0\":1,\"PLC09/1210_03_27\":3,\"PLC02/0820_07_39_BT1\":1,\"ARSAW1501/05_10/B12_6\":3,\"PLC09/0110_13_40\":1,\"FSC10/TRZ_0850_01/CAS_0850_01_0299\":2,\"PLC02/0820_05_31/B4000_2\":1,\"PLC09/1210_03_30\":3,\"PLC09/1210_03_36\":3,\"PLC1000/1000_43_01\":1,\"PLC09/0120_35_18/B505_2\":1,\"PLC02/0820_05_20/B3804_6\":1,\"PLC01/0820_06_05\":1,\"PLC01/0820_06_07\":1,\"PLC1000/1000_22_02/B501_3\":1,\"PLC01/0820_01_41/B6103_2\":1,\"PLC1000/1000_42_04/B517_7\":1,\"PLC09/2210_08_60/B911_1\":1,\"PLC02/0820_05_06/B3702_6\":1,\"PLC09/2210_08_60/B911_5\":1,\"PLC09/0110_23_40/B304_2\":1,\"PLC09/1210_02_01/B705_0\":1,\"PLC09/1210_03_25\":3,\"PLC01/0820_01_75/B6401_6\":1,\"PLC01/0820_64_03\":1,\"PLC02/0820_07_29_BT1/TN12A\":1,\"PLC02/0820_05_03/B3701_2\":1,\"PLC01/0820_06_14\":1,\"PLC09/2210_03_45/B1007_4\":1,\"PLC01/0820_06_17\":1,\"PLC01/0820_06_18\":1,\"FSC10/OFZ_0850_31/CH_0850_31_06\":2,\"FSC10/OFZ_0850_31/CH_0850_31_07\":2,\"FSC10/OFZ_0850_31/CH_0850_31_04\":2,\"FSC10/OFZ_0850_31/CH_0850_31_05\":2,\"FSC10/OFZ_0850_31/CH_0850_31_08\":2,\"FSC10/OFZ_0850_31/CH_0850_31_09\":2,\"PLC09/1210_03_06\":3,\"PLC09/1210_03_04\":3,\"PLC02/0820_05_41/B4100_2\":1,\"FSC10/OFZ_0850_31/CH_0850_31_02\":2,\"PLC02/0820_91_08/B4318\":1,\"FSC10/OFZ_0850_31/CH_0850_31_03\":2,\"FSC10/OFZ_0850_31/CH_0850_31_01\":2,\"FSC10/TRZ_0850_01/CAS_0850_01_0148\":3,\"PLC02/0820_01_07\":1,\"PLC09/1210_03_13\":3,\"PLC09/1210_03_12\":1,\"PLC26/0513_11_02/B118_1\":3,\"PLC09/0120_52_23/B528_6\":1,\"PLC09/0120_51_01/B510_0\":1,\"ARSAW1303\":3,\"PLC09/2210_02_01\":1,\"PLC09/1210_02_30\":3,\"PLC1000/1000_42_04\":1,\"PLC09/1210_03_02\":3,\"PLC1000/1000_43_01/B525_0\":1,\"PLC26/0513_31_30/M1\":3,\"PLC01/0820_02_02/B6500_6\":1,\"FSC10/OFZ_0850_31/CH_0850_31_28\":2,\"FSC10/OFZ_0850_31/CH_0850_31_29\":2,\"FSC10/OFZ_0850_31/CH_0850_31_26\":2,\"PLC09/0110_23_40\":1,\"PLC01/0820_01_47/B6200_6\":1,\"FSC10/OFZ_0850_52/CH_0850_52_01\":2,\"FSC10/OFZ_0850_31/CH_0850_31_27\":2,\"FSC10/OFZ_0850_31/CH_0850_31_20\":2,\"FSC10/OFZ_0850_31/CH_0850_31_21\":2,\"FSC10/OFZ_0850_31/CH_0850_31_24\":2,\"FSC10/OFZ_0850_31/CH_0850_31_25\":2,\"FSC10/OFZ_0850_31/CH_0850_31_22\":2,\"FSC10/OFZ_0850_31/CH_0850_31_23\":2,\"FSC10/IFZ_0850_68/PCO_0850_68_98\":2,\"PLC09/0120_33_10\":1,\"PLC09/2210_09_60\":1,\"PLC09/0110_01_20\":1,\"FSC10/OFZ_0850_31/CH_0850_31_17\":2,\"FSC10/OFZ_0850_31/CH_0850_31_18\":2,\"FSC10/OFZ_0850_31/CH_0850_31_15\":2,\"FSC10/OFZ_0850_31/CH_0850_31_16\":2,\"FSC10/OFZ_0850_31/CH_0850_31_19\":2,\"PLC09/0120_52_08/B526_7\":1,\"FSC10/OFZ_0850_31/CH_0850_31_10\":2,\"PLC02/0820_91_14/B4422\":1,\"FSC10/OFZ_0850_31/CH_0850_31_13\":2,\"FSC10/OFZ_0850_31/CH_0850_31_14\":2,\"FSC10/OFZ_0850_31/CH_0850_31_11\":2,\"FSC10/OFZ_0850_31/CH_0850_31_12\":2,\"FSC10/TRZ_0850_01/CAS_0850_01_0147\":3,\"PLC01/0820_06_05/B6902_2\":1,\"FSC10/OFZ_0850_51/CH_0850_51_50\":2,\"PLC09/0120_33_01\":1,\"PLC09/1210_03_60\":3,\"FSC10/OFZ_0850_31/CH_0850_31_48\":2,\"FSC10/OFZ_0850_31/CH_0850_31_49\":2,\"PLC01/0820_02_04/B6501_6\":1,\"FSC10/OFZ_0850_31/CH_0850_31_42\":2,\"PLC02/0820_07_09_BT1\":1,\"FSC10/OFZ_0850_51/CH_0850_51_43\":2,\"PLC01/0820_03_18/B6802_6\":1,\"FSC10/OFZ_0850_31/CH_0850_31_43\":2,\"PLC09/1210_03_48\":3,\"FSC10/OFZ_0850_31/CH_0850_31_40\":2,\"FSC10/OFZ_0850_51/CH_0850_51_41\":2,\"FSC10/OFZ_0850_31/CH_0850_31_41\":2,\"PLC02/0820_91_18/B4518\":1,\"FSC10/OFZ_0850_31/CH_0850_31_46\":2,\"FSC10/OFZ_0850_31/CH_0850_31_47\":2,\"FSC10/OFZ_0850_51/CH_0850_51_44\":2,\"FSC10/OFZ_0850_31/CH_0850_31_44\":2,\"FSC10/OFZ_0850_31/CH_0850_31_45\":2,\"PLC01/0820_55_03/B420_1\":1,\"FSC10/OFZ_0850_31/CH_0850_31_39\":2,\"FSC10/OFZ_0850_31/CH_0850_31_37\":2,\"FSC10/OFZ_0850_31/CH_0850_31_38\":2,\"PLC09/1210_03_39\":3,\"FSC10/OFZ_0850_31/CH_0850_31_31\":2,\"FSC10/OFZ_0850_31/CH_0850_31_32\":2,\"PLC09/0120_32_02\":1,\"FSC10/OFZ_0850_31/CH_0850_31_30\":2,\"PLC09/0120_35_10/B504_1\":1,\"FSC10/OFZ_0850_31/CH_0850_31_35\":2,\"PLC09/2210_02_01/B905_0\":1,\"PLC09/0110_23_40/B305_1\":1,\"ARSAW1501\":3,\"PLC09/0110_23_40/B305_0\":1,\"FSC10/OFZ_0850_31/CH_0850_31_36\":2,\"FSC10/OFZ_0850_31/CH_0850_31_33\":2,\"PLC09/0110_23_40/B305_2\":1,\"FSC10/OFZ_0850_31/CH_0850_31_34\":2,\"PLC09/1210_03_42\":3,\"PLC01/0820_06_07/B6903_2\":1,\"PLC26/0513_11_02\":3,\"PLC09/1210_03_45\":3,\"PLC09/0120_32_11\":1,\"ARSAW1303/05_22\":3,\"PLC09/0110_01_20/B102_3\":1,\"PLC09/0110_01_20/B102_2\":1,\"PLC09/2210_03_45\":1,\"PLC01/0820_01_73/B6400_6\":1,\"PLC02/0820_07_49_BT1\":1,\"PLC80/0632_05_40/B113_3\":1,\"PLC80/0632_05_40/B113_4\":1,\"PLC26/S01/A902\":4,\"PLC80/0632_05_40/B113_5\":1,\"PLC26/S01/A901\":4,\"PLC26/0513_31_23\":3,\"PLC09/0120_43_01\":1,\"PLC80/0632_05_40/B113_2\":1,\"PLC80/0632_01_07/B103_6\":1,\"PLC14/0580_01_01\":3,\"PLC09/0120_51_08/B510_7\":1,\"PLC09/0120_41_20/B521_3\":1,\"PLC26/0513_31_19\":3,\"PLC01/0820_02_05/B6502_2\":1,\"PLC02/0820_07_29_BT1\":1,\"PLC02/0820_91_12/B4414\":1,\"PLC82/0640_21_02/BT1\":1,\"PLC01/0820_02_01/B6500_2\":1,\"FSC10/OFZ_0850_53/CH_0850_53_02\":2,\"PLC81/0631_05_40/B113_5\":1,\"PLC02/0820_91_13/B4418\":1,\"PLC09/1210_02_30/M1\":3,\"PLC81/0631_05_40/B113_4\":1,\"PLC81/0631_05_40/B113_3\":1,\"FSC10/OFZ_0850_55/CH_0850_55_04\":2,\"PLC1000/1000_22_02\":1,\"PLC69/0330_07_20/B118_4\":1,\"FSC10/OFZ_0850_55/CH_0850_55_02\":2,\"FSC10/OFZ_0850_55/CH_0850_55_03\":2,\"PLC69/0330_07_20/B118_3\":1,\"PLC16/0580_21_01\":3,\"PLC01/0820_01_43/B6104_2\":1,\"PLC1000/1000_33_12\":1,\"PLC01/0820_55_03\":1,\"PLC27/0514_04_20/B106_5\":1,\"PLC09/2210_04_22\":1,\"PLC02/0820_05_14/B3801_6\":1,\"PLC26/0513_31_30\":3,\"PLC26/0513_32_01\":3,\"PLC09/1210_03_27/B805_2\":3,\"PLC02/0820_05_24/B3901_6\":1,\"PLC09/1210_03_04/B802_3\":3,\"PLC82/0640_21_03\":1,\"PLC82/0640_21_04\":1,\"PLC82/0640_21_01\":1,\"PLC26/0513_31_23/B320_6\":3,\"PLC82/0640_21_02\":1,\"FSC10/OFZ_0850_53/CH_0850_53_20\":2,\"FSC10/TRZ_0850_01/CAS_0850_01_1180\":3,\"PLC02/0820_91_06/B4310\":1,\"PLC09/0110_21_20\":1,\"PLC1000/1000_33_01\":1,\"FSC10/OFZ_0850_53/CH_0850_53_29\":2,\"FSC10/OFZ_0850_53/CH_0850_53_26\":2,\"PLC01/0820_01_71/B6306_6\":1,\"PLC09/0120_35_26/B506_2\":1,\"PLC09/0120_51_01\":1,\"PLC09/0120_51_08\":1,\"PLC09/0120_41_14/B520_5\":1,\"PLC09/0120_41_20\":1,\"PLC09/0120_32_11/B423_2\":1,\"PLC82/0640_21_01/BT1\":1,\"PLC09/1210_09_60/M1\":3,\"PLC80/0632_05_40\":1,\"PLC09/0120_41_14\":1,\"FSC10\":4,\"PLC01/0820_57_03\":1,\"PLC02/0820_05_02/B3700_6\":1,\"PLC09/0120_51_15\":1,\"PLC02/0820_91_51/B5210\":1,\"PLC27/0514_04_20\":1,\"PLC09/1210_03_45/B807_4\":3,\"PLC09/1210_03_39/B806_6\":3,\"PLC01/0820_57_03/B421_1\":1,\"PLC09/0120_41_08\":1,\"PLC02/0820_91_52/B5214\":1,\"PLC09/0120_51_23\":1,\"PLC09/2210_03_12\":1,\"FSC10/TRZ_0850_01/CAS_0850_01_1174\":3,\"PLC09/0120_52_15/B527_6\":1,\"PLC01/0820_01_77/B6402_6\":1,\"PLC01/0820_06_18/B7003_6\":1,\"PLC02/0820_91_02/B4214\":1,\"FSC10/OFZ_0850_33/CH_0850_33_21\":2,\"PLC26/0513_31_19/B320_2\":3,\"FSC10/OFZ_0850_33/CH_0850_33_25\":2,\"PLC09/0120_52_01\":1,\"PLC02/0820_91_53/B5218\":1,\"FSC10/OFZ_0850_75\":2,\"FSC10/OFZ_0850_73\":2,\"PLC09/0120_52_08\":1,\"PLC01/0820_02_03/B6501_2\":1,\"PLC09/2210_07_01\":1,\"FSC10/OFZ_0850_54/CH_0850_54_08\":2,\"PLC01/0820_06_14/B7001_6\":1,\"FSC10/OFZ_0850_54/CH_0850_54_06\":2,\"FSC10/OFZ_0850_54/CH_0850_54_03\":2,\"PLC82/0640_21_04/BT1\":1,\"FSC10/MAZ_0850_98/CCO_0850_98_98\":3,\"PLC09/0120_52_15\":1,\"PLC02/0820_07_19_BT1/TN8A\":1,\"FSC10/OFZ_0850_33/CH_0850_33_13\":2,\"PLC02/0820_04_28/B3601_6\":1,\"FSC10/OFZ_0850_33/CH_0850_33_14\":2,\"FSC10/OFZ_0850_33/CH_0850_33_12\":2,\"PLC01/0820_06_09/B6904_2\":1,\"PLC09/2210_06_29\":1,\"FSC10/OFZ_0850_33/CH_0850_33_15\":2,\"PLC09/2210_03_12/B1003_3\":1,\"PLC81/0631_05_40\":1,\"FSC10/OFZ_0850_33/CH_0850_33_19\":2,\"FSC10/OFZ_0850_54/CH_0850_54_19\":2,\"PLC02/0820_07_39_BT1/TN16A\":1,\"FSC10/OFZ_0850_54/CH_0850_54_17\":2,\"PLC69\":1,\"PLC09/2210_09_60/B912_5\":1,\"PLC09/0120_52_23\":1,\"PLC02/0820_05_41\":1,\"PLC01/0820_01_49/B6201_6\":1,\"FSC10/OFZ_0850_55\":2,\"PLC09/2210_07_27\":1,\"FSC10/OFZ_0850_54\":2,\"FSC10/OFZ_0850_33/CH_0850_33_05\":2,\"FSC10/OFZ_0850_53\":2,\"PLC01/0820_64_03/B425_5\":1,\"FSC10/OFZ_0850_52\":2,\"FSC10/OFZ_0850_51\":2,\"PLC02/0820_07_19_BT1\":1,\"FSC10/OFZ_0850_75/CH_0850_75_08\":2,\"FSC10/OFZ_0850_54/CH_0850_54_20\":2,\"PLC02/0820_91_07/B4314\":1,\"PLC69/0330_09_30\":1,\"PLC69/0330_09_30/B120_2\":1,\"PLC69/0330_09_30/B120_4\":1,\"PLC07/0320_31_20/B520_1\":1,\"PLC80\":1,\"PLC09/0120_51_15/B511_6\":1,\"FSC10/MAZ_0850_98\":3,\"PLC03\":1,\"PLC01/0820_02_04\":1,\"PLC01/0820_02_03\":1,\"PLC01/0820_02_13/B6600_2\":1,\"PLC09/2210_04_22/B1011_5\":1,\"PLC01\":1,\"PLC01/0820_02_02\":1,\"PLC01/0820_02_01\":1,\"PLC02\":1,\"PLC07\":1,\"PLC02/0820_05_20\":1,\"FSC10/OFZ_0850_33\":2,\"FSC10/OFZ_0850_32\":2,\"FSC10/OFZ_0850_31\":2,\"PLC02/0820_05_24\":1,\"PLC02/0820_05_27\":1,\"PLC82/0640_21_03/BT1\":1,\"PLC09\":3,\"PLC01/0820_02_05\":1,\"PLC14\":3,\"PLC01/0820_01_47\":1,\"PLC01/0820_01_46\":1,\"PLC01/0820_02_13\":1,\"ARSAW1501/05_10\":3,\"PLC01/0820_06_17/B7003_2\":1,\"PLC01/0820_01_43\":1,\"PLC02/0820_91_17/B4514\":1,\"PLC01/0820_71_03/B428_1\":1,\"PLC01/0820_01_41\":1,\"PLC16\":3,\"PLC02/0820_05_31\":1,\"PLC1000/1000_12_02/B308_7\":1,\"PLC01/0820_01_50/B6202_2\":1,\"PLC01/0820_59_03/B422_1\":1,\"PLC09/1210_03_60/M1\":3,\"PLC03/0820_82_04\":1,\"PLC01/0820_01_49\":1,\"PLC26\":4,\"PLC01/0820_02_20\":1,\"PLC27\":1,\"PLC01/0820_71_03\":1,\"PLC01/0820_01_50\":1,\"PLC02/0820_05_03\":1,\"PLC02/0820_05_02\":1,\"PLC02/0820_91_28/B4718\":1,\"PLC02/0820_91_33/B4818\":1,\"PLC02/0820_05_06\":1,\"PLC1000/1000_12_02\":1,\"PLC80/0632_03_01/B106_0\":1,\"PLC02/0820_91_15/B4430\":1,\"PLC01/0820_03_07\":1,\"PLC01/0820_03_08\":1,\"PLC01/0820_01_63\":1,\"PLC02/0820_05_14\":1,\"ARSAW1303/05_22/B11_4\":3,\"PLC02/0820_05_15\":1,\"PLC09/2210_06_02\":1,\"PLC01/0820_59_03\":1,\"PLC09/0120_51_23/B512_6\":1,\"PLC09/1210_03_12/B803_3\":1,\"PLC09/1210_03_06/B802_5\":3,\"PLC09/2210_07_01/B1025_0\":1,\"PLC01/0820_03_18\":1,\"PLC01/0820_03_07/B6703_2\":1,\"FSC10/OFZ_0850_32/CH_0850_32_03\":2,\"PLC01/0820_01_79\":1,\"PLC09/0120_41_08/B519_7\":1,\"PLC01/0820_01_77\":1,\"PLC02/0820_91_18\":1,\"PLC02/0820_91_17\":1,\"PLC01/0820_01_75\":1,\"PLC02/0820_91_16\":1,\"PLC01/0820_01_73\":1,\"PLC02/0820_91_15\":1,\"PLC02/0820_91_14\":1,\"FSC10/OFZ_0850_31/CH_0850_31_64\":2,\"PLC01/0820_01_71\":1,\"FSC10/OFZ_0850_31/CH_0850_31_65\":2,\"PLC02/0820_91_13\":1,\"PLC02/0820_91_12\":1,\"FSC10/OFZ_0850_31/CH_0850_31_62\":2,\"FSC10/OFZ_0850_31/CH_0850_31_63\":2,\"FSC10/OFZ_0850_32/CH_0850_32_09\":2,\"FSC10/OFZ_0850_32/CH_0850_32_06\":2,\"FSC10/OFZ_0850_31/CH_0850_31_68\":2,\"FSC10/OFZ_0850_31/CH_0850_31_69\":2,\"FSC10/OFZ_0850_31/CH_0850_31_66\":2,\"PLC26/S01\":4,\"FSC10/OFZ_0850_31/CH_0850_31_67\":2,\"FSC10/TRZ_0850_01/CAS_0850_01_0694\":3,\"FSC10/OFZ_0850_31/CH_0850_31_60\":2,\"FSC10/OFZ_0850_31/CH_0850_31_61\":2,\"PLC02/0820_07_49_BT1/TN20A\":1,\"PLC02/0820_91_36/B4910\":1,\"FSC10/OFZ_0850_32/CH_0850_32_13\":2,\"FSC10/OFZ_0850_32/CH_0850_32_14\":2,\"FSC10/OFZ_0850_31/CH_0850_31_59\":2,\"FSC10/OFZ_0850_32/CH_0850_32_12\":2,\"PLC02/0820_91_08\":1,\"PLC02/0820_91_07\":1,\"FSC10/OFZ_0850_73/CH_0850_73_13\":2,\"PLC02/0820_91_06\":1,\"FSC10/OFZ_0850_32/CH_0850_32_10\":2,\"PLC80/0632_03_06/B106_5\":1,\"FSC10/OFZ_0850_73/CH_0850_73_11\":2,\"PLC09/2210_07_27/B1028_2\":1,\"FSC10/OFZ_0850_31/CH_0850_31_53\":2,\"PLC02/0820_91_02\":1,\"FSC10/OFZ_0850_31/CH_0850_31_54\":2,\"FSC10/OFZ_0850_73/CH_0850_73_18\":2,\"FSC10/OFZ_0850_31/CH_0850_31_51\":2,\"FSC10/OFZ_0850_73/CH_0850_73_15\":2,\"PLC02/0820_05_27/B3903_2\":1,\"FSC10/OFZ_0850_31/CH_0850_31_52\":2,\"FSC10/OFZ_0850_32/CH_0850_32_17\":2,\"PLC02/0820_04_28\":1,\"FSC10/OFZ_0850_31/CH_0850_31_57\":2,\"FSC10/OFZ_0850_31/CH_0850_31_58\":2,\"FSC10/OFZ_0850_32/CH_0850_32_18\":2,\"FSC10/OFZ_0850_32/CH_0850_32_15\":2,\"FSC10/OFZ_0850_73/CH_0850_73_19\":2,\"FSC10/OFZ_0850_31/CH_0850_31_55\":2,\"FSC10/OFZ_0850_31/CH_0850_31_56\":2,\"PLC07/0320_31_20\":1,\"FSC10/OFZ_0850_32/CH_0850_32_16\":2,\"FSC10/OFZ_0850_31/CH_0850_31_50\":2,\"PLC26/0513_03_10/B104_7\":3,\"PLC02/0820_01_07/B3103_2\":1,\"PLC69/0330_07_20\":1,\"FSC10/OFZ_0850_73/CH_0850_73_02\":2,\"FSC10/OFZ_0850_73/CH_0850_73_03\":2,\"FSC10/OFZ_0850_73/CH_0850_73_01\":2,\"PLC02/0820_91_36\":1,\"FSC10/OFZ_0850_73/CH_0850_73_04\":2,\"PLC02/0820_91_33\":1,\"PLC09/0110_13_40/B204_2\":1,\"FSC10/IFZ_0850_68\":2,\"PLC26/0513_03_10\":3,\"FSC10/OFZ_0850_31/CH_0850_31_80\":2,\"PLC09/1210_03_48/B807_7\":3,\"PLC80/0632_03_06\":1,\"PLC02/0820_91_28\":1,\"PLC09/2210_08_60\":1,\"PLC80/0632_03_01\":1,\"FSC10/OFZ_0850_31/CH_0850_31_75\":2,\"FSC10/OFZ_0850_31/CH_0850_31_76\":2,\"FSC10/OFZ_0850_31/CH_0850_31_73\":2,\"FSC10/OFZ_0850_31/CH_0850_31_74\":2,\"FSC10/OFZ_0850_31/CH_0850_31_79\":2,\"FSC10/TRZ_0850_01/CAS_0850_01_0557\":3,\"PLC1000/1000_33_12/B419_3\":1,\"FSC10/OFZ_0850_32/CH_0850_32_37\":2,\"FSC10/TRZ_0850_01/CAS_0850_01_0556\":3,\"FSC10/OFZ_0850_31/CH_0850_31_77\":2,\"FSC10/OFZ_0850_31/CH_0850_31_78\":2,\"FSC10/TRZ_0850_01/CAS_0850_01_0565\":2,\"FSC10/TRZ_0850_01/CAS_0850_01_0564\":2,\"FSC10/OFZ_0850_31/CH_0850_31_71\":2,\"FSC10/OFZ_0850_31/CH_0850_31_72\":2,\"FSC10/TRZ_0850_01/CAS_0850_01_0680\":3,\"FSC10/OFZ_0850_31/CH_0850_31_70\":2,\"PLC02/0820_05_15/B3802_2\":1,\"PLC09/0120_33_10/B426_1\":1,\"PLC09/1210_09_60\":3,\"FSC10/OFZ_0850_32/CH_0850_32_47\":2,\"PLC09/0120_35_26\":1,\"PLC81\":1,\"PLC82\":1,\"FSC10/TRZ_0850_01/CAS_0850_01_0891\":4,\"PLC09/1210_03_30/B805_5\":3,\"PLC09/0110_13_40/B205_1\":1,\"PLC02/0820_91_53\":1,\"PLC09/0110_13_40/B205_0\":1,\"PLC02/0820_91_52\":1,\"PLC09/0110_13_40/B205_2\":1,\"PLC02/0820_91_51\":1,\"PLC09/2210_06_02/B1018_1\":1,\"FSC10/TRZ_0850_01\":4,\"PLC80/0632_01_07\":1,\"PLC09/0110_03_40\":1,\"PLC1000/1000_33_01/B418_0\":1,\"FSC10/OFZ_0850_32/CH_0850_32_54\":2,\"PLC09/0120_35_18\":1,\"FSC10/TRZ_0850_01/CAS_0850_01_0780\":2,\"PLC09/0110_03_40/B105_2\":1,\"PLC09/0110_03_40/B105_0\":1,\"PLC01/0820_01_79/B6403_6\":1,\"PLC09/0110_03_40/B105_1\":1,\"PLC26/0513_32_01/B405_4\":3,\"FSC10/TRZ_0850_01/CAS_0850_01_0300\":2,\"FSC10/TRZ_0850_01/CAS_0850_01_0779\":2,\"PLC09/1210_03_13/B803_4\":3,\"FSC10/OFZ_0850_33/CH_0850_33_43\":2,\"PLC01/0820_01_46/B6200_2\":1,\"PLC09/0110_21_20/B302_3\":1,\"PLC09/0110_21_20/B302_2\":1,\"PLC1000\":1,\"PLC09/0120_35_10\":1,\"PLC09/1210_03_36/B806_3\":3,\"PLC09/1210_02_01\":1,\"PLC09/1210_03_42/B807_1\":3,\"PLC09/2210_06_29/B1021_4\":1,\"PLC09/0120_32_02/B422_1\":1,\"PLC09/0110_03_40/B104_2\":1,\"PLC09/1210_03_25/B805_0\":3,\"PLC02/0820_07_09_BT1/TN4A\":1,\"PLC01/0820_01_63/B6302_6\":1,\"PLC01/0820_02_20/B6603_6\":1,\"PLC09/1210_03_02/B802_1\":3,\"PLC26/S01/A999\":4,\"PLC09/0120_52_01/B526_0\":1,\"PLC01/0820_03_08/B6703_6\":1}", + "page_id": "value", + "product_metrics": { + "enable": true + }, + "searchId": "PLC01", + "sources": [], + "view_in_focus": "/" + }, + "propConfig": { + "custom.alarmId": { + "persistent": false + }, + "custom.colours.state2": { + "binding": { + "config": { + "expression": "if({this.custom.colours.colour_impaired},\u0027#F00077\u0027,\u0027#FF8000\u0027)" + }, + "type": "expr" + } + }, + "custom.colours.state3": { + "binding": { + "config": { + "expression": "if({this.custom.colours.colour_impaired},\u0027#FF6000\u0027,\u0027#FFFF00\u0027)" + }, + "type": "expr" + } + }, + "custom.colours.state4": { + "binding": { + "config": { + "expression": "if({this.custom.colours.colour_impaired},\u0027#FCC400\u0027,\u0027#007EFC\u0027)" + }, + "type": "expr" + } + }, + "custom.colours.state5": { + "binding": { + "config": { + "expression": "if({this.custom.colours.colour_impaired},\u0027#007DFA\u0027,\u0027#00CC00\u0027)" + }, + "type": "expr" + } + }, + "custom.command_auth.auth_timeout": { + "binding": { + "config": { + "expression": "if({this.custom.command_auth.enabled},toInt(dateDiff({this.custom.command_auth.auth_time},now(),\u0027seconds\u0027)),0)" + }, + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": "\tif currentValue.value \u003e self.custom.command_auth.timeout_sp:\n\t\tself.custom.command_auth.enabled \u003d False" + } + }, + "custom.command_auth.enabled": { + "onChange": { + "enabled": null, + "script": "\tif currentValue.value:\n\t\tself.custom.command_auth.auth_time \u003d system.date.now()" + } + }, + "custom.covert": { + "access": "PRIVATE" + }, + "custom.deviceSearchId": { + "access": "PRIVATE" + }, + "custom.downloads": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{this.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]System/download" + }, + "transforms": [ + { + "code": "\tvalue_decoded \u003d system.util.jsonDecode(value)\n\tdownloads \u003d value_decoded.get(\"data\",[])\n\tfor i in downloads:\n\t\tsession_id \u003d i.get(\"session_id\")\n\t\turl \u003d i.get(\"url\")\n\t\tif session_id \u003d\u003d self.props.id:\n\t\t\tself.custom.download_url \u003d url\n\t\t\treturn True\n\t\telse:\n\t\t\treturn False", + "type": "script" + } + ], + "type": "tag" + } + }, + "custom.fc": { + "access": "PRIVATE" + }, + "custom.has_fc_role": { + "access": "PRIVATE", + "binding": { + "config": { + "expression": "{this.props.auth.user.roles}" + }, + "transforms": [ + { + "code": "\tuser_roles \u003d value\n\tfc_role \u003d self.custom.fc\n\trme_role \u003d fc_role.lower() + \"-rme-all\"\n\thas_role \u003d False\n\tfor roles in user_roles:\n\t\tif roles.lower() \u003d\u003d rme_role:\n\t\t\thas_role \u003d True\n\t\t\t\t\n\treturn has_role\n", + "type": "script" + } + ], + "type": "expr" + } + }, + "custom.id_to_state": { + "access": "PRIVATE", + "persistent": true + }, + "custom.show_south_dock": { + "access": "PRIVATE" + }, + "custom.state": { + "access": "PRIVATE" + }, + "custom.state_messages": { + "access": "PRIVATE" + }, + "custom.state_view": { + "access": "PRIVATE" + }, + "props.auth": { + "access": "PRIVATE", + "persistent": false + }, + "props.device.accelerometer": { + "access": "SYSTEM", + "persistent": false + }, + "props.device.identifier": { + "access": "SYSTEM", + "persistent": false + }, + "props.device.timezone": { + "access": "SYSTEM", + "persistent": false + }, + "props.device.type": { + "access": "SYSTEM", + "persistent": false + }, + "props.device.userAgent": { + "access": "SYSTEM", + "persistent": false + }, + "props.gateway": { + "access": "SYSTEM", + "persistent": false + }, + "props.geolocation.data": { + "access": "SYSTEM", + "persistent": false + }, + "props.geolocation.permissionGranted": { + "access": "SYSTEM", + "persistent": false + }, + "props.host": { + "access": "SYSTEM", + "persistent": false + }, + "props.id": { + "access": "SYSTEM", + "persistent": false + }, + "props.lastActivity": { + "access": "SYSTEM", + "persistent": false + } + }, + "props": { + "address": "10.10.1.96", + "appBar": { + "togglePosition": "hidden" + }, + "device": {}, + "geolocation": {}, + "locale": "en-US", + "timeZoneId": "UTC" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/session-props/resource.json b/com.inductiveautomation.perspective/session-props/resource.json new file mode 100644 index 0000000..855ad7b --- /dev/null +++ b/com.inductiveautomation.perspective/session-props/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "props.json" + ], + "attributes": { + "lastModification": { + "actor": "vivsampa", + "timestamp": "2024-06-11T15:24:58Z" + }, + "lastModificationSignature": "2cec11896e41072cffe086e65438ae771a78d78f0a30f183ead2705b2a0e526f" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/session-scripts/data.bin b/com.inductiveautomation.perspective/session-scripts/data.bin new file mode 100644 index 0000000..1d0b230 --- /dev/null +++ b/com.inductiveautomation.perspective/session-scripts/data.bin @@ -0,0 +1 @@ +{"onStartup":"\ttags_to_read = system.tag.readBlocking([\"Configuration/FC\", \"Configuration/aws\"])\n\tsession.custom.fc = tags_to_read[0].value\n\taws = system.util.jsonDecode( tags_to_read[1].value)\n\tprefix = aws.get(\"prefix\")\n\tregion = aws.get(\"region\")\n\tsession.custom.aws.prefix = prefix\n\tsession.custom.aws.region = region\n\tsession.custom.covert = False\n\tsession.custom.download_url = None\n\tsession.custom.alarm_filter.show_map = False\n\tsession.custom.alarm_filter.magnificaiton = \"x2\"","onShutdown":"#\tsystem.perspective.logout()","onBarcodeDataReceived":"\t","onBluetoothReceived":"\t","onAccelerometerDataReceived":"\t","onNdefDataReceived":"\t"} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/session-scripts/resource.json b/com.inductiveautomation.perspective/session-scripts/resource.json new file mode 100644 index 0000000..e9dd780 --- /dev/null +++ b/com.inductiveautomation.perspective/session-scripts/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "data.bin" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-06-19T08:26:13Z" + }, + "lastModificationSignature": "1cd2c178f5d2b73e5040401d437510e4eceb09cc96845b9a96a625c04089b832" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Critical/resource.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Critical/resource.json new file mode 100644 index 0000000..d34b41c --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Critical/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-20T21:19:40Z" + }, + "lastModificationSignature": "1999b4aec778d8bcf295c34988df2973aed888ec4aaef8e100e3578688548caf" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Critical/style.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Critical/style.json new file mode 100644 index 0000000..3a92ad8 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Critical/style.json @@ -0,0 +1,16 @@ +{ + "base": { + "style": { + "backgroundColor": "#B42222B3", + "borderColor": "#000000", + "borderStyle": "solid", + "borderWidth": "0.5px", + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": "14px", + "fontWeight": "bold", + "lineHeight": "20px", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Diagnostic/resource.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Diagnostic/resource.json new file mode 100644 index 0000000..f3dcb80 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Diagnostic/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-20T21:24:58Z" + }, + "lastModificationSignature": "d7c147730203770cea762fd4b0677f53abcdf11f9def340b614ab2ca616f5960" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Diagnostic/style.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Diagnostic/style.json new file mode 100644 index 0000000..e913ad7 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Diagnostic/style.json @@ -0,0 +1,16 @@ +{ + "base": { + "style": { + "backgroundColor": "#FCC400B3", + "borderColor": "#000000", + "borderStyle": "solid", + "borderWidth": "0.5px", + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "14px", + "fontWeight": "bold", + "lineHeight": "20px", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/High/resource.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/High/resource.json new file mode 100644 index 0000000..c8d9ff2 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/High/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-20T21:19:40Z" + }, + "lastModificationSignature": "9fe96766052614d0f226552ed43d33d69885433e70732793940a2040f3a6f794" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/High/style.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/High/style.json new file mode 100644 index 0000000..3f8698b --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/High/style.json @@ -0,0 +1,15 @@ +{ + "base": { + "style": { + "backgroundColor": "#FF0000B3", + "borderColor": "#000000", + "borderStyle": "solid", + "borderWidth": "0.5px", + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": "14px", + "fontWeight": "bold", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Low/resource.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Low/resource.json new file mode 100644 index 0000000..029f15e --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Low/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-20T21:24:31Z" + }, + "lastModificationSignature": "e6f37fe26bfaa1f5f12f2c1c95c204cffac24f1e63d380b50fc13a718433ad7a" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Low/style.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Low/style.json new file mode 100644 index 0000000..1b67501 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Low/style.json @@ -0,0 +1,15 @@ +{ + "base": { + "style": { + "backgroundColor": "#FF6000B3", + "borderColor": "#000000", + "borderStyle": "solid", + "borderWidth": "0.5px", + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "14px", + "fontWeight": "bold", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Medium/resource.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Medium/resource.json new file mode 100644 index 0000000..3558f8d --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Medium/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-20T21:24:01Z" + }, + "lastModificationSignature": "1e83a4aeeccd481d18802147f2eb59251559d8a84190a4c7b6213f7a37bde276" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Medium/style.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Medium/style.json new file mode 100644 index 0000000..21a76c6 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Alt-Colours/Medium/style.json @@ -0,0 +1,15 @@ +{ + "base": { + "style": { + "backgroundColor": "#F00077B3", + "borderColor": "#000000", + "borderStyle": "solid", + "borderWidth": "0.5px", + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "14px", + "fontWeight": "bold", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Critical/resource.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Critical/resource.json new file mode 100644 index 0000000..c922029 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Critical/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-02-25T15:30:11Z" + }, + "lastModificationSignature": "937e1851409ec1b7e2099b14dc7e3385b4557cbf1273c09ddf76e93a72705464" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Critical/style.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Critical/style.json new file mode 100644 index 0000000..3a92ad8 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Critical/style.json @@ -0,0 +1,16 @@ +{ + "base": { + "style": { + "backgroundColor": "#B42222B3", + "borderColor": "#000000", + "borderStyle": "solid", + "borderWidth": "0.5px", + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": "14px", + "fontWeight": "bold", + "lineHeight": "20px", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Diagnostic/resource.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Diagnostic/resource.json new file mode 100644 index 0000000..d89cdbf --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Diagnostic/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-20T15:35:37Z" + }, + "lastModificationSignature": "2adbaa6aa1f6b753364b460f343a11969793bf644238eb568a1b90d91d53ad86" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Diagnostic/style.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Diagnostic/style.json new file mode 100644 index 0000000..33d9994 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Diagnostic/style.json @@ -0,0 +1,16 @@ +{ + "base": { + "style": { + "backgroundColor": "#007EFCB3", + "borderColor": "#000000", + "borderStyle": "solid", + "borderWidth": "0.5px", + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "14px", + "fontWeight": "bold", + "lineHeight": "20px", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/High/resource.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/High/resource.json new file mode 100644 index 0000000..7283f80 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/High/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-02-25T15:30:01Z" + }, + "lastModificationSignature": "9f6e637fb05e4eef5e15df156cf86763f6a6bc2cad736be5b1420e035a9fffa3" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/High/style.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/High/style.json new file mode 100644 index 0000000..3f8698b --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/High/style.json @@ -0,0 +1,15 @@ +{ + "base": { + "style": { + "backgroundColor": "#FF0000B3", + "borderColor": "#000000", + "borderStyle": "solid", + "borderWidth": "0.5px", + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": "14px", + "fontWeight": "bold", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Low/resource.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Low/resource.json new file mode 100644 index 0000000..c6f218e --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Low/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-20T15:39:11Z" + }, + "lastModificationSignature": "a8fdefdda853c2d8953dc1e0d53a149085327b3698fb2e411a320eeb17158972" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Low/style.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Low/style.json new file mode 100644 index 0000000..cb775a7 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Low/style.json @@ -0,0 +1,15 @@ +{ + "base": { + "style": { + "backgroundColor": "#FFFF00B3", + "borderColor": "#000000", + "borderStyle": "solid", + "borderWidth": "0.5px", + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "14px", + "fontWeight": "bold", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Medium/resource.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Medium/resource.json new file mode 100644 index 0000000..374dc2e --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Medium/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-20T15:34:39Z" + }, + "lastModificationSignature": "eeecaeb9b35fe6826d72a09d50bd939162b19020a35cc969748534fd22104088" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Medium/style.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Medium/style.json new file mode 100644 index 0000000..45b722d --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Medium/style.json @@ -0,0 +1,15 @@ +{ + "base": { + "style": { + "backgroundColor": "#FF8000B3", + "borderColor": "#000000", + "borderStyle": "solid", + "borderWidth": "0.5px", + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "14px", + "fontWeight": "bold", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/NoAlarm-Black/resource.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/NoAlarm-Black/resource.json new file mode 100644 index 0000000..eab44f7 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/NoAlarm-Black/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "sipearso", + "timestamp": "2021-11-16T16:07:09Z" + }, + "lastModificationSignature": "d1f70de6874b47f8b2f47025d99cef4aed4bf71b20217c4d561eed0dd7588270" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/NoAlarm-Black/style.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/NoAlarm-Black/style.json new file mode 100644 index 0000000..3c420c6 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/NoAlarm-Black/style.json @@ -0,0 +1,15 @@ +{ + "base": { + "style": { + "backgroundColor": "#2B2B2B", + "borderColor": "#909090", + "borderStyle": "solid", + "borderWidth": "0.5px", + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": "14px", + "fontWeight": "bold", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/NoAlarm/resource.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/NoAlarm/resource.json new file mode 100644 index 0000000..466b6a1 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/NoAlarm/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "sipearso", + "timestamp": "2021-11-15T12:38:54Z" + }, + "lastModificationSignature": "702df7f3c9191867bdec8abf1e34b7f29e17af85dabb20a72ca13aefd7568109" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/NoAlarm/style.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/NoAlarm/style.json new file mode 100644 index 0000000..fcc4a21 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/NoAlarm/style.json @@ -0,0 +1,15 @@ +{ + "base": { + "style": { + "backgroundColor": "#008000", + "borderColor": "#000000", + "borderStyle": "solid", + "borderWidth": "0.5px", + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": "14px", + "fontWeight": "bold", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Shelved/resource.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Shelved/resource.json new file mode 100644 index 0000000..b9d090d --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Shelved/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2021-11-22T08:42:18Z" + }, + "lastModificationSignature": "8bf302223a0fdf5c2c1a290ad2993ab7d5a8e0d5dfd052d629f9e3d549d1d183" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Shelved/style.json b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Shelved/style.json new file mode 100644 index 0000000..e703988 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alarms-Styles/Shelved/style.json @@ -0,0 +1,16 @@ +{ + "base": { + "style": { + "backgroundColor": "#FFFFFF", + "borderColor": "#000000", + "borderStyle": "solid", + "borderWidth": "0.5px", + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "14px", + "fontWeight": "bold", + "lineHeight": "20px", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/alertButton/resource.json b/com.inductiveautomation.perspective/style-classes/Alerts/alertButton/resource.json new file mode 100644 index 0000000..caf5ab8 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/alertButton/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "9525e49a9d968ca6f4519e00b7eefe95a048f4fc431476c2b103b263da553c91" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/alertButton/style.json b/com.inductiveautomation.perspective/style-classes/Alerts/alertButton/style.json new file mode 100644 index 0000000..d99fee3 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/alertButton/style.json @@ -0,0 +1,38 @@ +{ + "base": { + "style": { + "backgroundColor": "#3779AE", + "boxShadow": "none", + "color": "#FAFAFA", + "margin": "5px" + } + }, + "variants": [ + { + "pseudo": "hover", + "animation": { + "duration": "0.2s", + "direction": "normal", + "iterationCount": "1", + "timingFunction": "ease", + "keyframes": { + "0%": { + "backgroundColor": "var(--info)", + "boxShadow": "none" + }, + "100%": { + "backgroundColor": "#448BB7", + "boxShadow": "none" + } + } + } + }, + { + "pseudo": "active", + "style": { + "backgroundColor": "var(--info)", + "boxShadow": "none" + } + } + ] +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/alertButtonSecondary/resource.json b/com.inductiveautomation.perspective/style-classes/Alerts/alertButtonSecondary/resource.json new file mode 100644 index 0000000..2ec417d --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/alertButtonSecondary/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "b1a9777f01de255b7c267457f06cc0cd580feb2d4eae43ffbb9129211de954e8" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/alertButtonSecondary/style.json b/com.inductiveautomation.perspective/style-classes/Alerts/alertButtonSecondary/style.json new file mode 100644 index 0000000..440fe39 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/alertButtonSecondary/style.json @@ -0,0 +1,30 @@ +{ + "base": { + "style": { + "backgroundColor": "#FAFAFA", + "borderColor": "var(--neutral-100)", + "borderStyle": "solid", + "borderWidth": "1px", + "color": "#323232", + "fontWeight": "normal", + "margin": "5px" + } + }, + "variants": [ + { + "pseudo": "hover", + "animation": { + "duration": "0.2s", + "direction": "normal", + "iterationCount": "1", + "timingFunction": "ease", + "keyframes": { + "0%": {}, + "100%": { + "borderWidth": "2px" + } + } + } + } + ] +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/alertClose/resource.json b/com.inductiveautomation.perspective/style-classes/Alerts/alertClose/resource.json new file mode 100644 index 0000000..774a1a7 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/alertClose/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "1ff060c75818d66c6bfa36c61f444d5c5ef0c98bf27937718f32c67bc57f109e" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/alertClose/style.json b/com.inductiveautomation.perspective/style-classes/Alerts/alertClose/style.json new file mode 100644 index 0000000..54e8b9e --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/alertClose/style.json @@ -0,0 +1,16 @@ +{ + "base": { + "style": { + "cursor": "pointer", + "fill": "var(--callToAction)" + } + }, + "variants": [ + { + "pseudo": "hover", + "style": { + "fill": "var(--callToAction--hover)" + } + } + ] +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/alertMessage/resource.json b/com.inductiveautomation.perspective/style-classes/Alerts/alertMessage/resource.json new file mode 100644 index 0000000..1ae8e36 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/alertMessage/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "ad890c421b887d7e221196652693aaee207f1f12272a99aa09925a850d7e35bf" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/alertMessage/style.json b/com.inductiveautomation.perspective/style-classes/Alerts/alertMessage/style.json new file mode 100644 index 0000000..86eb8e9 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/alertMessage/style.json @@ -0,0 +1,8 @@ +{ + "base": { + "style": { + "color": "#FAFAFA", + "fontSize": "14px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/alertTitle/resource.json b/com.inductiveautomation.perspective/style-classes/Alerts/alertTitle/resource.json new file mode 100644 index 0000000..946c425 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/alertTitle/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "244c0e5e125dffaf1255cf810bae6ac15e277d9a7d8dfbbd826a3f5072b9cc93" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/alertTitle/style.json b/com.inductiveautomation.perspective/style-classes/Alerts/alertTitle/style.json new file mode 100644 index 0000000..70f1467 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/alertTitle/style.json @@ -0,0 +1,9 @@ +{ + "base": { + "style": { + "fontSize": "20px", + "fontWeight": "bold", + "lineHeight": "32px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/error/resource.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/error/resource.json new file mode 100644 index 0000000..3fd7b37 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/error/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "d7453231587353b7b82ef6079c2a5c0708a9e4d21faf7cd62295c162bd7338a3" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/error/style.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/error/style.json new file mode 100644 index 0000000..6c614de --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/error/style.json @@ -0,0 +1,11 @@ +{ + "base": { + "style": { + "backgroundColor": "#555555", + "borderTopColor": "#FF8000", + "borderTopStyle": "solid", + "borderTopWidth": "4px", + "boxShadow": "0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22)" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/errorBtn1/resource.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/errorBtn1/resource.json new file mode 100644 index 0000000..e411d1c --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/errorBtn1/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "73b5e47cef0f7a0f90227e49d1768b1eb3bb2c4f5dd3d1bce61f58b364b18424" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/errorBtn1/style.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/errorBtn1/style.json new file mode 100644 index 0000000..89f4d02 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/errorBtn1/style.json @@ -0,0 +1,25 @@ +{ + "base": { + "style": { + "backgroundColor": "var(--error)", + "borderStyle": "none", + "boxShadow": "none", + "margin": "5px", + "textTransform": "uppercase" + } + }, + "variants": [ + { + "pseudo": "hover", + "style": { + "backgroundColor": "var(--error)" + } + }, + { + "pseudo": "active", + "style": { + "color": "var(--neutral-30)" + } + } + ] +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/errorBtn2/resource.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/errorBtn2/resource.json new file mode 100644 index 0000000..7a962e0 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/errorBtn2/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "b6355d5cabc3766bf502948143d1bc824484b7a8dd216289d0512faa1d6a9433" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/errorBtn2/style.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/errorBtn2/style.json new file mode 100644 index 0000000..63047d1 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/errorBtn2/style.json @@ -0,0 +1,33 @@ +{ + "base": { + "style": { + "backgroundColor": "var(--neutral-10)", + "borderColor": "var(--error)", + "borderStyle": "solid", + "borderWidth": "1px", + "boxShadow": "none", + "color": "var(--error)", + "fontWeight": "normal", + "margin": "5px", + "textTransform": "uppercase", + "fill": "var(--error)" + } + }, + "variants": [ + { + "pseudo": "hover", + "animation": { + "duration": "0.2s", + "direction": "normal", + "iterationCount": "1", + "timingFunction": "ease", + "keyframes": { + "0%": {}, + "100%": { + "backgroundColor": "var(--neutral-20)" + } + } + } + } + ] +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/info/resource.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/info/resource.json new file mode 100644 index 0000000..a67bfe7 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/info/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "96e7d25daf9e4b7f94edb9979264705d5f5a492630edbf162e3a28871df9bfa4" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/info/style.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/info/style.json new file mode 100644 index 0000000..060cd4f --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/info/style.json @@ -0,0 +1,11 @@ +{ + "base": { + "style": { + "backgroundColor": "#555555", + "borderTopColor": "#007EFC", + "borderTopStyle": "solid", + "borderTopWidth": "4px", + "boxShadow": "0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22)" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/infoBtn1/resource.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/infoBtn1/resource.json new file mode 100644 index 0000000..fb25ea1 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/infoBtn1/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "7cd944cef21cce90889c80f897ee7c521be7c9fac68c902129c2de2bec516f1c" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/infoBtn1/style.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/infoBtn1/style.json new file mode 100644 index 0000000..22852ee --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/infoBtn1/style.json @@ -0,0 +1,25 @@ +{ + "base": { + "style": { + "backgroundColor": "var(--info)", + "borderStyle": "none", + "boxShadow": "none", + "margin": "5px", + "textTransform": "uppercase" + } + }, + "variants": [ + { + "pseudo": "hover", + "style": { + "backgroundColor": "var(--info)" + } + }, + { + "pseudo": "active", + "style": { + "color": "var(--neutral-30)" + } + } + ] +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/infoBtn2/resource.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/infoBtn2/resource.json new file mode 100644 index 0000000..4ccf345 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/infoBtn2/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "8e71c7665a5ed4bffddbd38132c2c4e0ec6f11257a692eefd9fc45c70513d6d5" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/infoBtn2/style.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/infoBtn2/style.json new file mode 100644 index 0000000..c1a57f5 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/infoBtn2/style.json @@ -0,0 +1,33 @@ +{ + "base": { + "style": { + "backgroundColor": "var(--neutral-10)", + "borderColor": "var(--info)", + "borderStyle": "solid", + "borderWidth": "1px", + "boxShadow": "none", + "color": "var(--info)", + "fontWeight": "normal", + "margin": "5px", + "textTransform": "uppercase", + "fill": "var(--info)" + } + }, + "variants": [ + { + "pseudo": "hover", + "animation": { + "duration": "0.2s", + "direction": "normal", + "iterationCount": "1", + "timingFunction": "ease", + "keyframes": { + "0%": {}, + "100%": { + "backgroundColor": "var(--neutral-20)" + } + } + } + } + ] +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/success/resource.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/success/resource.json new file mode 100644 index 0000000..cb3ddb4 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/success/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "05c6ccaae4c1b00d4279d4684e4c942955feccf35347ec461609e23e5e5c3f67" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/success/style.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/success/style.json new file mode 100644 index 0000000..9f36a34 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/success/style.json @@ -0,0 +1,11 @@ +{ + "base": { + "style": { + "backgroundColor": "#555555", + "borderTopColor": "#00CC00", + "borderTopStyle": "solid", + "borderTopWidth": "4px", + "boxShadow": "0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22)" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/successBtn1/resource.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/successBtn1/resource.json new file mode 100644 index 0000000..237aa9c --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/successBtn1/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "9157a8d5cfedbced92eebcfe57af427848436684b3e916245ddec429bfa9e0d7" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/successBtn1/style.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/successBtn1/style.json new file mode 100644 index 0000000..d68e8f4 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/successBtn1/style.json @@ -0,0 +1,25 @@ +{ + "base": { + "style": { + "backgroundColor": "var(--success)", + "borderStyle": "none", + "boxShadow": "none", + "margin": "5px", + "textTransform": "uppercase" + } + }, + "variants": [ + { + "pseudo": "hover", + "style": { + "backgroundColor": "var(--success)" + } + }, + { + "pseudo": "active", + "style": { + "color": "var(--neutral-30)" + } + } + ] +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/successBtn2/resource.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/successBtn2/resource.json new file mode 100644 index 0000000..541df3f --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/successBtn2/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "1eff9fa5c2495360d5f081c5f06ddf41f7539a0e6459028b4c004e1fcd6211e1" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/successBtn2/style.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/successBtn2/style.json new file mode 100644 index 0000000..14f8f71 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/successBtn2/style.json @@ -0,0 +1,33 @@ +{ + "base": { + "style": { + "backgroundColor": "var(--neutral-10)", + "borderColor": "var(--success)", + "borderStyle": "solid", + "borderWidth": "1px", + "boxShadow": "none", + "color": "var(--success)", + "fontWeight": "normal", + "margin": "5px", + "textTransform": "uppercase", + "fill": "var(--success)" + } + }, + "variants": [ + { + "pseudo": "hover", + "animation": { + "duration": "0.2s", + "direction": "normal", + "iterationCount": "1", + "timingFunction": "ease", + "keyframes": { + "0%": {}, + "100%": { + "backgroundColor": "var(--neutral-20)" + } + } + } + } + ] +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/warning/resource.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/warning/resource.json new file mode 100644 index 0000000..a11c366 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/warning/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "3bac4508deba5466c862c2a4823da22229ac06bdb415b195abaffcf101801608" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/warning/style.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/warning/style.json new file mode 100644 index 0000000..be9d041 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/warning/style.json @@ -0,0 +1,11 @@ +{ + "base": { + "style": { + "backgroundColor": "#555555", + "borderTopColor": "#FFFF00", + "borderTopStyle": "solid", + "borderTopWidth": "4px", + "boxShadow": "0 14px 28px rgba(0,0,0,0.25), 0 10px 10px rgba(0,0,0,0.22)" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/warningBtn1/resource.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/warningBtn1/resource.json new file mode 100644 index 0000000..959632c --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/warningBtn1/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "609d266de1246bfec0f01f3d6091d8ccdc91e062516e9c873dd4460804593f61" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/warningBtn1/style.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/warningBtn1/style.json new file mode 100644 index 0000000..fffccdd --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/warningBtn1/style.json @@ -0,0 +1,25 @@ +{ + "base": { + "style": { + "backgroundColor": "var(--warning)", + "borderStyle": "none", + "boxShadow": "none", + "margin": "5px", + "textTransform": "uppercase" + } + }, + "variants": [ + { + "pseudo": "hover", + "style": { + "backgroundColor": "var(--warning)" + } + }, + { + "pseudo": "active", + "style": { + "color": "var(--neutral-30)" + } + } + ] +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/warningBtn2/resource.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/warningBtn2/resource.json new file mode 100644 index 0000000..b53af1c --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/warningBtn2/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "49bd07a491ef67aa0a0a7acc1b4b6fd773b9ac569443e54eb1081211ac84f13f" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Alerts/states/warningBtn2/style.json b/com.inductiveautomation.perspective/style-classes/Alerts/states/warningBtn2/style.json new file mode 100644 index 0000000..c38ccd0 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Alerts/states/warningBtn2/style.json @@ -0,0 +1,33 @@ +{ + "base": { + "style": { + "backgroundColor": "var(--neutral-10)", + "borderColor": "var(--warning)", + "borderStyle": "solid", + "borderWidth": "1px", + "boxShadow": "none", + "color": "var(--warning)", + "fontWeight": "normal", + "margin": "5px", + "textTransform": "uppercase", + "fill": "var(--warning)" + } + }, + "variants": [ + { + "pseudo": "hover", + "animation": { + "duration": "0.2s", + "direction": "normal", + "iterationCount": "1", + "timingFunction": "ease", + "keyframes": { + "0%": {}, + "100%": { + "backgroundColor": "var(--neutral-20)" + } + } + } + } + ] +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Background-Styles/Controller/resource.json b/com.inductiveautomation.perspective/style-classes/Background-Styles/Controller/resource.json new file mode 100644 index 0000000..3624800 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Background-Styles/Controller/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol@amazon.co.uk", + "timestamp": "2022-09-26T14:36:22Z" + }, + "lastModificationSignature": "61aa833972910f81cdb2d12c94297830805b2b41231be36bc41d369f1ba61ad6" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Background-Styles/Controller/style.json b/com.inductiveautomation.perspective/style-classes/Background-Styles/Controller/style.json new file mode 100644 index 0000000..4b15e8f --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Background-Styles/Controller/style.json @@ -0,0 +1,8 @@ +{ + "base": { + "style": { + "backgroundColor": "#3B3B3B", + "color": "#FFFFFF" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Background-Styles/Grey-Background/resource.json b/com.inductiveautomation.perspective/style-classes/Background-Styles/Grey-Background/resource.json new file mode 100644 index 0000000..1ff67a6 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Background-Styles/Grey-Background/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "sipearso", + "timestamp": "2021-12-08T10:43:49Z" + }, + "lastModificationSignature": "71cf335f01412f6d310005ec9f6f1359db927454c7a34f6e34bba2d627c0fc34" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Background-Styles/Grey-Background/style.json b/com.inductiveautomation.perspective/style-classes/Background-Styles/Grey-Background/style.json new file mode 100644 index 0000000..8d0e0d9 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Background-Styles/Grey-Background/style.json @@ -0,0 +1,7 @@ +{ + "base": { + "style": { + "backgroundColor": "#EEEEEE " + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Background-Styles/Main-Background/resource.json b/com.inductiveautomation.perspective/style-classes/Background-Styles/Main-Background/resource.json new file mode 100644 index 0000000..85f81cb --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Background-Styles/Main-Background/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "sipearso", + "timestamp": "2021-11-04T10:59:59Z" + }, + "lastModificationSignature": "ace7f51e45280d54f0ef131b84f2b489462e279d372ba7c522985bc97be560ea" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Background-Styles/Main-Background/style.json b/com.inductiveautomation.perspective/style-classes/Background-Styles/Main-Background/style.json new file mode 100644 index 0000000..9d98d89 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Background-Styles/Main-Background/style.json @@ -0,0 +1,7 @@ +{ + "base": { + "style": { + "backgroundColor": "#2B2B2B" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Buttons/Button-Menu/resource.json b/com.inductiveautomation.perspective/style-classes/Buttons/Button-Menu/resource.json new file mode 100644 index 0000000..316b639 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Buttons/Button-Menu/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-20T14:21:02Z" + }, + "lastModificationSignature": "24ee4af796a96cbf88b34ae31bcbbfcc1f0e3062a11721949ce2f0178a99874b" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Buttons/Button-Menu/style.json b/com.inductiveautomation.perspective/style-classes/Buttons/Button-Menu/style.json new file mode 100644 index 0000000..4b15e8f --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Buttons/Button-Menu/style.json @@ -0,0 +1,8 @@ +{ + "base": { + "style": { + "backgroundColor": "#3B3B3B", + "color": "#FFFFFF" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Buttons/Clear-Background/resource.json b/com.inductiveautomation.perspective/style-classes/Buttons/Clear-Background/resource.json new file mode 100644 index 0000000..0f52cf3 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Buttons/Clear-Background/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-03-02T21:46:17Z" + }, + "lastModificationSignature": "17bf39ccfdf077c3c0c295ba84d1a4432658643fbbabe9788777d764444ac003" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Buttons/Clear-Background/style.json b/com.inductiveautomation.perspective/style-classes/Buttons/Clear-Background/style.json new file mode 100644 index 0000000..9cc31d7 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Buttons/Clear-Background/style.json @@ -0,0 +1,7 @@ +{ + "base": { + "style": { + "backgroundColor": "#EEEEEE" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Buttons/PB_1/resource.json b/com.inductiveautomation.perspective/style-classes/Buttons/PB_1/resource.json new file mode 100644 index 0000000..0bbfc23 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Buttons/PB_1/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "sipearso", + "timestamp": "2021-12-01T09:19:54Z" + }, + "lastModificationSignature": "5e5eaa698f3567638ca85e82a3e9b455d44734aca87b44b8cec5ae4d0b734b16" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Buttons/PB_1/style.json b/com.inductiveautomation.perspective/style-classes/Buttons/PB_1/style.json new file mode 100644 index 0000000..6acf469 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Buttons/PB_1/style.json @@ -0,0 +1,9 @@ +{ + "base": { + "style": { + "backgroundColor": "#2F73BF", + "fontFamily": "Arial", + "fontSize": "12px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/DeviceManager/DeviceManagerRows/resource.json b/com.inductiveautomation.perspective/style-classes/DeviceManager/DeviceManagerRows/resource.json new file mode 100644 index 0000000..f624a6a --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/DeviceManager/DeviceManagerRows/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "sipearso", + "timestamp": "2021-12-01T16:05:04Z" + }, + "lastModificationSignature": "9e018160b970cb0867d3f98057a212673dc90b11ac7ed11e5f34c0d3714e7bd2" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/DeviceManager/DeviceManagerRows/style.json b/com.inductiveautomation.perspective/style-classes/DeviceManager/DeviceManagerRows/style.json new file mode 100644 index 0000000..b0b8076 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/DeviceManager/DeviceManagerRows/style.json @@ -0,0 +1,12 @@ +{ + "base": { + "style": { + "backgroundColor": "#FFFFFF", + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "12px", + "fontWeight": "bold", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Disconnects/Device-Connected/resource.json b/com.inductiveautomation.perspective/style-classes/Disconnects/Device-Connected/resource.json new file mode 100644 index 0000000..fc32dd2 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Disconnects/Device-Connected/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-07-13T15:23:36Z" + }, + "lastModificationSignature": "85ff4f497ead9ef279d96dbc4197220af7d11bcbecba8a23261e5a8532bb56e1" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Disconnects/Device-Connected/style.json b/com.inductiveautomation.perspective/style-classes/Disconnects/Device-Connected/style.json new file mode 100644 index 0000000..88cc7f3 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Disconnects/Device-Connected/style.json @@ -0,0 +1,7 @@ +{ + "base": { + "style": { + "borderStyle": "none" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Disconnects/Device-Disconnected/resource.json b/com.inductiveautomation.perspective/style-classes/Disconnects/Device-Disconnected/resource.json new file mode 100644 index 0000000..87d405e --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Disconnects/Device-Disconnected/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-07-13T15:23:36Z" + }, + "lastModificationSignature": "7dee6c72f40e81be38904cdd626bad89ac9fc2735fdf63fab8779a5be8ab25f4" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Disconnects/Device-Disconnected/style.json b/com.inductiveautomation.perspective/style-classes/Disconnects/Device-Disconnected/style.json new file mode 100644 index 0000000..f037520 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Disconnects/Device-Disconnected/style.json @@ -0,0 +1,9 @@ +{ + "base": { + "style": { + "borderColor": "#FF0000", + "borderStyle": "solid", + "borderWidth": "2px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Dropdown/DropDownBox/resource.json b/com.inductiveautomation.perspective/style-classes/Dropdown/DropDownBox/resource.json new file mode 100644 index 0000000..27c6534 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Dropdown/DropDownBox/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-01-13T16:33:03Z" + }, + "lastModificationSignature": "0a7cd6014a7c590e35b176dea9de5e5c18c8825fed595bd0a4475f53148c44d3" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Dropdown/DropDownBox/style.json b/com.inductiveautomation.perspective/style-classes/Dropdown/DropDownBox/style.json new file mode 100644 index 0000000..6660145 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Dropdown/DropDownBox/style.json @@ -0,0 +1,9 @@ +{ + "base": { + "style": { + "backgroundColor": "#FFFFFF", + "color": "#000000", + "fontFamily": "Arial" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopActivated/resource.json b/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopActivated/resource.json new file mode 100644 index 0000000..a8bf745 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopActivated/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2021-10-25T08:13:45Z" + }, + "lastModificationSignature": "6be61e1e8d8627e1901f483caae5a245f640db2543117e7f02ebbcbe6bb203b6" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopActivated/style.json b/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopActivated/style.json new file mode 100644 index 0000000..8898864 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopActivated/style.json @@ -0,0 +1,8 @@ +{ + "base": { + "style": { + "backgroundColor": "#FFFF00", + "color": "#FF0000" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopActivated101/resource.json b/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopActivated101/resource.json new file mode 100644 index 0000000..7e9790d --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopActivated101/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2021-11-20T14:33:35Z" + }, + "lastModificationSignature": "7d7bf095d438de686eadaac405ec76f7da4e0f19607bc4e7c09a02ec5bc3a58c" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopActivated101/style.json b/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopActivated101/style.json new file mode 100644 index 0000000..6cf9be1 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopActivated101/style.json @@ -0,0 +1,12 @@ +{ + "base": { + "animation": { + "keyframes": { + "0%": { + "backgroundColor": "#FF0000" + }, + "100%": {} + } + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopDeactivated/resource.json b/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopDeactivated/resource.json new file mode 100644 index 0000000..d2d09de --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopDeactivated/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2021-11-20T10:52:30Z" + }, + "lastModificationSignature": "cac7ebd9266553c94cb93787c5b86e9f9f222d4858182cb719f18e2c50446df9" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopDeactivated/style.json b/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopDeactivated/style.json new file mode 100644 index 0000000..46da093 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopDeactivated/style.json @@ -0,0 +1,8 @@ +{ + "base": { + "style": { + "backgroundColor": "#FFFF00", + "color": "#008000" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopDeactivated100/resource.json b/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopDeactivated100/resource.json new file mode 100644 index 0000000..cc53b63 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopDeactivated100/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2021-11-24T10:07:02Z" + }, + "lastModificationSignature": "3e02df9251eea06e73d7bc696041b031a9318c55f19adeee8e922740d59c67ec" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopDeactivated100/style.json b/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopDeactivated100/style.json new file mode 100644 index 0000000..54b23af --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/EmergencyStop-Styles/EstopDeactivated100/style.json @@ -0,0 +1,12 @@ +{ + "base": { + "animation": { + "keyframes": { + "0%": { + "backgroundColor": "#008000" + }, + "100%": {} + } + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Bold_Text/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Bold_Text/resource.json new file mode 100644 index 0000000..a4102ad --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Bold_Text/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "585f926783d365f05a5f805f339bc1dabbf6c14082d2200730cc067aafbb58d9" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Bold_Text/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Bold_Text/style.json new file mode 100644 index 0000000..b21b980 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Bold_Text/style.json @@ -0,0 +1,7 @@ +{ + "base": { + "style": { + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Card/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Card/resource.json new file mode 100644 index 0000000..12a2112 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Card/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "d909c3b117b76d557a42afbfa15e72a1cdf2295f55b527d92869cbf058dafc26" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Card/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Card/style.json new file mode 100644 index 0000000..762c94d --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Card/style.json @@ -0,0 +1,13 @@ +{ + "base": { + "style": { + "backgroundColor": "var(--neutral-10)", + "borderColor": "var(--neutral-30)", + "borderStyle": "solid", + "borderWidth": "1px", + "borderRadius": "4px", + "boxShadow": "0px 2px 4px rgba(0, 0, 40, 0.15)", + "margin": "5px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Card_transparent/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Card_transparent/resource.json new file mode 100644 index 0000000..b559737 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Card_transparent/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "4c3f6070a499c81c31e4740642f4c0ebf808e523a8af3a4f854084fff4aebf80" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Card_transparent/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Card_transparent/style.json new file mode 100644 index 0000000..abab03c --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Card_transparent/style.json @@ -0,0 +1,8 @@ +{ + "base": { + "style": { + "backgroundColor": "transparent", + "margin": "1px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_error/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_error/resource.json new file mode 100644 index 0000000..c997d5b --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_error/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "8fd944a8db6c9c949a9698738fe4fee993b423a090d4254fd9de60a2748d276e" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_error/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_error/style.json new file mode 100644 index 0000000..37f829c --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_error/style.json @@ -0,0 +1,17 @@ +{ + "base": { + "style": { + "backgroundColor": "var(--error)", + "borderTopLeftRadius": "4px", + "borderTopRightRadius": "4px", + "borderBottomLeftRadius": "4px", + "borderBottomRightRadius": "4px", + "color": "var(--neutral-10)", + "fontSize": "12px", + "fontWeight": "bold", + "lineHeight": "16px", + "padding": "2px", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_info/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_info/resource.json new file mode 100644 index 0000000..82eb941 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_info/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "4de4f81755f05631b6f8f7ba36c216b01b0129225a08863d4236e5eea4bdb66f" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_info/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_info/style.json new file mode 100644 index 0000000..3f225e0 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_info/style.json @@ -0,0 +1,17 @@ +{ + "base": { + "style": { + "backgroundColor": "var(--info)", + "borderTopLeftRadius": "4px", + "borderTopRightRadius": "4px", + "borderBottomLeftRadius": "4px", + "borderBottomRightRadius": "4px", + "color": "var(--neutral-10)", + "fontSize": "12px", + "fontWeight": "bold", + "lineHeight": "16px", + "padding": "2px", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_off/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_off/resource.json new file mode 100644 index 0000000..6ab2730 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_off/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "87a2e1f14438122e01e17cc13471047b6aec9346bca94d2ea6eecedea5df083e" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_off/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_off/style.json new file mode 100644 index 0000000..4cd4ed4 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_off/style.json @@ -0,0 +1,17 @@ +{ + "base": { + "style": { + "backgroundColor": "var(--neutral-60)", + "borderTopLeftRadius": "4px", + "borderTopRightRadius": "4px", + "borderBottomLeftRadius": "4px", + "borderBottomRightRadius": "4px", + "color": "var(--neutral-10)", + "fontSize": "12px", + "fontWeight": "bold", + "lineHeight": "16px", + "padding": "2px", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_success/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_success/resource.json new file mode 100644 index 0000000..ad48966 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_success/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "19d0216d546f082cfa5bd664cb3721ac4937d9f3a68518e26161cb1eef353b2a" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_success/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_success/style.json new file mode 100644 index 0000000..65375f9 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_success/style.json @@ -0,0 +1,17 @@ +{ + "base": { + "style": { + "backgroundColor": "var(--success)", + "borderTopLeftRadius": "4px", + "borderTopRightRadius": "4px", + "borderBottomLeftRadius": "4px", + "borderBottomRightRadius": "4px", + "color": "var(--neutral-10)", + "fontSize": "12px", + "fontWeight": "bold", + "lineHeight": "16px", + "padding": "2px", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_warning/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_warning/resource.json new file mode 100644 index 0000000..d1801d4 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_warning/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "5172112b12da738369a0ad2ad303e9500a6f4aa81ec8835fcb750ab5b6a24aac" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_warning/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_warning/style.json new file mode 100644 index 0000000..fcf27fd --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Data/value_warning/style.json @@ -0,0 +1,17 @@ +{ + "base": { + "style": { + "backgroundColor": "var(--warning)", + "borderTopLeftRadius": "4px", + "borderTopRightRadius": "4px", + "borderBottomLeftRadius": "4px", + "borderBottomRightRadius": "4px", + "color": "var(--neutral-10)", + "fontSize": "12px", + "fontWeight": "bold", + "lineHeight": "16px", + "padding": "2px", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Embedded/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Embedded/resource.json new file mode 100644 index 0000000..002aad0 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Embedded/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "767842679a4540e19b9714c28add87731b9249cbaf1894135e6b8e4017f3defb" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Embedded/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Embedded/style.json new file mode 100644 index 0000000..e40b9fa --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Embedded/style.json @@ -0,0 +1,7 @@ +{ + "base": { + "style": { + "margin": "5px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Embedded_transparent/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Embedded_transparent/resource.json new file mode 100644 index 0000000..fac236c --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Embedded_transparent/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "8e4410ca8d56830cbb68cba756cb9547560bacced6941f06e923864b68f61c88" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Embedded_transparent/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Embedded_transparent/style.json new file mode 100644 index 0000000..51f7cfa --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Embedded_transparent/style.json @@ -0,0 +1,9 @@ +{ + "base": { + "style": { + "margin": "5px", + "marginLeft": "0px", + "marginRight": "0px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Item/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Item/resource.json new file mode 100644 index 0000000..4bc71d7 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Item/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "0a776adc0866b3ee5fe86e31a9f2fed6c8669186f4ab036b198a03723d0ec42b" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Item/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Item/style.json new file mode 100644 index 0000000..c8bd125 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Item/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "paddingBottom": "4px", + "paddingLeft": "18px", + "paddingRight": "18px", + "paddingTop": "4px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Item_Border/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Item_Border/resource.json new file mode 100644 index 0000000..8df7ebd --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Item_Border/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "2df8b3d8924e82fad807180e2f5f6f521cfa09485de8d678d5aeb2a2e14c6cd7" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Item_Border/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Item_Border/style.json new file mode 100644 index 0000000..de9f0c8 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Item_Border/style.json @@ -0,0 +1,9 @@ +{ + "base": { + "style": { + "borderBottomColor": "var(--neutral-30)", + "borderBottomStyle": "solid", + "borderBottomWidth": "1px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Label/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Label/resource.json new file mode 100644 index 0000000..ca4af66 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Label/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "62fb51a3122ff501e0e3d64baee9e792754e37d5bff21b44d410c706fae418ca" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Label/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Label/style.json new file mode 100644 index 0000000..3de2c5a --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Label/style.json @@ -0,0 +1,12 @@ +{ + "base": { + "style": { + "color": "var(--neutral-70)", + "fontSize": "12px", + "fontWeight": "300", + "lineHeight": "16px", + "marginRight": "10px", + "textTransform": "uppercase" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Row/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Row/resource.json new file mode 100644 index 0000000..1f8eff6 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Row/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "43f147e02fffc14ac1224aa5b496be8528942c81e456797e4f3da0f47471368e" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Row/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Row/style.json new file mode 100644 index 0000000..fc7c06a --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Row/style.json @@ -0,0 +1,7 @@ +{ + "base": { + "style": { + "marginBottom": "2px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Title/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Title/resource.json new file mode 100644 index 0000000..57f6d0c --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Title/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "d2d2811be2ce62916c15f95fe06de380ff1b8d2c22d413d68c9e539f906c03d4" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Title/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Title/style.json new file mode 100644 index 0000000..8b1cf60 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Title/style.json @@ -0,0 +1,17 @@ +{ + "base": { + "style": { + "backgroundColor": "var(--neutral-20)", + "borderBottomColor": "var(--neutral-30)", + "borderBottomStyle": "solid", + "borderBottomWidth": "1px", + "color": "var(--neutral-80)", + "fontSize": "12px", + "fontWeight": "bold", + "paddingLeft": "6px", + "paddingRight": "6px", + "textTransform": "uppercase", + "fill": "var(--neutral-70)" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Title_transparent/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Title_transparent/resource.json new file mode 100644 index 0000000..bc153a6 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Title_transparent/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "1565a3bbc869249e6ecc523fd82bdf9ae287ed6098e0f701e018891d30049dd6" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Title_transparent/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Title_transparent/style.json new file mode 100644 index 0000000..2f848da --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Title_transparent/style.json @@ -0,0 +1,17 @@ +{ + "base": { + "style": { + "backgroundColor": "transparent", + "borderBottomColor": "var(--neutral-30)", + "borderBottomStyle": "solid", + "borderBottomWidth": "1px", + "color": "var(--neutral-80)", + "fontSize": "12px", + "fontWeight": "bold", + "paddingLeft": "6px", + "paddingRight": "6px", + "textTransform": "uppercase", + "fill": "var(--neutral-70)" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Value/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Value/resource.json new file mode 100644 index 0000000..f3bd5e2 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Value/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "93a043288dcd06a830f8463e31b2df67a9e2d2c0d15b6ad74c28265aabda20a7" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Card/Value/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Card/Value/style.json new file mode 100644 index 0000000..6c627a7 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Card/Value/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "color": "var(--info)", + "fontSize": "12px", + "fontWeight": "bold", + "lineHeight": "16px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Cards/Bold_Text/data.bin b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Bold_Text/data.bin new file mode 100644 index 0000000..23b71b2 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Bold_Text/data.bin @@ -0,0 +1 @@ +{"base":{"style":{"fontWeight":"bold"}}} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Cards/Bold_Text/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Bold_Text/resource.json new file mode 100644 index 0000000..ec41f3d --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Bold_Text/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "data.bin" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "724ec4a29768744e8a98b04beeaeffbe2786f9510a4c74fb1f704afedd7945f0" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Cards/Card/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Card/resource.json new file mode 100644 index 0000000..bb59688 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Card/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "7b09dc9dfc03e14eed4096d2f183f1746840ca2d1469bb5292717d48c6d045ce" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Cards/Card/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Card/style.json new file mode 100644 index 0000000..982f4b3 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Card/style.json @@ -0,0 +1,13 @@ +{ + "base": { + "style": { + "backgroundColor": "#FAFAFA", + "borderColor": "#D5D5D5", + "borderStyle": "solid", + "borderWidth": "1px", + "borderRadius": "4px", + "boxShadow": "0px 2px 4px rgba(0, 0, 40, 0.15)", + "margin": "5px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Cards/Embedded/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Embedded/resource.json new file mode 100644 index 0000000..44d5be5 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Embedded/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "0c8f1a09ea1dca1b39354b44e2dc1282bab329d6bc22b806ef0a799bc6d356d6" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Cards/Embedded/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Embedded/style.json new file mode 100644 index 0000000..e40b9fa --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Embedded/style.json @@ -0,0 +1,7 @@ +{ + "base": { + "style": { + "margin": "5px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Cards/Item/data.bin b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Item/data.bin new file mode 100644 index 0000000..b3d0ed8 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Item/data.bin @@ -0,0 +1 @@ +{"base":{"style":{"paddingBottom":"4px","paddingLeft":"18px","paddingRight":"18px","paddingTop":"4px"}}} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Cards/Item/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Item/resource.json new file mode 100644 index 0000000..2972ec1 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Item/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "data.bin" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "79005be23b3ff6489426936b79cf3f2ebab8457a1095db43007414b860a6f3fd" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Cards/Item_Border/data.bin b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Item_Border/data.bin new file mode 100644 index 0000000..f7eedd7 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Item_Border/data.bin @@ -0,0 +1 @@ +{"base":{"style":{"borderBottomColor":"#D5D5D5","borderBottomStyle":"solid","borderBottomWidth":"1px"}}} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Cards/Item_Border/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Item_Border/resource.json new file mode 100644 index 0000000..ad62454 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Item_Border/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "data.bin" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "f0ee9cc172435a4fe10515590d008d84463ab6a3dc039b86f4f469e10944b7a9" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Cards/Label/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Label/resource.json new file mode 100644 index 0000000..0f86c17 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Label/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "0bcd51b2564fdb884800f6228b59baffff1e427c61e89daa92fd6e880815de1e" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Cards/Label/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Label/style.json new file mode 100644 index 0000000..12be6e1 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Label/style.json @@ -0,0 +1,12 @@ +{ + "base": { + "style": { + "color": "#8E8E8E", + "fontSize": "12px", + "fontWeight": "300", + "lineHeight": "16px", + "marginRight": "10px", + "textTransform": "uppercase" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Cards/Row/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Row/resource.json new file mode 100644 index 0000000..5fb8071 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Row/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "5bd3eb9fceed7a7f8f1856aaf0172982817f2dd58c92c618d928d58dc46a02c7" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Cards/Row/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Row/style.json new file mode 100644 index 0000000..fc7c06a --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Row/style.json @@ -0,0 +1,7 @@ +{ + "base": { + "style": { + "marginBottom": "2px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Cards/Title/data.bin b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Title/data.bin new file mode 100644 index 0000000..0e16719 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Title/data.bin @@ -0,0 +1 @@ +{"base":{"style":{"backgroundColor":"#E6EAEEAD","borderBottomColor":"#D5D5D5","borderBottomStyle":"solid","borderBottomWidth":"1px","color":"#2E2E2E","fontSize":"12px","fontWeight":"bold","paddingLeft":"6px","paddingRight":"6px","textTransform":"uppercase","fill":"#2E2E2E"}}} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Cards/Title/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Title/resource.json new file mode 100644 index 0000000..44ebc46 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Title/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "data.bin" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "7c6da0dbdc1a180ea324c7fb08f7188364ef2e586aed38dfa3b92f24cda32db7" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Cards/Value/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Value/resource.json new file mode 100644 index 0000000..368d07e --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Value/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "4df5b762a5257d76fa2efc5ed1c26c6aeae9bd7316f61f05377517a059545a61" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/Cards/Value/style.json b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Value/style.json new file mode 100644 index 0000000..d740f8f --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/Cards/Value/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "color": "#2B2B2B", + "fontSize": "12px", + "fontWeight": "bold", + "lineHeight": "16px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/ColorPicker/Container/resource.json b/com.inductiveautomation.perspective/style-classes/Framework/ColorPicker/Container/resource.json new file mode 100644 index 0000000..cce2e07 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/ColorPicker/Container/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "c1529eb80f683e859860ea49adf5e303a04222f1da5a0b32c8819fd6c48b4ab1" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Framework/ColorPicker/Container/style.json b/com.inductiveautomation.perspective/style-classes/Framework/ColorPicker/Container/style.json new file mode 100644 index 0000000..f1b5f0e --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Framework/ColorPicker/Container/style.json @@ -0,0 +1,11 @@ +{ + "base": { + "style": { + "borderColor": "#CCCCCC", + "borderStyle": "solid", + "borderWidth": "1px", + "borderRadius": "4px", + "padding": "4px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button/resource.json b/com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button/resource.json new file mode 100644 index 0000000..835c48e --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "348d033d4e3781cd58222724dab76878c8ad540ed06373f8f0c8cbc10edb51cd" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button/style.json b/com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button/style.json new file mode 100644 index 0000000..37e9238 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button/style.json @@ -0,0 +1,9 @@ +{ + "base": { + "style": { + "backgroundColor": "var(--callToAction)", + "margin": "4px", + "padding": "4px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button_Disabled/resource.json b/com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button_Disabled/resource.json new file mode 100644 index 0000000..5694859 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button_Disabled/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "fcc5dc0c4651704d851a3d5986fdd4a1da34d4ba8b71b04e2c2e28021736bcd6" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button_Disabled/style.json b/com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button_Disabled/style.json new file mode 100644 index 0000000..b9257ea --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button_Disabled/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "var(--neutral-30)", + "color": "var(--neutral-50)", + "margin": "4px", + "padding": "4px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button_Error/resource.json b/com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button_Error/resource.json new file mode 100644 index 0000000..9115e11 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button_Error/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "c7e607fef24bbb48f35f7f6e9a16ccb7d2af6e67678c981ef3f3bd4eb88f3d29" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button_Error/style.json b/com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button_Error/style.json new file mode 100644 index 0000000..737d890 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Input/Button/Action_Button_Error/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "var(--error)", + "color": "#2B2B2B", + "margin": "4px", + "padding": "4px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Input/Button/Export_Button/resource.json b/com.inductiveautomation.perspective/style-classes/Input/Button/Export_Button/resource.json new file mode 100644 index 0000000..41a9c91 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Input/Button/Export_Button/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "223051a9bb6cae88d1326f72590b43228e4c19e3ea175e8420ce3aebd4bed07c" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Input/Button/Export_Button/style.json b/com.inductiveautomation.perspective/style-classes/Input/Button/Export_Button/style.json new file mode 100644 index 0000000..43da557 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Input/Button/Export_Button/style.json @@ -0,0 +1,12 @@ +{ + "base": { + "style": { + "backgroundColor": "#AAAAAA", + "borderColor": "#808080", + "borderStyle": "none", + "color": "#555555", + "margin": "5px", + "fill": "#2B2B2B" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Input/Button/General_Button/resource.json b/com.inductiveautomation.perspective/style-classes/Input/Button/General_Button/resource.json new file mode 100644 index 0000000..41a9c91 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Input/Button/General_Button/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "223051a9bb6cae88d1326f72590b43228e4c19e3ea175e8420ce3aebd4bed07c" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Input/Button/General_Button/style.json b/com.inductiveautomation.perspective/style-classes/Input/Button/General_Button/style.json new file mode 100644 index 0000000..43da557 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Input/Button/General_Button/style.json @@ -0,0 +1,12 @@ +{ + "base": { + "style": { + "backgroundColor": "#AAAAAA", + "borderColor": "#808080", + "borderStyle": "none", + "color": "#555555", + "margin": "5px", + "fill": "#2B2B2B" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Input/Button/Secondary_minimal/resource.json b/com.inductiveautomation.perspective/style-classes/Input/Button/Secondary_minimal/resource.json new file mode 100644 index 0000000..de7bf76 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Input/Button/Secondary_minimal/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "4f95c6da49368fb432e12df6f71e36173e56f6d4edbeb378ca679e6c826a81ec" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Input/Button/Secondary_minimal/style.json b/com.inductiveautomation.perspective/style-classes/Input/Button/Secondary_minimal/style.json new file mode 100644 index 0000000..9a6d62e --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Input/Button/Secondary_minimal/style.json @@ -0,0 +1,8 @@ +{ + "base": { + "style": { + "backgroundColor": "transparent", + "borderStyle": "none" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Labels/Label/resource.json b/com.inductiveautomation.perspective/style-classes/Labels/Label/resource.json new file mode 100644 index 0000000..2e4164e --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Labels/Label/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "sipearso", + "timestamp": "2021-12-01T11:34:16Z" + }, + "lastModificationSignature": "5640b85022afe01309b46d8be591202608264741ae1ba2f93f5423c7a639adae" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Labels/Label/style.json b/com.inductiveautomation.perspective/style-classes/Labels/Label/style.json new file mode 100644 index 0000000..a2681bd --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Labels/Label/style.json @@ -0,0 +1,11 @@ +{ + "base": { + "style": { + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "20px", + "fontWeight": "bold", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Labels/Label_1/resource.json b/com.inductiveautomation.perspective/style-classes/Labels/Label_1/resource.json new file mode 100644 index 0000000..ee2f04b --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Labels/Label_1/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "sipearso", + "timestamp": "2021-12-02T16:37:21Z" + }, + "lastModificationSignature": "0a7a3f7aa63a692545a4970911ba8b6e5e066fe6a3189666217b9d1cda1bf1e2" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Labels/Label_1/style.json b/com.inductiveautomation.perspective/style-classes/Labels/Label_1/style.json new file mode 100644 index 0000000..916e126 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Labels/Label_1/style.json @@ -0,0 +1,11 @@ +{ + "base": { + "style": { + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "14px", + "fontWeight": "bold", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/PopUp-Styles/InfoButton/resource.json b/com.inductiveautomation.perspective/style-classes/PopUp-Styles/InfoButton/resource.json new file mode 100644 index 0000000..92042d6 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/PopUp-Styles/InfoButton/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2021-10-29T14:08:41Z" + }, + "lastModificationSignature": "1f9730fd63b2309ab8a51b56ff3ed2fa93ebb1cf38aece906501279b83d24101" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/PopUp-Styles/InfoButton/style.json b/com.inductiveautomation.perspective/style-classes/PopUp-Styles/InfoButton/style.json new file mode 100644 index 0000000..6bb0b38 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/PopUp-Styles/InfoButton/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "paddingBottom": "5px", + "paddingLeft": "5px", + "paddingRight": "5px", + "paddingTop": "5px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/PopUp-Styles/InfoLabel/resource.json b/com.inductiveautomation.perspective/style-classes/PopUp-Styles/InfoLabel/resource.json new file mode 100644 index 0000000..685ec25 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/PopUp-Styles/InfoLabel/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2021-10-29T13:18:27Z" + }, + "lastModificationSignature": "f5c594779d9ba008aabb476c35bd8831f3522a304b306b2be60b6c1283a860ba" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/PopUp-Styles/InfoLabel/style.json b/com.inductiveautomation.perspective/style-classes/PopUp-Styles/InfoLabel/style.json new file mode 100644 index 0000000..434d8f1 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/PopUp-Styles/InfoLabel/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "style": { + "borderBottomStyle": "none", + "borderBottomWidth": "0.5px", + "borderLeftStyle": "none", + "borderLeftWidth": "0.5px", + "borderRightStyle": "none", + "borderRightWidth": "0.5px", + "borderTopStyle": "solid", + "borderTopWidth": "0.5px", + "color": "#808080", + "fontFamily": "Roboto", + "fontSize": "12px", + "fontWeight": "lighter" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/PopUp-Styles/Information-Device/resource.json b/com.inductiveautomation.perspective/style-classes/PopUp-Styles/Information-Device/resource.json new file mode 100644 index 0000000..498fa26 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/PopUp-Styles/Information-Device/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2021-10-29T13:48:04Z" + }, + "lastModificationSignature": "7f5d6683e6530a5d8a1394b938c96cec9f484016d7dea7d92da51a34702a7717" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/PopUp-Styles/Information-Device/style.json b/com.inductiveautomation.perspective/style-classes/PopUp-Styles/Information-Device/style.json new file mode 100644 index 0000000..3054d91 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/PopUp-Styles/Information-Device/style.json @@ -0,0 +1,18 @@ +{ + "base": { + "style": { + "backgroundColor": "#EEEEEE ", + "borderColor": "#808080", + "borderStyle": "solid", + "borderWidth": "0.5px", + "borderTopLeftRadius": "10px", + "borderTopRightRadius": "10px", + "borderBottomLeftRadius": "10px", + "borderBottomRightRadius": "10px", + "color": "#FBFCFC", + "cursor": "auto", + "fontFamily": "Arial", + "fontWeight": "lighter" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/AAA-Style/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/AAA-Style/resource.json new file mode 100644 index 0000000..f780083 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/AAA-Style/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-04-27T09:36:00Z" + }, + "lastModificationSignature": "dfa938b0ec8dfe36705251817fea7dfa6a57965cf9211306581fb009a26aa448" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/AAA-Style/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/AAA-Style/style.json new file mode 100644 index 0000000..c9d9460 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/AAA-Style/style.json @@ -0,0 +1,7 @@ +{ + "base": { + "style": { + "backgroundColor": "#FFDC00" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State0/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State0/resource.json new file mode 100644 index 0000000..8b4df6f --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State0/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-01-04T16:56:59Z" + }, + "lastModificationSignature": "8ce5de598de20e024d5b7026771b4fc2c264acbb7e97e0dda5d9130d3764c96b" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State0/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State0/style.json new file mode 100644 index 0000000..55e15f2 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State0/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "#8C8C8C", + "color": "#000000", + "fontFamily": "Arial", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State1/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State1/resource.json new file mode 100644 index 0000000..f7766d1 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State1/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T14:49:34Z" + }, + "lastModificationSignature": "ce6516d96aec235ac51d8981b7f44b3746359c7b6feb379f0c429c3b90a80a85" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State1/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State1/style.json new file mode 100644 index 0000000..a6ba74f --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State1/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "#FF0000", + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State2/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State2/resource.json new file mode 100644 index 0000000..5f98680 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State2/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T14:50:19Z" + }, + "lastModificationSignature": "5733fc4a5868ced9d9b244dd16fed252ac913fc1c653804e115808364879b096" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State2/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State2/style.json new file mode 100644 index 0000000..a5d68c5 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State2/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "#F00077B3", + "color": "#000000", + "fontFamily": "Arial", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State3/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State3/resource.json new file mode 100644 index 0000000..41df3ee --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State3/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T14:50:55Z" + }, + "lastModificationSignature": "d01c7e0e80b109f167485caf3ae15278074e6674a897ec4333db54bc06d98d21" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State3/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State3/style.json new file mode 100644 index 0000000..7b36e1d --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State3/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "#FF6000B3", + "color": "#000000", + "fontFamily": "Arial", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State4/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State4/resource.json new file mode 100644 index 0000000..227f661 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State4/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T14:52:15Z" + }, + "lastModificationSignature": "7a17549e4701bda45b68e0e7cad2e8f13001bf39df0d9de30a5c144d7fc64d39" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State4/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State4/style.json new file mode 100644 index 0000000..a222549 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State4/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "#FCC400B3", + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State5/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State5/resource.json new file mode 100644 index 0000000..5d24784 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State5/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-22T08:44:03Z" + }, + "lastModificationSignature": "4ea7ea676e88922a813b7cf3d7d008baff5f92b881ad35a16a405c631a154cd0" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State5/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State5/style.json new file mode 100644 index 0000000..198a4d1 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Alt-Background-Fill/State5/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "#007EFC", + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State0/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State0/resource.json new file mode 100644 index 0000000..8c1313f --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State0/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T16:46:29Z" + }, + "lastModificationSignature": "e1df5e7fdf39aaa3770822e3c496fda4f8b5e70fa6aebed5b31dbccadf9d5756" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State0/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State0/style.json new file mode 100644 index 0000000..55e15f2 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State0/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "#8C8C8C", + "color": "#000000", + "fontFamily": "Arial", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State1/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State1/resource.json new file mode 100644 index 0000000..5e17d78 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State1/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T14:47:26Z" + }, + "lastModificationSignature": "8f681baea4f31ca9377034ee3f15ab57f06c07be6e9de4c132c3fc246c2beba6" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State1/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State1/style.json new file mode 100644 index 0000000..a6ba74f --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State1/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "#FF0000", + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State1_Alt/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State1_Alt/resource.json new file mode 100644 index 0000000..358baf3 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State1_Alt/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-01-20T15:04:27Z" + }, + "lastModificationSignature": "8a6b2aee655f84c6d0acb7f7cdc8dd421f80e68bc48c38b75e04a565979931ff" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State1_Alt/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State1_Alt/style.json new file mode 100644 index 0000000..a6ba74f --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State1_Alt/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "#FF0000", + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State2/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State2/resource.json new file mode 100644 index 0000000..80328ec --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State2/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T14:48:10Z" + }, + "lastModificationSignature": "69edc4a36b44af4ccea8b8b2e6494f755e70d339791acd6a0218c390462230f7" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State2/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State2/style.json new file mode 100644 index 0000000..2887093 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State2/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "#FF8000", + "color": "#000000", + "fontFamily": "Arial", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State2_Alt/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State2_Alt/resource.json new file mode 100644 index 0000000..3d36fe3 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State2_Alt/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-01-20T15:04:34Z" + }, + "lastModificationSignature": "c75e8b2a4d5b3d18bc9aea0c0b88097e679117e97c1810b983e0988278d5088b" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State2_Alt/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State2_Alt/style.json new file mode 100644 index 0000000..571f7e6 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State2_Alt/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "#F00077", + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State3/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State3/resource.json new file mode 100644 index 0000000..8cf253e --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State3/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T14:48:02Z" + }, + "lastModificationSignature": "cdee64e873c5075d9e4c1b8473d55bbeadf6679044973e4857350a8833cac8eb" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State3/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State3/style.json new file mode 100644 index 0000000..06fca02 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State3/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "#FFFF00", + "color": "#000000", + "fontFamily": "Arial", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State3_Alt/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State3_Alt/resource.json new file mode 100644 index 0000000..ae55620 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State3_Alt/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-01-20T15:04:39Z" + }, + "lastModificationSignature": "4998f8db3790856ced8bfe160b675371758796420cd5b209ee36207ddee836ac" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State3_Alt/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State3_Alt/style.json new file mode 100644 index 0000000..812c3c8 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State3_Alt/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "#FF6000", + "color": "#000000", + "fontFamily": "Arial", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State4/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State4/resource.json new file mode 100644 index 0000000..877afdd --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State4/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T14:47:32Z" + }, + "lastModificationSignature": "a94984a8b93afb77713b72d94b9f28e6cb5f7e100c1c74886958ebeb2e9289e8" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State4/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State4/style.json new file mode 100644 index 0000000..198a4d1 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State4/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "#007EFC", + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State4_Alt/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State4_Alt/resource.json new file mode 100644 index 0000000..fdc67d3 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State4_Alt/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-01-20T15:04:48Z" + }, + "lastModificationSignature": "7af7a85d270e00bb3976d43e215762b00a7eccf6a789f2b70f610150c727eaae" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State4_Alt/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State4_Alt/style.json new file mode 100644 index 0000000..fcb4cbc --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State4_Alt/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "#FCC400", + "color": "#000000", + "fontFamily": "Arial", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State5/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State5/resource.json new file mode 100644 index 0000000..2e07bd4 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State5/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T18:08:15Z" + }, + "lastModificationSignature": "3941247289e7f2da02947f73fcf80ea5603d14f9d66ca60e5308b1c92b1c1a83" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State5/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State5/style.json new file mode 100644 index 0000000..ea4de11 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State5/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "#00CC00", + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State5_Alt/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State5_Alt/resource.json new file mode 100644 index 0000000..4fde756 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State5_Alt/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-01-20T15:04:55Z" + }, + "lastModificationSignature": "c504f8eaca609efbdc085be9bab4e444a727285b7dc61d0262dd37167da003c5" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State5_Alt/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State5_Alt/style.json new file mode 100644 index 0000000..92691b5 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State5_Alt/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "#007DFA", + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State6/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State6/resource.json new file mode 100644 index 0000000..ff3a03e --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State6/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2021-11-08T21:11:20Z" + }, + "lastModificationSignature": "feefbcccb0db745a2b88a7016813184939d8489f4f21592eb77f0910aea25865" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State6/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State6/style.json new file mode 100644 index 0000000..b9337b5 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/Background-Fill/State6/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "backgroundColor": "#CCCCFF", + "color": "#000000", + "fontFamily": "Arial", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State0/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State0/resource.json new file mode 100644 index 0000000..73d0385 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State0/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2021-10-25T08:13:53Z" + }, + "lastModificationSignature": "5eab50e7b7346cda2ea75cff6c034754c6ddc2c6d0b99996c71259a138a48ecc" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State0/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State0/style.json new file mode 100644 index 0000000..fb1801e --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State0/style.json @@ -0,0 +1,7 @@ +{ + "base": { + "style": { + "color": "#808080" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State1/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State1/resource.json new file mode 100644 index 0000000..0b87f5f --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State1/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-04-27T14:35:13Z" + }, + "lastModificationSignature": "92b03aa4bd3ec8684646f2676ff4adf8c307155038b45f095544ce5f5306ddcd" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State1/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State1/style.json new file mode 100644 index 0000000..8806361 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State1/style.json @@ -0,0 +1,7 @@ +{ + "base": { + "style": { + "color": "#FF0000" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State101/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State101/resource.json new file mode 100644 index 0000000..fabadc9 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State101/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-22T11:35:26Z" + }, + "lastModificationSignature": "c8bf51f274d3a203a50844123f76516030002d421d845d1587b21619f5c44cce" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State101/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State101/style.json new file mode 100644 index 0000000..cfcac7b --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State101/style.json @@ -0,0 +1,13 @@ +{ + "base": { + "animation": { + "duration": "1s", + "keyframes": { + "0%": { + "backgroundColor": "#FF0000B3" + }, + "100%": {} + } + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State102/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State102/resource.json new file mode 100644 index 0000000..5f1482b --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State102/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T18:25:37Z" + }, + "lastModificationSignature": "871176e247dabf99db5cf05edd44cd60f815774147f44b6e1ccb9af23ebad469" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State102/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State102/style.json new file mode 100644 index 0000000..6381a93 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State102/style.json @@ -0,0 +1,13 @@ +{ + "base": { + "animation": { + "duration": "1s", + "keyframes": { + "0%": { + "backgroundColor": "#FF8000B3" + }, + "100%": {} + } + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State103/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State103/resource.json new file mode 100644 index 0000000..cbb5d9d --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State103/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T18:26:06Z" + }, + "lastModificationSignature": "71833ab80e60568fcaf95d185e5c44f6894a69166ece00cf155c3a352ba890cb" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State103/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State103/style.json new file mode 100644 index 0000000..8586d48 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State103/style.json @@ -0,0 +1,13 @@ +{ + "base": { + "animation": { + "duration": "1s", + "keyframes": { + "0%": { + "backgroundColor": "#FFFF00B3" + }, + "100%": {} + } + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State104/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State104/resource.json new file mode 100644 index 0000000..37c207a --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State104/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T18:26:14Z" + }, + "lastModificationSignature": "bbc347636a70914630e7f1f565e8e2df1202e9d936bc5d74f6fd2c7cfd15f3f1" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State104/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State104/style.json new file mode 100644 index 0000000..e5f9982 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State104/style.json @@ -0,0 +1,13 @@ +{ + "base": { + "animation": { + "duration": "1s", + "keyframes": { + "0%": { + "backgroundColor": "#007EFCB3" + }, + "100%": {} + } + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State105/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State105/resource.json new file mode 100644 index 0000000..abdace5 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State105/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T18:26:22Z" + }, + "lastModificationSignature": "e4dcc12f988ee0536369107964b751a89a965c8d4b609a11d40f53bf6c2e5799" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State105/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State105/style.json new file mode 100644 index 0000000..e5b9343 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State105/style.json @@ -0,0 +1,13 @@ +{ + "base": { + "animation": { + "duration": "1s", + "keyframes": { + "0%": { + "backgroundColor": "#00CC00" + }, + "100%": {} + } + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State106/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State106/resource.json new file mode 100644 index 0000000..b446fce --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State106/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T18:26:29Z" + }, + "lastModificationSignature": "d5edad966dffd9d8027753594cc265a561169fafc89e7f74ce09c8722aadf74c" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State106/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State106/style.json new file mode 100644 index 0000000..dbe7f65 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State106/style.json @@ -0,0 +1,13 @@ +{ + "base": { + "animation": { + "duration": "1s", + "keyframes": { + "0%": { + "backgroundColor": "#CCCCFF" + }, + "100%": {} + } + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State2/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State2/resource.json new file mode 100644 index 0000000..e324956 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State2/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2021-11-04T19:25:46Z" + }, + "lastModificationSignature": "d6d090eb502aa937824091912d813957dca8cc098fa7af1b0558a87242595d2c" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State2/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State2/style.json new file mode 100644 index 0000000..fb1801e --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State2/style.json @@ -0,0 +1,7 @@ +{ + "base": { + "style": { + "color": "#808080" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State201/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State201/resource.json new file mode 100644 index 0000000..f6138aa --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State201/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-07-14T13:24:35Z" + }, + "lastModificationSignature": "ef23602d75314cd5c3e5a9ac90178354fc7fae1b1cf4cd4e5663cb9a6437ad82" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State201/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State201/style.json new file mode 100644 index 0000000..f79ee95 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State201/style.json @@ -0,0 +1,13 @@ +{ + "base": { + "animation": { + "duration": "1s", + "keyframes": { + "0%": { + "backgroundColor": "#FF0000" + }, + "100%": {} + } + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State202/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State202/resource.json new file mode 100644 index 0000000..116b7a3 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State202/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-07-14T13:24:35Z" + }, + "lastModificationSignature": "6bfa4111c57188290da62f9a8356245e6dd94938c456d3e50a5e9b932d13fba8" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State202/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State202/style.json new file mode 100644 index 0000000..d06c0f1 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State202/style.json @@ -0,0 +1,13 @@ +{ + "base": { + "animation": { + "duration": "1s", + "keyframes": { + "0%": { + "backgroundColor": "#F00077" + }, + "100%": {} + } + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State203/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State203/resource.json new file mode 100644 index 0000000..6e398d7 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State203/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-07-14T13:24:35Z" + }, + "lastModificationSignature": "945d6a4b57d24dde92cfe41218b6027707fceafd9bf2022d704f16841081bb8f" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State203/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State203/style.json new file mode 100644 index 0000000..66627cd --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State203/style.json @@ -0,0 +1,13 @@ +{ + "base": { + "animation": { + "duration": "1s", + "keyframes": { + "0%": { + "backgroundColor": "#FF6000" + }, + "100%": {} + } + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State204/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State204/resource.json new file mode 100644 index 0000000..5ab9a56 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State204/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-07-14T13:24:35Z" + }, + "lastModificationSignature": "f41dd6f4cac908833cc054e5b64d34f4232969292d556ace6ee8406f19ddd6ff" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State204/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State204/style.json new file mode 100644 index 0000000..bfcced5 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State204/style.json @@ -0,0 +1,13 @@ +{ + "base": { + "animation": { + "duration": "1s", + "keyframes": { + "0%": { + "backgroundColor": "#FCC400" + }, + "100%": {} + } + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State205/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State205/resource.json new file mode 100644 index 0000000..324f917 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State205/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-07-14T13:24:35Z" + }, + "lastModificationSignature": "926c6ac6c0fd794fcd952d361dc892c9c6cb3e0d34c3d4faa3497efe116d9c27" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State205/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State205/style.json new file mode 100644 index 0000000..677242c --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State205/style.json @@ -0,0 +1,13 @@ +{ + "base": { + "animation": { + "duration": "1s", + "keyframes": { + "0%": { + "backgroundColor": "#007DFA" + }, + "100%": {} + } + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State3/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State3/resource.json new file mode 100644 index 0000000..3d0455c --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State3/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2021-11-04T19:26:04Z" + }, + "lastModificationSignature": "42c2630f4716b0fa8446c8bd935cc3e78154d517e0ca88dcab0da90ade02b7cf" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State3/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State3/style.json new file mode 100644 index 0000000..8ddfe1b --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State3/style.json @@ -0,0 +1,7 @@ +{ + "base": { + "style": { + "color": "#4747FF" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State4/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State4/resource.json new file mode 100644 index 0000000..baec70a --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State4/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-04-27T14:40:37Z" + }, + "lastModificationSignature": "215d71f1863f68cd3732cd1fc8541794f0f14273c8fcf4e62f16d7bb3eb70973" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State4/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State4/style.json new file mode 100644 index 0000000..55e7693 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State4/style.json @@ -0,0 +1,7 @@ +{ + "base": { + "style": { + "color": "#FFB200" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State5/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State5/resource.json new file mode 100644 index 0000000..137ef36 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State5/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T18:07:37Z" + }, + "lastModificationSignature": "1c710c0833d18f82f6401b7f4111dd1d6fbd7434f235b1cb5175fb007228375c" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State5/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State5/style.json new file mode 100644 index 0000000..4bfcd6d --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State5/style.json @@ -0,0 +1,7 @@ +{ + "base": { + "style": { + "color": "#00CC00" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State6/resource.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State6/resource.json new file mode 100644 index 0000000..3028cca --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State6/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2021-11-04T19:26:52Z" + }, + "lastModificationSignature": "96c5f301e57d29fc5f5bf0bbeb0aeb075b0ee5d58a2668775cb1d93583bb8d2c" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/State-Styles/State6/style.json b/com.inductiveautomation.perspective/style-classes/State-Styles/State6/style.json new file mode 100644 index 0000000..d615c70 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/State-Styles/State6/style.json @@ -0,0 +1,7 @@ +{ + "base": { + "style": { + "color": "#CCCCFF" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text-Styles/Ariel-Bold-12pt/resource.json b/com.inductiveautomation.perspective/style-classes/Text-Styles/Ariel-Bold-12pt/resource.json new file mode 100644 index 0000000..a7abc8b --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text-Styles/Ariel-Bold-12pt/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2021-11-01T19:34:14Z" + }, + "lastModificationSignature": "12828099a2661842c655d47c7eacd93062f8283f56167561484fca1639657bc5" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text-Styles/Ariel-Bold-12pt/style.json b/com.inductiveautomation.perspective/style-classes/Text-Styles/Ariel-Bold-12pt/style.json new file mode 100644 index 0000000..1c9a08f --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text-Styles/Ariel-Bold-12pt/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "12px", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text-Styles/Ariel-Bold-White-12pt/resource.json b/com.inductiveautomation.perspective/style-classes/Text-Styles/Ariel-Bold-White-12pt/resource.json new file mode 100644 index 0000000..c124a1c --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text-Styles/Ariel-Bold-White-12pt/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2021-11-09T13:52:21Z" + }, + "lastModificationSignature": "922e29ee6b6183325ade90125c952d7d87b62d8f5c4d04b28d6bd7a5c87c6a24" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text-Styles/Ariel-Bold-White-12pt/style.json b/com.inductiveautomation.perspective/style-classes/Text-Styles/Ariel-Bold-White-12pt/style.json new file mode 100644 index 0000000..dee08f7 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text-Styles/Ariel-Bold-White-12pt/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": "12px", + "fontWeight": "bold" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text-Styles/Controller/resource.json b/com.inductiveautomation.perspective/style-classes/Text-Styles/Controller/resource.json new file mode 100644 index 0000000..f374cbe --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text-Styles/Controller/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol@amazon.co.uk", + "timestamp": "2022-09-26T14:36:22Z" + }, + "lastModificationSignature": "c52f15aa087decb8736f37c6840c583226118a7003236c119800dfe74edb145a" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text-Styles/Controller/style.json b/com.inductiveautomation.perspective/style-classes/Text-Styles/Controller/style.json new file mode 100644 index 0000000..39fd938 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text-Styles/Controller/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "fontFamily": "Arial", + "fontSize": "10px", + "fontWeight": "bold", + "textAlign": "left" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text-Styles/Docked-Buttons/resource.json b/com.inductiveautomation.perspective/style-classes/Text-Styles/Docked-Buttons/resource.json new file mode 100644 index 0000000..118221e --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text-Styles/Docked-Buttons/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "pllincol@amazon.co.uk", + "timestamp": "2022-09-26T14:36:22Z" + }, + "lastModificationSignature": "4f42ec6607300aed69df70f0831917b428c4d1714f98fb00149bd417155178d9" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text-Styles/Docked-Buttons/style.json b/com.inductiveautomation.perspective/style-classes/Text-Styles/Docked-Buttons/style.json new file mode 100644 index 0000000..4260a62 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text-Styles/Docked-Buttons/style.json @@ -0,0 +1,9 @@ +{ + "base": { + "style": { + "fontFamily": "Arial", + "fontSize": "10px", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text/CenterAlign_with_Padding/resource.json b/com.inductiveautomation.perspective/style-classes/Text/CenterAlign_with_Padding/resource.json new file mode 100644 index 0000000..123507c --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text/CenterAlign_with_Padding/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "88a969de6e2fd1f6b5f29e64f8bec3652e26960a28b7770f8eae83d3062fb788" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text/CenterAlign_with_Padding/style.json b/com.inductiveautomation.perspective/style-classes/Text/CenterAlign_with_Padding/style.json new file mode 100644 index 0000000..e2e8661 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text/CenterAlign_with_Padding/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "overflowWrap": "normal", + "paddingLeft": "4px", + "paddingRight": "4px", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text/InfoText/resource.json b/com.inductiveautomation.perspective/style-classes/Text/InfoText/resource.json new file mode 100644 index 0000000..df69c60 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text/InfoText/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "a231d897b3e3a5b12058c4cf23d0eeaba3d83b50c818f5254239bbd231bc573f" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text/InfoText/style.json b/com.inductiveautomation.perspective/style-classes/Text/InfoText/style.json new file mode 100644 index 0000000..52f9b5a --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text/InfoText/style.json @@ -0,0 +1,8 @@ +{ + "base": { + "style": { + "color": "var(--neutral-80)", + "fontSize": "min(1.0vw, 14px)" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text/Label/resource.json b/com.inductiveautomation.perspective/style-classes/Text/Label/resource.json new file mode 100644 index 0000000..44d5be5 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text/Label/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "0c8f1a09ea1dca1b39354b44e2dc1282bab329d6bc22b806ef0a799bc6d356d6" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text/Label/style.json b/com.inductiveautomation.perspective/style-classes/Text/Label/style.json new file mode 100644 index 0000000..e40b9fa --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text/Label/style.json @@ -0,0 +1,7 @@ +{ + "base": { + "style": { + "margin": "5px" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text/LeftAlign_with_Padding/resource.json b/com.inductiveautomation.perspective/style-classes/Text/LeftAlign_with_Padding/resource.json new file mode 100644 index 0000000..be5ba47 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text/LeftAlign_with_Padding/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "e91c0bdcf6473bfb448861acaad7da2e69c6a2ef557f85fbcdf5556263a9f89f" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text/LeftAlign_with_Padding/style.json b/com.inductiveautomation.perspective/style-classes/Text/LeftAlign_with_Padding/style.json new file mode 100644 index 0000000..27ac20c --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text/LeftAlign_with_Padding/style.json @@ -0,0 +1,8 @@ +{ + "base": { + "style": { + "paddingLeft": "4px", + "textAlign": "left" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text/RightAlign_with_Padding/resource.json b/com.inductiveautomation.perspective/style-classes/Text/RightAlign_with_Padding/resource.json new file mode 100644 index 0000000..77b37a6 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text/RightAlign_with_Padding/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "52e6339246d5cac3eee877c822e3de48717d65520e26e8de37478b52a3488265" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text/RightAlign_with_Padding/style.json b/com.inductiveautomation.perspective/style-classes/Text/RightAlign_with_Padding/style.json new file mode 100644 index 0000000..7304b53 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text/RightAlign_with_Padding/style.json @@ -0,0 +1,8 @@ +{ + "base": { + "style": { + "paddingRight": "4px", + "textAlign": "right" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text/TitleText/resource.json b/com.inductiveautomation.perspective/style-classes/Text/TitleText/resource.json new file mode 100644 index 0000000..18c875f --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text/TitleText/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "ce83ed1e6665e65e7882877660f4398956d992dd2ffbf0050c810ac772a533d6" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text/TitleText/style.json b/com.inductiveautomation.perspective/style-classes/Text/TitleText/style.json new file mode 100644 index 0000000..55e6395 --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text/TitleText/style.json @@ -0,0 +1,10 @@ +{ + "base": { + "style": { + "color": "var(--neutral-80)", + "fontSize": "min(2.0vw, 36px)", + "fontWeight": "bold", + "textAlign": "center" + } + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text/labelText/resource.json b/com.inductiveautomation.perspective/style-classes/Text/labelText/resource.json new file mode 100644 index 0000000..c65df9d --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text/labelText/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "style.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "4a3f6a0ea527fec9bb6c24e69d1e7059d269526837354eeee7938b22d5220211" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/style-classes/Text/labelText/style.json b/com.inductiveautomation.perspective/style-classes/Text/labelText/style.json new file mode 100644 index 0000000..29a285e --- /dev/null +++ b/com.inductiveautomation.perspective/style-classes/Text/labelText/style.json @@ -0,0 +1,5 @@ +{ + "base": { + "style": {} + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/stylesheet/resource.json b/com.inductiveautomation.perspective/stylesheet/resource.json new file mode 100644 index 0000000..967655c --- /dev/null +++ b/com.inductiveautomation.perspective/stylesheet/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "stylesheet.css" + ], + "attributes": { + "lastModification": { + "actor": "sipearso", + "timestamp": "2023-09-05T13:25:20Z" + }, + "lastModificationSignature": "db6ad83da61ac54c363dcf17c27a98d0d301c550d80cd2fd189f052de36e8f7e" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/stylesheet/stylesheet.css b/com.inductiveautomation.perspective/stylesheet/stylesheet.css new file mode 100644 index 0000000..9e68540 --- /dev/null +++ b/com.inductiveautomation.perspective/stylesheet/stylesheet.css @@ -0,0 +1,70 @@ +/* Direct stylesheet authoring is an advanced feature. Knowledge of CSS required.*/ + +.psc-x1 { transition: all .2s ease-in-out; } +.psc-x1:hover { transform: scale(1.5) !important; z-index: 5;} + + +.psc-x2 { transition: all .2s ease-in-out; } +.psc-x2:hover { transform: scale(2) !important; z-index: 5;} + +.psc-x3 { transition: all .2s ease-in-out; } +.psc-x3:hover { transform: scale(3) !important; z-index: 5;} + +/* Set the styling for the Table component checkbox colour.*/ +.ia_tableComponent[data-component="ia.display.table"] .ia_checkbox__checkedIcon { + color: black; +} +.ia_tableComponent[data-component="ia.display.table"] .ia_checkbox__uncheckedIcon { + color: black; +} + +div[data-component="ia.input.fileupload"] .ia_button--primary { + background-color: var(--neutral-30); + border-style: None; + color: black; + border-radius:20px; +} + + +/* Help page styles */ + +.psc-background:hover { + box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); + transition: box-shadow 0.9s ease-in-out; +} + +.psc-background-none { + box-shadow: 0 0px 0px 0 , 0 0px 0px 0; + transition: box-shadow 0.9s ease-in-out; +} + +@keyframes fadeIn{ + 0% { opacity: 0; } + 100% { opacity: 1; } +} + +.psc-FadeInFast { + animation: fadeIn 2s; +} + +.psc-FadeInMedium { + animation: fadeIn 4s; +} + +.psc-FadeInSlow { + animation: fadeIn 6s; +} + + +@keyframes rotation { + from { + transform: rotate(0deg); + } + to { + transform: rotate(359deg); + } +} + +.psc-rotate { + animation: rotation 2s infinite linear; +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Additional-Home-View/MAP-Home/resource.json b/com.inductiveautomation.perspective/views/Additional-Home-View/MAP-Home/resource.json new file mode 100644 index 0000000..cfe4e9f --- /dev/null +++ b/com.inductiveautomation.perspective/views/Additional-Home-View/MAP-Home/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "ankikarw", + "timestamp": "2024-04-01T21:09:10Z" + }, + "lastModificationSignature": "39d8b5fdbc33c9104ee2dfc6d73cc3e0bcf798e38727b6e8709af8dc27eef9c2" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Additional-Home-View/MAP-Home/thumbnail.png b/com.inductiveautomation.perspective/views/Additional-Home-View/MAP-Home/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..a547ea48d24b1d167f193bf8edd1bd1c9a594665 GIT binary patch literal 62407 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 L|Nhs1p|AcAq%?QY literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Additional-Home-View/MAP-Home/view.json b/com.inductiveautomation.perspective/views/Additional-Home-View/MAP-Home/view.json new file mode 100644 index 0000000..f45faa6 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Additional-Home-View/MAP-Home/view.json @@ -0,0 +1,108 @@ +{ + "custom": { + "activityLogger": { + "alt_pageid": "site-overview", + "start_time": { + "$": [ + "ts", + 192, + 1709762531101 + ], + "$ts": 1709762531101 + } + } + }, + "events": { + "system": { + "onShutdown": { + "config": { + "script": "\tactivityLog.productMetrics.callLogger(self, \u0027page\u0027)" + }, + "scope": "G", + "type": "script" + }, + "onStartup": { + "config": { + "script": "\tself.custom.activityLogger.start_time \u003d system.date.now()" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": {}, + "propConfig": { + "custom.activityLogger": { + "persistent": true + }, + "custom.activityLogger.pageid": { + "binding": { + "config": { + "expression": "{page.props.path}" + }, + "transforms": [ + { + "code": "\tif value \u003d\u003d\u0027/\u0027 or value \u003d\u003d \u0027\u0027 or value \u003d\u003d None:\n\t\treturn self.custom.activityLogger.alt_pageid.lower()\n\telse:\n\t\treturn value[1:].lower()", + "type": "script" + } + ], + "type": "expr" + } + } + }, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "custom": { + "s3URI": "SCADA/Other/MAP.svg" + }, + "meta": { + "name": "Image" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "props.source": { + "binding": { + "config": { + "path": "this.custom.s3URI" + }, + "transforms": [ + { + "code": "\treturn AWS.s3.getPresignedURL(self, value)", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "altText": "none", + "fit": { + "mode": "fill" + } + }, + "type": "ia.display.image" + } + ], + "meta": { + "name": "root" + }, + "props": { + "mode": "percent", + "style": { + "backgroundColor": "#EEEEEE" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Alarm-Views/AlarmTable/resource.json b/com.inductiveautomation.perspective/views/Alarm-Views/AlarmTable/resource.json new file mode 100644 index 0000000..8d7a1e5 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Alarm-Views/AlarmTable/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "vivsampa", + "timestamp": "2024-04-18T12:23:53Z" + }, + "lastModificationSignature": "cfece3333a1ad9f32c7f70d100f78c91ec462c469dfce881bdff001e2c2fb0ca" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Alarm-Views/AlarmTable/thumbnail.png b/com.inductiveautomation.perspective/views/Alarm-Views/AlarmTable/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..eeb4b64f5ad777e02828176ed54fd13ef0293c71 GIT binary patch literal 2983 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%0DTjSnZK>5l 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 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Alarm-Views/HistoricalAlarms/view.json b/com.inductiveautomation.perspective/views/Alarm-Views/HistoricalAlarms/view.json new file mode 100644 index 0000000..4a97e9a --- /dev/null +++ b/com.inductiveautomation.perspective/views/Alarm-Views/HistoricalAlarms/view.json @@ -0,0 +1,2897 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "15.8px" + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "32px" + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "meta": { + "name": "Label_3" + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-White-12pt", + "fontWeight": "bold", + "text": "value", + "textAlign": "left", + "textIndent": "10px" + }, + "text": "Filter by Date/Time" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "32px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-White-12pt", + "textAlign": "left", + "textIndent": "10px" + }, + "text": "Start" + }, + "type": "ia.display.label" + }, + { + "events": { + "system": { + "onStartup": { + "config": { + "script": "\timport datetime\n\t\t\n\ttime_now \u003d datetime.datetime.now()\n\tself.props.value \u003d time_now - datetime.timedelta(hours \u003d 1)\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "StartTime" + }, + "position": { + "basis": "32px", + "shrink": 0 + }, + "propConfig": { + "props.maxDate": { + "binding": { + "config": { + "path": "../EndTime.props.value" + }, + "type": "property" + } + }, + "props.minDate": { + "binding": { + "config": { + "expression": "addWeeks({../EndTime.props.value},-2)" + }, + "type": "expr" + } + } + }, + "props": { + "formattedValue": "Apr 19, 2022 10:28 AM", + "value": { + "$": [ + "ts", + 192, + 1650367709276 + ], + "$ts": 1650364109276 + } + }, + "type": "ia.input.date-time-input" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "basis": "32px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-White-12pt", + "textAlign": "left", + "textIndent": "10px" + }, + "text": "End" + }, + "type": "ia.display.label" + }, + { + "events": { + "system": { + "onStartup": { + "config": { + "script": "\timport datetime\n\t\n\ttime_now \u003d datetime.datetime.now()\n\tself.props.value \u003d time_now" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "EndTime" + }, + "position": { + "basis": "32px", + "shrink": 0 + }, + "props": { + "formattedValue": "Apr 19, 2022 11:28 AM", + "value": { + "$": [ + "ts", + 192, + 1650367709276 + ], + "$ts": 1650367709276 + } + }, + "type": "ia.input.date-time-input" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "200px" + }, + "props": { + "direction": "column", + "style": { + "borderStyle": "solid", + "borderWidth": "0.5px" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "textAlign": "left", + "textIndent": "10px" + } + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "meta": { + "name": "Label_3" + }, + "position": { + "basis": "32px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-White-12pt", + "fontWeight": "bold", + "text": "value", + "textAlign": "left", + "textIndent": "10px" + }, + "text": "Filter by Device" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "32px" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload \u003d {}\n\tdevice \u003d self.props.value\n\tpayload[\"device\"] \u003d device\n\tsystem.perspective.sendMessage(\"device-filter\", payload \u003d payload, scope \u003d \"page\")" + }, + "scope": "G", + "type": "script" + } + }, + "system": { + "onStartup": { + "config": { + "script": "\tdevices \u003d system.tag.readBlocking([\"Configuration/DetailedViews\"])\n\tdevices \u003d devices[0].value\n\tdevices_decoded \u003d system.util.jsonDecode(devices)\n\tdevice_list \u003d []\n\tno_device \u003d {}\n\tno_device[\"value\"]\u003d\"\"\n\tno_device[\"label\"]\u003d\"None\"\n\tdevice_list.append(no_device)\n\tfor i in devices_decoded:\n\t\tdevice_dict \u003d{}\n\t\tif len(devices_decoded[i]) \u003d\u003d 1:\n\t\t\tdevice_dict[\"value\"] \u003d i\n\t\t\tdevice_dict[\"label\"]\u003d i\n\t\t\tdevice_list.append(device_dict)\n\t\telse:\n\t\t\titems \u003d devices_decoded[i]\n\t\t\tfor item in items:\n\t\t\t\tdevice_dict \u003d{}\n\t\t\t\tdevice_dict[\"value\"] \u003d item\n\t\t\t\tdevice_dict[\"label\"]\u003d item\n\t\t\t\tdevice_list.append(device_dict)\n\t\t\t\t\n\tself.props.options \u003d device_list\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "32px", + "shrink": 0 + }, + "props": { + "options": [ + { + "label": "None", + "value": "" + }, + { + "label": "PLC03", + "value": "PLC03" + }, + { + "label": "PLC25", + "value": "PLC25" + }, + { + "label": "PLC47", + "value": "PLC47" + }, + { + "label": "PLC97", + "value": "PLC97" + }, + { + "label": "PLC69", + "value": "PLC69" + }, + { + "label": "PLC26", + "value": "PLC26" + }, + { + "label": "PLC48", + "value": "PLC48" + }, + { + "label": "PLC01", + "value": "PLC01" + }, + { + "label": "PLC23", + "value": "PLC23" + }, + { + "label": "PLC02", + "value": "PLC02" + }, + { + "label": "PLC07", + "value": "PLC07" + }, + { + "label": "PLC29", + "value": "PLC29" + }, + { + "label": "PLC08", + "value": "PLC08" + }, + { + "label": "PLC27", + "value": "PLC27" + }, + { + "label": "PLC49", + "value": "PLC49" + }, + { + "label": "PLC06", + "value": "PLC06" + }, + { + "label": "PLC28", + "value": "PLC28" + }, + { + "label": "PLC96", + "value": "PLC96" + }, + { + "label": "PLC40", + "value": "PLC40" + }, + { + "label": "PLC60", + "value": "PLC60" + }, + { + "label": "SLAM302", + "value": "SLAM302" + }, + { + "label": "PLC21", + "value": "PLC21" + }, + { + "label": "PLC43", + "value": "PLC43" + }, + { + "label": "PLC65", + "value": "PLC65" + }, + { + "label": "SLAM306", + "value": "SLAM306" + }, + { + "label": "PLC22", + "value": "PLC22" + }, + { + "label": "PLC66", + "value": "PLC66" + }, + { + "label": "SLAM307", + "value": "SLAM307" + }, + { + "label": "PLC41", + "value": "PLC41" + }, + { + "label": "PLC1000", + "value": "PLC1000" + }, + { + "label": "PLC20", + "value": "PLC20" + }, + { + "label": "PLC42", + "value": "PLC42" + }, + { + "label": "PLC64", + "value": "PLC64" + }, + { + "label": "SLAM304", + "value": "SLAM304" + }, + { + "label": "MAN2_PLC99", + "value": "MAN2_PLC99" + }, + { + "label": "PLC23-1", + "value": "PLC23-1" + }, + { + "label": "PLC09-2", + "value": "PLC09-2" + }, + { + "label": "PLC1000-1", + "value": "PLC1000-1" + }, + { + "label": "PLC09", + "value": "PLC09" + }, + { + "label": "PLC99", + "value": "PLC99" + }, + { + "label": "PLC14", + "value": "PLC14" + }, + { + "label": "ARSAW1401", + "value": "ARSAW1401" + }, + { + "label": "ARSAW1402", + "value": "ARSAW1402" + }, + { + "label": "ARSAW1403", + "value": "ARSAW1403" + }, + { + "label": "ARSAW1404", + "value": "ARSAW1404" + }, + { + "label": "ARSAW1405", + "value": "ARSAW1405" + }, + { + "label": "ARSAW1406", + "value": "ARSAW1406" + }, + { + "label": "ARSAW1407", + "value": "ARSAW1407" + }, + { + "label": "ARSAW1408", + "value": "ARSAW1408" + }, + { + "label": "PLC15", + "value": "PLC15" + }, + { + "label": "ARSAW1501", + "value": "ARSAW1501" + }, + { + "label": "ARSAW1502", + "value": "ARSAW1502" + }, + { + "label": "ARSAW1503", + "value": "ARSAW1503" + }, + { + "label": "ARSAW1504", + "value": "ARSAW1504" + }, + { + "label": "ARSAW1505", + "value": "ARSAW1505" + }, + { + "label": "ARSAW1506", + "value": "ARSAW1506" + }, + { + "label": "ARSAW1507", + "value": "ARSAW1507" + }, + { + "label": "ARSAW1508", + "value": "ARSAW1508" + }, + { + "label": "PLC13", + "value": "PLC13" + }, + { + "label": "ARSAW1301", + "value": "ARSAW1301" + }, + { + "label": "ARSAW1302", + "value": "ARSAW1302" + }, + { + "label": "ARSAW1303", + "value": "ARSAW1303" + }, + { + "label": "ARSAW1304", + "value": "ARSAW1304" + }, + { + "label": "ARSAW1305", + "value": "ARSAW1305" + }, + { + "label": "ARSAW1306", + "value": "ARSAW1306" + }, + { + "label": "ARSAW1307", + "value": "ARSAW1307" + }, + { + "label": "ARSAW1308", + "value": "ARSAW1308" + }, + { + "label": "PLC16", + "value": "PLC16" + }, + { + "label": "ARSAW1601", + "value": "ARSAW1601" + }, + { + "label": "ARSAW1602", + "value": "ARSAW1602" + }, + { + "label": "ARSAW1603", + "value": "ARSAW1603" + }, + { + "label": "ARSAW1604", + "value": "ARSAW1604" + }, + { + "label": "ARSAW1605", + "value": "ARSAW1605" + }, + { + "label": "ARSAW1606", + "value": "ARSAW1606" + }, + { + "label": "ARSAW1607", + "value": "ARSAW1607" + }, + { + "label": "ARSAW1608", + "value": "ARSAW1608" + }, + { + "label": "PLC51", + "value": "PLC51" + }, + { + "label": "SLAM305", + "value": "SLAM305" + }, + { + "label": "PLC70", + "value": "PLC70" + }, + { + "label": "PLC71", + "value": "PLC71" + }, + { + "label": "RWC4", + "value": "RWC4" + }, + { + "label": "PLC71", + "value": "PLC71" + }, + { + "label": "PLC70", + "value": "PLC70" + }, + { + "label": "RWC4", + "value": "RWC4" + }, + { + "label": "MAN2_PLC96", + "value": "MAN2_PLC96" + }, + { + "label": "PLC32", + "value": "PLC32" + }, + { + "label": "PLC30", + "value": "PLC30" + }, + { + "label": "SLAM301", + "value": "SLAM301" + }, + { + "label": "PLC52", + "value": "PLC52" + }, + { + "label": "MAN2_PLC97", + "value": "MAN2_PLC97" + }, + { + "label": "PLC31", + "value": "PLC31" + }, + { + "label": "SLAM303", + "value": "SLAM303" + }, + { + "label": "PLC80", + "value": "PLC80" + }, + { + "label": "SLAM401", + "value": "SLAM401" + }, + { + "label": "SLAM402", + "value": "SLAM402" + } + ], + "value": "None" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "device-filter-reset", + "pageScope": true, + "script": "\t# implement your handler here\n\tdevice_selection \u003d payload[\"device\"]\n\tself.props.value \u003d device_selection", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "200px" + }, + "props": { + "direction": "column", + "style": { + "borderStyle": "solid", + "borderWidth": "0.5px" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "32px", + "grow": 1 + }, + "props": { + "style": { + "textAlign": "left", + "textIndent": "10px" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "32px", + "grow": 1 + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "meta": { + "name": "Label_3" + }, + "position": { + "basis": "32px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-White-12pt", + "fontWeight": "bold", + "text": "value", + "textAlign": "left", + "textIndent": "10px" + }, + "text": "Filter by Severity" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "32px" + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "custom": { + "Severity": "Critical", + "background_on": "false" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload \u003d {}\n\tseverity \u003d self.custom.Severity\n\tpayload[\"severity\"] \u003d severity\n\tsystem.perspective.sendMessage(\"severity-filter\", payload \u003d payload , scope \u003d \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "expression": "if({this.custom.background_on}\u003d\"true\",1,0)" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Critical" + }, + { + "input": 0, + "output": "Alarms-Styles/NoAlarm-Black" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "color": "#FFFFFF", + "path": "material/error" + }, + "position": "top" + }, + "style": {}, + "text": "Critical" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "button-severity-indicator", + "pageScope": true, + "script": "\tbackground \u003d \"false\"\n\tseverity \u003d payload[\"severity\"]\n\tbutton_severity \u003d self.custom.Severity\n\tif severity \u003d\u003d button_severity:\n\t\tbackground \u003d \"true\"\n\telse:\n\t\tbackground \u003d \"false\"\n\t\n\tself.custom.background_on \u003d background\n\t", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "custom": { + "Severity": "High", + "background_on": "false" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload \u003d {}\n\tseverity \u003d self.custom.Severity\n\tpayload[\"severity\"] \u003d severity\n\tsystem.perspective.sendMessage(\"severity-filter\", payload \u003d payload , scope \u003d \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_0" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "expression": "if({this.custom.background_on}\u003d\"true\",1,0)" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/High" + }, + { + "input": 0, + "output": "Alarms-Styles/NoAlarm-Black" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/priority_high" + }, + "position": "top" + }, + "style": {}, + "text": "High" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "button-severity-indicator", + "pageScope": true, + "script": "\tbackground \u003d \"false\"\n\tseverity \u003d payload[\"severity\"]\n\tbutton_severity \u003d self.custom.Severity\n\tif severity \u003d\u003d button_severity:\n\t\tbackground \u003d \"true\"\n\telse:\n\t\tbackground \u003d \"false\"\n\t\n\tself.custom.background_on \u003d background", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "custom": { + "Severity": "Medium", + "background_on": "false" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload \u003d {}\n\tseverity \u003d self.custom.Severity\n\tpayload[\"severity\"] \u003d severity\n\tsystem.perspective.sendMessage(\"severity-filter\", payload \u003d payload , scope \u003d \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_1" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "expression": "if({this.custom.background_on}\u003d\"true\",1,0)" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Medium" + }, + { + "input": 0, + "output": "Alarms-Styles/NoAlarm-Black" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/priority_high" + }, + "position": "top" + }, + "style": {}, + "text": "Medium" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "button-severity-indicator", + "pageScope": true, + "script": "\tbackground \u003d \"false\"\n\tseverity \u003d payload[\"severity\"]\n\tbutton_severity \u003d self.custom.Severity\n\tif severity \u003d\u003d button_severity:\n\t\tbackground \u003d \"true\"\n\telse:\n\t\tbackground \u003d \"false\"\n\t\n\tself.custom.background_on \u003d background", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "50px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "7px" + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "custom": { + "Severity": "Low", + "background_on": "false" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload \u003d {}\n\tseverity \u003d self.custom.Severity\n\tpayload[\"severity\"] \u003d severity\n\tsystem.perspective.sendMessage(\"severity-filter\", payload \u003d payload , scope \u003d \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "expression": "if({this.custom.background_on}\u003d\"true\",1,0)" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Low" + }, + { + "input": 0, + "output": "Alarms-Styles/NoAlarm-Black" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/low_priority" + }, + "position": "top" + }, + "style": {}, + "text": "Low" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "button-severity-indicator", + "pageScope": true, + "script": "\tbackground \u003d \"false\"\n\tseverity \u003d payload[\"severity\"]\n\tbutton_severity \u003d self.custom.Severity\n\tif severity \u003d\u003d button_severity:\n\t\tbackground \u003d \"true\"\n\telse:\n\t\tbackground \u003d \"false\"\n\t\n\tself.custom.background_on \u003d background", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "custom": { + "Severity": "Diagnostic", + "background_on": "false" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload \u003d {}\n\tseverity \u003d self.custom.Severity\n\tpayload[\"severity\"] \u003d severity\n\tsystem.perspective.sendMessage(\"severity-filter\", payload \u003d payload , scope \u003d \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_0" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "expression": "if({this.custom.background_on}\u003d\"true\",1,0)" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 0, + "output": "Alarms-Styles/NoAlarm-Black" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/warning" + }, + "position": "top" + }, + "style": {}, + "text": "Diagnostic" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "button-severity-indicator", + "pageScope": true, + "script": "\t# implement your handler here\n\tbackground \u003d \"false\"\n\tseverity \u003d payload[\"severity\"]\n\tbutton_severity \u003d self.custom.Severity\n\tif severity \u003d\u003d button_severity:\n\t\tbackground \u003d \"true\"\n\telse:\n\t\tbackground \u003d \"false\"\n\t\n\tself.custom.background_on \u003d background", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "basis": "100px" + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "50px", + "shrink": 0 + }, + "type": "ia.container.flex" + } + ], + "custom": { + "SeverityFilter": "value" + }, + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "basis": "200px" + }, + "props": { + "direction": "column", + "style": { + "borderStyle": "solid", + "borderWidth": "0.5px" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Label_3" + }, + "position": { + "basis": "200px", + "grow": 1, + "shrink": 10 + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "meta": { + "name": "Label_3" + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-White-12pt", + "fontWeight": "bold", + "text": "value", + "textAlign": "left", + "textIndent": "10px" + }, + "text": "Reset Filters" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "32px" + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "5px", + "grow": 1 + }, + "type": "ia.display.label" + }, + { + "custom": { + "Severity": "Critical", + "background_on": "false" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload1 \u003d {}\n\tpayload2 \u003d{}\n\tpayload3 \u003d{}\n\tpayload1[\"severity\"] \u003d \"\"\n\tpayload2[\"device\"] \u003d \"None\"\n\tpayload3[\"device\"] \u003d \"\"\n\tsystem.perspective.sendMessage(\"severity-filter\", payload \u003d payload1 , scope \u003d \"page\")\n\tsystem.perspective.sendMessage(\"button-severity-indicator\", payload \u003d payload1 , scope \u003d \"page\")\n\tsystem.perspective.sendMessage(\"device-filter-reset\", payload \u003d payload2 , scope \u003d \"page\")\n\tsystem.perspective.sendMessage(\"device-filter\", payload \u003d payload3 , scope \u003d \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "basis": "80px" + }, + "props": { + "image": { + "icon": { + "color": "#FFFFFF", + "path": "material/clear" + }, + "position": "top" + }, + "style": { + "classes": "Alarms-Styles/NoAlarm-Black" + }, + "text": "Reset Filters" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "button-severity-indicator", + "pageScope": true, + "script": "\tbackground \u003d \"false\"\n\tseverity \u003d payload[\"severity\"]\n\tbutton_severity \u003d self.custom.Severity\n\tif severity \u003d\u003d button_severity:\n\t\tbackground \u003d \"true\"\n\telse:\n\t\tbackground \u003d \"false\"\n\t\n\tself.custom.background_on \u003d background\n\t", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "custom": { + "Severity": "High", + "background_on": "false" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.toggleDock(\"Docked-West\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_0" + }, + "position": { + "basis": "80px" + }, + "props": { + "image": { + "icon": { + "path": "material/toggle_on" + }, + "position": "top" + }, + "style": { + "classes": "Alarms-Styles/NoAlarm-Black" + }, + "text": "Toggle Dock" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "button-severity-indicator", + "pageScope": true, + "script": "\tbackground \u003d \"false\"\n\tseverity \u003d payload[\"severity\"]\n\tbutton_severity \u003d self.custom.Severity\n\tif severity \u003d\u003d button_severity:\n\t\tbackground \u003d \"true\"\n\telse:\n\t\tbackground \u003d \"false\"\n\t\n\tself.custom.background_on \u003d background", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "custom": { + "Severity": "High", + "background_on": "false" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tdata \u003d self.parent.parent.parent.parent.getChild(\"Table\").props.data\n\tdataset \u003d system.dataset.dataSetToHTML(1,data,\"Test\")\n\tsystem.perspective.print(type(dataset))\n\tsystem.perspective.download(\"myExport.html\",dataset)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_1" + }, + "position": { + "basis": "80px" + }, + "props": { + "image": { + "icon": { + "path": "material/import_export" + }, + "position": "top" + }, + "style": { + "classes": "Alarms-Styles/NoAlarm-Black" + }, + "text": "Export" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "button-severity-indicator", + "pageScope": true, + "script": "\tbackground \u003d \"false\"\n\tseverity \u003d payload[\"severity\"]\n\tbutton_severity \u003d self.custom.Severity\n\tif severity \u003d\u003d button_severity:\n\t\tbackground \u003d \"true\"\n\telse:\n\t\tbackground \u003d \"false\"\n\t\n\tself.custom.background_on \u003d background", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "5px", + "grow": 1 + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "50px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "36px" + }, + "type": "ia.display.label" + } + ], + "custom": { + "SeverityFilter": "value" + }, + "meta": { + "name": "FlexContainer_2" + }, + "position": { + "basis": "200px" + }, + "props": { + "direction": "column", + "style": { + "borderStyle": "solid", + "borderWidth": "0.5px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "300px", + "shrink": 0 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "15.8px" + }, + "type": "ia.display.label" + }, + { + "custom": { + "Historyfilters": { + "Acked": 2, + "AckedBy": "", + "Area": "", + "DeviceDescription": "", + "DeviceType": "", + "DisplayPath": "", + "Empty": 0, + "Interval": 0, + "LinkToOEEMP": "", + "LinkToPage": "", + "Name": "", + "PLC": "", + "Priority": 0, + "SubArea": "", + "TZ": "Europe/London", + "UDT": "" + }, + "export": "value", + "severityFilter": "" + }, + "meta": { + "name": "Table" + }, + "position": { + "basis": "1639px", + "grow": 1 + }, + "propConfig": { + "custom.Historyfilters.FC": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "direct", + "tagPath": "Configuration/FC" + }, + "type": "tag" + } + }, + "custom.Historyfilters.StartDT": { + "binding": { + "config": { + "path": "../FlexContainer/FlexContainer/StartTime.props.value" + }, + "type": "property" + } + }, + "custom.Historyfilters.StopDT": { + "binding": { + "config": { + "path": "../FlexContainer/FlexContainer/EndTime.props.value" + }, + "type": "property" + } + }, + "custom.alarmHistory": { + "binding": { + "config": { + "parameters": { + "Ackd": "{this.custom.Historyfilters.Acked}", + "AckdBy": "{this.custom.Historyfilters.AckedBy}", + "Area": "{this.custom.Historyfilters.Area}", + "DeviceDescription": "{this.custom.Historyfilters.DeviceDescription}", + "DeviceType": "{this.custom.Historyfilters.DeviceType}", + "DisplayPath": "{this.custom.Historyfilters.DisplayPath}", + "Empty": "{this.custom.Historyfilters.Empty}", + "Finish": "{this.custom.Historyfilters.StopDT}", + "Interval": "{this.custom.Historyfilters.Interval}", + "LinkToOEEMP": "{this.custom.Historyfilters.LinkToOEEMP}", + "LinkToPage": "{this.custom.Historyfilters.LinkToPage}", + "Name": "{this.custom.Historyfilters.Name}", + "PLC": "{this.custom.Historyfilters.PLC}", + "Priority": "{this.custom.Historyfilters.Priority}", + "Start": "{this.custom.Historyfilters.StartDT}", + "SubArea": "{this.custom.Historyfilters.SubArea}", + "TZ": "{this.custom.Historyfilters.TZ}", + "UDT": "{this.custom.Historyfilters.UDT}", + "WHID": "{Configuration/FC}" + }, + "polling": { + "enabled": true, + "rate": "2" + }, + "queryPath": "StoredProcedures/GetHistoricalAlarms", + "returnFormat": "dataset" + }, + "type": "query" + } + }, + "custom.export": { + "onChange": { + "enabled": null, + "script": "\tdata \u003d self.props.data\n\tsystem.perspective.download(\"AlarmExport\", data)" + } + }, + "custom.severityFilter": { + "onChange": { + "enabled": null, + "script": "\tpayload \u003d {}\n\tseverity \u003d self.custom.severityFilter\n\tpayload[\"severity\"] \u003d severity\n\tsystem.perspective.sendMessage(\"button-severity-indicator\", payload\u003d payload, scope \u003d \"page\")" + } + }, + "props.data": { + "binding": { + "config": { + "path": "this.custom.alarmHistory" + }, + "type": "property" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "TimeStamp", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Duration", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Name", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Priority", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Acked", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": false, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "UDT", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "UID", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "DeviceDescription", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": false, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "DeviceType", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": false, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "DisplayPath", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Area", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "SubArea", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "PLC", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "MaintenanceTemplate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": false, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "LinkToPage", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": false, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "LinkToBOM", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": false, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "LinkToHelp", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": false, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "LinkToOEEMP", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": false, + "width": "" + } + ], + "filter": { + "enabled": true + }, + "headerGroups": [ + [] + ] + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "severity-filter", + "pageScope": true, + "script": "\tfilter \u003d payload[\"severity\"]\n\tself.custom.severityFilter \u003d filter\n\tself.props.filter.text \u003d filter\n\t", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "device-filter", + "pageScope": true, + "script": "\t# implement your handler here\n\tdevice\u003d payload[\"device\"]\n\tself.custom.Historyfilters.PLC \u003d device", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.display.table" + } + ], + "meta": { + "name": "root" + }, + "props": { + "style": { + "classes": "Background-Styles/Main-Background" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/resource.json b/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/resource.json new file mode 100644 index 0000000..8feadec --- /dev/null +++ b/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "vivsampa", + "timestamp": "2024-06-11T15:25:17Z" + }, + "lastModificationSignature": "b847d4c35a094954df1f729fb7826eb366ebf00c46ee61d5905de12d63982952" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/thumbnail.png b/com.inductiveautomation.perspective/views/Alarm-Views/RealTime/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..5683b1249afe2817b2576e0537339054db5b873a GIT binary patch literal 33328 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 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Alerts/alert/view.json b/com.inductiveautomation.perspective/views/Alerts/alert/view.json new file mode 100644 index 0000000..0845b6f --- /dev/null +++ b/com.inductiveautomation.perspective/views/Alerts/alert/view.json @@ -0,0 +1,749 @@ +{ + "custom": {}, + "params": { + "btnActionClose": "closePopup", + "btnActionPrimary": "closePopup", + "btnActionSecondary": "closePopup", + "btnIconAlignment": "right", + "btnIconPrimary": "chevron_right", + "btnIconSecondary": "", + "btnTextPrimary": "Primary", + "btnTextSecondary": "Secondary", + "message": "Alert message goes here.", + "payload": { + "key": "The payload to return to the caller would go here. DLC 2021-09-23" + }, + "showCloseBtn": true, + "state": "info", + "title": "title" + }, + "propConfig": { + "params.btnActionClose": { + "paramDirection": "input", + "persistent": true + }, + "params.btnActionPrimary": { + "paramDirection": "inout", + "persistent": true + }, + "params.btnActionSecondary": { + "paramDirection": "inout", + "persistent": true + }, + "params.btnIconAlignment": { + "paramDirection": "inout" + }, + "params.btnIconPrimary": { + "paramDirection": "inout", + "persistent": true + }, + "params.btnIconSecondary": { + "paramDirection": "inout", + "persistent": true + }, + "params.btnIconSecondary_1": { + "paramDirection": "input", + "persistent": true + }, + "params.btnIconSecondary_2": { + "paramDirection": "input", + "persistent": true + }, + "params.btnIconSecondary_3": { + "paramDirection": "input", + "persistent": true + }, + "params.btnTextPrimary": { + "paramDirection": "inout" + }, + "params.btnTextSecondary": { + "paramDirection": "inout" + }, + "params.buttons.key": { + "paramDirection": "input", + "persistent": true + }, + "params.message": { + "paramDirection": "input", + "persistent": true + }, + "params.payload": { + "paramDirection": "input", + "persistent": true + }, + "params.showCloseBtn": { + "paramDirection": "input", + "persistent": true + }, + "params.state": { + "paramDirection": "input", + "persistent": true + }, + "params.title": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 224, + "width": 384 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "iconMain" + }, + "position": { + "basis": "32px", + "shrink": 0 + }, + "propConfig": { + "props.color": { + "binding": { + "config": { + "expression": "{view.params.state}" + }, + "transforms": [ + { + "fallback": "var(--info)", + "inputType": "scalar", + "mappings": [ + { + "input": "warning", + "output": "#FFFF00" + }, + { + "input": "success", + "output": "#00CC00" + }, + { + "input": "error", + "output": "#FF8000" + }, + { + "input": "info", + "output": "#007EFC" + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "expr" + } + }, + "props.path": { + "binding": { + "config": { + "expression": "{view.params.state}" + }, + "transforms": [ + { + "fallback": "material/info", + "inputType": "scalar", + "mappings": [ + { + "input": "warning", + "output": "material/warning" + }, + { + "input": "info", + "output": "material/info" + }, + { + "input": "error", + "output": "material/error" + }, + { + "input": "success", + "output": "material/check_circle" + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "style": { + "classes": "Utilities/m-r-16" + } + }, + "type": "ia.display.icon" + }, + { + "children": [ + { + "meta": { + "name": "title" + }, + "position": { + "grow": 1, + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "{this.props.text}" + }, + "transforms": [ + { + "fallback": true, + "inputType": "scalar", + "mappings": [ + { + "input": "", + "output": false + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "expr" + } + }, + "props.style.color": { + "binding": { + "config": { + "path": "view.params.state" + }, + "enabled": false, + "transforms": [ + { + "fallback": "var(--info)", + "inputType": "scalar", + "mappings": [ + { + "input": "info", + "output": "var(--info)" + }, + { + "input": "success", + "output": "var(--success)" + }, + { + "input": "error", + "output": "var(--error)" + }, + { + "input": "warning", + "output": "var(--warning)" + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + } + }, + "props.text": { + "binding": { + "config": { + "path": "view.params.title" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Alerts/alertTitle", + "color": "#FAFAFA" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "message" + }, + "position": { + "grow": 1, + "shrink": 0 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.message" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Alerts/alertMessage" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "content" + }, + "position": { + "grow": 1 + }, + "props": { + "direction": "column", + "style": { + "classes": "Utilities/m-r-16" + } + }, + "type": "ia.container.flex" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tmessageType \u003d self.view.params.btnActionClose\t\n\tsystem.perspective.sendMessage(messageType, scope \u003d \"session\")" + }, + "scope": "G", + "type": "script" + }, + "onTouchStart": { + "config": { + "script": "\tmessageType \u003d self.view.params.btnActionClose\t\t\n\tpayload \u003d self.view.params.payload\t\t## Added 2021-09-23 to return to caller view\n\tsystem.perspective.sendMessage(messageType, payload, scope \u003d \"session\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "iconClose" + }, + "position": { + "basis": "16px", + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "view.params.showCloseBtn" + }, + "type": "property" + } + } + }, + "props": { + "color": "#FAFAFA", + "path": "material/close", + "style": { + "classes": "Alerts/alertClose" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "closePopup", + "pageScope": false, + "script": "\t# closes the last focused popup\n\tsystem.perspective.closePopup(\u0027alertDialog\u0027)", + "sessionScope": true, + "viewScope": false + } + ] + }, + "type": "ia.display.icon" + } + ], + "meta": { + "name": "body" + }, + "position": { + "basis": "150px", + "grow": 1, + "shrink": 0 + }, + "props": { + "alignItems": "flex-start", + "style": { + "classes": "Utilities/p-16" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tmessageType \u003d self.view.params.btnActionSecondary\t\t\n\tpayload \u003d self.view.params.payload\t\t## Added 2021-09-23 to return to caller view\n\tsystem.perspective.sendMessage(messageType, payload, scope \u003d \"session\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "actionSecondary" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "this.props.text" + }, + "transforms": [ + { + "fallback": true, + "inputType": "scalar", + "mappings": [ + { + "input": "", + "output": false + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + } + }, + "props.image.icon.path": { + "binding": { + "config": { + "expression": "\"material/\" + {view.params.btnIconSecondary}" + }, + "transforms": [ + { + "code": "\tif str(value) \u003d\u003d \"material/\":\n\t\treturn \"\"\n\telse:\n\t\treturn value", + "type": "script" + } + ], + "type": "expr" + } + }, + "props.image.position": { + "binding": { + "config": { + "path": "view.params.btnIconAlignment" + }, + "type": "property" + } + }, + "props.image.style.fill": { + "binding": { + "config": { + "path": "view.params.state" + }, + "transforms": [ + { + "fallback": "#222222", + "inputType": "scalar", + "mappings": [ + { + "input": "info", + "output": "#17599C" + }, + { + "input": "success", + "output": "#117539" + }, + { + "input": "warning", + "output": "#C26700" + }, + { + "input": "error", + "output": "#A62D19" + } + ], + "outputType": "color", + "type": "map" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.params.state" + }, + "enabled": false, + "transforms": [ + { + "fallback": "Alerts/alertBtn2 Utilities/m-r-8 Utilities/p-rl-8", + "inputType": "scalar", + "mappings": [ + { + "input": "error", + "output": "Alerts/states/errorBtn2 Utilities/m-r-8 Utilities/p-rl-8" + }, + { + "input": "warning", + "output": "Alerts/states/warningBtn2 Utilities/m-r-8 Utilities/p-rl-8" + }, + { + "input": "info", + "output": "Alerts/states/infoBtn2 Utilities/m-r-8 Utilities/p-rl-8" + }, + { + "input": "success", + "output": "Alerts/states/successBtn2 Utilities/m-r-8 Utilities/p-rl-8" + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + } + }, + "props.text": { + "binding": { + "config": { + "expression": "{view.params.btnTextSecondary}" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "height": 20, + "icon": {}, + "width": 20 + }, + "primary": false, + "style": { + "classes": "Alerts/alertButtonSecondary" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "closePopup", + "pageScope": false, + "script": "\t# closes the last focused popup\n\tsystem.perspective.closePopup(\u0027alertDialog\u0027)", + "sessionScope": true, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tmessageType \u003d self.view.params.btnActionPrimary\t\n\tpayload \u003d self.view.params.payload\t\t## Added 2021-09-23 to return to caller view\n\tsystem.perspective.sendMessage(messageType, payload, scope \u003d \"session\")\n#\tsystem.perspective.print(\u0027sent message \"%s\" to session from primary button\u0027 % messageType)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "actionPrimary" + }, + "position": { + "basis": "102px", + "shrink": 0 + }, + "propConfig": { + "props.image.icon.path": { + "binding": { + "config": { + "expression": "\"material/\" + {view.params.btnIconPrimary}" + }, + "transforms": [ + { + "code": "\tif str(value) \u003d\u003d \"material/\":\n\t\treturn \"\"\n\telse:\n\t\treturn value", + "type": "script" + } + ], + "type": "expr" + } + }, + "props.image.position": { + "binding": { + "config": { + "path": "view.params.btnIconAlignment" + }, + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.params.state" + }, + "enabled": false, + "transforms": [ + { + "fallback": "Alerts/alertBtn1 Utilities/p-rl-8", + "inputType": "scalar", + "mappings": [ + { + "input": "error", + "output": "Alerts/states/errorBtn1 Utilities/p-rl-8" + }, + { + "input": "warning", + "output": "Alerts/states/warningBtn1 Utilities/p-rl-8" + }, + { + "input": "info", + "output": "Alerts/states/infoBtn1 Utilities/p-rl-8" + }, + { + "input": "success", + "output": "Alerts/states/successBtn1 Utilities/p-rl-8" + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + } + }, + "props.text": { + "binding": { + "config": { + "path": "view.params.btnTextPrimary" + }, + "type": "property" + } + } + }, + "props": { + "image": { + "height": 20, + "icon": {}, + "width": 20 + }, + "style": { + "classes": "Alerts/alertButton" + }, + "textStyle": { + "textAlign": "center" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "closePopup", + "pageScope": false, + "script": "\t# closes the last focused popup\n\tsystem.perspective.closePopup(\u0027alertDialog\u0027)", + "sessionScope": true, + "viewScope": false + }, + { + "messageType": "logout", + "pageScope": false, + "script": "\tsystem.perspective.logout()", + "sessionScope": true, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "footer" + }, + "position": { + "basis": "56px", + "shrink": 0 + }, + "props": { + "justify": "flex-end", + "style": { + "backgroundColor": "var(--neutral-30)", + "borderTop": "1px solid var(--neutral-50)", + "classes": "Utilities/p-8" + } + }, + "type": "ia.container.flex" + } + ], + "events": { + "dom": { + "onFocus": { + "config": { + "script": "\tmessageType \u003d \u0027alertFocus\u0027\n\tsystem.perspective.sendMessage(messageType)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "dialog" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "expression": "{view.params.state}" + }, + "transforms": [ + { + "fallback": "Alerts/alertDefault", + "inputType": "scalar", + "mappings": [ + { + "input": "info", + "output": "Alerts/states/info" + }, + { + "input": "warning", + "output": "Alerts/states/warning" + }, + { + "input": "error", + "output": "Alerts/states/error" + }, + { + "input": "success", + "output": "Alerts/states/success" + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "direction": "column", + "style": { + "maxHeight": "none" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Alerts/info-examples/resource.json b/com.inductiveautomation.perspective/views/Alerts/info-examples/resource.json new file mode 100644 index 0000000..04243f6 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Alerts/info-examples/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "4d9743f9356381c628de9fc18ba2d9abaa35aad23d528530de567d1c06483475" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Alerts/info-examples/thumbnail.png b/com.inductiveautomation.perspective/views/Alerts/info-examples/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..51622d7c64607afe5a8c2deedac36c4f0f66cf35 GIT binary patch literal 50184 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

}4j#@r~^}O%vuQ(5m8O{iX$? z(Xe0rn$Q5AqGrHGc^yZ?#rgt==)I4bLi%>6Psp<$*;wk ziWMg9{=7IdVBL|-)rna`wIT1eS)H)Z; zqoF@H%ik#^o(xmq%G^#kO*E(T=mB0`sMCCJD|{r0fy&|F{wFH z^4^2ZLebfglcG^LUym3*j#{q2hv+Zn3*qbd6Z3L*Jed@)u?XZIMdo^ljh{`fkfIEY z+B3?E!OEwgCd_;!%s;VZT~{Ot_O@imLe1C{jfD18Bl$5m;c$a+RN}P?#1e=l4AXG{ zLQV1gIS|FRt~}srn?TPu!ZEaRPaf`%S47G>uLcnQgE|v&Vtxm71yjU>%8Ag5gpH!6 zH7E-e9E5d_z#yU6K1soRdNLqy8xg?DI2OzV!{2jwY?Z93_9uJT_LdkfM44AvS(@X0 zH2moLy>8VR>FAx%@y|^2*ipu|Rh&s_=g!`706B5}{1R>5MjL8-hLdjf{LXs4VCzjx zv|L_!7LsGWkkkb8en|@y;2kmooSTsVDjE&BKV4``(+n!Q9dg_q|DGja6ZmCPpQqV^ zUZFj_XP^gmC^%6$83&=UuLg|dG)Svx5Rx=+Was=9z4&V=Iwj`!9j)eZ=q^@tOlfqZ zAMJ>xdfD|RuL}L{FWU%UWpU| zg4FRjxREg$ukqBHg-W1AoRlQ=3z#{^U)u+6&{R}WXxSNIeT$0@ZjNCv$g@vAlnUwi zdutmPG?QQZo<=YLiG@K^`5SeP?O+vgHk(!+QeGik9WbWKt`u8Ceb`up$+DUE*BP93 z!wy?+DBr2sWNT)pn?%EQS9%4E^6Kv`NHt_eb=+%V;3(zgrbT>DKBAylVzP3ouQ}B2 zeGg^qC>Q$SjIY^wN>+I)v}jV$zsy>{?2`M`Z;ql=>>9VlV;%vTqsW<@T<6x!@0x3~^Gy*ZE}K->b8y7u`*C zG#%66fidV0or81u^Fde;G-*7wxyR!^_ z3#wc$B50oFeAPS(NkYbn7nC01;OZo5DhfMKhjqh-zJ0M9dAkFU z8XMoo2Df()aC#2oqwdwC?pTO=8n3Ph>PbA|T#yRSIPl!(r zfQo=J_T>er#fFVa%SKAruvHoe0SkaMu}FBB+^mABU7gQT(X!wC{J4ynDMb}b6H1ub zDJ#*mQ$o64D6qWX$P!?qKs6w9A86f4uWe%=Ha2IcctUps-u8BIlypE^*XauFh}76{ zIFE1)Y!x-i#YXIJ>Zxz#i=rT3atyQHsW~E?y+pL!f?2E?;L)n7d;k zV~eL)P~{;JbB#snEmw_&k2QNPSB}pKVAm5`ayZSkDWaw(r)A7E=w}`e+~T$HcnX`j z`!4?stE6ALt(f>zg-X<6+LOW}>Mm+Iduw3}0~&Y=^-rTm^mVqJ{A>x)S8`)4sHM=U zHN?l?^c&0*-{EA=(oVNhI*wva8BvbMMjj(Fzlu=^&zOUVpvfT|pkSrB$7d^1H+pVJ zOfu&*YJ(0F2`-GyStW}B{E7^+ct$l;wOAFCU>3uHWCE)_~T{hLbBsUcsBY@9d+ zqX@UWd>%MK>olRvSZ0uESF#`>`kkKd%KhEgf1><&yH!|zt=zfU=S-S6NLFOM$6@DYv1IVPg?Q)B zv;VTB?@Kb4Ql;o}$8cb~UOja^ltVxFvxS|1+os<|jXE)d_M*Czr#d5q!27N7;w|=L zlN3!Ehh^Eb$(>!@Cw~(*{5zj}3yhUL+$X*U5v7ExX^!@wc9F% z748~;xXjBZ?)?1|oK(Yu5lk{t+FaxF#Ms^9=`OXVtzRijvbZ|bdTIf`w6ztvMb+6X zuh-}Mi=+}l?VUE)9iHrSi|(?83OdC)GYLO$OAijw~42;A}ft34nU5s4G~KMY^U z{}`Gs4aRZr{}Mj8Lkjb;eP6{x`1-W*PmFHy_rJ}QX}2`zPgwce(1W!Hbb#(MxAcDi zn^P=WrV?Pb(69JjQ%}LexXTZ)$o|{wdNsKLuNePw)@08Ew^>PlZ<6i9eym;!8VLLq zrT-bRo@V}XY?mTl$MV-f-rol>myS4}G{f6SOti@IM;X*Rzw-~o5MrVTak>;T$_FT) zFJkfZ#zVL0pmunKyMfSUOgn#r*ACZpyVCN^mk-6IQqr7fzamuKgJmgwj_ni zS&sZfA`T8PMWBa~-%ur{*wn20Kz&1XC z<)@JyMZ0iBGa2$j;D1y~PAN0&UV+}KsTc1G$_}SEjK$)$F$!9Gz3=-~C_Jc}Y z5gd9Np4nOK-aHt%H)8tFMJ-d`4wD_zIGo9{-V55v`H*`yDACE>HI4l$0ysPK5W@-;pr%+$IM>2p+|s@NIhIVRJ3% zPg7US@g)@HW`CECADx8d^lVYH>Avi3c_GYk5mQFU%FeN{?uYW$aetzS84!s=H)9Pc zdW)#VM_|o;ghO8X#M-X4?l!iQ6^ME&IJd~T6oa+ge;|3-qK%_;Z1+zt;PRb+X_GYjR=tmUc)5%N zbz%Rnnus4(5`>TZreGu4{ZVVQzh;jiv77C_IrwMk#pF#6(UJ~Ri+{)eX{#+IUQJiB z{RzE`aDim5l@CbY3kWtK2xb3vRB!rVW3yr!xzhNPbib2elZXX3{5?^rNF$F_n8eAJ zwV_w{N@MF=-K{j}zPVBgkvFte-wR=luunQ>uR-FMMTn1WLtv6fXZMmXEC)`T$4DxO`+tc?4_1?ilX#ia`Itq47|aBktRw z_mkI)i(G~P)|>@?-{ieOvW!_Nj3eZu@PAV)e8-=$^cXsDq{cj*_tfI_;}A;kgb`02 zt8;(W^l)94gl|iZ^7tgjUAz=$*w_mkJD^MRV}~S{j0>x;r|riFEKacv9;0p!?weuL zsQqY9g89zt6oWkyh~m*WRk?h)9WIbjV`lKR|ETXHc!d5@1f*IoSXr_wEGG2r|6=Sb zgX#*pEdvP3h z;m!DAd6%-{*&9Fca=Zv`f71V`OAiYW6OpuTMZw|cno&)NAE^JODgzGq^5gA4ahQF@ zX55f8rcNboExyuLhXyy0llaX4L8zc`cNmC1*e*k6GF;8WZoh9VpVaED3bo%sD{&N%8Z4*gwsx6 z{sR%tv;q|Do<((-02Q=f&+UJGg^A%*Z^@+76k@Tx)9BByF2CE$!Z*cbW)q{bvIZ7d z?lpmgdHckXCP$@z#exwg!iK(fDML!$I51gyXZx`5umFE3Fm1t>cvnOFrQxD15~01b zv&a}VGRkxhZ`h+z#A;g<|C|?4p?<&Os1satc`R}NBu0M0-9c`ugMLx8S<+b`ZgHPR z|F0n6i%6Z3Vil{BFu3b+3oK zvg4!Gp7A!=+GVZ3vc0=)cn<4zzo7n4dEx&b>+s)N#5P572h`Dk$oOTY2-m=0I%Mx9 zEKOY4$M_2x?Ug^;s*QkTlTSm>ZCD~zV~ze#X7H&^!9ChD#^xitvl8uX5qcJDrB_*- zbpj!t2&W!to=M@UBOR)_f15r}b?8@4W$ZLH4es*mIiWJf%QolBI_>77+v!<8`M&m? zKQxf_SFjSdH8%BgwJV<-uF~Y(zRC0&*R1}eYW5l%KV%NprwK0p^H;M?w<1p9T5h#< zfBVNmA0|CE5?>QojvU%V=k^?n3y*Bw^6PBW$*186)aY-! zkM0b$8b*~~2#65x8qWi|IIh=m8VuQN#w-Ll=uPTb)C%?+q}W)C*``cAFw z$zP_Zr2#?+>EkzecTZyzAfw8)`AQOgt)^L>S)m9D4>kAv2JD`O?X7uu9nCJ;ht|6K@;7YRL)V5+m0&aq294ho zNePeDp9zzGtx7XuLd7VwzLD=ffs%$EmBEZ#6N%h{R?(8<4u2f*!XWmGRX(b$1xFRH zW(OrAEr5AhNS#C4qifajD=)J^UwB|8u}K}YSfr0%gb}@Pci^*&`(RoSuj9u`T{V=7 zP?5TDJK7s+;N<*;=H`?uCX}Lk@uTA@^vA*p%0yUobd%!e@X@V_?Y&2%g22WB-R$y~ zn(jwccxEAlMxGcu+SQz);V2yN5CS%?T3|LMy}-^W5RQ!1&<-)5jS*Bpm7d z7pRTZ#rhBKUg5T?8}FJ@+gAWRk*ticDQ3b!8LgPEDXi*@Yg|%R%=s6i=FFS#Md8v) z2|&@w*&l9q-+Z!DpSHp;UE|aJ5Dibk&g8-$W#VCY#VjKC2Ox65ur?4@`$QOphzJ6E zO2Sv_2r3>Sf|TJ3CWdd%4{FtG79Xoz4a23Sp^x+;LZnui+5%V23aRCrJJ-rHEO31z zBRGf$-qJvH+9t}0AxqITf(UmaGzva;Y$DHN3G&?x{L{O)2k^0y@5HIj z$zccBiYgNOMqH&pIx-J~T6cOZ&dj%nC_416@^1(0A7!)+-?NUU5LgH-+^i+T`so7|uoDd_}C8(t3iH>Xw?xbr?wp2e{ESO+)VH0QwQiK0E zv{zeTU>4|#m@zE52=d3(Oxbs|!+uGPYn4sA=mC)UfcchI3(DqW3Tr?&BVeg$B$ogB2qAdbemhi{Nm7RH=TJ1LmvpEgO(=-&E(1;TZvwac31Se-^Kg{)ae8a-?B$J_1)<*<0 z@JG`VG=!_Zd~ux~J04SvCo3jpl!6R7Tn9v@&+E~smXeaiO}c5i8w-kD_$Rh0w@qwq zoxy76jhsA^o=&VpdaKv<%k04C##^+djb&rMdNMt=u;(U4DNx!*2@VWx*Pt0_y#Mbr z?h~Wf+M5afZKaA}@7ph1wP~HOpnr`C2lt;}IzY!VMh=`A)~CdS%3697-%SA=SD>}%&qLM+X7%|o&@&0?u$&(H zDAK3fk?4T5_Dgt%+I)HkV&m3H+4S7h^isdts4S+~l@?!G*^hBczp*VXhh&DChdcv9 zsfR?}k2uHYWyJRqO)7_JI`sLKT)AYtsjpF@Ya36dBx_zm0(vQWt-na1`yOb>DtNeH zQqtLEcDHqX(+ZAu8|gBX%ohy)i8@K2<*uX79qaPCk8$;4NpU)4=hxp)%huE=spBE+ zPD6=^SQAxMQsy4BlzK|RM^EVLPjm&VtcMKBqvE0}EM#ZS`pVbxYaql#6*+n);*oxs zv7nVA<@c74Cb%^`N*3JEnW<&;h_Ov1OqxZkngj}Wu>J^@$D>aRNyN5btKTX@U=W4OXJKm|>i5#sDw*rR|eaZXfUCCJGE zQ|)Rb$VD-+uqtcDO`Pw4xjS9YZ!C$fU&7Z#kQ`BZCWnU!IT3PS4a+I~=aDd5H-J=$ z8B}TMYLTdQD$>2QGz!^^S%66iT^&w&)X>0*Pf!!J)u*U?8baYpRMEGHk1_mapg?^g zGcqO%^{1A$rI6Zkj0txiCnGq&C+G$9G%s$KCU~B48yMO;3tID(V9}bAq>#stn8|J66J92j)i2 zn<7kWl4*TbhsUdmC}@+n9)*ke?IL6u|8%y;r35DS7HO4#so5VA*E;Q_xwHjfVx)|; zewaHJ71^sLP5>~=qc6IOJi8P6NG-2!m=rgGdXK51#@Fl9FI#d{VmkO^7keqK?aQg3 zzcG#ahH+wB*$C1W6d;~2Vm;)u5h6gf6Mw25*jq@D5?FW;I!Lq=W{qC=Qzb3eB;pfE z1kyB6ny{=7fe-vYP=Gy>qMV#!nzf9;c}0m@h7mYw(_$JX{3j=KCew?CIF@gdfSSH3sPxbte(~jbYg%}|M3P@% z3|l(vVP4P4q!LmjDG$}p$H_?zQrMM96)3WRKsP%P;5)pq@u znAXO#DJAd0haUKhWp7b~;+V6IU#F_O+PyXQg}M+v&oCmd#p>tA9-th6sezXSXsRGf zVPCbP0L$Lr&$HGLUeR+UV-URX4^UgI0b`1+9K)nyV-6~raK5B(4T(I}SdP2#%**yc zzu-KH5?YJjml~S{q?W5vqH=|_V`hJsaU`@MkR%vjs6i>eT2NZsk&pmNxcwmkv2WTH z7B_|{j+ANeCzeo!^n^G_t|(xe?_yH>p|G58(0=9)~I^nBE}as8wUEKwHa}DAFe0#z@LE*L4v^O&`TGH z?%w@?8Nz@wb$J9_z_G>^`{Un3f!is&@KetTm$gaWex#{dK3n3l~OCvjVv$O zLeOCUPR$`UqvqOkt|q}frrJR3+F%Q(sGlNrY~T%}fwgE;aLd6NVUaLF$yXdhHsdqZ)Mrd~Nh|tVQDK zY46@PskUL`^3K$}QtpjMu#u|D7m1D_iIk4tExO-f&ts8_DLluQPG$Wj|P_o4yL_Z)(52B304DdgIFt!C_UT? zpxeqGRr1|c+WUveNw|ApxQqDAJ5i%bfP+bIw zy36pBmN*6 zLK;7ie3uwx7SW&jG>6J$=L##pu`Vdh+D)DBZQ#rqY-gDKXve-{%O);0)zmI$X9z!! zs(L%|3FGcmb$W_Sxf&LR}IsL6P)gJ>ryI? zE=~R&%1q>rcI@Qt!H;aY1OWhNZuj4 z7D9k&gg2_lM3KUcPLm~Ro{)$yrywTu&TauNWu)BBlv6Qe?#4*bU)oGj2RS$aW9w}y zW4y68taAA)E3|(z#7Fx>gUSMimV-Jn%hSoDhjzpDHVH?*TC zC`2`#c)B2k`%xK%LF64a7m1c>mv35ASkqp16rprY#l!?$ufy{B#Fm~uSUpEI#bEJR zI0gzLGxI=ciB@AmSC6OfW?M5IR9>cf^y=-|<4i+$Sw{X;4TUN@o(-lZ_55jWLS6^p zFJ)N#WgwsAA1v`zVY*OVAlcdj!gaAa=D_CVtC0z5B+Y4uK3v2ql|YmVb%R){xnxaS z7$&J&4N6GT%4iY|N<}_FKal|QRhxdmTnP8}nH%4dsH9kRTRYKeJ@)y)S`LE{rNm`~5BY*eUG?(~M~ig*5jXw`ve3=hmVS|B|} zi^QaO*5D#fv$%as(9S<_qkKD|^IKhlYX9NJ^l8@>-yWObu*uPW;x{|QgP9^0=S@-( zB;(P^qA7lgkFiqa&KIBed_H%%rW}wIwk>`{J!AcX2zeNIcB)nfG@4vpvpU$xo-MoP0wOR%TM_C2+(iVJIZ@}~g zd?*;NCfOWFkRxN56w$Iw4;er;(96PIto}x5qa}YPK0aS&OEv^u`KojnpOz(KB14M2 zD!Y8w0EF`$hsT7h@Z#+@MB1^{wFVnV9*c|NdgExwSDkF*h`Kq-n@P)2aY&6p^WYoj ze-~(rn;B>(^us~Md1_ex@V!?6QMwZ+XPczMeUM5a&U_>`ZBPdY2`Sd2u#AMFBqR)! zV!~ydR$^&Uf(~vB)*PF(h4gx*LhD^&_Zn@`;O-;s?0G-k&#mR8AG`4_(BttiaFhRp zB%4h9zMJ`tf7nXPCnAtHTD}858Y$YBsi{v9TZ@j^qj?NXP9ti>!Z9oHWh(SZN5EayBce1|TliGcm)A@bjEZY- zdI7&?2e@piYvh#oP^1?i^~cmi1#DL^*LzO>2nY}_8<)@<+dO!ZeWJ07mC5*!<}2vwiP!t{S^_ydvLeD7HoDiR+xaBj>iaHNJZ#|*_4!cT$1nMVd)_jeg zxCUGp(3!B%^}ZV^(w7s}R04&!U%?>b0&!q*@p<8ntIKV8+Nmu-PQlb6^WXI4H0`$r zrLJ_bi%4XP?m3akOzI64m@vy$cWWAY8Ayb7KeP_dSjK#J4l%^KB z1>v$9QmI7#wRCJcv5>loK+dB&Es9|YSkkBd8?((+S6M4#fW9teS@D3y{YC|p-rL3| z*y3K@T!uc)XdRWzUYZNBV((M^zBXHbWgfNG6-SsLY$-{hvz5;n=$A`zfTRW}nk4aj!J9;Z^t{@L8nC^1(wOrqlIi*p&LX!V z!cie4&%5)>CWF7S5_T7ZY`*!fvl0Dl$x)_{X1sJ)>63;|nFk^Zb&E83UIS_{B0d|Y z{9AED>*UXfK!06gF2uv`*8)V}3|YMrRB zfqhi_(xFQwcLTPwh=2*$rR9&v1 z8R~e0vYUIa{$AO^G*Q#u!WjLhs?M7xR%@ee=O4|c=?gFSzO|!;$vOebXxPSL-_hg* zl)+%nvnN>1$jJFYasR<*rEF4n=}xvYSFrNxiIeQnrvm)YJUBV-Ss9>}6XQ@+wC7B$ zU%8Fg;hDDRw6|@U4tx%F_tJa>T4^L-9ROIpyE-jt6RTRgFDTaM?}8`sa|t?}aWSC}aN{T+ZT5r%;EJ=yiaKHD~8Tn_>@!aC7(3!JEdm zQB2~Z0K`cq%(g;S6gheW``k%va!09-;yNB``Dhitv2?}+yh}e@oe9Btih2tm+mCcF zlWqXBUCo|F7sN(!E&zl#A!CPr=3-*HqMWAxBL?A!c}L`g4F5mX@2^d9=I#J(o_Z=e`eMEXr#dE_}kH) z3BCf&*YFTu{t@u&;fKS7s-x4&-I`r-qiOq-o8BE!Bf;?Lnv(vRqaQ zuEA9F6$#vu5ec}(Dej}qM}Na}m!u|GHiy?Cg3Nr?8`O!a;s>In$tS+0m$xj(pZlJo zwtStDOe+vq8Gtz!28Kf4Ft(6}B~s*-^^x_EyE#>5P5Kq&F_(o1dQ`su|-k%Pq)hn2Lk`8&I(nr#`@ z1-)Kh?&+1F^hR{0fG=c)arPU9Hn}#rAjINt8`J3gj5KNx)<=IBQjY~@R z-e(MU>TA#R5hf=~yT;hw1j5p*Z5c*De2!OGxIV{gH+^=WgKZ>c+8SatzcmGaq3F@l zym!Pk+AZe8Ul{I;G_uZn!HSNK0;(jAB`0zw;b@_=lBjbu2b?ymz?9c)%Nfc%w)t4o z3VHG_3(T{XuhS70QP+AA3KLM?KMQsP(@V=V-53$`mb(woE`_Hp@|Z&Bu|bNw(_J; zl`U(WQaT~Nds<&YN}y|KR8F$#USN~$s0nKAQP|+$q~WLxpKxRhz2pxd(C0H$)sQVE zkB`az_DH*@gMao_h%alQ(o&TYn3_dE&Q*nS_8=xn$S5;fo;$AkJyY9U?W6%4xjQ@S zp|}i^+g6rM0ZIeWiflXojq9x!z}8#2@nNZmV5DVP+T)a=kEpNrNT4SPw029Z@5j6) z%VyWM%WJXuBIk~D73Sp9$Sy6f3DZ_d2}2>04=Zl@gncxNDo)iuyDBoaKSs>)k-4Cd zXy2L(gllE)k(UMlX3@qfmW%-{cK5B0qjc$t?MzzpV}8v@l8SgsYfK2$Mx*v_e%J;Q zt*o%AdE;J`3><&HCwXG!A=sR8l4=sY{t2QhZp90*OHb_oR6aibyW<(qn2P~1r6kZ7 zm9ela3y)SZHt~<%io#|-iyz_B1nYW#Ns%}5{20NWCa;8w zk(CU5dS?IF5JF|CF=N6?omU=#SQC!IhdVLhp9t;eps!Sv(Ip<3*F0D{y5`3Il4FEX z4&`R4B3m3x)b@0)zjKfO`nR+(tzU516nY%B5eYcd0~0u~(h4^b%IWZnM55@32S}DT zsN*B>d9Wh04H?@WoBLTNJ-{HVATD3mFJc9D#qG|Un40E^JC>=QQC%_;(J6LGsk(E_ zR?M64%sD>}5=DJ}D@n7s4i9N*Zlqwj_&~yp3zz{A>>vHft28V(eAx*Fuf8R3puUHt zv!FTa5}M#esN}$-wWX8Nf*3*?Nv|mns4?Fex5m_GDcQd4KxC? za(cSMMy@(@2OpS8n99qmo9puwiYl2D>rN8mz0FA5N|Fa-3_Wf=22^!S?bP`H<&hew zso>lkENSQUm=-y?Auay=sAj>^GEbwsva*DW=V;R{uB&<4Fbn4~e*l}{Ddx+g*c29# zt$CQSs-wMO>|_N>Yk|8(7xF@D+_!CqZjkmcsEX?w;4L(C! zx$&SbZ3XQ($;sUHjO9(q;9{(7J^nCirIhBban8n@TDB&ZAgE<6I5_4X0h$Mob))vd z`^|AsTkB}Bh_)I>x*=v;SeI0AAW@SmlfUsC^~6#uYdfxBo)Q7%H}rHh#XX#1{b#eo zvGH3zMa>b&*uvHF4{lvn*NtlQugK~&sB+;0G_R(VT3m2Z{~ztv@MQ9k?kCI98wUFG@VzMrKwsn+h&9p~uC7 z>N_&fJ{*0LN(xgSX@jh{0uq`cQR?PKiFv6CtXZv{Lo4AD4xc&V(RrWHo!#k)!Rb3^ zn+F7of(m#oL79Nut4M5gpY`hy{}md!e>xSSnpVUm9N}|;rNq=kH(iDZySm;DH^Q={ zLks|@Dq~tO0J$;PqX^_t6iaj#&u=6v!Xq;xp5^a`{QZr)6)ta+ykx??hLHc>??&XL zt>|7WV6!Wr)sSvnLb#`1Yg6mZz^Lges)3s4@^eW4ysh~SF_M|c(I*J7oz<(YCm45O zQR%L&(dACZ4?gF{uWIq?&<4n}iCWl32hBS^dfVLLyMCdVL?+$Hh63I2E?Xf-9Ok}q zXKC-LPcr8W|5C%IqrejL%jrIDxZ^>x7Lo}cmX zx{J6M>-u`v8`8UA$NDKv?@eCh0|o<9ucC<;;k_m3OSIp{j8yFV(<$W-MPC|1=yfxQ zYLQ!$9WFF_Pw#vUV&Vs%ao7e8ax6DZ98|?qQlYS#??? zGS8Bv?z=D-z}BE8zb!UQ);=J<{>jD9jVXDN-O;`Ao@2*Zu4~f`S)5Eo)uD*r-r!Nr zZ#RJc+-|G$Ri+c98s_AmO7^@DC)pIMeOkH|qD7&zx=it`7dZ0vAeHk~uqB}<#^v={ zpumT%zS0uu(Se+H}H!x6TQFJdN%N(PRcYWmNVt|zWevg8R!rC#@Ni4L7( zV9?Dsj?Mc$&*nRbr#Iig@WnEHnD0>{P1wa^&U<-}L^R4g^vdXU`)wTjy4SYiZ*W76 zD4xRY8sH;e#}2FtxVRDwK6`wx6_Mc^?$HS^ zS;P__>%VoyMDjS|bx?Ib<{BS0UQs7#{;x{-g+4*H{P@Hv{_#2Ge(Q?8eqs0GLgYnm zWk8j|>%{dLtP~j5$jzAZ26~e$wGnOm>F(qd8>9`egy}gOP_Gj*fjV{G`+H0Te%I?c z@;jd0{3EG9u<)w0*T#5%mh(zQFi&FYP7-&&2EPC9hV!JR@ccj)_+7LrY4|KKyQ@ua zY~s5>;4{LTfJz8A5=GY#t?(PgQ`nK;Mc1o{-)_h!-KWq`%2{3ia8vaj{r~rEnklrq zCCqtUFrWbsB0f!6c~2M*@vV;0zFyWvwFW>W?O1XiueFwhpZErwtIpkPQa2u2Ub*zEQQtK5*TR|p>d z+7tWRmeM?9vittT{z?f3gRY}()N^qFd)^XL|Rn98_ zIonl|2y)-poGs!d6p_~8FX-sM^;9J9cyO2UpD-XxzBrb6ODX(1pOThNupPqs%5LPX z9O2{|B=WQ^LQ&ElU$52G8+gA1T}En`abMfKsHqZE8k)jJI5K-a0Sk|0?En@U7l*z6 zmH8d;ty4VC{*g$0fml71Eh2kejen>Lyv6#x%VQ12BJqjUIV#)RCVS&>vDMu_v)LY~ z@=L%2l)Gt)Ukn9apr;;3&+)|m)jr*t4ZPS4AFec6t&zG!7wOv!m)Oa)`Nt}9D-+4o zDsesEMtwZNd6DzBqhw=%UOkgJ2^M~kC~C??xpkkNSBDI}{uPP0$l1B>fA13UlKkpF z#r(xzT&5u{J?^w_?_!?yjXCg%$7m<)E+JLd^~bS5e*)Q1O6Q|O0;-MpfJCj|kHI~4 zgvplrgqdVGc)0Pe!tVAg?mr(=@i1JsAx0W#U$U=uzQOr6?aa1258M0zhAoSC9=%QLSQ|2(=ieI(G0OU0LSbVoe5`#Ru<3Z; zQMgI}o^?oNR#uj4x}BK!F}ewz+}!Z32skyx>_c?3?SNl`4_F^Q7j`5lvAt+)IPQ68 zoiTbFj=Xu0Om_wTKM?W%3pW32(qqui{XNsxyR+M=sosV=#xARwr{OaNAD)NK49>~C zsh?&%fs3!cgHC7B-vv8FYFl=009ALCn`PIImu>VZch?hb(!QV#jaR4Dn6u|or#w%! zTldzD1wtdG!iT15gwNuSF9)`xK`W9!TzpEI*R`ZlN>4r=#@r~cOhK0H&IGEeE<2EH zZGpd5e*Mw>>(g%N;1rLk`1!bAFsV8_{;V#bE1k3n!YopSy z>jQ+y;@|-7+($^4LZ>(X!QsS!}VhF!Rgu%S>CnFsV%l#*Rv$5q&I6ld?B? z_GYE9)&o+Zh8_d9l5JZ^W8t>$jjk0P)+5|8t;1X|ja2{|+O=O+7|Y0Fz5{AY zi}TH6)|J-1&#IfEgPe@?0$!KhftzqW&Oe?VOdlzyHaUX*2ZT-JgFgj)iPwZ@N=X;o zf`+>?PiM7?Br(9o z1$SwY0Bw?AV6S$TjHAs>WPef7g5WqayR=40B872>B?phtA}brt6!wnY?GbO$k5u#Y zFNbp-+mr@9=+}^9Ayu#ytf5pX2Lnv8kSzEU?2wlMng{w?Ch3V83zNC!_LrPV#)HXo zZ}mQUla`ATzmJQPavp6RkMx1IDPGn81UtNw??WY)j!cD>|;Vuu-2L3c<`osjS*zu?iD^0IUyQdz- z!b%pEfTm#wr4tS{tM8-Gkplv$L+hoo8;mc?PlFQ^*BwT(Kj%p~HSW6OjS`&@l>TB6 zsh!}TI3(PPgHpD>W#ttYYB|tes(ah`c2NbU+`fpa+2*Xs(X?l0lg%==bKkN;oMt3D zIrQzevFEw}iUfY|t~xWDb^k6hse4h_@bmmEIi~csf`rT<+u5HvYk2R6S!f;waz-hK z%xY#9e0`&e@m~z#*cherma5@h<@>eF!s@Bsf6J89>~PYh4%aa12Ms=x`R4Q%CHb1S zBznyfVQZzRNi10hCl{Qtwm(4JDbK*jv0l&$D;TU*i+0c{d$pGli*H?Re3l*Wae)LU z{wnNXyyki8Oy~a2NTIEjgBHQN2e?8maxY4p>&mox45V`c8QPJNsq2^44pm1Wk3-OZ@8SB!EW86-{!n0nQ7PkH}kUPX~;b??2c`~{$ zCk`yLv!;~XTVeRJ>6DU%Vr<*hVbB`nt5i7-5BG*{_aG8S@X$hlgX= zX!5`h1!5%jv(wsALw`Bfiv&-HsMuTDWt-L~O8X{H4>^lk`3Ipq;wtDmdfFECZPB3% zq_=3nvQ+hrfIiW%=M9=Jxv;y4+R0cCmBpnPG5)pNJqFOWSrkf?ay-WP`Z+N-y5Dj6 zg!F3>@L3C*LO`-_>Si0WdxNu*aeS@7QpY_DY$*vIe_?dDJKOE{9gC;)bMizWY2@$C zf46{(_)f;Fot|U)rabSR(2_)gcH5+FKtjpNkif5p;6NgD{25)!kyhvg^1L5^0}-qV!p!PA@M5GCEDF{hNCsy%nEez6KyP-gx3!SUVi!a02N#3ahwZ}O>NqK zhR$rF+`Lsm7bxN#P#@b$IP_8tm#1P}*A24=?P~xmE+aBNA!DtMxJ6<6heW1!POt2=I|!8L_uCwZTepO_@)U;MXPGKhE-D$kHj) zTkh-PQ`FX`Ssk(}SCZ>E9=DGW=Jj0E$s{o|HV@x}=#%zS0~(vDgS>ysnUfJXbZ;zt z_uNeUkRfH4PXf+ZkETxMY1-%5brBIxo4!Br6mWW~Hb|n5q8DLEH`!1-EOY;)gqlw__%U)0)~& zc`ZGxiuL@w99Y!}g%zU1eL}rB81=`kQ^Kqnw8nJ(cdn555e`KHtgyShqn=^yaAq#X zR5VZ`)0jo74?7I1yUH8oFYd&9403QO6!)7<4@rWvGx z*~ldrMC2SL3AwnDOJvgI-wlMHwuEG(q7yBsRb~YlAUi1--QOIqM|YBVl;cShRQf*X z&A#mH;wo#zOG&0>N$QbTi9-R*NSfK%()uo_8D${+nc0%0=h*}lc_(}2d)?ohp$cm4 zi@o`5zwc(1l2oNKIX)AWkgGnuEp#b;R@1uT8ZF$L(b*h2Bz{Vb`H*{LW;0v zY|5Ap>IBSfdaUXUd@^c|JwBI{;3$uIRTIZQEtPS2YO>Z9jMVgtkX*BfrG4x2aptwa z8#r5^J+J3Mu~4P~bsgW-?OoTAsKndQJv8*S7IboR^~E86%@>)!-JQfP5zn8A$T8WuI@+&y%<~k z{=FkRD3vZPCtq0M8~2c;aPs`4$}BCa`EyisMgPlR9NV_N)cs=ex`NQWF;1H>%S%k7 zucK>yGvcf|-h4cVZeh0(I*-gr;-OaIH>%@6&)yOTYpTOkHvr1G)E_q9Q3z@N)agw@YP25`% zDXUJAyYTr~71^<7}n8cSs;Kg1*__tpm{p7^wXaGD<=YhhXwWgF{tdCxvdsd?BxXd5Z3dDNV^GJw`3;!hR zk`YrNjlME%DX&)}U(i>mc5Jb!F~|R(dc1N7od<=bvr%wFkFP5DqN0 zbesC_Y|s%jGRZ4)J7W$pUU&$<$>o`T2t3kqGGS2| zm=j@c$w&s~1Nhh*9D=vp8gXNPa^V|B=PHO3>3 ztkiS?ukC2pv0WScr%4;0B;!*f=wg@G?+X6tiBlHUONiGs=u7PE$}}TVxaqc>j$sxx zEnoVtbWIQ9Ft7eCZK67mfx}+P+coYuwKx9iVDY$r7Oxn4XaPdvYTH3EtMTi3B7q)a zRY$t$K@xwVOxDKzt_a7pvS@$=t&=bx6>HIl&21j*CJo~QqC^;mtcwvuObLVziY}Rq zXdgS|G{89llALrx4`k*mKS&?a12U@NGbb+_{w>!M7Jye&Yk!R8`+R5*9J{Az?Oy@t zWZ1B2NgElYaJII+cYO}P^6wUP>yB?`FPhPAwYu~2JN_!doY`q1vTBA4Va6ql@=oMN z$(u;Nh?LvIep_ne>gh-^?cZIY72!y;toc=%fVH2tIy2Fqc3Mf%G(*u@5u91f%bv43 zGECpgyl3vu3VONRT31zldNOpSST@`u(_l(cJ99btd){o>(q=lv!#51q z*(}(A2Ur&=;#_&IOBYmHs5R4gaLTVlZF&Ez zyi`L$QUr;rj^QJC4k9xlzq^dhBo()?g<3%fkz_H?;4DM!70aEo2sK$(eO*IQ_~EGy zsj$!3uSC4$IL6aOfDJlefP@%R`0AoVp*8pgNA>Le50S{X@81!Hm}vkU49<}fE`GOh zEu@qOAsWO&exQR&*-Hk6m7i}i^$z$Czs+4W}T4*cXi+r zQrv0?{>1>Rv|+xKAgB2)AEonXMheN9^uatR9_CMATy4L&WPbt>ZPFZi{X097fsoLL zPEO{JtEs`2Y)r>0_Fxf51Jq1fFn!pKa>ERUf*>l&2E$yM?7{&Ji!_bWr%B4jkGBL? z)0f4caEAuB9n1f(=nj@^iyEP|{c=yqJ($}jZUmJqCdAR6WSzGOcSJ`1D>-{a<39oi z)v0Zd8Fk06^g?R-@h*}JXv?X#H00cwy`|h9cgZ7iktx%8VUM*gxSs2IpWLbX#p8|U z`*Z0!3cu#Sg+&?9uoLq8{P2!#kQsrLBW&54BT=(`CFu!lmeEnfWOqiKk;X#do;N$m z+8cJ&a}aqw(YZt(BbMHFuTMQNNN8ofH7wKf`<~|^ z7Gme0(EppamIFvPUWc?)JhCKq@HeBNpBk~cMdz3uBTaSa;(*-UyN6%Ce&&&J-1EZ+ zu|65`Z|ZX#{n^doh!O1l$Zz?sM{daBjgec#0=WHKHYQs9(=~LqP0ex4FKYGkDI7JY z^X3i?N4+O&Uunq+&F-*WgQF>`K0AXMwAWUq%8LmO72@5RM%gF@X%gUXhZ`&Q6Q2-X|=;pnKra z4NFsSFoKY3SW;4o=qhSn2Hh;?J-8R314y;CM=r`KIil*B`wBnE5q6QJj>r`hsVlLFbgEDECdKD9{fdQrx=wf;_u&8 zq&N1q%Lvu|IE{grx?04ymYplT=DDdsS}4M|2&QMQ!Ygx3)SpHbb0qDXJp$0R)ISV0 zuK1ZIaL`LnfUV4 z(}iy%d&-i8i2sV9%3XhA^R>p<#AF1uMwr+Kr@WSk>|Bk7B349 zp&>QxR0RdsrsfWaHm`YcpS)w|&*uA2HPuD;53B*QayGCf4Z)dN_f-=AHkkeYh+q5vUhRh_O1@0^tvZ+0cpeg>s_>5yS#d1GOVVyhGWEj)>Rat_pUV4nmbNAxlu_DZkb$540_$A=wlLSt@`gDi# zQwe|QPU#^r|BXt+PhY2u&Qr8>!b54LQA_*zlK<7-Sp~%rz1u#7;1=8=KyY`L;O+#6 z;10o=!4lkckl^mF0S0$>w*Z6t;C}g^d+R=)xAS)Tp{u(0Lw9xUud4Uj>svoGX?cF( z4XQ%|hV9*%GYXA(GUl`*N}+C_#;GQmls_~o(StwI+veroHxe0wUaDrp$27y%i?agr z8_8Z=?9M~4<T63~PT4f`LyK;w|k=Y}!eC5_N;I)v}WBDUJ5VCOJ4pD0Sokr)W zVA$SWQu94V`v&vH^CkHoY&(lQypbWiymm2=NLFRs5-0)H#K*V30Xkg^!sMwAw!9i* zWQH#EfY$}JMOhiW9wr2Rjg-oNnK?VAjT;s(AYChawfj_N#QA&gK8^c0b+~2@HkYnS z`Pse<%-`MI5a)7D8nt0zFH@vH1nz3E%%y;veS2^ z*?a$}IOM1sN@9DR9CLhQfS;Bu6E}&n5s*#MAptO)+c~-`2b69)`Pc%2XN&k5$ITW z{PT@hr#|K3z`b3hF7zNz1mD8I|IJolS45z(m8H%<=R3#dzq^pAtTGk0%~2p@{=)$Fz5K4-vDSQ6=%uS^YxuKeRMeR{3xkMB|CWc5Rmx|=T^3|Kr34Y2p1EZ z6hPm(M1N3Ld^fV6yGrj@l0^gh?t3KC@Op^B$Gxf9zH>QLtp6uUJx0O*`}e@_S+{2* z-lImgtFet>3DP-#9~<3_`+4y1ZHYI{PDZHU(u}jU0lDR@rbL@zsjRS+hn4e!BWEY_egaxn1+)%=^y?CFyOQxjMbaOEK|9w&{o$CgS&EEhtFa;B;Sakh zm8-62`2!Vsu?Pa(Vf^*jsdL#L2X3chW@j_(f~N#I-{;a0VbDZF^8wYCj1`y+GcM$( zTC(p5BWtD^T?(>*Vc%}Xdk{~|5`o)zXWXkbmFC%8Gp2BUmdge)i% z3)7p)uQt1`51UMuKQo`D2q88sT9kt6F-WWQO7pJv!cE$~hwy<%ElnwQU@cYW{Mbv8Zd_k_>@jYdxE?-akdMHo#Ox5eI z4pI$fx}^jz_pU#L%MF_osE3cTbX#(AG<=1fUBH=_Mv2Db-0g3X?5Ca)ZVBJ4l~$6X z7(V=St-{Q~GbjH28;l&i&0J~}#7a6*=LhDGr9mU3iIp=7hh&Z(vu&HB>{dh;#sAKX z%iNkl?;|`!XR%rSVV?R_NJYs6Mz`hR-BqTZnbJE2Ws$hy#!143#u~rUEYDZkJ5~H( z7^3B*4Grc-pn_F02Z0iZh(l|AKc<)=nVBRvm{c`Pb1~D@>xgRfQTN5iXUd7YPzav+ zGSux57>IyiDm3(q;`A4Xnr17VI05kRVB*KF-$N8s7k_k^3JEcWIRJp?qQKt~8r$kI zyLYg8rerhxKl?U)ciE3QfW;xg6pj78E~7}(!Glrh1-!%b2nHX`Jz)qx3^>Xg;{kX=AFO`+VoOf@QFT*}-^yf7q3+jo zu6DLH+K?>Z?Mmff(`_aL8kVB|JVXEN!+V*L9KqS~vPLfz!ufhsjzM23w6AYMdy>hg z<0QHzxXFi2E&TP%LU>)nQTg+8?^SFm@m1nWugtYQ$rSxFn8;P!{rAPq7qPt;SCOYj z!j7(v5Ao?iDcP!m+ol>~ybL=*^_*~7elwJl;jAdCNzgcdMd9uE(b0DN$$sC1Pg{3(B&%>3%*`rC8)__@0O>&`VCo0g@T zD3_FjGsDfeN5Xa=n=KVE*OAzi#ZP1ew+JQT z8z~eOl*Il1!>ng__33Xicbqof=JwpLg5fPc9VBALUhuOXDshKv2y<}I;NFi)wu?;s zgymb((J+58fHF?Szdyu(Z*^tbHBF zLQ-9IQOr!2rL?ivOWPa3PKi{k)BZ4wL7=Ob_m$=M#2KEt3v}7zP(KYcUz%6=e_hfA zDnXnAJY#mAraDlPSzRMVv!}0n5t2tCyoCn;aY=KRU-zANtK+EH$HYfOwSi4bOnv>r zo;;2FRZRzK+r*ts>Cs`__1O#okHTmB#5Pq!v_;_b*+BlfnNO(*Cz3*8mOiI(_4&-G zTWX4mN?5pAeQ9?=3o~wI6`2I1sHUWo!ykyG8`qVWF#Khmuegd~&T%8}+ouuG-)YFg zH}v@16wHw zd?OO`(SxkGn>e4tlee$uP59YrObZH!?VLrox4I_+g?daOLeAP`5VGm%GZUbe;$ucA z&P^+z;dpoVgtI6V{Qlo^adFwPK;i3%LAdEX1h&h5?ct1~!T1f!iuqs#f@EERf9YvA zhh~vkB$E#z68~#s6*X5SvNzEY+Y-d6<+=}VyOQ0wai)FFSm`i>`gz41?|a+dWXGww zw!a6AIzH$gQQEZj*(<^B0m;rB9x2^(2gH$)zW2d zO%Sd-z$n4LX_)`Xc2<@fWZ(U0?@%ey!74O|64#9WSNAiU5Bp`5@MZ_R$jdEN2UW6B zqK+=c(TLTn44E-{5?AuNHZX{jCgv_uC7a3O{EJq2FT&b7QjLWtiz6SY}imQ!=q zk(s)#0%?DM3$WY*`VO*T$y%8!Kjpv9tfR@S>Rag|j-8|*kFYSO>e_IlYE(jNm`lP= z)Ea(U+yHbGCmY&q_^qU@5WeM0&y`|-C+j4a(pWJJ(s zUENk(gLyOU=C*a=^NL0c#Hsm8hUU?t<3BH3cZl8mPbYsTR=lgPvH%>mG10!ZkrZf}C$!#}KZu6*nf+_aIFxFNTkN#gCH)o{LW7?uVFu^nyqX4{bhM z!|zllBx=KFqB9gs8{y8z;IlGYoiTxi^vA=Z=fb-6af}t9_HdwjHxFM#S%kqDGfST0 zd_dx=-PqA}4fpn8Jlp~Zi_X~Vzgu$*2~1ObKLM8EAf+?W z0YcziTtVb|JIrS&qy4f#t|Pm6xlPwe4++!-c}i3unlMe^{ER#xo7{)*wUgQ3Pr|K7 zCF+U&Th=&2XGg%a{D8?TDrqM#Q$$+g>A^WMiYJb$#eRv9n$HL5CbQ5yXEm%FhAe99%_C@9fNZyFHb@xbr?pHC+HzMv`LIvo= z(D_|I%J&h>?9fb?CBre6tBg{M1-U1@ndf7ckIv?!}a!%+Giw}^w6K4*uUe8ylzj; z`b_uveky-SFG6=^B!)PHvD6-9Mroizic9We(_DEUsS*=Y^*1Rn1jURlLRB$X;+&(u z$ij~DJBT%v!6)`w+J;)5@a@MN>dE+?;;mi<($QC9?X%iDMv_v-jQ(Nc{w75hSX)Wb z>7)C5=~#t*COHrz5-9mfB%fts`xNC!Lc>8v1MLz}oiYEVYb+765b*mux6-i9qkLuGu#rcBCV+8}0HS8xS6 z(u5#=a4inq!fkEo{u6jm=D?{;%J-bZvB!}M(r7x~82o1%$!#trXLT-8T8o~feDwZi zkUXz_F#@_qqBzyi+8%;hI2*cAgxqlO$j0CNVG@&dpp*YURpTMihxmXD{c1U`*5E$y z4=Jms9#dL>m5^k0?tTu&a=(YKu&sCDJ3&?8hvz4lzcGQS#igpRPbmjH(zP{sUHpWN zW}dPcf{jFdQYRpx47PDK6=z9lTi?hS{`^uj!l2}2PUo0a!kz)64<`N}P|7KS4m02s za0cRQbpGv$_1`?Oq0?7CrBm?Pl;P%`;|--sPS}j_Ru)(o=FsO;QHo$hCDg8Ae3Qr) zjN-zjh&A)(k6KtDpaI}V5$(<4OLx*EYi*DsAKBR6ti%o*DKm!XBCs+*Kl+NDq&Z7G z`odJSiX&!zGC2tAX2a^QVnw6{sFbr9iJ^9VdqBNt{N9ttVs)_Qz^dd<=Y#+;$^5yl zn$>J)BQy3ndkkrdt9(qiVl#N?Rq@Y;8!K2z|7(Lv#Bs$ikYxq~|#$hK@}A zyYkfV(~Ah|pHd+=@SvycfFsJpy2K|HA02nc$k4ydhISXEq~Wylu^-h)&MLZpu&KUj z`t9e4r}%ype)-OKkkJdv`n`1HnZl7Azlpw`;3lQE+b_O){8X4BunwLWE!)(_=kq#{ zs&SGCZzvr)iw61Wjccdxz2wQT(+MjiIm2|iuzB;5+G70lqP0(ldm$e zq%N>OoAtqz3M0e!$-|Mrm*V;W`GXM<4Do}G3( z?5r30;0m{}_hBcK#YlDEB|J6LOPIQWHbb3ktiGFq9T~7LDXG$C8xwbvsv&~BC?FW!LWIQiYu^+7O zmjBf1T<|wrg>e?r2(S+$rujTxtMc#*p18 zsbJ4a?keLTLcx%5+&fmyh0!2)RJ)g)QFV!D%WYH2_x^baqs0cBTqP!GOW z8gAB#ov(T4{Mq19+7+2_k$v_8Yhrp8!mk6#Y|>WpC&^0&VGNJr+cvLk#4ROLo7)Y2 z&d!zeQeMntxRY&`*Khsr%v|`Lj)EY!3rGEkqJ*%xeV2i!AnU6u(P2b(e|Cw!n&1B_ zEndfxJl$|&?ZV!Y??u$U)Jl)MjgkDb>SIpx0OK}%>^bhjmu6bkfMoG+G9q|5d z*01CS$0F_bci`KkN8z{KN96@q(;S9cszYZ{AH^f9-M7%eus8C8OG{%pvTBmzXWYS! z;v_H0(CD8&3L?8J;)ZOyt@0HbluEm4wBk#Qakqa}k1iuxO@PZ9lPav`>P>yzQUt+> zXkK1^K*O(jwb;9gqrHKh8G~jqopO<3Dw7IFwc*z@(EiR%e?Nk@B%#PW8& z9r@Pq21&)Zl5%r_@GJ7jdw=lwo7Zbz2wn8weieD0tN}D}`R?Zk^CCoXAtfG7O0+^X z(0$yyWZ^`$IJ|keO=O&%{jx2H$}8?7MhkCb+mSRNcg{qQ=Izg1C_yul=N1A&?~Z={ zA}X&7x+YH~Q)>4M2(`dkjP*}pKu8O7R?Fg4DC%ESSX(DoVC7Z`7uez>aV90ZcBby+ zodBd3ORj7`YaTB2eNY=Ig(L;;D4+YQD9Ol0niXsVIy(1ihg7!t1qvtBg;JheXIJGZ z+Lg|)2;WXS+Ru(@o&A8mg=iNIZ?jJx(3ObhAu=snv46cnLK`gM&^r7?A7y6e@jk%z z8pw_8SX+)Y3|3B5q@mTVh(!^|__ZNfGA@9b)F2g8~HT5{4u zLyo#zYOIP_;XFm&)|3&d`JnD>RqQr7$?q4u%fD>c5hnU|#PcO|CNsjvT0AeY(2~Do z%-`h;o}NT8*cB(Gb~i?H|MFT|=!-&jqN7_~z0`z`9?zFK7#(y_w$DBg`HWej@>u5L z8Ts2=?bLdU07{N=afokvai&Q;t;L}HA?R@S1GOsKkU&3|)E4b4F>&cjRmlt1{(Yi) zQ>hUW!UBC=CzviBLlOHkns1;cX0BXub+KIMUUs$bmtm|b*sw@k=kaO z4xa@fa`N#Dga*03Ly8ILn(ngU6+v6XnhVLNHHc*jriAzgj%Wr_YxbXmWU9<4iWPh* zDa{S5`yarsh1XgezK}sZ7UzBkQcbdpUAs%Su%|%l>>oPU7Jk6Y*=>*au)v)9sIAAu zNt=kGjN&=myWkq@z`llq4nwTnbDg@NsHq0uwv=_vW8CS&+HE#8n%*k<%~caW?fKpz7fvG-hb~(2MezQTh()kNK{??4^Y7=Aq?Pkn zbkT5%V=E6E4?EJ`S(eUMZUTp;o9WE=Nc3c1%om%PO!Qnv66m?vkbT$v2v6RiBS`2C zH?71K?x4AnT7FX~ii)UU@QKX6ipk6rh-_4iFCh&(*1IzY0127~LF+mAW47W&G{Ixt zdB=!tZRx3m+1*EVq)oN#6_t)*JFtUB6;72XYUR+{q@jEBFx&CvN-8K-zTg5odX?&=^w8yU~hlgu0&Qx|P>`FCai83W7neGU#s;ePNHvKjykOL)6Gri9+vP zS&Tkm;8td>s;y-U$u(gt8+B!C1kizqAErM&-6H~liaM*y2**)ZAFl3&bc`~j&$|$X zHiV;4uYb(cGQ(dUUXm5sbwQ5M3IA|bj4O&&&xSXN2(SHK&Ixn}jrakB!ZA^Rih)bF zBpMx*bLdnA1VsHsuGlg#93Q>Y4+;fzR{0BFaXzoe5NiNInv14h)}OH%9cyRz-TIDg zm!)`X%6VR&1Y4?pP1?Z1WXO)bV_N7 zQg)a|hXWh{_$Ib%>aLE_HvwEFaB~+}|wVk?KCj3lin0hNXe;5C#0p?koH$ouZn~&e(@# zq=v=hycw>bc?v2cA!e2MGZL}eQSDS`a?_Hw@3L;+lW_C=txR0F zskI#D1Ce)7wp|@b?L_40Q|U1lmN?HYQhNBi0NiR9Mz*ERkh{&d564`HSzsW#(j?Bp zzKq)JN=RDWN7PEvUQR3N%2w=ChnrO6j9!^JJiTNzW~PC@Gz`u?OURsC&z#Y3! zZ4?Tocb9@#lRRv!9p<_JMbwBbwtD`K-IGq8O%SNEwT{4+0udi~Hn!bekno=)PEu0$ zHvp@8V*<>QxSZcE=_;ubMikp@oK>pVv3j*tdsg znRH4GwH|_hk`4S@EokL%m(cnifmYUhm)))kF(7Y<%q>J!8Ck96Dv;1G#*JB~nB%cN z6aXBssi*?VE}ct>t|~B;dBYRixp921IU6u0XsI3C^*~9@T@vuGQ9_$)N^n``xIgUP zK8%;es?M4K+X^_Nb0J)BDzsD~VZwQu{1eP}f<$^1OB)#y3JTONB4bk74lv(+VKu4U zf6lIZNooY%871d6c92k0pIVhsq`3%FUcbn9 z5}`Q+-fxo|=Qr0Q^XOw33BMsSS27Qcj1EH4JDs<&BHaw?EfI}hW}T*|Q_)6+0K~pT zn)At4jgTzw48bB8s724wueN$hclUORn9(G?kYxkbuGAM_{#_6 z#sgw1q__E=sRv~}ZLB3@?uB#}N8M{V@a{@4_b23?eF2Tw3|jmH`v68^u>tNVze*zE zdNQ9Iz-M;=Lq$bZ4qG#PM>^|g7v;Qy`Clz2*m`Ka1YGW>0cWj`3oeS2(@goEv$rj?;XSmd&;zZw9Kubft$U{WSR5sYhk(n!4pQ7=)G#95VOCmW z)l^HR-7gvEjzjw!lA1$kD+IXa=O_iwsR`QwnjpJczD?FVe|^2Qcw;>|-rr=JjYmII zDA$3`zKjcE_c7yS%NEy&xB&9Jj(n6!(R;+vHkm2z{ch(+!m3+KwUvc%wM?=BKLo$K zc{IJzVQVK6dW}k0jK>?L5~^61CplOluHd$gu&y=D(1~eMA0h(@qk8me(HGF87`G&AZP zLg%BM09vl6Xq$J;;z1+ThZ1`Nm>+OU+Ne!q6-5*KX=o;+iD-?zYrsbtd1 zps{&cU3AMI#)m(PfbQrWs>-EECY4cx46r&(ScwB}-j0dfgD_5*Ag{-%t~| zG70QU#EYF_JhMAP%nB0Epv(ldZutoUFq6T$G>z5uOiCW^tR&dgZGXTs@Ap*mn zGlAM_H+6Vfk%CL!#Hw0OJ-Zf&X?yC5iaIv`w0m|$HSoRz-g}#oyhRC%PIxW?>$PwT z4^B@DY~+PwViTc-Ek2d2f~a%&`CwNfkx*RS$`>7)UNytbY|3@Qd_i?a!f`n30~Y?) zZOk4+e29AqV||U{)m5-x8b?#AO&WIp?m9D`Qgn#}7sc4IxMt`e3&$R-NLSSHr{+a= zA`((-wy}TDZn%@f#5L6daVi^Q$`B%2J2Nl2tU;TDIMgi#BFRdw8$l^oEs-KitGK%e zRJ_rUrsiH#{eZ&qPcJA>7c9CL4JDX^CLHfjqCr8u5{Hw&IrKC2v`Kv6?-R8v$tF`c zIj(&aD-<}$5sd}E?1;`q7=!L0sX{sStqWY5a1J`IQD2(DAG5F-u5L(qXg5KQ(HX`) zEgfOPo9vWU_)CTaU9KE8z1XwXl`LZQj=!Ru;NX)nw*E}-i-Ef#hzgJ zMPJ^St*sgLI@%N++x)w${C2|*sQ1}vjq1`g4yG9;qRi5TG#vB?7PU5sk5yLXww8Qy zt&$+>llS`gX6ZmL9|hkXE#(yvG!1>wA>MmrrjnWtLksiW)9u7xFFad36R?9l&2ox4EUL17b_S z0#L6scB}cE#_^B(D#ChCR#IFKq@#$uDJY~)3$c5K>pBM?n6=ib^W@}KYcOssAb_(6 zsr!MWzj*GM@CGvvXoZuTEQciiV)x^0L7#TJ$87B;r>TtVwNwcK6u&#+* zFH>AOB{d|%b04~YVVrU^KyY!y1e>5?Ck%sTKd16AimH$y9a>eh%%;42e#0w9kr5uk z$wL8xXi;o zsACiUVe}$Rq|?~VEy~3_%~x2;Ap4c;#30qm88W;j5>@&1uU0=;vbd~{kaz<-Ex;zu zaOP976^0>%Xdi+rCfW|aUx5qUA(*J1WM7$$$lEsMx=nTd*>lMbKHHI&VBak+N+@!$ z{cE6aZMR@1>VwqjjWo_w33LzqMr4f}BDZD~GF|ROJ30K@!yO|=hiA^R|2_)EFBX=Y zE7O{exjPink?nHr#1<7e4zNuWM~yFDURVj;iR3Ixfe{#t#%^u7n3E_hqjVZ&#*`Ps%dIP1EaIR16mC;KW-9#H@hurknZOyi3Z&4Iv=PP=-Wk>jO9aMN{($-_6yT7 z2*1^1nkhiqeO`$(NS(gT+Vt!lVeJ-waF33*J|L51^O2mz_LHqgk7h>uc|sORFDNRl zu3IGg&x0p@YZvV!l#&*Rc988sT4cF0T zNsme4LWN!N*o|{655ZEYddoe0N+t*?2Bxr*Obs$rJ&_ai4y`E-RmnwXMW`k5gd*p9~s=i%Uf_= zdS60e57txC7cj4dcGCQt6X+NR@b4VE4ijk@WkV?vaT(sILec&O8e@2Ugp2}-pDQ0O z&+Q&VS)x2p{M67+Z(IgeRgHfz@AYI=0*>rzozWrLENg}<@7~=vac1^XJj?&l_4vvn zxV29}O}#*aNk`jcwbLCa?}zh%WKo`ROilP@@V9G5u_OTSjqj59Jj$6!@Yq8K!GVjk zRJ`8A-~`V_c&*b{bI!P~BHYu3IspHCRnI^>{^QoSiNWwIFYTze*lHMInso*bvEDUa zkQvBEPpohAYY(OuuPoBUj+lsYiZK))bJ3UTMYZfxRUPb&^o0pnIq8?kS?Hyq24+*v zTz(z)z#+r$i096k1(VtZmzw=PzWL13a#$^k^=+C_!C$2m2&VWPMwZhtxsrlH>e@E$ z8AcmVF2MW|%LZ?PC7 zeQ)xEa-~5}W_%NrjV=j;!neGQCTFwQHthg=4yBkq^zP=JzP$x>Zh6%?B=W@jrvX6t zGqqpjo7M!Ne$6SFx19;&>S3?;aM1PFX76SqKyjd1=r#r6Q|G^#C9|%sp@O>6fj~BD z45YKp$m}OJe~ekblWOs!me{%dm&VyxZP{^c4tU!3O_~|S$(@&nSct;2hyQD@oBCvI zO14?fP#B#PA5V{U-Mgm96t%o#b};TDa+`uVaMzJB45dLm>g~AH*+}f9JvvGsoOtoX zn0c!jE}?id+R_$3JwN|(DHyXop4l;d5E~DMrESk1^vcH;av9UdB;AWYe?tU8rTRY> zL9K(f!@tg`04@E^H(u?(Mt>7;x?OD;BoE~Hx%n(|!+UGaf2P<+ewmL!StV<8ckN0> zd=cB*i6Ak;2<~(cec}O++l}CCl1qRr<2UVxBxN9zrSY{kgTe=jP8r^B-rHb=jY#8g zuH6Aw2ZtYv-d`5z_};nf{*UBxquEi8Xz?&B&W;QiL@xjIpNTN8auv}M;+tbh6Ngl6 z`9X*J>X~e(8OwP5w(+NPNL zjCzqR2`WL?!V2;`IHS*$YcbO+C@}U)H0&py#uw@z>}jcW!bAF$okA8@t=c~tP{R=v z&hvN4Aykbb8)N>D#uF$iS8H>j&83FtP8@`gCzG(h+g?g^>@vIjRXPa&LLmHAly9Xv zcRBYyqMf*bQsG{B32Arn1;gB*b}2;sXcYhWU-{@)h{EX}X@qC&{`e-f${%%nh1jZJ z{v*TV$J*L&xJ4w#dy`4AhzhHt6)C2G#2xHb3277ClE79cByC=%#t{r&hJg@4%xq$m z2X@Yd$njnR<&1iQtjyx)zP=1YT@}+(EfJnFA+}*VwzbkyMU&Qvy%Q$O{YA_O2CRy3 z*Rw?dR;dY4V_e@O200ZORZeSLTa?(U0nGXwd{xOBelxFWWkpeUQ2na@ zr{_U=VbP1YzhHw~Nm>;{Y{j8|C=sDd6eAhlVv0K1nJXB+*Ul>3UEuNn=C1dL_#S9A zj4FdlT-oD?OU#OJkVvK;SmHckQ_^2JO1B0hB{2xVSRZ7XN%!?i{W&qUi?YGXob2g7q>g=7(>pXN#B5g0G~O} z>n*;|aH4VLLaJpIY7yMj6BQdzAU8l12UqI)k99x5*lgIN2;EOG@Ntts|_J)*|T#>7k;;YjDPp#X-ZEPuU`eePW}S^g1hW`a0SOaJMP zWN4DL+lVcqmW+d;LO~MNcC#^HqKH9LbKYzi5Rm8~s0r7yJ>EEghx>Ya?vJ_yK_(1j zsqhY5O68nAcdBM}HlxVzWv#SlU=~j<`xIE-#d~ZDkR?!HAR){{L<2oaQ(XnM`u#Lhm4wTs1fP^QVS7wceU7b z@Jld4O}0f0v?41`?5`*Ir8+?&2gE<@{J#Y@G*^BiTBUr~(`w8YB7gsM_7Ep+`RIDf zFXWqm)^l?!J=vs8me+_qK9Sd(T=j z{)>ZD%@a$Fu$@@>bcD`SB!?DtM)5vnNuBo(O-Zc9)Kk7YmM`T^(Wr)sLF9_Ztk z0~Y2f0uD)hgN`;*i5me!4``G!$~ZpHIEF92UXPKUQ``cPA;sioYlH&}I<#r64qO+o zsU+;V7d!UX(e`l^457fG-xm|8P7QSC@o|v6LUi?+eviz9u*ULrInsLE2nMhJ9B4X~oD7IYEOfhKx_C@^z zklHdGh30>fT~1IQQ;^R5sLy-WLU(JgKgcDHkJ;?;21I94bMCJGa)o{(8mVKeuL}u* z64_^FwKsO45063!(%*f-*NMtOxA^_&i`(WHbtrb9sjG|f6O5@zyS=nYffd;A3>W;Y zvda9_$L$2K+mX)tPg<@ih#1p6N%>Z$WCE?XGk%D~X6x2R#6iLEevVH;apsjwXL;?uac>N<&Pa8o$np88otA*G zJ}>T(O>{;r@$KuY{7*mab}mU{6cySDDj2s}L#GweK2hHr`XVlegEPZ{^S1|-RA8D3 zA+e0RGm4N^v$-UVn$BX(0c|z=>^x$UJhM6TK0a^XaiX@g``q-%kZT&HQ!Y$5s~_!G zHvKsoH;rNgfxiRzwWM5&L~J5C-|Rw_{-~>2k<_^5uiE!(cRp1j*78pB2N^-HnFiy* z^v5lj_o&UG9ykk4+rLoz=cRC7#v82(m%2n>%m~Keb`N-ubI1t>QjC29n$kWp@!gr& zGY1Gh5}zpAP1|JlI9MaVLH5DcG~^M$GMb0oJAX(M!G)AM17+L`cujx7TN`@7pf({Xs*HExjV2gfUQGm}jF0ZVt3i%C=J)6K{@;2i_6dgPZK(b9ve1Q;Ex>Kj>rbN@|(oQ9NnApz+Sysvkk=V_Fx;u6y`$vr_sw;@j-?pvT zlq*cdv}5EvKXg7^V}J6*Q_bPozOl+yH7*IYu}9668t41_D$2K-`K^8WlLBqyd+^XA zChy8f)RGSA!0d??+bvq}VdS>?dPoXnJz7mzk)^VG-{7m0G8zWJEIyFCWY`N3yJkIB z)w|^&-%6_2pnn32MR99h$eBEo=;D{WnPVjT&f`9BI#nj~EgX4g)>TK(vs+{#I7Wo{ zW@|IvnFTlG;D&i!%q#jN{_-wm+xthDa!}Y}fKp)Iwk@h6v#Fg$n!%gEHBswuzkPR= zH=OPyV=Zx8u)i+}>*$fQiyuO^8IHvR905Ug4+nREw*#SBA{7K(LjX4Lp6{4{B?`i` zZ)xJ@K+Z@dFvn#*tz@JS2_R!^^3Yr$a`wfR@;0P6IkqcdUradm<^0rfjj$LxGA|#GZc8z55u=Ct@X`^Pi*W~gP5JYFUuNC z2L!2N`hFB+RL3>$Wf$OvaCkj#`G!CpB5Mh3KtXxEB}lX3hl`6k9U=7Ce`$xoFAI&) zSG!=O*k&*bYq+ERmz7HSPd5qoxs4dVRgREGTx;vu*)M?VS+($tL%jq<9?aY!NU+@9%}EkLE&Cb_gK z9+R)1&Xf6v4s?-ocu-_)`J((D>d5m0|B=k#}Lo#tAFy+d>f=dv@l#|%h0 zG>IC;C2i&B)1i}OiRArI@M9g;!Bfakn=!8RQ~wpiNf2u=McJs@4jW$Y7l4?O;Q+`j zUDYnN7eCuDx4wg5-IXjOVXKk`wtvIK+n3_zNlR06Z+6^~#8n|3@qR%~oR&eq!zl&I?>WL8_zQ<=8Qe?f7XX|}qBf>nlFeYlw zUF3oHzef#i(_dO!q2}d9Tr84c!aH+f=`n9I0rbL6c2le|RmunYIk+<_EpWO3>E>Wi zkAM)aqt9VkDDEF(7Xy=abyF2#e|oEw`1Sr&jOj5a>_H|Jh*{>}pk@tv-MmAP{3DZ` z!G}U_l3G*{VPJ)NR_TtJ-*fcQPT%ofs>@JJk|P%5#>~W3^pwP6D+%Abce@lyL2=0+ z(B4b+_d6*i@Yy;W+R+>fJ4q8YV6-LmD1^Yrmm|a))xG4D--@vlR%Ar1$y%#J5D5~^ z-1r~}kQ9e<;S8KTaz(Y{F*)#U@teyvwkxlD+tl4-0?b?XVId0sRDk(VurY7Y5h9phgl55+K2Ksbg{{#&K!r z#p_+1OR3wzFXX6DLPrUPHI4&gR}&vAH|x;do>cVK*2R!c=3*%lT${OCzzu3HGGedc zw?tDeIV+lm75!Ci#y)#7%T43AJPvlZ4=)n4T3TQE<$5P3q5%LhcDX#eugoJ z|AsWB@UFj^bDZl*@&meF3(tI631K07u*%n6(?k0 z(XrCJucWH_frOqLeG?kuUyeJnlyONZc*<<{*Q#OY+(B{onh=G=t&h2Jriy(22E{@j z_ydH9G@wK7tRB(Zg6v4qHJ5 zJ>G4x>6kYodRp41TWMEc3qo~a!$!IUoeV4;P|b&T^~6JH`0|6-}Fo60Z~ ziB48Sf_dS*WRzs91}3+lMm1lNQW&#%S@7);=@-A}H3xTmmRUvsoqA8>+3ad;H_cFP z@3a}n^986IA09HmYtfT0y1L-=Ok3%4By-2`#YRlvcaq1ghI+=gIPBDQ)9;+Jj^7P@ zX176hewEa8eQpNzH-%;=?SM}8UYTaXFrq?{12L*E+2E;|+YvTtC)LbNbpa}F_8Uh^ zB(wr^f#AXFKWWmG7~9SFck&yFiwbTTb5NQXg@R0=asmh_D=12sosdj^=^K%kO=l)V zeg{w~%GMND>^$ogkl#DMd{ibTpa;nNWPcCw5-v2lT3yiAOCMa_f6V}ai?Y&z%Ho*N zad2T#BG3;g0(S`&j)DQ+KWwp=9x^N{Prj|rC_7~HLK9#*v_lTs_E={=H~1f(2R``}tt~Cx)6?;6(pce=(EWdQ zXqZ<|n{P%0RJT!IvBDvf-MmD3qR(3xJ)8-$UlT;}H?70|>wfhApQI1U55kv|Z+TtW z(BdJ2TgI!(I$;epa z3n>3HN?{U)to%mGm@UzjT}YAOLtOBFqJ5@#^?W?r{C33wSc<7#=$NjI-XHkbAVf7xoX4W6x4>>7i$tv+50sja2`(Y#i literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Alerts/info-examples/view.json b/com.inductiveautomation.perspective/views/Alerts/info-examples/view.json new file mode 100644 index 0000000..b21b1a1 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Alerts/info-examples/view.json @@ -0,0 +1,479 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "width": 600 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Label_4" + }, + "position": { + "basis": "48px" + }, + "props": { + "style": { + "fontSize": "24px", + "textAlign": "center" + }, + "text": "Swap Theme" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "40px", + "shrink": 0 + }, + "propConfig": { + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "session.props.theme" + }, + "type": "property" + } + } + }, + "props": { + "options": [ + { + "label": "Light", + "value": "light" + }, + { + "label": "Light (cool tint)", + "value": "light-cool" + }, + { + "label": "Light (warm tint)", + "value": "light-warm" + }, + { + "label": "Dark", + "value": "dark" + }, + { + "label": "Dark (cool tint)", + "value": "dark-cool" + }, + { + "label": "Dark (warm tint)", + "value": "dark-warm" + } + ], + "placeholder": { + "text": "" + }, + "search": { + "enabled": false + }, + "style": { + "classes": "Utilities/m-b-16" + } + }, + "type": "ia.input.dropdown" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "basis": "40px" + }, + "props": { + "alignVertical": "bottom", + "style": { + "fontSize": "24px", + "textAlign": "center" + }, + "text": "Example Scripts" + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t# ~~ 12 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\n\tAlerts.showAlert(\"warning\", \"This is a Warning!\", \"You have been warned.\", \"false\", \"Accept\", \"Cancel\", \"\", \"\", \"\", \"closePopup\", \"closePopup\", \"closePopup\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "warning script" + }, + "position": { + "basis": "80px", + "grow": 1 + }, + "props": { + "style": { + "classes": "Alerts/states/warningBtn1 Utilities/m-r-8 Utilities/p-8" + }, + "text": "Warning" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t# ~~ 12 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\n\tAlerts.showAlert(\"success\", \"You\u0027re So Successful\", \"Fantastic work. Really, just a job well done.\", \"true\", \"I know\", \"No\", \"tag_faces\", \"close\", \"\", \"closePopup\", \"closePopup\", \"closePopup\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "success script" + }, + "position": { + "basis": "80px", + "grow": 1 + }, + "props": { + "style": { + "classes": "Alerts/states/successBtn1 Utilities/m-r-8 Utilities/p-8" + }, + "text": "Success" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t# ~~ 12 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\n\tAlerts.showAlert(\"error\", \"I\u0027m Sorry, Dave.\", \"I\u0027m afraid I can\u0027t do that. I think you know what the problem is just as well as I do.\", \"true\", \"Disconnect Hal\", \"\", \"disc_full\", \"\", \"\", \"closePopup\", \"closePopup\", \"closePopup\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "error script" + }, + "position": { + "basis": "80px", + "grow": 1 + }, + "props": { + "style": { + "classes": "Alerts/states/errorBtn1 Utilities/m-r-8 Utilities/p-8" + }, + "text": "Error" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t# ~~ 12 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\n\tAlerts.showAlert(\"info\", \"Info Title\", \"Alert message goes here.\", \"true\", \"Continue\", \"Cancel\", \"\", \"\", \"\", \"closePopup\", \"closePopup\", \"closePopup\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "info script" + }, + "position": { + "basis": "80px", + "grow": 1 + }, + "props": { + "style": { + "classes": "Alerts/states/infoBtn1 Utilities/m-r-8 Utilities/p-8" + }, + "text": "Info" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "scripts" + }, + "position": { + "basis": "56px" + }, + "props": { + "alignItems": "center", + "style": { + "classes": "Utilities/m-b-16" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Label_3" + }, + "position": { + "basis": "48px" + }, + "props": { + "alignVertical": "bottom", + "style": { + "fontSize": "24px", + "textAlign": "center" + }, + "text": "Example Actions" + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "draggable": false, + "id": "alertWarning", + "modal": true, + "overlayDismiss": true, + "resizable": false, + "showCloseIcon": false, + "type": "open", + "viewParams": { + "btnActionClose": "closePopup", + "btnActionPrimary": "closePopup", + "btnActionSecondary": "closePopup", + "btnIconPrimary": "", + "btnTextPrimary": "Accept", + "btnTextSecondary": "Cancel", + "message": "You have been warned.", + "showCloseBtn": "false", + "state": "warning", + "title": "This is a Warning!" + }, + "viewPath": "Alerts/alert" + }, + "scope": "C", + "type": "popup" + } + } + }, + "meta": { + "name": "warning action" + }, + "position": { + "basis": "80px", + "grow": 1 + }, + "props": { + "style": { + "classes": "Alerts/states/warningBtn1 Utilities/m-r-8 Utilities/p-8" + }, + "text": "Warning" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "draggable": false, + "id": "alertSuccess", + "modal": true, + "overlayDismiss": true, + "resizable": false, + "showCloseIcon": false, + "type": "open", + "viewParams": { + "btnActionClose": "closePopup", + "btnActionPrimary": "closePopup", + "btnActionSecondary": "closePopup", + "btnIconPrimary": "tag_faces", + "btnIconSecondary": "close", + "btnTextPrimary": "I Know", + "btnTextSecondary": "No", + "message": "Fantastic work. Really, just a job well done.", + "state": "success", + "title": "You\u0027re So Successful" + }, + "viewPath": "Alerts/alert" + }, + "scope": "C", + "type": "popup" + } + } + }, + "meta": { + "name": "success action" + }, + "position": { + "basis": "80px", + "grow": 1, + "shrink": 0 + }, + "props": { + "style": { + "classes": "Alerts/states/successBtn1 Utilities/m-r-8 Utilities/p-8" + }, + "text": "Success" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "draggable": false, + "id": "alertError", + "modal": true, + "overlayDismiss": true, + "resizable": false, + "showCloseIcon": false, + "type": "open", + "viewParams": { + "btnActionClose": "closePopup", + "btnActionPrimary": "closePopup", + "btnActionSecondary": "closePopup", + "btnIconPrimary": "disc_full", + "btnTextPrimary": "Disconnect Hal", + "btnTextSecondary": "", + "message": "I\u0027m afraid I can\u0027t do that. I think you know what the problem is just as well as I do. ", + "state": "error", + "title": "I\u0027m Sorry, Dave." + }, + "viewPath": "Alerts/alert" + }, + "scope": "C", + "type": "popup" + } + } + }, + "meta": { + "name": "error action" + }, + "position": { + "basis": "80px", + "grow": 1 + }, + "props": { + "style": { + "classes": "Alerts/states/errorBtn1 Utilities/m-r-8 Utilities/p-8" + }, + "text": "Error" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "draggable": false, + "id": "alertInfo", + "modal": true, + "overlayDismiss": true, + "resizable": false, + "showCloseIcon": false, + "type": "open", + "viewParams": { + "btnActionClose": "closePopup", + "btnActionPrimary": "closePopup", + "btnActionSecondary": "closePopup", + "btnIconPrimary": "", + "btnTextPrimary": "Continue", + "btnTextSecondary": "Cancel", + "state": "info", + "title": "Info Title" + }, + "viewPath": "Alerts/alert" + }, + "scope": "C", + "type": "popup" + } + } + }, + "meta": { + "name": "info action" + }, + "position": { + "basis": "80px", + "grow": 1 + }, + "props": { + "style": { + "classes": "Alerts/states/infoBtn1 Utilities/m-r-8 Utilities/p-8" + }, + "text": "Info" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "actions" + }, + "position": { + "basis": "56px" + }, + "props": { + "alignItems": "center", + "style": { + "classes": "Utilities/m-b-16" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "info" + }, + "position": { + "basis": "400px", + "grow": 1 + }, + "props": { + "source": "Thank you for downloading this Ignition resource!\n\n## How to Use\nAlert popups may be called via a script or event action. The specified parameters drive their appearance and features.\n\n### Button Actions\nThe action performed when interacting with an alert button is determined by [component message handlers](https://docs.inductiveautomation.com/display/DOC80/Component+Message+Handlers). In this way, they are dynamic and extensible based on the parameters driving the alert. Add a message handler to the corresponding button to enable a new action onActionPerformed.", + "style": { + "backgroundColor": "var(--neutral-30)", + "borderRadius": "4px", + "fontSize": "0.875rem", + "marginTop": "1rem", + "padding": "1rem", + "textAlign": "center" + } + }, + "type": "ia.display.markdown" + } + ], + "meta": { + "name": "root" + }, + "props": { + "alignContent": "flex-start", + "direction": "column", + "style": { + "margin": "0 auto", + "maxWidth": "600px", + "padding": "1rem" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Custom-Views/Detail/resource.json b/com.inductiveautomation.perspective/views/Custom-Views/Detail/resource.json new file mode 100644 index 0000000..d33c03a --- /dev/null +++ b/com.inductiveautomation.perspective/views/Custom-Views/Detail/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-04-12T20:45:31Z" + }, + "lastModificationSignature": "f219b6078885aed988e1fcda0248cef1fd9891ff71ad6721e8bb089d2a8e8b2e" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Custom-Views/Detail/thumbnail.png b/com.inductiveautomation.perspective/views/Custom-Views/Detail/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..8f4561b5634fa01c6e0c7bd00b5b14d19b4b0a4e GIT binary patch literal 9222 zcmcIqcUY78vSxKX?Aj0k>9PwVMI;K+OFU};m6akOAWZ@o!Ds;K2}C@*kbr=Qz#QRICkwSWRBXhK!w}gml`MtL}&N290r?Vwdqks3|15*BL*2A_oqcRbWQpwPa zt}OGS#&2F(3l%6}uVfsSnh1d5SvJK+b%f98{bK-t&bKr4EKIXIhH@a z^(&f_$hL)@FO}~9;juQVc-J|W*)A(znpwCEu$f-M=8wBK;A99!NK7nA)o|7W_?yei zgal3ZiBDgYt`L5vVXPbPZD$lH`c2_fXLUW`2gkyi$QU;^nZ zTc{AOfA3CiU^>_89+fEC#>NDj(PN7||NAsk2`UkkF3~W!i;?SLI(=X5Y_+h=c>{%8d>=By(>#%LR@$a$h#AzYf&tu1u{Uhrp&caJn)8`#q!8aW7{}XF9$R7SDU5Oul z+-Q2r*mmmRpE&E5@y@TQDLd4~D#(v*oZIXc_Vg(W(EN}Cf4mckIWVFSt@DC^ZlCwCKlS%tkAT-l{;{;QL|N^U+@bNm zkUH?F6*$?OxkV*@erw~;$1?j46bik2_e(XW*vF+hVTYw{*V2;$)IT6fr{6d=#@G=2 zd3HKfhWywhV2hTPmdY?{#k^uU+UjA6WH(o<=1S9AkDZv?+8hFnymxQP<-z6FZAdPA zMny$M-ULALhI9g!oW}DuW+LZHr1HOpYs_O_-F|ncdUK%?Z6=?#(+Q2tr=R;UXp@NI z(V$Q1{SV9L8toX%{?tLLIeN{!Xvpur+*@&c#YR`&e1FkGEtbdJ4u}ZQNnfS7gRsTA z!@iS=+&bJ>xsCBYA(#C&rqdm^JdhHfXOe?Ym&#gg?ta7=(peuRHQAaZ=FCf5CF?qN zB{8Ox>KbH}8*r{2H&k+L%QwCvOF*F+LqkJA{B4X&*N0Fm&0xkjIQ+8gaHDQ^!hG>~ zcndDif9^iFIdurR(A(QPG2yrgG0)#=;-x-ijlj?q}Q#54CEZTg#%V(U+ zZSUylFnM&s$=p&~v{7OQCNjT3i_Ye!b9Vnmn4Lh=WKA1kVPWh&TU6Ec)jtdNvEktQ z`Z}!h2gcIv*70YJln04BhM?Suuq}o3`ucj4bb~}yH>kX&0twTQZ|r3|TO}=>G;dzyRVDw$T$2!0cO!sDA z6&4i4ZV1#-d*xx$KX%sV7@XDldkN1?OMTCVvBhp@jR=kQfxo@W%Ug(p;jmJ^f^T;7 zQX9M6k2~!*mCW48V}?XG0F@%yw%;Sbcz(Y|fWC$cE^DM;OifxZFUetuzL5`=FUrG!t1#MGn)ysEofn zP1Lm}n9hRK_=9WfAW<*emVGepcCXhfoIBotP@_kJxx~WlWr|Td9#@)Zl~doz`PWyN^9}1;K81RZ4OLoQ$Op22yqTyL5wjF^dfIP zFOjhr4E{*zyPqoe`vQ+jxvdWzmiNBhl}Op4zTKMzG`X9dv5#fa2}0BRX^ z(0dq7C!%ZLW_`5d%gV5$kMZL#gphl{%oQ+Vuyn0X81YmNdo)xFudvCWR*G>8WTnK# z#i@=Wm=px@M`4wRz#Eml!^2{e=;eATi4^ftulWIAqNq0nGU(B9Bk~D%FnGP1Yb=nl zHO%zy$+amOaMyS2=i5nW?d1Gteyiap~(0kY@NJuT?(2-LR2tgqW z(z&|o0qJZ6Rf_biVlqA@`%D4+G6}F_#KBb6+*!P$_*X;5grWFZi6rQ2J~ve~gZ>Xr zuDZ@>{%xYvPA;C(8-n+}pDqfRDT4mUhdtT&k`T(DXH_&mW5?VWX3P!i{-E=8t6Gd+ zeJ%`4uK~*;Zj>__oA?aBB?7;L#4Ryfz(2PUmA8;KPe_KFcACZ7{b-n)zR_H^4XjAtvIdJ)Kt9UU7`@)Sbau48qcl7 ztxSv`7Uc`YVcrA56R3MDO^Mx5eMf&@`B}1ECUgXwg-VdR>tKjRqcy{>R;&6tS4c;= z`!aNCyJT@&eQ@;k5l!(QDUho#9%JX~b z9|opXAX#ZZh3WK)0Ao&35f#WSNrAI3DIq7Ni1D`A{K}7kyfxCcr5@8C9`r+XE_Myb zj?sy-2<>Polbh#*5S3eAz6T_K(C3YQ{4`NY$XHQbT`0o#;_ID`azW2fYt8iAE`Y4f zvn?(vD4gu+#$*-O#=ejR5p|w<*v7`+vrP>RtFEqQFc_j5UbT|m<8@)@%yUHq1f(aQ zR$)vCjQTfZ(1FZs{Du(s`AWuGo_Wq~&xucw%dXp8)v$b^*C&;i*s|;>?lX2x_elkP zxlytzcJ@L6At9}#`OrNyPxx~(RM1^4Nw6sOBt9=3mNM9_`Z>`ImI!odS)~iMY zti-GO{&FJ$j5BoXP0!O@8~AEwG@FCiCwe6Kz<+)v~oA`XZqed zo22Py-^L+c5KLx$M}OtFMJ*9}F_QYpjgB zs2IZNVOK+{LNA3qehLqj?Cj35lK85gr{!gN%9w0&hht)F*?+7So3u3x!+T-R!K?=) ze!>N8Oj~q7a%(-o2hPfG;lT}K?qU~tlKGNP-hWZtSEr=%T&7zkQr+!Nnt?SYRpF#~ zj4HR3hSx0S0utax@zw@$ndcHMf+g;YBh{)85@b(a3>mLdy5Iex%MhaPI01Q-y6U6A zecP>sNd}<>ow#F`YU}Fi#8aTM%lV!3ujZ8@`R2lIZ-F$#^!^r7TROWlxegHc&?($m zaTci}>K^xim2tc|uU8rY2~(=PKW?#d+z19c+UPIlheS5&!q5q4Zps>*?8mEyUXs;M z%IBR)NRyNDn(O1ME&#UpPajm%=q=$lMf3=GykhRU+wWVO)ClFG_n1jR8vmw)M0kkQ ziC9KHSh=CT@nGW0Bd^^h`AcrcEhC``Xxz=0OAU;AT^Z?X-7jSmJqrw#+CA{GQ7?kZ zv2TcZkFJt%F6!U&gKX(QJB_xQi{3oltZnG4kjN9`An^;dz1x`*|L{esy5XA@X){M| zJ|-ZGxXMTds;hOt;E#3VnZZ(ys`4x)`5gbzAW?AILI|(UVi3d6)11vBc8O@-8sG-C;7e z5@Ef*AIOi46BTzAqQ?eW8 zoFJQ+keh01YK+m@^#wjt03k_Zh+$dGI}UH1_2f$UIO{0=VT#}zH!LB5RFi9Syh`VV z+0``tGi@L=tr0MT5WSk2j@uxB0`T@VLB1WV-taEhUf@UeNHb}KI$6Ox8Kbp2>7$gToOo!=fN@Q&DMlQWRC-&a>x zM@H_{{`{>O#5DU^irkYQV?g+B>`P3Dg>X4A4rZC>g*Rbdg($wD#-(U?TN$6IaS!q- zp2Q*LTTYnIUCmZK6Jr^v;&vyyUc6NN8T6Xz=ZE(tZc5>FH3znt*`j~#63+KaoKH|B z47^Ed9jgcC9(ml)zMlB4D_-WOjPG}6JI5Y;_Vwdy-q`i;(mut1m-FelfENReh8rp+ zxrY281LCSPwGM5>lQ$h#XlX#D6R9o6qbE{!qgSrQq5W!J8j`2Uw1`v|D) zxxqqrV`F1awHeSQSSeNbXtHIm6zHs~y1W+s?^ktuM(STTX6%Il z=og5+ZZeJ?KmK7?Y4=-cR$(b!e?)zAll{SekllMm%Quivt198f7SleWg#Fs|My!$)*(Ya<6$goSQ`BHL3@hl zfU@?7v#Dhqrl#U9v}H1|hSHOC;k8CUFNoHG=m?#+DZK=pE(9I{n{vPhiQ8%C3<$<3)JM2S?FBCvbo8@NhM%%KBxb-#T)1mS88t8EMc*k^$s0T7ZZL{SLPN@FOt8B z@;oZ_(#%vqP|!E`A|ORltQ8g1y-+TGW4#kiSe_++7eDoiFWPWXjo8uEpH+g0XAA6Q z!V~dYNH5AeC1fENOnb(jUe81b8TkKhzmha%4V%0mhaL<{nqKVH6RP`li9U+Y%;Yj? z`lzJpyU;H+xd8SZZi&j;fDOe1A39D9$hK!lOn?{Cl@bKSn2Wzwe3uhhhrj#1r+P{Z zD8OlPQKN&$fzx{-Ax>ZhJ!!-&D_5L6ZdH&TjPxoD>JW3HtS$}?!F}GWx6P84+V#1J zdJf2u!J$ln`9Yhzt;buNaPmWC$hU%&B#nN-7*Y#9XY5EzjQzr|K?h;s-BYF4L3OM$WsY@e&VBw8iawA~4ROAeggblr+X==-IMZ zL&_{5jJuh|scRsUM}16CQ&m`paZZf_e&KLCsA?N^zP4<$XVnmlp6KLEH^>pvDs-J} z%gk)|FLUr(JwT**1vSs=1oO+|)L@hmwN~1ySW7S%aHD&+1pS=0I4g!+QCS~NdPIj1 zr3{J2Q8%5II!VP}>iE3}DPNNjxq>B>lDT1PE!52Ot);cFt{OWZO3r$~%$PsFh;95) zWKh06FSuxH^_`|s6AnBpsE&jSDi_!#)hy05FX}fhmMRt`+TZ_hv=Kiyx}wn{qpkR{ zYW8jQ5#Br@O_*2LNNfWh7E}s{BS2Kh4zHAPOJ&hr0bc{}q@egUkC}TAd zCiJ?J0)9c9%<1*z5@O7#b!e>UQ>Kr+f<_z8#%nRg!zXYImkjqw9%Duw2fHjim~0v9 z)~sLW?`%3g^kKG*H2SuBJ>9=?mgLwgi|b#EpX5ra{N&m`1gFr)lqAUDcKzdsiZ(b6 z=E-=+Yv)dxfdzRtJM}7h+*S44P;mF6{8VGG)YtA_u8#KUPZ?BM6|w6?%fb^?*Jw@$ zhiz9z3FjFBAlKQKp-1(XB!eWxw6mPjnU`9$C%J-Q=&Ax1;_udorwfWIy{7tNsR4*h z$hSkiz3a4G-`Tl#v2vx=n)7;MgWB{@Zz_DPHpgc;vJRfVlQ+!?&__O3_5sFgt;9vxN9_hFe*&A?gOJm7!ee~Eut=H^FdQkAV zuPw@}+jZ+uC`bX$hn}#XF{Q%tYEQI^=CW~+*t97Pt^lVrc~a=3Fmw32<+1p%l9qskvGtb%r=K!61?_+;CnI60 zv;eQlQNBx>Zg3P7?&0X+fr78r;zo{(l8{KZE2VmNp~7mZ%eR^=3jCG)6B$@t zqExtO(n}$sa4~txQ{uAB=X0jpFlaGleFY;=taW!{3_y{ioG zeFtddfUE`Fvp$W8;5y4~Hjg@PZ7KfR)_={6n-DFjFb!N&SQXrD25uort^&7=nd^Dx zkm@d7h@0d~QDgmB`9vJ90s<+t)8@$i)^=+AIxn}9qGAEC<9te2D{nIoP~&uUvaCSS zo=fTjTB=M+asG?4tF;?4%g))f3&8D80UFHddT4rXPEB~Q-Tm6kU%1v5W)zM`Tms3^E|J8JwE5W|8R2n-S55M`yHR}x(OG~Tghxy z*a`xHWPUn#`XUG<@QhH4tJ4|=vbZp=A{Hw3O`Q|63V;0SE zYtdDHvmQTXT>Yu)JKD2rt`^o7GnHY>I05|`%$fGP;xi{oki`W5K?A1&1rJn1?}PRa zF;-qby;Sy-(j6tTU#4bNGK{QdLF&LXinwx`Om1PU@*r896mPyfoEz%YT@kB##oLo zo7s{WBwXVn%9Smm*NE`W&d#8*mv@YVn5TcH@&$sz!a`OaVQI3PLFlJY{%8oFAFe@^ z=b7DH%!jkt>{STd-#@vrvC%ke=1m|WoHsX!D3{s3{j{qq4M~+%Hr?ahm3z|(UTjxT z?qWk>3$U2U;+kB-a!w6=T42MN6!lZOkBM^U2^lfvB(@8GGFx1uU4}tbkpi?t$~9CM zJ~#|VSdLh5hfj03z-oqMnRAj~2W=-TbKv~d@GDxPy1Ga$ksyXdSVq9OF8n<1{W1*0 zp5&_~%C{lWV)|V8Bay%!f)!wo)gXR@kXD8fy?E&|B>x!s>#eF7$wz<^wKt+i~RTJU1vqyW|Xbv)W!V&;5AX1Uf#1Rc(f5ex{hBY`9Y zj(`y`5o|ELrYaN_g(IxONOgZ!g)(m9kbd(+2!alg8nfySC$WiZ0L?IA)e~C(exVCH zf3qY)j{~=9hZ*T8UT=a8z z__rPa7vB`iAl{Sw2>}l_#!7#VX#TzVrjj?+p==pb@B6_5$H zHo!;!3+*~~>irFJ1-bwL9!Gls6blyZTfNR-190cRAaWx9z~9K&odsauJD|!l2`SpV z_{S9e{r!#~lvHv1_U%ok|4U$iY&S9ef5U-~4SiG8ib_glpYTH>+v?TS)C6#FLYLBY69zj} zR9t*V@0MKrMrK7tBDJ>*(xkvC(PRlVZX5 z$puh&*PGw;Zb`dtBz7$};PKGkG?7(;gk$;fDKX21+_VDWcV1pz>bL!;m$pRS0J4?* z{Cq&k532T^_l)KZdb3!nlE~=!kb+Vr19)Jdd>2UN#zq>mN8?WU;NYO~jnNa)i)jT( zWEDi&qQRGyfhYkj{f8aJdS945-^dz|_phx*UMm(P2Sy)OiCG(4qpuR>XQ{Z9?igML z7oURE1PYa3*5|Sdy+CqB8~41M7G6~yFmjgwr?wtWF}uiZ)4(;qetqFc7UrY{6{mC%!EKS(NMA2l@9fpqs0Ri$%;mf{TIKtnVsH4Ruzs)r+Z91Iq)L( zh(?wHP^1AS!ErZD=4N~6mqepA`&h+=Ftsev8rc#J#Dq4{ofjDa#eCt!gjcct7iJzC zVtazUW53@hkglXEUWn5mtZi#iePv~_n7SrnNJMr0lo0W#ocLQJzYlkI$f$U$2t)gF zRJC|Re7@deOIOr#%_YJm?sBi46FLVu31-|RN00;~PYK^)k+ZIhyBQh#3IJi;0<>Oe zmGaJRIqqAXrYoC6mo=TDh=tccav5bF;p1)TfJKas*npX#Z|95%pSN2a-P1Lmx_U;6X_$mIwjH3IxwrzGW8YF18m;&jO$H@;f102~#F@S{@LUB6rFnnnI#Dyy8F`s(7n zv$)d{P`k=G7gfu(p8G*aucOwOY3s}C$th>A`yQPrYQN%LzvrE4a~BPZ+D-=e20v12 zvknq1Why7()#(gZ!d4pH{H8iZ+wRneSYn< zTDiNivUE5nUPjUAESXy|zMcTwW7NQ1HXx*0>h1Edn{B!jv_wh0xM-5WSbiG~QmRv4 z=odE`vBt5|8Ye@zJ5Pe>VCTj%pq2q}%HlW>kklKetXKOZ*A5pXbt#T7ghe}Hm=qQVF!cNIF$ikYcbK2fM#7!%%Sj=k*VlHEj2dbY} zzN{=^76^OS7A5q{M5Em(Zh_?i9e<09-&l`G&%zLpkfg4&!&3kVnDfuo*ESfGGxjGe zUaSmUyDp@mM0H$(r65X^7UUCCRAW|wGt<+Pr|JN$hS}8Mg`9ZeDSzD?W7ckF2z9=l zQX&$;YsNR0rXNP0l0x=Sh7=gc#Z{&&&JXKn^}SRi3Mg8wIzVd=>P&ucM{5;w8;)5j zx69_Dc?6U^R9Ju`zlv34%Bdo?yYl=KamcYHE|w&YGFw?*^<>>GXqG4PSW_j?y^=+! zP=e?9*a=_lP9eAP^_EWhQfDF;dnEf(qGz~IEN>bTC2Oj!Pm#sU1$05Hl?9I*Ik!8d zxmRZ{sSp88kP~%Db~A)y@SyNW{eX0DIsZrtiya|3zQNQa^PX2VsLFi`R-sQDD;iEe!4guPsMx0~6H6eM2{kEGGK>sI1N!B^)wDo9Ot8d8&2 z&+A;{Ske`Ou;wZVraj(svNe*4Cm%*q{6``zcS=GAWgEATBEQSpasu6xy1yVN@qV#f zi+s##1d|aXEDee}^eC`Bk-KhZt{A7_*o+b{?8Xxwnz*>2n>*eR*1FOpN5oCXND6su z0jp3lQ9yRecXpMv2}!@v*RVdm_9m_X{c13E?Y@rCU08wQ1;P;I=}6IZH`%_MxC@*i z@;4JU8+k5V4Kd@V%C)rdiO<8?QAgewVEHFagrdq_j}H|w*DY^q68RCh79Le>Xu)kE zC3Us_%#~KTG58&s`QW1BnVKag%|rk&)st1w-;GamCu!HigWGn#n`? z6iGZuGB|U*bL6h5y&$<*JTsn^Q>%npf1}#!DvfR#?r<TG=#>&ilj`Vw{BW9TP( zUAeC$i>KcxE2Fuk4crk+(M2=vTO*j&WKDdwB6qO@n$j(vjws|%d@v7K=SEz)4XQXa zetLSps!q$wk`*&M(9Ai1J!)>wOtreGym?!i<%%_K?L=11 z@LrS%ONzg(n1&x8=d@&s-%hWI88KjYM&DDR)F=`N@(KzHKqW95d;C&&H~sE&10%>_ zf}{GfcX4}4vXzNv%kZ2n#)3q7Vyx%no>gKNKHLAuu-Uqubrln3IbtV+p0>LVE2BJl zzTj<0Fs0MyvB6*G?k`{jIk|@%y)@NLwB9S~5i zG}Xo+3)9rQv-2G?~|`6D^d8@ExD(m4%2yw)+zLw7opdXq2j13(=omwZpL32 z{1Ch}KU(3VZLR~c^BXh0wnQsnIQGq6%15o9!A^2?@|{CbSI11fA}qtb>$Y|8Yy;8l zoEtm7ECPzjcTF`QzAn5dRhrHrL7ICCBdR;WR%3K*WnNoqjUNHw51Q9`pZJZQ%=p5Y z-{Eu}Rv(NA_6@dpa!I8wWQGxa!!`OTQ$*5!l6%zHP$g}8>Dr~@?ev)XXH_>4W9C{> ze$j`Hw)Rf;2FQnK#*{6_%y)F4AjU{;7XmsUZa#foEQp>&kV0z5nQWq-Ys?6xxtYx= z;+Mc!VX;o(PH z$?aoLl`dSokZs+F6@~=|KYNx;VdL!W?RDM7rh0k@L=DP8+_Tq-mp$KJRC>Zma_G?o zr+?uX#a@45;N+~)GSJMPECM;n2HW?R?6|581k@~rI;A>8(q1snfc#?ghHZwbO^ZtJ zI5jUTOYVG$$JO9x4mAbzkfHPHU)H445nHc$F3~t_lRbG-r*!p9Bn`IRU6<~jp@g&^ zJF3z0Z5n2A)iB*!bhtc^{Zyz)DR`A|=f>6(*o~ym>~LcuCzib^9}d#FC>zhc5>1gYF9N=9*0wlduF2>z2fCYGTR}|Gic@N#RAiV z3vQYuDn4~K$ZH|`afKVd7TiWVa2GCr{_N~nq3*?;gw#^`!qO58$8zZIWb*HaysU$+ zMH)weT?@Id$DW&5T%yl=R936pt#ArxE~%=$ObUZ4ah|69>`Jw=x3?M>*d4rJEcK+} zeXe;++Q~H7-~h|Xj$9-|gP}&ceCCb!t*p4h0`1{t&b+k9d5+j3gCq*~8+@iC8}Wv` zq*Jc~$@9mDKy8NaW)IW^{T!;wj)$5_VEWY&EocY=Cg6qP5#2>=>+tsW+rHmA5{15V zrhghaYC{z#18rO9-umeKL3S%f%%u>;o_M6Fb-=Y6++W{t1RbuD{25gY)#y zkjsC@2aog*ko=wI;68~X_l=s%7vc3ai^)Flz@&ywE#06Mzp{bn$6Qte6Xo4qRmteE z=2@Lgh9IQ7_321*Pd(goZlDJ2jzT&snOWqbd(Q~+lktAzMFVvr?7$#Jp4zq2YDbj# z)mKI%D%m4DaP>r!^SsLD()LU;5#q|~)RKn5d?&(xmQV@~gE&B+9+=|*9n)LVXP%}O z}Yt!A(_%1yv zs~;R;q^MPMjMMF*>_O!tvnVU)ji~MJusn`H=mWgA6@OpR=0W>pRov6s`-AW zuECz!Hkyj9_kMJKQf8+AQ#1OXh*NW=3`Ina+?kH#)*`Ls9!B3jh&lODafw=Zz=#SC zH>iTC8T1*zTgVbr;`4r%2D}q>6B(jZX1PPFfeI7a+6$YONJ+eTx^c|2WBv8Qvu*_m zK6FX=8)b87492ymO2i(xIpt<6yV^YD?+PQ=D)$Wh33lhNFB%W`?~6;xMbCN36=|5?lwTR7!SMH^MX*O@`k{v$%hVaFbvy4<%M-*QMywl4UB*E?TR)cu zGX=Q_a^u8d-HS2Uu0{Tf1)uRRdWz9+$Tr=QL%i_(_%weR?qZ^4icA<=H?+#gr54>h z&^hL#*_}7fMi(MQLBbn|P^AO$o^h+>r|Gk>!DrC3k~`b**H&in!cHTYfXJJgokn*N zx9LI@5`KrwvN|u776vW^=gtKrjq5ZhwYPBuQ-kpF6DE5{I>Wd#?W82CV_7_LxnX`} zmqtG}QHv(m+!8|eTv047T)7Yuy3BK=x8Igx2OZA)RV{1F8@KmG{R=5v{i)ontfc8+ z4{I>_A_jxkm)!g_bmzn!ag|23u;B_yKRmZ27wxQ0B3XxA9j}Q9^cFWfURmdC zxithdQGtN5cH%i?cR_%TL#xg(iONc(avWxKa!B6kqP&_G8c8rqSpip*+aLNqC_c<% z)1Yc==NfhIwANMOeFTZn*)BNx(vQ@I@x-9(Yy4>AdMcuZJol0ZdV*aBhhN{}I`eR& zff4y2xhoEvno7I!mM3bVN|*jC)B3Uk?q5aL&ufsOTAi9Q`VpP!7~1sl%eCbLFX0Zq z4!?x!Z2fT?RnexqAUhBHX2|Xm`bH;d0`lTz+PGNXB^?+X7FUkTkXJ$;nRn_bn{@2N4!tUPUbCiv;5srkkx}d7hzU zXq$X(enGM^ZREg+)y11u_f+qbB3EqJYtm;6Mr424#xX~twHkohbzR(HYkN=X?Hu-a zV8qeZ!0qJJriP%fP_v@;6wGANYeNZ=em9#&wZ5ON{*5?!`Y+4-k4Wk2 zn(T}9)@dDB^Ksj6rs!1eo}hOOeOh$8XulHiz;2_sLcxVoWv+s7ePs*9kPskFo2klc zyC;;M@_y8SF&Q!yz(Qd^6cv#RO9PzzMqE|dg8MKUjaFDvsHY9phWwFZ%2T5#_o@79;2kUp`nmWbQJIKaaJ*wk407WpZ zZ%GvNKL>)4@0yZCgIu=^{8ug#lf7_zyz&2Uh51Mn#k{JY}@(gVL?@96V&^Sf6S5o zfI&q#!)2$x$f+&G)~YFIFFtxDf6AA>yPXjU4)=53T_+pfGRBwTHmSx~=8Jml9&ug* zjlO#f!P7+qBj{Vha(DSWb920~Mc&iSH9~2CaIlI!q8OOTfFiuT{oET4n}Ty#cT~mS z=OcJlcv6jdm47str(b1dC&*tD$h#-!>z(@bzzf8;8d)-OazH!zMeOlBLt{OYeF!6+ z#1Kq;8W61E)?BA~_1q}f1uSROJCvac4W@87S}eUHN# zgs9%H)^G0Y85^kdy;)gh*j!$e5%0Pi@886`ywa+}a$B!y__+>dH(SzHl`_xxC4V;l z_u6XMjYE$}*n>R7f-gzot=JL$tvEK(!3w|BRE94BRF#OnxyeGT7Xv&nLJc&zc z#%3oB@cY|)BK+0Q6W);XA=0oAlW)83Nh%0R-`d%AkVp_P&uXMf3Me{f)>;(rGkrLC zV>(1O1s-wM^m;IFCgF0!>V=LD`qOBl|8(~^w}yb+{vAv`coLlthl!&+Cj*nn3FW*g z^P9R+uDsT5Iu@!l1$1-rLwjy(Y5OC=a(Y&t+8HZ^XJ|pgPABP<=KDC}ejILCAv16| zX+o=%**C7iWMje1X71she&ly&17$N~ArVTJL%THG5o+$Pc*9zO4tZ|QFV}2%mwz0( zrKd>%Ti{17M?{?VW~^Hel3yp3U#J`wuw&eLZW4M(p)QI=nI>MYfI0hN;qe-U zX}Vw&6&Y9e1Sqi<2zx^clQ{RJRzB~!a}IjjF>pK1IR;f4-r9FR)3f(Jt?kNu^qgCr zsbfQfp0>MkLQ|L`Yf^`_6IuKftld=u7D3~-9RVrnzITz0q5Caq=UV#ZTJ6Dil|d~m zZTe-~w5ewz&aP@k5 zQ8E?yDNBk9(p$&z<;Vy@xJr~cfv0eWF(>`hfO*eC%DHhLM&t_r*F9ZDUS6J27x!Ac zkZ5gmS=PvhkNIJKOv#FvgQ0OPR zt^YYc860oV{CNIbR#8#$xdV#-9Fy9_4zA2nHReCuv0_I@!0_{5YAnHE*VKSwg7t@I zBzrn2JD(2 z^AArL40v)8c|z+qDLP`>y8s;zsRugaXf-BCL<@gBm5m9{28+ zhZbszhV2(jV}y~pz?&$d%1{F$0+`9k<(mWjMYJ+leN0oi##xws)He{Q=eO-$yY7E5 z3$xJ2V4$FKY+AJrFgup+7K;QLz(SMV9e2}z9ROZ}R902BcIAN&i++L+HkOr_Yrk7& zx7B<4uWS#;`aLg!0nDS45;cqEhjK0DkUDj%E=srC_fnu+a^E-3H7u3K4pN%(K%f_~ zjU`E(ya=Q^iz4?ma67rL##K4kh)d#B@j;+xAXn7bcrt9A^H9(?E~)k4p+J3Q^nu!N Tf(vj5&`)R1pDzE=E{wTv(! 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 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Detailed-Views/Test/view.json b/com.inductiveautomation.perspective/views/Detailed-Views/Test/view.json new file mode 100644 index 0000000..05f423e --- /dev/null +++ b/com.inductiveautomation.perspective/views/Detailed-Views/Test/view.json @@ -0,0 +1,87 @@ +{ + "custom": {}, + "params": {}, + "props": {}, + "root": { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "height": 49, + "width": 171, + "x": 174, + "y": 182 + }, + "props": { + "style": { + "classes": "State-Styles/Background-Fill/State1" + }, + "text": "Label" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "height": 49, + "width": 171, + "x": 174, + "y": 246 + }, + "props": { + "text": "Label" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "height": 49, + "width": 171, + "x": 174, + "y": 328 + }, + "props": { + "text": "Label" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tvalue \u003d 1\n\tsystem.tag.writeBlocking([\"PLC1000/Cmd/inReset\"],[value])" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "height": 54, + "width": 174, + "x": 100, + "y": 516 + }, + "props": { + "text": "Reset" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "root" + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Framework/Breakpoint Embedded/resource.json b/com.inductiveautomation.perspective/views/Framework/Breakpoint Embedded/resource.json new file mode 100644 index 0000000..42594ca --- /dev/null +++ b/com.inductiveautomation.perspective/views/Framework/Breakpoint Embedded/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-04-26T13:00:48Z" + }, + "lastModificationSignature": "a7d684bf8ecb95bc163d5a9a388339980c6a24aab35b7f070d98fc9139aa556f" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Framework/Breakpoint Embedded/thumbnail.png b/com.inductiveautomation.perspective/views/Framework/Breakpoint Embedded/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..26bb76d8bf3252702fe9ee516f396d1012089312 GIT binary patch literal 3433 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 LNkvXXu0mjf8m`PI literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Framework/Breakpoint Embedded/view.json b/com.inductiveautomation.perspective/views/Framework/Breakpoint Embedded/view.json new file mode 100644 index 0000000..e6ac614 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Framework/Breakpoint Embedded/view.json @@ -0,0 +1,113 @@ +{ + "custom": {}, + "params": { + "breakpoint": 500, + "params": {}, + "path": "Header/Header" + }, + "propConfig": { + "params.breakpoint": { + "paramDirection": "input", + "persistent": true + }, + "params.params": { + "paramDirection": "input", + "persistent": true + }, + "params.path": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 58, + "width": 512 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Large" + }, + "position": { + "size": "large" + }, + "propConfig": { + "props.params.params": { + "binding": { + "config": { + "path": "view.params.params" + }, + "type": "property" + } + }, + "props.path": { + "binding": { + "config": { + "path": "view.params.path" + }, + "type": "property" + } + } + }, + "props": { + "params": { + "size": "medium" + }, + "style": { + "backgroundColor": "#2B2B2B" + } + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "Small" + }, + "propConfig": { + "props.params.params": { + "binding": { + "config": { + "path": "view.params.params" + }, + "type": "property" + } + }, + "props.path": { + "binding": { + "config": { + "path": "view.params.path" + }, + "type": "property" + } + } + }, + "props": { + "params": { + "size": "small" + }, + "style": { + "backgroundColor": "#2B2B2B" + } + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "root" + }, + "propConfig": { + "props.breakpoint": { + "binding": { + "config": { + "path": "view.params.breakpoint" + }, + "type": "property" + } + } + }, + "type": "ia.container.breakpt" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Framework/Breakpoint/resource.json b/com.inductiveautomation.perspective/views/Framework/Breakpoint/resource.json new file mode 100644 index 0000000..e268cca --- /dev/null +++ b/com.inductiveautomation.perspective/views/Framework/Breakpoint/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "5dc0b9e3749d4b7f02c56ad52717cb45a4007af3a7cc2d8e019b2021fe284143" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Framework/Breakpoint/thumbnail.png b/com.inductiveautomation.perspective/views/Framework/Breakpoint/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..5defdebf1ebea29b46cea7b26ce07969e6333ccd GIT binary patch literal 5203 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 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Framework/Card/Card/view.json b/com.inductiveautomation.perspective/views/Framework/Card/Card/view.json new file mode 100644 index 0000000..763521d --- /dev/null +++ b/com.inductiveautomation.perspective/views/Framework/Card/Card/view.json @@ -0,0 +1,151 @@ +{ + "custom": {}, + "params": { + "address": "test", + "params": {}, + "path": "", + "system": {}, + "title": "Card Title", + "useDefaultHeight": false, + "useDefaultWidth": false + }, + "propConfig": { + "params.address": { + "paramDirection": "input", + "persistent": true + }, + "params.params": { + "paramDirection": "input", + "persistent": true + }, + "params.path": { + "paramDirection": "input", + "persistent": true + }, + "params.system": { + "paramDirection": "input", + "persistent": true + }, + "params.title": { + "paramDirection": "input", + "persistent": true + }, + "params.useDefaultHeight": { + "paramDirection": "input", + "persistent": true + }, + "params.useDefaultWidth": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 339, + "width": 369 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "20px", + "shrink": 0 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.title" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Framework/Card/Title" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "EmbeddedView" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "props.params": { + "binding": { + "config": { + "path": "view.params.params" + }, + "type": "property" + } + }, + "props.params.address": { + "binding": { + "config": { + "path": "view.params.address" + }, + "type": "property" + } + }, + "props.params.system": { + "binding": { + "config": { + "path": "view.params.system" + }, + "type": "property" + } + }, + "props.path": { + "binding": { + "config": { + "path": "view.params.path" + }, + "type": "property" + } + }, + "props.useDefaultViewHeight": { + "binding": { + "config": { + "path": "view.params.useDefaultHeight" + }, + "type": "property" + } + }, + "props.useDefaultViewWidth": { + "binding": { + "config": { + "path": "view.params.useDefaultWidth" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Framework/Card/Embedded" + } + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "classes": "Framework/Card/Card" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible/resource.json b/com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible/resource.json new file mode 100644 index 0000000..a17f803 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "30c270c0d10c2be4f1e0f8495619db4b734c1471b7af41fa5e6c279084b1f8e8" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible/thumbnail.png b/com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..783e7ff4a62fad2eab9fe2d4a79dc131cd9385a0 GIT binary patch literal 12867 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 G3H~4SCn;V4 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible/view.json b/com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible/view.json new file mode 100644 index 0000000..1e3209b --- /dev/null +++ b/com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible/view.json @@ -0,0 +1,212 @@ +{ + "custom": { + "expanded": true + }, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\tself.custom.expanded \u003d self.params.open_expanded\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": { + "open_expanded": true, + "params": {}, + "path": "Diagnostics/Embedded/System", + "title": "Card Title", + "useDefaultHeight": false, + "useDefaultWidth": false + }, + "propConfig": { + "custom.expanded": { + "persistent": true + }, + "params.address": { + "paramDirection": "input", + "persistent": true + }, + "params.open_expanded": { + "paramDirection": "input", + "persistent": true + }, + "params.params": { + "paramDirection": "input", + "persistent": true + }, + "params.path": { + "paramDirection": "input", + "persistent": true + }, + "params.system": { + "paramDirection": "input", + "persistent": true + }, + "params.title": { + "paramDirection": "input", + "persistent": true + }, + "params.useDefaultHeight": { + "paramDirection": "input", + "persistent": true + }, + "params.useDefaultWidth": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 339, + "width": 369 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.title" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Framework/Card/Title" + } + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.custom.expanded \u003d not self.view.custom.expanded" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "propConfig": { + "props.image.icon.path": { + "binding": { + "config": { + "expression": "if({view.custom.expanded}, \u0027material/expand_less\u0027, \u0027material/expand_more\u0027)" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": {} + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "24px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "EmbeddedView" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "view.custom.expanded" + }, + "type": "property" + } + }, + "props.params": { + "binding": { + "config": { + "path": "view.params.params" + }, + "overlayOptOut": true, + "type": "property" + } + }, + "props.path": { + "binding": { + "config": { + "path": "view.params.path" + }, + "overlayOptOut": true, + "type": "property" + } + }, + "props.useDefaultViewHeight": { + "binding": { + "config": { + "path": "view.params.useDefaultHeight" + }, + "type": "property" + } + }, + "props.useDefaultViewWidth": { + "binding": { + "config": { + "path": "view.params.useDefaultWidth" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Framework/Card/Embedded" + } + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "classes": "Framework/Card/Card" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible_Transparent/resource.json b/com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible_Transparent/resource.json new file mode 100644 index 0000000..1890699 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible_Transparent/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "460ef10dae8197ad78238bf6b0a5daca27d1dc751007c0b29b3e2608650d3338" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible_Transparent/thumbnail.png b/com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible_Transparent/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..5223a198fd718eff54c70fcb00fa0bdffb15796c GIT binary patch literal 2306 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π9Wy#T1L zoYm^@ZWU}-ttK0nzjBjAmaRCL1lP#~&OQHjCAR%m0dOZabNy*2hi;!)O>jXBAQ1hzYH4KFdz4Z!RGVM`LjAvm9* z(XPlz#TvCrU_~8BJ$x%l-ZtClQb!? z)NO%L1w32QSRh3j*vI2LC?|lG1?AXxj>m5cKqZG#vb?-ua$4&az~S@hB$Gh*H`}QR ztSXM-%%CZDj1zpAu)M^J<*gZp9r20Im)VI3EIOQ;zNHocMsJ(MdjGU}3AwkEu`ztu z!E_2Af-hE7Ua~PsKUSQdg%YeT$bNK+$U8jYqwgBfW;l2UnVWTXL?B_Y?9wi}bummA zrr;WI*#{G}HP>(6+z<<7HE*RlJp+M)*%+mw=c0`C{6i5fT*wAXHmS}7NANhoeNo9( zu;w1+cqY{f<#IU(rh_^Emva$RS|qH&qQZ<0m&q%k)F{|^**rT@M(vOKI{UDD=>d7k z74?~>j|fWgfB>N43Q|~RW(>x_qZ~gW@AaqHlU#7H`gN=92({nL6jyci*17$dWk)sg z(rin%iUWX$t+lzCT&*H}O{H(GsVO12l72a%Yx=2~1aOP4F2)TCxpYcm6d9~3@vJnp z3D4fo0PhOiWQUqp2Tfch?x;tz$+*#lb&el4{c@kBcb9RFj;utyTUPO$f!%te;cA3H zmNC2S$2oT~T^XD!%)?AeuXhF!D!RL`VHN?XYL$a;LrexGooX}unfig!>ALgc z^{Jwpey3^T1I>#b#`p1q1tZ>rOmhO!(U}_gYdzh{v{aS$d45pTV&G(29lt-eW;i%5 z`5@o==C;VPj9;Aa4U-PE#FpRb9-%P|?Qy01(@zk~d^EkbF&ZElsycZd%6q*E*NGLL z35-XW)t@zlb@6>_MgMs&y7nZ{aO=o>}@zptwQ?+pB^U^cDfqe=32o7 zfA7it+Y?~;FvUsscHYEj+sO3g`75UzITv0kv~IZDNgS6rdcBnOKiTdbtPn8?)WU67 z2!s^cezmSXVgfZa9PdLh*8BEdM+q#Je~PxwbJ2x?uT*54;(i4oIYY~!HF1CiYE(NR$e2^CAl=8 z*E}9YeE+)GKYLYM8b673oCm4wNg_3;i$f>aKW`&qNZPSGrp)XYHDs){TdG(=DriQS z<=*MB@6(GB-#NGa?atJ=! zX_uo-V+#&dxZ4)#+{FEBZR_RQ9pIYi6&)10*9d+=l;SCdgWUeiR^=XBh-yFt1U&=3 zn-sv?8Ik;w=H$Uh0b|1rSd Z_p6;HJ$cVmfn%IRPup0lM#CZUe*i@}AwvKF literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible_Transparent_with_Anchor/view.json b/com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible_Transparent_with_Anchor/view.json new file mode 100644 index 0000000..b9b1bb6 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Framework/Card/Card_Collapsible_Transparent_with_Anchor/view.json @@ -0,0 +1,431 @@ +{ + "custom": { + "box_shadow": "0px 2px 4px rgba(0, 0, 40, 0.15)", + "expanded": true, + "show_content": true + }, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\tself.custom.expanded \u003d self.params.open_expanded\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": { + "anchor_position": null, + "content_shown": true, + "open_expanded": true, + "params": {}, + "path": "Objects/Templates/S3/Management/file", + "show_box_shadow_on_expanded": true, + "title": "Card Title", + "useDefaultHeight": false, + "useDefaultWidth": false + }, + "propConfig": { + "custom.box_shadow": { + "binding": { + "config": { + "expression": "if(\r\n\t{view.params.show_box_shadow_on_expanded}\u0026\u0026{view.custom.expanded},\r\n\t\u00270px 2px 4px rgba(0, 0, 40, 0.15)\u0027,\r\n\t\u0027\u0027\r\n)" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.expanded": { + "persistent": true + }, + "custom.show_content": { + "persistent": true + }, + "params.address": { + "paramDirection": "input", + "persistent": true + }, + "params.anchor_position": { + "paramDirection": "input", + "persistent": true + }, + "params.content_shown": { + "binding": { + "config": { + "path": "view.custom.show_content" + }, + "type": "property" + }, + "paramDirection": "output", + "persistent": true + }, + "params.open_expanded": { + "paramDirection": "input", + "persistent": true + }, + "params.params": { + "paramDirection": "input", + "persistent": true + }, + "params.path": { + "paramDirection": "input", + "persistent": true + }, + "params.show_box_shadow_on_expanded": { + "paramDirection": "input", + "persistent": true + }, + "params.system": { + "paramDirection": "input", + "persistent": true + }, + "params.title": { + "paramDirection": "input", + "persistent": true + }, + "params.useDefaultHeight": { + "paramDirection": "input", + "persistent": true + }, + "params.useDefaultWidth": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 600, + "width": 500 + } + }, + "root": { + "children": [ + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t# toggle \u0027show_content\u0027 view custom prop\n\tself.view.custom.show_content \u003d not self.view.custom.show_content" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "props.image.icon.path": { + "binding": { + "config": { + "expression": "if({view.custom.show_content},\"material/chevron_left\",\"material/chevron_right\")" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": {} + }, + "primary": false, + "style": { + "borderStyle": "none", + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer Anchor Left" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "{view.params.anchor_position}\u003d\u0027left\u0027" + }, + "type": "expr" + } + } + }, + "props": { + "direction": "column", + "style": { + "classes": "Framework/Card/Title_transparent", + "margin": "0px", + "padding": "0px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.title" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Framework/Card/Title_transparent" + } + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.custom.expanded \u003d not self.view.custom.expanded" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "propConfig": { + "props.image.icon.path": { + "binding": { + "config": { + "expression": "if({view.custom.expanded}, \u0027material/expand_less\u0027, \u0027material/expand_more\u0027)" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": {} + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "24px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "EmbeddedView" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "view.custom.expanded" + }, + "type": "property" + } + }, + "props.params": { + "binding": { + "config": { + "path": "view.params.params" + }, + "overlayOptOut": true, + "type": "property" + } + }, + "props.path": { + "binding": { + "config": { + "path": "view.params.path" + }, + "overlayOptOut": true, + "type": "property" + } + }, + "props.useDefaultViewHeight": { + "binding": { + "config": { + "path": "view.params.useDefaultHeight" + }, + "type": "property" + } + }, + "props.useDefaultViewWidth": { + "binding": { + "config": { + "path": "view.params.useDefaultWidth" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Framework/Card/Embedded_transparent" + } + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "100%", + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "view.custom.show_content" + }, + "type": "property" + } + } + }, + "props": { + "direction": "column", + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t# toggle \u0027show_content\u0027 view custom prop\n\tself.view.custom.show_content \u003d not self.view.custom.show_content" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "props.image.icon.path": { + "binding": { + "config": { + "expression": "if({view.custom.show_content},\"material/chevron_right\",\"material/chevron_left\")" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": {} + }, + "primary": false, + "style": { + "borderStyle": "none" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer Anchor Right" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "{view.params.anchor_position}\u003d\u0027right\u0027" + }, + "type": "expr" + } + } + }, + "props": { + "direction": "column", + "style": { + "classes": "Framework/Card/Title_transparent", + "margin": "0px", + "padding": "0px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "propConfig": { + "props.justify": { + "binding": { + "config": { + "expression": "if({view.params.anchor_position}\u003d\u0027right\u0027,\u0027flex-end\u0027,\u0027flex-start\u0027)" + }, + "type": "expr" + } + }, + "props.style.boxShadow": { + "binding": { + "config": { + "path": "view.custom.box_shadow" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Framework/Card/Card_transparent" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible/resource.json b/com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible/resource.json new file mode 100644 index 0000000..9c6ef83 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "cf20cbe1afcfdefd90aab5c86b3aba04ad20c55a679a8a1096eeca4630290c66" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible/thumbnail.png b/com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..1b9f7ec361ea4fadb8d2b30f0253b5828e42935c GIT binary patch literal 12852 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 Rm-&l54>>#@aiaFgb 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 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible/view.json b/com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible/view.json new file mode 100644 index 0000000..7fe9f01 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible/view.json @@ -0,0 +1,213 @@ +{ + "custom": { + "expanded": true + }, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\tself.custom.expanded \u003d self.params.open_expanded\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": { + "open_expanded": true, + "params": {}, + "path": "Diagnostics/Embedded/System", + "title": "Card Title", + "useDefaultHeight": false, + "useDefaultWidth": false + }, + "propConfig": { + "custom.expanded": { + "persistent": true + }, + "params.address": { + "paramDirection": "input", + "persistent": true + }, + "params.open_expanded": { + "paramDirection": "input", + "persistent": true + }, + "params.params": { + "paramDirection": "input", + "persistent": true + }, + "params.path": { + "paramDirection": "input", + "persistent": true + }, + "params.system": { + "paramDirection": "input", + "persistent": true + }, + "params.title": { + "paramDirection": "input", + "persistent": true + }, + "params.useDefaultHeight": { + "paramDirection": "input", + "persistent": true + }, + "params.useDefaultWidth": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 339, + "width": 369 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.title" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Framework/Card/Title" + } + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.custom.expanded \u003d not self.view.custom.expanded" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "propConfig": { + "props.image.icon.path": { + "binding": { + "config": { + "expression": "if({view.custom.expanded}, \u0027material/expand_less\u0027, \u0027material/expand_more\u0027)" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": {} + }, + "primary": false, + "style": { + "backgroundColor": "transparent", + "borderStyle": "none" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "24px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "EmbeddedView" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "view.custom.expanded" + }, + "type": "property" + } + }, + "props.params": { + "binding": { + "config": { + "path": "view.params.params" + }, + "overlayOptOut": true, + "type": "property" + } + }, + "props.path": { + "binding": { + "config": { + "path": "view.params.path" + }, + "overlayOptOut": true, + "type": "property" + } + }, + "props.useDefaultViewHeight": { + "binding": { + "config": { + "path": "view.params.useDefaultHeight" + }, + "type": "property" + } + }, + "props.useDefaultViewWidth": { + "binding": { + "config": { + "path": "view.params.useDefaultWidth" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Framework/Card/Embedded" + } + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "classes": "Framework/Card/Card" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible_Transparent/resource.json b/com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible_Transparent/resource.json new file mode 100644 index 0000000..c89b929 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible_Transparent/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "14538234db6bf2888c1967ae388bb55cccb03b9325c7d4d82dd6847daf1a4cc8" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible_Transparent/thumbnail.png b/com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible_Transparent/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..67a28121cfa67cda0cd66ad9fa6c7e2fde3a7cba GIT binary patch literal 10667 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 JRtp;h{12kNi(vo& literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible_Transparent/view.json b/com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible_Transparent/view.json new file mode 100644 index 0000000..dc1e396 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Framework/Card/Nested/Card_Collapsible_Transparent/view.json @@ -0,0 +1,237 @@ +{ + "custom": { + "box_shadow": "0px 2px 4px rgba(0, 0, 40, 0.15)", + "expanded": true + }, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\tself.custom.expanded \u003d self.params.open_expanded\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": { + "open_expanded": true, + "params": {}, + "path": "Objects/Templates/EAM/Cards/Editable/Work Order Scheduling", + "show_box_shadow_on_expanded": true, + "title": "Card Title", + "useDefaultHeight": false, + "useDefaultWidth": false + }, + "propConfig": { + "custom.box_shadow": { + "binding": { + "config": { + "expression": "if(\r\n\t{view.params.show_box_shadow_on_expanded}\u0026\u0026{view.custom.expanded},\r\n\t\u00270px 2px 4px rgba(0, 0, 40, 0.15)\u0027,\r\n\t\u0027\u0027\r\n)" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.expanded": { + "persistent": true + }, + "params.address": { + "paramDirection": "input", + "persistent": true + }, + "params.open_expanded": { + "paramDirection": "input", + "persistent": true + }, + "params.params": { + "paramDirection": "input", + "persistent": true + }, + "params.path": { + "paramDirection": "input", + "persistent": true + }, + "params.show_box_shadow_on_expanded": { + "paramDirection": "input", + "persistent": true + }, + "params.system": { + "paramDirection": "input", + "persistent": true + }, + "params.title": { + "paramDirection": "input", + "persistent": true + }, + "params.useDefaultHeight": { + "paramDirection": "input", + "persistent": true + }, + "params.useDefaultWidth": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 339, + "width": 369 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.title" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Framework/Card/Title_transparent" + } + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.custom.expanded \u003d not self.view.custom.expanded" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "propConfig": { + "props.image.icon.path": { + "binding": { + "config": { + "expression": "if({view.custom.expanded}, \u0027material/expand_less\u0027, \u0027material/expand_more\u0027)" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": {} + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "24px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "EmbeddedView" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "view.custom.expanded" + }, + "type": "property" + } + }, + "props.params": { + "binding": { + "config": { + "path": "view.params.params" + }, + "overlayOptOut": true, + "type": "property" + } + }, + "props.path": { + "binding": { + "config": { + "path": "view.params.path" + }, + "overlayOptOut": true, + "type": "property" + } + }, + "props.useDefaultViewHeight": { + "binding": { + "config": { + "path": "view.params.useDefaultHeight" + }, + "type": "property" + } + }, + "props.useDefaultViewWidth": { + "binding": { + "config": { + "path": "view.params.useDefaultWidth" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Framework/Card/Embedded_transparent" + } + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "root" + }, + "propConfig": { + "props.style.boxShadow": { + "binding": { + "config": { + "path": "view.custom.box_shadow" + }, + "type": "property" + } + } + }, + "props": { + "direction": "column", + "style": { + "classes": "Framework/Card/Card_transparent" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Framework/Color Picker/Color Picker/resource.json b/com.inductiveautomation.perspective/views/Framework/Color Picker/Color Picker/resource.json new file mode 100644 index 0000000..e0632f4 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Framework/Color Picker/Color Picker/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "6d1aa11b15ff146dffc4a2f0f92df3625ea69dfa614ed48031b7f79d1100a9c0" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Framework/Color Picker/Color Picker/thumbnail.png b/com.inductiveautomation.perspective/views/Framework/Color Picker/Color Picker/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..57700fd7d9dce219005a9e2c444b8336ad33624c GIT binary patch literal 11197 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 X$=o}zRrv8O7a;ph>1(Zoaq#~D$e8i7 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Framework/Color Picker/Color Picker/view.json b/com.inductiveautomation.perspective/views/Framework/Color Picker/Color Picker/view.json new file mode 100644 index 0000000..5fc79b3 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Framework/Color Picker/Color Picker/view.json @@ -0,0 +1,787 @@ +{ + "custom": {}, + "params": { + "color": "#FFFFFF" + }, + "propConfig": { + "params.color": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 380, + "width": 250 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Color Palette" + }, + "position": { + "grow": 1 + }, + "props": { + "alignContent": "flex-start", + "alignItems": "flex-start", + "elementPosition": { + "basis": "20px", + "grow": 0, + "shrink": 0 + }, + "instances": [ + { + "color": "#FFFFFF" + }, + { + "color": "#D5D5D5" + }, + { + "color": "#AAAAAA" + }, + { + "color": "#808080" + }, + { + "color": "#555555" + }, + { + "color": "#2B2B2B" + }, + { + "color": "#000000" + }, + { + "color": "#FFCCCC" + }, + { + "color": "#FF8A8A" + }, + { + "color": "#FF4747" + }, + { + "color": "#FF0000" + }, + { + "color": "#D90000" + }, + { + "color": "#AC0000" + }, + { + "color": "#800000" + }, + { + "color": "#FFE8CC" + }, + { + "color": "#FFCA8A" + }, + { + "color": "#FFAC47" + }, + { + "color": "#FF8C00" + }, + { + "color": "#D97700" + }, + { + "color": "#AC5F00" + }, + { + "color": "#804600" + }, + { + "color": "#FFFFCC" + }, + { + "color": "#FFFF8A" + }, + { + "color": "#FFFF47" + }, + { + "color": "#FFFF00" + }, + { + "color": "#D9D900" + }, + { + "color": "#ACAC00" + }, + { + "color": "#808000" + }, + { + "color": "#CCFFCC" + }, + { + "color": "#8AFF8A" + }, + { + "color": "#47FF47" + }, + { + "color": "#00FF00" + }, + { + "color": "#00D900" + }, + { + "color": "#00AC00" + }, + { + "color": "#008000" + }, + { + "color": "#CCFFFF" + }, + { + "color": "#8AFFFF" + }, + { + "color": "#47FFFF" + }, + { + "color": "#00FFFF" + }, + { + "color": "#00D9D9" + }, + { + "color": "#00ACAC" + }, + { + "color": "#008080" + }, + { + "color": "#CCCCFF" + }, + { + "color": "#8A8AFF" + }, + { + "color": "#4747FF" + }, + { + "color": "#0000FF" + }, + { + "color": "#0000D9" + }, + { + "color": "#0000AC" + }, + { + "color": "#000080" + }, + { + "color": "#FFCCFF" + }, + { + "color": "#FF8AFF" + }, + { + "color": "#FF47FF" + }, + { + "color": "#FF00FF" + }, + { + "color": "#D900D9" + }, + { + "color": "#AC00AC" + }, + { + "color": "#800080" + } + ], + "key": "value", + "path": "Framework/Color Picker/Color", + "style": { + "backgroundColor": "#FFFFFF" + }, + "useDefaultViewHeight": false, + "useDefaultViewWidth": false, + "wrap": "wrap" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "color-clicked", + "pageScope": true, + "script": "\tcolor \u003d payload[\"color\"]\n\tself.view.params.color \u003d color", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.display.flex-repeater" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "40px", + "shrink": 0 + }, + "props": { + "style": { + "marginLeft": "6px" + }, + "text": "Red" + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "meta": { + "name": "NumericEntryField" + }, + "position": { + "basis": "32px", + "shrink": 0 + }, + "propConfig": { + "props.value": { + "binding": { + "config": { + "path": "view.params.color" + }, + "transforms": [ + { + "code": "\ttry:\n\t\treturn int(value[1:3], 16)\n\texcept:\n\t\treturn None", + "type": "script" + } + ], + "type": "property" + }, + "onChange": { + "enabled": null, + "script": "\tif origin in [\"Browser\", \"BindingWriteback\"]:\n\t\tif currentValue.value !\u003d None:\n\t\t\tcolor \u003d self.view.params.color\n\t\t\thexColor \u003d hex(currentValue.value).replace(\"0x\",\"\").upper().replace(\"L\",\"\")\n\t\t\tif len(hexColor) \u003d\u003d 1:\n\t\t\t\thexColor \u003d \"0%s\" % hexColor\n\t\t\tcolor \u003d \"#\" + hexColor + color[3:]\n\t\t\tself.view.params.color \u003d color" + } + } + }, + "props": { + "format": "0,0", + "inputBounds": { + "maximum": 255, + "minimum": 0 + }, + "style": { + "borderRadius": "4px" + } + }, + "type": "ia.input.numeric-entry-field" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "50px", + "shrink": 0 + }, + "props": { + "direction": "column", + "justify": "center", + "style": { + "marginLeft": "10px", + "marginRight": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Slider" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "../FlexContainer/NumericEntryField.props.value" + }, + "type": "property" + } + } + }, + "props": { + "labels": { + "interval": 42.5, + "show": true + }, + "max": 255, + "style": { + "marginLeft": "10px", + "marginRight": "20px" + } + }, + "type": "ia.input.slider" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "72px", + "shrink": 0 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "shrink": 0 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "40px", + "shrink": 0 + }, + "props": { + "style": { + "marginLeft": "6px" + }, + "text": "Blue" + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "meta": { + "name": "NumericEntryField" + }, + "position": { + "basis": "32px", + "shrink": 0 + }, + "propConfig": { + "props.value": { + "binding": { + "config": { + "path": "view.params.color" + }, + "transforms": [ + { + "code": "\ttry:\n\t\treturn int(value[3:5], 16)\n\texcept:\n\t\treturn None", + "type": "script" + } + ], + "type": "property" + }, + "onChange": { + "enabled": null, + "script": "\tif origin in [\"Browser\", \"BindingWriteback\"]:\n\t\tif currentValue.value !\u003d None:\n\t\t\tcolor \u003d self.view.params.color\n\t\t\thexColor \u003d hex(currentValue.value).replace(\"0x\",\"\").upper().replace(\"L\",\"\")\n\t\t\tif len(hexColor) \u003d\u003d 1:\n\t\t\t\thexColor \u003d \"0%s\" % hexColor\n\t\t\tcolor \u003d \"#\" + color[1:3] + hexColor + color[5:]\n\t\t\tself.view.params.color \u003d color" + } + } + }, + "props": { + "format": "0,0", + "inputBounds": { + "maximum": 255, + "minimum": 0 + }, + "style": { + "borderRadius": "4px" + } + }, + "type": "ia.input.numeric-entry-field" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "50px", + "shrink": 0 + }, + "props": { + "direction": "column", + "justify": "center", + "style": { + "marginLeft": "10px", + "marginRight": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Slider" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "../FlexContainer/NumericEntryField.props.value" + }, + "type": "property" + } + } + }, + "props": { + "labels": { + "interval": 42.5, + "show": true + }, + "max": 255, + "style": { + "marginLeft": "10px", + "marginRight": "20px" + } + }, + "type": "ia.input.slider" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "72px", + "shrink": 0 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "shrink": 0 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "40px", + "shrink": 0 + }, + "props": { + "style": { + "marginLeft": "6px" + }, + "text": "Green" + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "meta": { + "name": "NumericEntryField" + }, + "position": { + "basis": "32px", + "shrink": 0 + }, + "propConfig": { + "props.value": { + "binding": { + "config": { + "path": "view.params.color" + }, + "transforms": [ + { + "code": "\ttry:\n\t\treturn int(value[5:], 16)\n\texcept:\n\t\treturn None", + "type": "script" + } + ], + "type": "property" + }, + "onChange": { + "enabled": null, + "script": "\tif origin in [\"Browser\", \"BindingWriteback\"]:\n\t\tif currentValue.value !\u003d None:\n\t\t\tcolor \u003d self.view.params.color\n\t\t\thexColor \u003d hex(currentValue.value).replace(\"0x\",\"\").upper().replace(\"L\",\"\")\n\t\t\tif len(hexColor) \u003d\u003d 1:\n\t\t\t\thexColor \u003d \"0%s\" % hexColor\n\t\t\tcolor \u003d \"#\" + color[1:5] + hexColor\n\t\t\tself.view.params.color \u003d color" + } + } + }, + "props": { + "format": "0,0", + "inputBounds": { + "maximum": 255, + "minimum": 0 + }, + "style": { + "borderRadius": "4px" + } + }, + "type": "ia.input.numeric-entry-field" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "50px", + "shrink": 0 + }, + "props": { + "direction": "column", + "justify": "center", + "style": { + "marginLeft": "10px", + "marginRight": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Slider" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "../FlexContainer/NumericEntryField.props.value" + }, + "type": "property" + } + } + }, + "props": { + "labels": { + "interval": 42.5, + "show": true + }, + "max": 255, + "style": { + "marginLeft": "10px", + "marginRight": "20px" + } + }, + "type": "ia.input.slider" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "72px", + "shrink": 0 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_2" + }, + "position": { + "shrink": 0 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "shrink": 0 + }, + "props": { + "style": { + "marginLeft": "6px", + "marginRight": "6px" + }, + "text": "Color" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "TextField" + }, + "position": { + "basis": "100px", + "shrink": 0 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.color" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "borderRadius": "4px" + } + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "20px" + }, + "propConfig": { + "props.style.backgroundColor": { + "binding": { + "config": { + "path": "view.params.color" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "borderColor": "#D3D3D3", + "borderRadius": "32px", + "borderStyle": "solid", + "borderWidth": "1px", + "margin": "6px" + } + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t## Send message back to view/component that called color picker popup\n\tsystem.perspective.sendMessage(\n\t\t\"updateFromColorPicker\",\n\t\tpayload\u003d{\"color\": self.view.params.color},\n\t\tscope\u003d\"session\"\n\t)\n\t## close color picker poup\n\tsystem.perspective.closePopup(\"ColorPicker\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button Update and Close", + "tooltip": { + "enabled": true, + "location": "center-left", + "text": "Update and close" + } + }, + "props": { + "image": { + "icon": { + "path": "material/exit_to_app" + } + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "grow": 1 + }, + "props": { + "justify": "flex-end" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "32px", + "shrink": 0 + }, + "props": { + "style": { + "marginBottom": "10px", + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "classes": "Framework/ColorPicker/Container" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Framework/Color Picker/Color/resource.json b/com.inductiveautomation.perspective/views/Framework/Color Picker/Color/resource.json new file mode 100644 index 0000000..581cb02 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Framework/Color Picker/Color/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "717d10dbaf54ab9249ef52ea4e33293312874db677b33e0e03fee6f7b913b4fc" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Framework/Color Picker/Color/view.json b/com.inductiveautomation.perspective/views/Framework/Color Picker/Color/view.json new file mode 100644 index 0000000..f9a1b0b --- /dev/null +++ b/com.inductiveautomation.perspective/views/Framework/Color Picker/Color/view.json @@ -0,0 +1,65 @@ +{ + "custom": {}, + "params": { + "color": "#00FF00" + }, + "propConfig": { + "params.color": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 20, + "width": 20 + } + }, + "root": { + "children": [ + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tcolor \u003d self.view.params.color\n\tsystem.perspective.sendMessage(messageType\u003d\"color-clicked\", payload\u003d{\"color\":color})" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Label" + }, + "position": { + "basis": "20px", + "grow": 1 + }, + "propConfig": { + "props.style.backgroundColor": { + "binding": { + "config": { + "path": "view.params.color" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "cursor": "pointer" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Header/Header/resource.json b/com.inductiveautomation.perspective/views/Header/Header/resource.json new file mode 100644 index 0000000..082a0ec --- /dev/null +++ b/com.inductiveautomation.perspective/views/Header/Header/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-05-08T10:39:26Z" + }, + "lastModificationSignature": "2bbce8feddf3b04e05dd5067ffcb319a9b6aed5ffef44147827c6c8167432046" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Header/Header/thumbnail.png b/com.inductiveautomation.perspective/views/Header/Header/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..6d8b80b38682f6c50027566e5bf1754893d9b3b0 GIT binary patch literal 2604 zcmV+{3e)w8P)Hy**CSbq1wRrHO8p%(JU6$;!woyU9bRV{X31_0&99}#)= zRV4Q9L;S-J5&!5Te`3dy4YEZx$u^y%;=CkQpSo!xwtYJmdU_Dwv!~KtHPJct?nU(V z*KzHhd-!@&*IZ4@xeuwD3V1W5q*hWTFy!+nFrB>?#iygQICOpv!AOGnd!3iD*m6Fb z$FYeRe!4Qpm$Xg!V*l_=0{^}o!>%(?oSKZHkjo)Qc9~|%l>~!S$0SDacxu(-I$p(DYtgnZbOU|747V36vV+|dF# z@Ki>Do=M=_t7)8IU_ccxEG1pH!LYEffOI;IY&Khp8YCF%$cH@%hP5jR2C0t83x;Gm z12wgPzAMS5z;IxqfVsIjq*6D&PLg1#BOmr87}l;N7^FHTHyCJSpJXHaVsaiwFDIG< zL#TjQEQVwb-IF)3X-x==v7an zV4%oAz<}1N=hHG)h;awnYA^_!-u!ln&P9oqbgiaIpY4{nEz9D0YO5Wf4|^prP=r8Y zfY;dd>7%2-{rAIq^G#^1{xwm5s}Kw;-Tv*AVbGU;){>&B%JU+;cGc`e42B2CO}M?0p1| zRRjjnz9O}{ojW1n^yyyeiBiL0@E+`yx8q1jEv0H;&{)LKcR7K9ICV;uf(8x(Aw^a2 z_VnBMa{f#H0KXf47k38l#INaJ*?tBM)Bap_F6ti)Zl^#U$-PedMdzW^%I99#rF9W0 zc$0vGMg0!`9iYzpEscil{_7_K;b35Ost*mpIC2C=e?QDGz5pJ79LCY3u(of9wQCoT zBDgIUQM3XKR0k%zW{N}%lldO^ejoQyP1WkZ`L^zC^igXdEBAt(B+@m1PC#mbvqzsA0Jd zkpAn)G;J{WdNsxBG2YwDoxQbnE3kPpj}-9WgTP~t!FuT>U?Yp-2p(jM>YdepYrsI! zq{+cxT4r0oAO-{O)NFeT2z&EaN+Mbi+u}L%UQ@$hAc-$J>dAYIlvF*r!JsHvDCso5 zyD)`a10ftZy@1{4`mjFuTdW(o1-FjgiokFHfinTzJaRL-!`cuf4|ML3!4N3&@-}ftd{( zD$l`TXK^5qqqN9rI?hpmf$~-Y3?y=v!nZ9MEjT`s%Gt7`nsPhPb=!4aY7eom1Zq3a zcKpuys4g5^1}*tHs+_+8d40B!NCFO&*AN&;0p!xQ0|Q>?0ullYe4qW5nP@M&Jq(`5Vd3~xiVSF5*rsxpB_fE*>!_z% z&o(6iH7X~;Ak|U1!Qh@_`1@EC--lI9D>K*;{ylC#cRTL7a2FmPf0)C8V9_(%!{;7& z&!<5Tld@>GbdI5sMCH9UnpHc%ARLRqN5CrthVE|rv(;B#;jfykr=Ehvps;K(P@ZnT zez6^Fd%-|$N_FBLS=Sv1&^1*=4AwFu1~(X}44sqqiReQ_5fnMtby9I1byV%z#l3m+ z8Uh1v2u~$>C2mwos!@5tKwl-Pi5UMX=_LQ#ZJM?Oo}PFb&t86(JO9sOpJDyzdK`=% zf)cP>izvZLZHcK{o+NKY(MV3 zm(MZKWHh}}vVQ&*n|X literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Header/Header/view.json b/com.inductiveautomation.perspective/views/Header/Header/view.json new file mode 100644 index 0000000..e2cb645 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Header/Header/view.json @@ -0,0 +1,1102 @@ +{ + "custom": { + "activityLogger": { + "alt_pageid": "Header", + "start_time": { + "$": [ + "ts", + 192, + 1715164723047 + ], + "$ts": 1715164723045 + } + } + }, + "events": { + "system": { + "onShutdown": { + "config": { + "script": "\tactivityLog.productMetrics.callLogger(self, \u0027page\u0027)" + }, + "scope": "G", + "type": "script" + }, + "onStartup": { + "config": { + "script": "\tself.custom.activityLogger.start_time \u003d system.date.now()" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": { + "params": {}, + "size": "medium" + }, + "propConfig": { + "custom.activityLogger": { + "persistent": true + }, + "custom.activityLogger.pageid": { + "binding": { + "config": { + "path": "page.props.path" + }, + "transforms": [ + { + "code": " if value \u003d\u003d\u0027/\u0027 or value \u003d\u003d \u0027\u0027 or value \u003d\u003d None:\n return self.custom.activityLogger.alt_pageid.lower()\n else:\n return value[1:].lower()\n\treturn value", + "type": "script" + } + ], + "type": "property" + } + }, + "params.params": { + "paramDirection": "input", + "persistent": true + }, + "params.size": { + "paramDirection": "input" + } + }, + "props": { + "defaultSize": { + "height": 58 + } + }, + "root": { + "children": [ + { + "children": [ + { + "events": { + "dom": { + "onDoubleClick": { + "config": { + "page": "/Monitron" + }, + "scope": "C", + "type": "nav" + } + } + }, + "meta": { + "name": "Icon" + }, + "position": { + "basis": "30px" + }, + "props": { + "color": "#FFFFFF", + "path": "material/vibration", + "style": { + "classes": "" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "41px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "direct", + "tagPath": "[IEC_SCADA_TAG_PROVIDER]Monitron/monitron_data" + }, + "transforms": [ + { + "code": "\treturn value.getRowCount()", + "type": "script" + } + ], + "type": "tag" + } + } + }, + "props": { + "style": { + "color": "#FFFFFF", + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "80px", + "display": false + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "events": { + "dom": { + "onDoubleClick": { + "config": { + "page": "/Oil" + }, + "scope": "C", + "type": "nav" + } + } + }, + "meta": { + "name": "Icon" + }, + "position": { + "basis": "30px" + }, + "props": { + "color": "#FFFFFF", + "path": "material/opacity", + "style": { + "classes": "" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "41px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "direct", + "tagPath": "[IEC_SCADA_TAG_PROVIDER]Oil/oil_condition_monitoring" + }, + "transforms": [ + { + "code": "\treturn value.getRowCount()", + "type": "script" + } + ], + "type": "tag" + } + } + }, + "props": { + "style": { + "color": "#FFFFFF", + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "basis": "80px", + "display": false + }, + "type": "ia.container.flex" + }, + { + "custom": { + "s3URI": "SCADA/rme-white-250.png" + }, + "meta": { + "name": "Image" + }, + "position": { + "basis": "120px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "{view.params.size} \u003d \"large\"" + }, + "type": "expr" + } + }, + "props.source": { + "binding": { + "config": { + "path": "this.custom.s3URI" + }, + "transforms": [ + { + "code": "\treturn AWS.s3.getPresignedURL(self, value)", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "fit": { + "height": 40, + "mode": "fill" + } + }, + "type": "ia.display.image" + }, + { + "meta": { + "hasDelegate": true, + "name": "Spacer Start" + }, + "position": { + "basis": "16px", + "shrink": 0 + }, + "props": { + "text": " " + }, + "type": "ia.display.label" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "id": "Docked-West", + "type": "toggle" + }, + "scope": "C", + "type": "dock" + } + } + }, + "meta": { + "name": "Menu Dock" + }, + "position": { + "basis": "24px", + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "{view.params.size} !\u003d \"large\"" + }, + "type": "expr" + } + } + }, + "props": { + "color": "#FFFFFF", + "path": "material/menu", + "style": { + "classes": "Header/Icon", + "marginRight": "10px" + } + }, + "type": "ia.display.icon" + }, + { + "children": [ + { + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "550px", + "grow": 1 + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "300px", + "shrink": 0 + }, + "propConfig": { + "custom.area": { + "binding": { + "config": { + "expression": "if(isNull({this.custom.lookup_path}), \"\",\r\ntry(jsonGet({this.custom.plc_dict},\"Area\"),\"\"))" + }, + "type": "expr" + } + }, + "custom.lookup_path": { + "binding": { + "config": { + "expression": "try(if({this.custom.path}[1,0]\u003d\"DetailedView\", {this.custom.path}[2,0],\r\n\"\"), \"\")\r\n" + }, + "type": "expr" + } + }, + "custom.path": { + "binding": { + "config": { + "path": "page.props.path" + }, + "transforms": [ + { + "expression": "split({value},\"/\")", + "type": "expression" + } + ], + "type": "property" + } + }, + "custom.path_to_display": { + "binding": { + "config": { + "expression": "if(len({this.custom.lookup_path})\u003c1, \"\",\r\nif(len({this.custom.area}) \u003c1, {this.custom.lookup_path},\r\nif(len({this.custom.sub_area}) \u003e 0, concat({this.custom.lookup_path} + \" / \" + {this.custom.area} + \" / \" + {this.custom.sub_area}),\r\nconcat({this.custom.lookup_path} + \" / \" + {this.custom.area}))))" + }, + "type": "expr" + } + }, + "custom.plc_dict": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]Configuration/PLC" + }, + "transforms": [ + { + "expression": "jsonGet({value},{this.custom.lookup_path})", + "type": "expression" + } + ], + "type": "tag" + } + }, + "custom.sub_area": { + "binding": { + "config": { + "expression": "if(isNull({this.custom.lookup_path}), \"\",\r\ntry(jsonGet({this.custom.plc_dict},\"SubArea\"), \"\"))" + }, + "type": "expr" + } + }, + "position.display": { + "binding": { + "config": { + "expression": "{view.params.size} \u003d \"large\"" + }, + "type": "expr" + } + }, + "props.text": { + "binding": { + "config": { + "path": "this.custom.path_to_display" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontWeight": "bold", + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "150px", + "grow": 1 + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "Area" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "type": "ia.container.flex" + }, + { + "meta": { + "hasDelegate": true, + "name": "Spacer 1" + }, + "position": { + "basis": "20px" + }, + "props": { + "text": " " + }, + "type": "ia.display.label" + }, + { + "custom": { + "buttonid": "HeaderNotifyIcon", + "entries": [ + { + "PrimaryKey": "2024-05-08 10:17:51", + "author": "pll", + "body": "Introducing our brand new Announcement Feature! 🎉 Stay in the loop with important updates, new features, planned downtime events, all in one place. Never miss out again! Check it out now and stay tuned for the latest updates. 🔊", + "childproj": "https://eu-preprod.scada2.rme.amazon.dev: MAN2", + "expire": "2024-05-09 05:00:00", + "link1": "https://", + "link1title": "", + "link2": "https://", + "link2title": "", + "priority": "Healthy", + "publish": "2024-05-08 10:08:33", + "title": "📢 Exciting News! 📢", + "whids": "" + } + ], + "entryCount": 1, + "highestPriority": 5 + }, + "events": { + "dom": { + "onClick": [ + { + "config": { + "draggable": true, + "id": "ioNP2CXn", + "modal": true, + "overlayDismiss": true, + "resizable": true, + "showCloseIcon": true, + "title": "Notifications", + "type": "open", + "viewParams": { + "entryCount": "{/root/Icon_0.custom.entryCount}", + "instances": "{/root/Icon_0.custom.entries}" + }, + "viewPath": "PopUp-Views/Notify-Tool/Notify-Popup", + "viewportBound": false + }, + "scope": "C", + "type": "popup" + }, + { + "config": { + "script": "\tbuttonid \u003d self.custom.buttonid\n\tactivityLog.productMetrics.callLogger(self.view, \u0027click\u0027, buttonid)" + }, + "scope": "G", + "type": "script" + } + ] + } + }, + "meta": { + "name": "Icon_0", + "tooltip": { + "enabled": true, + "location": "bottom-right", + "style": { + "whiteSpace": "pre" + }, + "text": "📢 Exciting News! 📢\n" + } + }, + "position": { + "basis": "30px" + }, + "propConfig": { + "custom.refreshMSG": { + "binding": { + "config": { + "expression": "now(600000)" + }, + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": "\tsystem.perspective.sendMessage(\u0027refreshNotifyIcon\u0027)" + } + }, + "position.display": { + "binding": { + "config": { + "path": "view.custom.EntriesList" + }, + "transforms": [ + { + "code": "\tfrom datetime import datetime\n\t\n#\tRead entries from dynamo table\n\treturns \u003d notifyTool.ReadFromDynamo.DynamoReader()\n\tEntriesList \u003d returns[\u0027Items\u0027]\n\tEntriesList.reverse()\n#\treturn EntriesList\n\n#\tCreate empty list and now string\n\tpublishdates \u003d []\n\tnow \u003d datetime.now()\n\tnowstr \u003d str(now)[:19]\n\tactiveNotify \u003d False\n\twhid \u003d self.session.custom.fc\n\tstates \u003d {\u0027Healthy\u0027:5,\u0027Diagnostic\u0027:4, \u0027Low\u0027:3, \u0027Medium\u0027:2, \u0027High\u0027:1}\n#\tCheck EntriesList for active entries based on publish and expire times\n\tactiveEntries \u003d []\n\ttooltip \u003d []\n\tcount \u003d 0\n\thighestPriority \u003d 5\n\tfor e in EntriesList:\n\t\t\n\t\tif len(e[\u0027whids\u0027])\u003e0:\n\t\t\tif whid in e[\u0027whids\u0027]:\n\t\t\t\tif nowstr \u003e\u003d e[\u0027publish\u0027] and nowstr\u003c\u003dstr( e[\u0027expire\u0027]):\n\t\t\t\t\tactiveEntries.append(e)\n\t\t\t\t\ttooltip.append(e[\u0027title\u0027])\n\t\t\t\t\tactiveNotify \u003d True\n\t\t\t\t\tcount +\u003d1\n\t\t\t\t\tif states[e[\u0027priority\u0027]] \u003c highestPriority:\n\t\t\t\t\t\thighestPriority \u003d states[e[\u0027priority\u0027]]\n\t\telse:\n\t\t\tif nowstr \u003e\u003d e[\u0027publish\u0027] and nowstr\u003c\u003dstr( e[\u0027expire\u0027]):\n\t\t\t\tactiveEntries.append(e)\n\t\t\t\ttooltip.append(e[\u0027title\u0027])\n\t\t\t\tactiveNotify \u003d True\t\t\n\t\t\t\tcount +\u003d1\t\n\t\t\t\tif states[e[\u0027priority\u0027]] \u003c highestPriority:\n\t\t\t\t\thighestPriority \u003d states[e[\u0027priority\u0027]]\n\n\t\t\t\n\ttooltiptext \u003d \u0027\u0027\n\tfor i in tooltip:\n\t\ttooltiptext+\u003d i+\u0027\\n\u0027\n\tself.custom.entries \u003d activeEntries\n\tself.custom.highestPriority \u003d highestPriority\n\tself.custom.entryCount \u003d count\n\tself.meta.tooltip.text \u003d tooltiptext\t\n\n\n#\treturn returns\n#\treturn activeEntries\n\treturn activeNotify", + "type": "script" + } + ], + "type": "property" + } + }, + "props.color": { + "binding": { + "config": { + "path": "this.custom.highestPriority" + }, + "transforms": [ + { + "fallback": "state5", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "state1" + }, + { + "input": 2, + "output": "state2" + }, + { + "input": 3, + "output": "state3" + }, + { + "input": 4, + "output": "state4" + }, + { + "input": 5, + "output": "state5" + } + ], + "outputType": "scalar", + "type": "map" + }, + { + "code": "\ttest \u003d self.session.custom.colours.colour_impaired\n\tstatecolor \u003d self.session.custom.colours[value]\n\treturn statecolor", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "path": "material/campaign", + "style": { + "marginLeft": 5, + "marginRight": 5 + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "refreshNotifyIcon", + "pageScope": true, + "script": "\n\tself.refreshBinding(\u0027props.color\u0027)\n\tself.refreshBinding(\u0027position.display\u0027)", + "sessionScope": true, + "viewScope": false + } + ] + }, + "type": "ia.display.icon" + }, + { + "meta": { + "hasDelegate": true, + "name": "Spacer End_3" + }, + "position": { + "basis": "20px", + "shrink": 0 + }, + "props": { + "text": " " + }, + "type": "ia.display.label" + }, + { + "custom": { + "buttonid": "HeaderLegendIcon" + }, + "events": { + "dom": { + "onClick": [ + { + "config": { + "draggable": false, + "id": "TZyBcXB7", + "modal": true, + "overlayDismiss": true, + "resizable": false, + "showCloseIcon": false, + "type": "open", + "viewPath": "PopUp-Views/Legend_Popup/Legend-popup-view", + "viewportBound": true + }, + "scope": "C", + "type": "popup" + }, + { + "config": { + "script": "\tbuttonid \u003d self.custom.buttonid\n\tactivityLog.productMetrics.callLogger(self.view, \u0027click\u0027, buttonid)" + }, + "scope": "G", + "type": "script" + } + ] + } + }, + "meta": { + "name": "Icon", + "tooltip": { + "delay": 250, + "enabled": true, + "sustain": 1000, + "text": "Legend" + } + }, + "position": { + "basis": "35px" + }, + "props": { + "color": "#FFFFFF", + "path": "material/legend_toggle", + "style": { + "classes": "", + "marginRight": 20 + } + }, + "type": "ia.display.icon" + }, + { + "children": [ + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.navigate(page \u003d \"/Real-Time\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Icon" + }, + "position": { + "basis": "30px" + }, + "props": { + "color": "#FFFFFF", + "path": "material/notifications_active", + "style": { + "classes": "" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "41px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "direct", + "tagPath": "System/aws_data" + }, + "transforms": [ + { + "code": "\tjson_decode \u003d system.util.jsonDecode(value)\n\treturn len(json_decode)", + "type": "script" + } + ], + "type": "tag" + } + } + }, + "props": { + "style": { + "color": "#FFFFFF", + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "80px" + }, + "props": { + "justify": "flex-end", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "hasDelegate": true, + "name": "Spacer End_2" + }, + "position": { + "basis": "20px", + "shrink": 0 + }, + "props": { + "text": " " + }, + "type": "ia.display.label" + }, + { + "custom": { + "covert": true + }, + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tdevice_list \u003d tags.tag_utilities.get_devices(self.session.custom.fc)\n\ttags.tag_utilities.reset_disconnect_tags(self.session.custom.fc, device_list)\n\tAWS.wbsckt_abort.close_websckt()" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Icon_2", + "tooltip": { + "enabled": true + } + }, + "position": { + "basis": "30px" + }, + "propConfig": { + "custom.heartbeat_received": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]System/wbsckt_heartbeat_interval" + }, + "transforms": [ + { + "expression": "if(secondsBetween(todate({value}),todate(now())) \u003e 70, False, True)", + "type": "expression" + } + ], + "type": "tag" + } + }, + "custom.wbsckt_running": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]System/wbsckt_running" + }, + "transforms": [ + { + "expression": "if({value} \u003d True \u0026\u0026 ({this.custom.heartbeat_received} \u003d True) , True, False)", + "type": "expression" + } + ], + "type": "tag" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "path": "this.custom.wbsckt_running" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "websocket running" + }, + { + "input": false, + "output": "websocket disconnected" + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + } + }, + "props.color": { + "binding": { + "config": { + "path": "this.custom.wbsckt_running" + }, + "transforms": [ + { + "fallback": "#000000", + "inputType": "scalar", + "mappings": [ + { + "input": false, + "output": "#FF4747" + }, + { + "input": true, + "output": "#FFFFFF" + } + ], + "outputType": "color", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "path": "material/location_city", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "50px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "direct", + "tagPath": "Configuration/FC" + }, + "type": "tag" + } + } + }, + "props": { + "icon": "material/building", + "style": { + "borderWidth": "0.25px", + "color": "#FFFFFF", + "textAlign": "", + "textIndent": 10 + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "hasDelegate": true, + "name": "Spacer End" + }, + "position": { + "basis": "20px", + "shrink": 0 + }, + "props": { + "text": " " + }, + "type": "ia.display.label" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tif self.session.props.auth.authenticated:\n\t\tsystem.perspective.logout()\n\telse:\n\t\tsystem.perspective.login()" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "User" + }, + "position": { + "basis": "30px", + "shrink": 0 + }, + "props": { + "path": "material/person", + "style": { + "classes": "Header/Icon", + "color": "#FFFFFF" + } + }, + "type": "ia.display.icon" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tif self.session.props.auth.authenticated:\n\t\tsystem.perspective.logout()\n\telse:\n\t\tsystem.perspective.login()" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "hasDelegate": true, + "name": "Sign In" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "{view.params.size} !\u003d \"small\"" + }, + "type": "expr" + } + }, + "props.text": { + "binding": { + "config": { + "path": "session.props.auth.user.userName" + }, + "transforms": [ + { + "code": "\tif len(value) \u003d\u003d 0 or value \u003d\u003d \"null\":\n\t return \"Sign In\"\n\telse:\n\t return value.split(\"@\")[0]", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Header/Icon", + "color": "#FFFFFF", + "cursor": "pointer", + "marginLeft": "4px" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "hasDelegate": true, + "name": "Spacer End_0" + }, + "position": { + "basis": "20px", + "shrink": 0 + }, + "props": { + "text": " " + }, + "type": "ia.display.label" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.closeSession()" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Exit", + "tooltip": { + "enabled": true, + "location": "bottom-left", + "style": { + "fontFamily": "Arial", + "fontSize": 12 + }, + "tail": false, + "text": "Exit Application" + } + }, + "position": { + "basis": "30px", + "shrink": 0 + }, + "props": { + "path": "material/exit_to_app", + "style": { + "classes": "Header/Icon", + "color": "#FFFFFF", + "cursor": "pointer" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "hasDelegate": true, + "name": "Spacer End_1" + }, + "position": { + "basis": "16px", + "shrink": 0 + }, + "props": { + "text": " " + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "root" + }, + "props": { + "justify": "flex-end" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/ATLAS/resource.json b/com.inductiveautomation.perspective/views/Main-Views/ATLAS/resource.json new file mode 100644 index 0000000..ccca531 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/ATLAS/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "sipearso", + "timestamp": "2021-11-26T15:11:03Z" + }, + "lastModificationSignature": "bc1405b17428d64c6e8efbc35f4fcdfa4aa54bee5b214f466518604d0d1ae793" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/ATLAS/thumbnail.png b/com.inductiveautomation.perspective/views/Main-Views/ATLAS/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..03bc5a51b5a3be88aca389303ed751fed0bdb178 GIT binary patch literal 3233 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 A(*OVf literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Main-Views/CommandControl (OLD)/view.json b/com.inductiveautomation.perspective/views/Main-Views/CommandControl (OLD)/view.json new file mode 100644 index 0000000..7fd2bd2 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/CommandControl (OLD)/view.json @@ -0,0 +1,228 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "custom": { + "Devices": [ + "PLC01", + "PLC02", + "PLC03", + "PLC06", + "PLC07", + "PLC08", + "PLC09", + "PLC13", + "PLC14", + "PLC15", + "PLC16", + "PLC20", + "PLC21", + "PLC22", + "PLC23", + "PLC25", + "PLC26", + "PLC27", + "PLC28", + "PLC29", + "PLC30", + "PLC31", + "PLC32", + "PLC40", + "PLC41", + "PLC42", + "PLC43", + "PLC47", + "PLC48", + "PLC49", + "PLC51", + "PLC52", + "PLC60", + "PLC64", + "PLC65", + "PLC66", + "PLC69", + "PLC70", + "PLC71", + "PLC80", + "PLC96", + "PLC97", + "PLC99", + "ARSAW1301", + "ARSAW1302", + "ARSAW1303", + "ARSAW1304", + "ARSAW1305", + "ARSAW1306", + "ARSAW1307", + "ARSAW1401", + "ARSAW1402", + "ARSAW1403", + "ARSAW1404", + "ARSAW1405", + "ARSAW1406", + "ARSAW1407", + "ARSAW1501", + "ARSAW1502", + "ARSAW1503", + "ARSAW1504", + "ARSAW1505", + "ARSAW1506", + "ARSAW1507", + "ARSAW1601", + "ARSAW1602", + "ARSAW1603", + "ARSAW1604", + "ARSAW1605", + "ARSAW1606", + "ARSAW1607", + "FSC10", + "SLAM301", + "SLAM302", + "SLAM303", + "SLAM304", + "SLAM305", + "SLAM306", + "SLAM307", + "SLAM402", + "SLAM401", + "RWC4" + ] + }, + "meta": { + "name": "FlexRepeater" + }, + "position": { + "basis": "1080px" + }, + "props": { + "alignContent": "flex-start", + "alignItems": "flex-start", + "elementPosition": { + "grow": 0, + "shrink": 0 + }, + "instances": [ + { + "instancePosition": {}, + "instanceStyle": { + "classes": "", + "margin": "5px" + }, + "tagProps": [ + "PLC01", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + { + "instancePosition": {}, + "instanceStyle": { + "classes": "", + "margin": "5px" + }, + "tagProps": [ + "PLC02", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + { + "instancePosition": {}, + "instanceStyle": { + "classes": "", + "margin": "5px" + }, + "tagProps": [ + "PLC03", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + { + "instancePosition": {}, + "instanceStyle": { + "classes": "", + "margin": "5px" + }, + "tagProps": [ + "PLC09", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + } + ], + "path": "Symbol-Views/Controller-Views/CommandControl", + "style": { + "overflow": "visible" + }, + "wrap": "wrap" + }, + "type": "ia.display.flex-repeater" + } + ], + "custom": { + "Devices": [ + "PLC01", + "PLC02", + "PLC03", + "PLC09" + ], + "count": "value", + "delay": 4000 + }, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\tfc \u003d system.tag.readBlocking([\"Configuration/FC\"])\n\ttag_provider \u003d \"[%s_SCADA_TAG_PROVIDER]\" % (fc[0].value)\n\ttags_to_read \u003d system.tag.readBlocking([tag_provider+\"Configuration/DetailedViews\"])\n\tdevices \u003d system.util.jsonDecode(tags_to_read[0].value)\n\tif devices:\n\t\tinstances \u003d []\n\t\tdashboard_devices \u003d []\n\t\tfor k,v in devices.items():\n\t\t\tdevice_list \u003d v\n\t\t\tfor i in device_list:\n\t\t\t\tdashboard_devices.append(i)\n\t\t\t\tinstances.append({\n\t\t\t\t \"instanceStyle\": {\n\t\t\t\t \"classes\": \"\",\n\t\t\t\t \"margin\": \"5px\"\n\t\t\t\t },\n\t\t\t\t \"instancePosition\": {},\n\t\t\t\t \"tagProps\": [\n\t\t\t\t i,\n\t\t\t\t \"value\",\n\t\t\t\t \"value\",\n\t\t\t\t \"value\",\n\t\t\t\t \"value\",\n\t\t\t\t \"value\",\n\t\t\t\t \"value\",\n\t\t\t\t \"value\",\n\t\t\t\t \"value\",\n\t\t\t\t \"value\"\n\t\t\t\t ]\n\t\t\t\t })\n\t\tsystem.perspective.print(instances)\n\t\tself.custom.Devices \u003d dashboard_devices\n\t\tself.getChild(\"FlexRepeater\").props.instances \u003d instances" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/CommandControl/resource.json b/com.inductiveautomation.perspective/views/Main-Views/CommandControl/resource.json new file mode 100644 index 0000000..bed373e --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/CommandControl/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-05-13T13:56:35Z" + }, + "lastModificationSignature": "d92dd5869d5c712f676f09a2d1c6891ea055318cd68388cb8ec2d00073131eec" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/CommandControl/thumbnail.png b/com.inductiveautomation.perspective/views/Main-Views/CommandControl/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..60e320df15cf9129492bbcfc60f41a4dc0c5ad48 GIT binary patch literal 35668 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≷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 P00000NkvXXu0mjf`5eR! literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Message/view.json b/com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Message/view.json new file mode 100644 index 0000000..decb668 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Message/view.json @@ -0,0 +1,115 @@ +{ + "custom": {}, + "params": { + "row": "value", + "rowIndex": "value", + "value": { + "Msg": "Mesg PlaceHolder", + "Timestamp": "TimeStamp Place holder" + } + }, + "propConfig": { + "params.row": { + "paramDirection": "input", + "persistent": true + }, + "params.rowIndex": { + "paramDirection": "input", + "persistent": true + }, + "params.value": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 59, + "width": 891 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "147px", + "shrink": 0 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.value" + }, + "transforms": [ + { + "code": "\treturn value[\"Timestamp\"]", + "type": "script" + } + ], + "type": "property" + } + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.value" + }, + "transforms": [ + { + "code": "\treturn value[\"Msg\"]", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "style": { + "margin": "5px", + "padding": "5px" + }, + "textStyle": { + "fontSize": 14, + "fontWeight": "100", + "overflow": "visible", + "overflowWrap": "break-word", + "wordWrap": "break-word" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "root" + }, + "props": { + "style": { + "backgroundColor": "#AAAAAA", + "borderBottomLeftRadius": "5px", + "borderBottomRightRadius": "5px", + "borderTopLeftRadius": "5px", + "borderTopRightRadius": "5px", + "color": "#000000", + "margin": "10px", + "padding": "5px" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Row/resource.json b/com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Row/resource.json new file mode 100644 index 0000000..6868408 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Row/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "sipearso", + "timestamp": "2023-09-05T13:14:40Z" + }, + "lastModificationSignature": "80ac7caea7a97701ab22d24749afa0b9bc3e713ea9f9dc729baae36873a7d18e" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Row/thumbnail.png b/com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Row/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..7396f4bb98fa7f3048f09dec6468a7ef5d76e7e0 GIT binary patch literal 4590 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 Y4{Ug>5Q>lTh5!Hn07*qoM6N<$f-McZu>b%7 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Row/view.json b/com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Row/view.json new file mode 100644 index 0000000..e898bdb --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/Row/view.json @@ -0,0 +1,318 @@ +{ + "custom": { + "numberOfColumns": 6, + "test": [ + { + "Label": "Seq", + "Value": 2, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Label": "Type", + "Value": "StateChanged", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Label": "When", + "Value": "1670429640000", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Label": "Source", + "Value": "PLC01/054BV55", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Label": "CurrentState", + "Value": "", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Label": "ReasonCode", + "Value": "", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + } + ] + }, + "params": { + "checkedState": "False", + "index": "value", + "rowData": [ + [ + "Seq", + 2 + ], + [ + "Type", + "StateChanged" + ], + [ + "When", + "1670429640000" + ], + [ + "Source", + "PLC01/054BV55" + ], + [ + "CurrentState", + "" + ], + [ + "ReasonCode", + "" + ] + ] + }, + "propConfig": { + "custom.test": { + "persistent": true + }, + "params.checkedState": { + "paramDirection": "input", + "persistent": true + }, + "params.index": { + "paramDirection": "input", + "persistent": true + }, + "params.rowData": { + "onChange": { + "enabled": null, + "script": "\tself.custom.numberOfColumns \u003d len(self.params.rowData)\n\t\n\tsystem.perspective.print(\"ROW SCRIPT\")\n\tsystem.perspective.print(self.params.rowData)\n\tinstances \u003d []\n\t\n\tfor col in self.params.rowData:\n\t\tsystem.perspective.print(col)\n\t\tinstance \u003d {\n\t\t\t \"instanceStyle\": {\n\t\t\t \"classes\": \"\"\n\t\t\t },\n\t\t\t \"instancePosition\": {},\n\t\t\t \"Label\": col[0],\n\t\t\t \"Value\": col[1]\n\t\t\t }\n\t\tinstances.append(instance)\n\t\t\n\tself.getChild(\"root\").getChild(\"FlexRepeater\").props.instances \u003d instances\n\t\n\tself.custom.test \u003d instances\n" + }, + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 86, + "width": 1220 + } + }, + "root": { + "children": [ + { + "custom": { + "SelectionData": "value" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.print(self.view.params.index)\n\tmsg \u003d \"update_selectionData\"\n\tpayload \u003d {\n\t\t\"index\" : self.view.params.index,\n\t\t\"state\"\t: self.props.selected\n\t}\n\tsystem.perspective.sendMessage(msg, payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Checkbox" + }, + "position": { + "basis": "40px", + "shrink": 0 + }, + "propConfig": { + "props.selected": { + "binding": { + "config": { + "path": "view.params.checkedState" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "marginRight": "2px" + }, + "text": "" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "tableSelectionData", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.custom.SelectionData \u003d payload", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.checkbox" + }, + { + "custom": { + "key": { + "backgroundColor": "#F2F3F4", + "borderStyle": "none", + "classes": "FadeInFast, background, background-none", + "cursor": "pointer", + "max-height": "400px", + "overflow": "visible" + } + }, + "meta": { + "name": "FlexRepeater" + }, + "props": { + "elementPosition": { + "basis": "150px" + }, + "instances": [ + { + "Label": "Seq", + "Value": 2, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Label": "Type", + "Value": "StateChanged", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Label": "When", + "Value": "1670429640000", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Label": "Source", + "Value": "PLC01/054BV55", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Label": "CurrentState", + "Value": "", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Label": "ReasonCode", + "Value": "", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + } + ], + "path": "Main-Views/Commissioning Tool/Column", + "style": { + "borderBottomLeftRadius": "5px", + "borderBottomRightRadius": "5px", + "borderStyle": "solid", + "borderTopLeftRadius": "5px", + "borderTopRightRadius": "5px", + "borderWidth": "1px", + "margin": "2px", + "marginRight": 5, + "overflow": "hidden", + "radius": "4px" + }, + "useDefaultViewHeight": false + }, + "type": "ia.display.flex-repeater" + }, + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.print(self.view.params.index)\n\tmsg \u003d \"measurementTab_deleteRows\"\n\tpayload \u003d {\"index\" : self.view.params.index}\n\tsystem.perspective.sendMessage(msg, payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "grow": 1 + }, + "props": { + "image": { + "icon": { + "path": "material/delete_forever" + } + }, + "primary": false, + "style": { + "margin": "10 px", + "max-height": "40px" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "40px", + "shrink": 0 + }, + "props": { + "direction": "column", + "justify": "center" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "style": { + "borderBottomLeftRadius": "5px", + "borderBottomRightRadius": "5px", + "borderTopLeftRadius": "5px", + "borderTopRightRadius": "5px", + "classes": "FadeInFast, background, background-none", + "margin": "5px", + "max-height": "75px" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/SequenceTester/resource.json b/com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/SequenceTester/resource.json new file mode 100644 index 0000000..b1caf00 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/SequenceTester/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "sipearso", + "timestamp": "2023-09-05T13:14:40Z" + }, + "lastModificationSignature": "5c35b4b0c31d4ec1a0472fbbb052c9a756e39aa10514ce1c0ef0c562d985f0ff" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/SequenceTester/thumbnail.png b/com.inductiveautomation.perspective/views/Main-Views/Commissioning Tool/SequenceTester/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..770e284ab26de0463ca70c61daf11d017c31bf5c GIT binary patch literal 21061 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 A!~g&Q literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Main-Views/Config-Tool/TagViewer/view.json b/com.inductiveautomation.perspective/views/Main-Views/Config-Tool/TagViewer/view.json new file mode 100644 index 0000000..68b4ff4 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/Config-Tool/TagViewer/view.json @@ -0,0 +1,237 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 1080, + "width": 400 + } + }, + "root": { + "children": [ + { + "children": [ + { + "children": [ + { + "custom": { + "selected_tag": "[BRS1_SCADA_TAG_PROVIDER]System/device_count" + }, + "events": { + "component": { + "onNodeClick": { + "config": { + "script": "\tpath \u003d event.path\n\tinfo \u003d system.tag.getConfiguration(path)\n\ttag_type \u003d str(info[0].get(\"tagType\"))\n\tif tag_type \u003d\u003d \"AtomicTag\":\n\t\tself.custom.selected_tag \u003d path\n\telse:\n\t\tself.custom.selected_tag \u003d None" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "TagBrowseTree" + }, + "position": { + "basis": "669px" + }, + "propConfig": { + "custom.tag_value": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "selected_tag": "{this.custom.selected_tag}" + }, + "tagPath": "{selected_tag}" + }, + "transforms": [ + { + "code": "\timport org.python.core.PyUnicode as uni\n\tif value \u003d\u003d None:\n\t\treturn \"N/A\"\n\t\t\n\tif isinstance(value, uni) and len(value) \u003e 50:\n\t\treturn (value[:50])\n\treturn value", + "type": "script" + } + ], + "type": "tag" + }, + "onChange": { + "enabled": null, + "script": "\tpayload \u003d {}\n\ttag_value \u003d self.custom.tag_value\n\tpayload[\"data\"] \u003d tag_value \n\tsystem.perspective.sendMessage(\"update-tag-value\", payload, scope \u003d \"view\")" + } + }, + "props.root.path": { + "binding": { + "config": { + "expression": "concat(\"[\",{session.custom.fc},\"_SCADA_TAG_PROVIDER]\")" + }, + "type": "expr" + } + } + }, + "props": { + "root": {}, + "selection": { + "mode": "single", + "values": [ + "[BRS1_SCADA_TAG_PROVIDER]System/device_count" + ] + } + }, + "type": "ia.display.tag-browse-tree" + }, + { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "32px" + }, + "props": { + "path": "material/local_offer", + "style": { + "marginLeft": "10px" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "80px" + }, + "props": { + "style": { + "textIndent": "10px" + }, + "text": "Tag Value", + "textStyle": { + "fontSize": "12px", + "fontWeight": "bold" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "40px" + }, + "props": { + "style": { + "borderBottomLeftRadius": "5px", + "borderBottomRightRadius": "5px", + "borderStyle": "none", + "borderTopLeftRadius": "5px", + "borderTopRightRadius": "5px", + "marginLeft": "10px", + "marginRight": "10px", + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Markdown" + }, + "position": { + "basis": "301px" + }, + "props": { + "source": "{}", + "style": { + "fontFamily": "Arial", + "textIndent": "10px" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update-tag-value", + "pageScope": false, + "script": "\tdata \u003d payload[\"data\"]\n\tself.props.source \u003d data", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.display.markdown" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "112px" + }, + "props": { + "style": { + "borderBottomLeftRadius": "5px", + "borderBottomRightRadius": "5px", + "borderStyle": "solid", + "borderTopLeftRadius": "5px", + "borderTopRightRadius": "5px", + "margin": "10px", + "marginLeft": "10px", + "marginRight": "10px", + "marginTop": "10px", + "paddingBottom": "10px", + "paddingLeft": "10px", + "paddingRight": "10px", + "paddingTop": "10px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "1025px" + }, + "props": { + "direction": "column", + "style": { + "borderBottomLeftRadius": "5px", + "borderBottomRightRadius": "5px", + "borderStyle": "solid", + "borderTopLeftRadius": "5px", + "borderTopRightRadius": "5px", + "margin": "10px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "361px", + "grow": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/Device/resource.json b/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/Device/resource.json new file mode 100644 index 0000000..c8c5dcf --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/Device/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "sipearso", + "timestamp": "2021-12-03T10:58:55Z" + }, + "lastModificationSignature": "e767a15a992f8bb028ea2dd0ea6449aa6be61eeef9f378eb1078341552bf06f7" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/Device/thumbnail.png b/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/Device/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..176953c05266b0e54936ce1a4bb26b211cb2bf14 GIT binary patch literal 773 zcmV+g1N!`lP)6+PV{0F5MZp%<^A)Nhrici#CBPaiyS!nq4iBq(za1wTPgx5e895 z$GnGmX_)3-?zOmr=J_p#$H$j}IcJ{tyt5|DvZ5%jgb+f=S3#7#yu1vDL)67$v0N_W zdU<)Ns_Ggt=JfQmTCLVPVt)85mlu9KRxISWxxJdU$y7dcBoO1@b~kDE#*J2DPC%{uM5a-bFTklEvhAzfkx4eVCh0 zr?0QC;i-9Q)Q?-}Xk}vt4~+Nz_V#vjb8~%t-RX1&gTZdMi#WmaiipM){eyL^gBmA{jg1ZC&@C2>^aGl>qVw@)e5Qd6T5>qDbu%a;|5JLETK77!i zczk?}Mx%j1Ae+s~vb?jib8v8wN~My?q|Ih46be|+q*)f=6khj6qk;Vn#rgR;+{9^m zcXxMtd;8+z0;aoMuDiRtt*tFAKnDe;=;-L^hYsFgxFT7=_>O z$GIGvCo%$?WW8R;0yLY=CI%-Q4#Qb^jV99NFER5ApqTD{%-j)x00000NkvXXu0mjf DV(NCn literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/Device/view.json b/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/Device/view.json new file mode 100644 index 0000000..ce1af37 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/Device/view.json @@ -0,0 +1,244 @@ +{ + "custom": {}, + "params": { + "device_name": "Test", + "driver": "value", + "enabled": false, + "host_name": "value", + "status": "value" + }, + "propConfig": { + "params.device_name": { + "paramDirection": "input", + "persistent": true + }, + "params.driver": { + "paramDirection": "input", + "persistent": true + }, + "params.enabled": { + "paramDirection": "input", + "persistent": true + }, + "params.host_name": { + "paramDirection": "input", + "persistent": true + }, + "params.status": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 50, + "width": 1908 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "400px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.device_name" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "400px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.driver" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "200px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.enabled" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "basis": "564px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.status" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_3" + }, + "position": { + "basis": "564px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.host_name" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "2px", + "grow": 1 + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\timport sys\n\tfrom java.lang import Exception\n\t\n\ttry:\n\t\tif system.tag.exists(\"System/DeviceList\"):\n\t\t\tdevice_cfg \u003d system.tag.read(\"System/DeviceList\").value\n\t\t\tif device_cfg\u003d\u003d\u0027\u0027:\n\t\t\t\tdevice_cfg\u003d\u0027{}\u0027\n\t\t\tcfg \u003d system.util.jsonDecode(device_cfg)\n\t\t\tenabled \u003d self.view.params.enabled\n\t\t\tdevice \u003d self.view.params.device_name\n\t\t\tsystem.perspective.print(enabled)\n\t\t\tif enabled:\n\t\t\t\tdevice_list \u003d cfg.get(\"Devicedisable\",[])\n\t\t\t\tif device not in device_list:\n\t\t\t\t\tdevice_list.append(device)\n\t\t\t\tcfg[\"Devicedisable\"] \u003d device_list\n\t\t\tif not enabled:\n\t\t\t\tdevice_list \u003d cfg.get(\"DeviceEnable\",[])\n\t\t\t\tif device not in device_list:\n\t\t\t\t\tdevice_list.append(device)\n\t\t\t\tcfg[\"DeviceEnable\"] \u003d device_list\n\t\t\tsystem.perspective.print(cfg) \n\t\t\tencode \u003d system.util.jsonEncode(cfg)\n\t\t\tsystem.tag.write(\"System/DeviceList\",encode)\t\n\texcept:\n\t logger \u003d system.util.getLogger(\"Device_Enable\")\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003d str(lineno) + str(exc_type) + str(exc_obj)\n\t #system.gui.errorBox(errorMessage,\"Error\")\n\t " + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_0" + }, + "position": { + "basis": "50px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "expression": "if({view.params.enabled} \u003d True, \"Disable Device\", \"Enable Device\")" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "classes": "Buttons/PB_1" + } + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "2px", + "grow": 1 + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "200px" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "custom": { + "update": "value", + "update_enable": "value" + }, + "meta": { + "name": "root" + }, + "props": { + "style": { + "borderStyle": "ridge" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DeviceManager/resource.json b/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DeviceManager/resource.json new file mode 100644 index 0000000..4e1e186 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DeviceManager/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "sipearso", + "timestamp": "2021-12-08T13:35:55Z" + }, + "lastModificationSignature": "5e3a01374c4256735f54489c627ffd3d57041f28ac3ecc641b2896a88af945aa" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DeviceManager/thumbnail.png b/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DeviceManager/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..5dc400d35ae36e1aeab9fe54c60b0fc4e8a2063c GIT binary patch literal 18826 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 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DeviceManager/view.json b/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DeviceManager/view.json new file mode 100644 index 0000000..6307483 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DeviceManager/view.json @@ -0,0 +1,1713 @@ +{ + "custom": { + "delay": 2000, + "update": 2000 + }, + "params": {}, + "propConfig": { + "custom.delay": { + "persistent": true + }, + "custom.update": { + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "10px" + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-White-12pt", + "fontSize": 20, + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "800px" + }, + "props": { + "style": { + "classes": "Labels/Label" + }, + "text": "Import/Add Device" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "basis": "145px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "800px" + }, + "props": { + "style": { + "classes": "Labels/Label" + }, + "text": "Export/Remove Device" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_4" + }, + "position": { + "basis": "10px", + "grow": 1 + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "32px", + "grow": 1, + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onEditCellCommit": { + "config": { + "script": "\t\n\t\n\tdef get_headers_index(headers,col):\n\t for i,value in enumerate(headers):\n\t if value \u003d\u003d col:\n\t\t \treturn i\n\t\n\t\n\tdata \u003d self.props.data\n\theaders \u003d system.dataset.getColumnHeaders(data)\n\tcol \u003d event.column\n\trow \u003d event.rowIndex\n\tvalue \u003d event.value\n\tcol_index \u003d get_headers_index(headers,col)\n\tself.props.data \u003d system.dataset.setValue(data, row, col_index, value)\n\t\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "AddTable" + }, + "position": { + "basis": "800px" + }, + "propConfig": { + "props.data": { + "onChange": { + "enabled": null, + "script": "\tpayload \u003d self.props.data\n\tsystem.perspective.sendMessage(\"addtable-data-update\", payload \u003d payload , scope \u003d \"view\")" + } + }, + "props.selection.selectedRow": { + "onChange": { + "enabled": null, + "script": "\tif currentValue.value is not None:\n\t\tpayload \u003d currentValue.value\t\n\telse:\n\t\tpayload \u003d -1\n\tsystem.perspective.sendMessage(\"addtable-selection-update\", payload \u003d payload , scope \u003d \"view\")" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": true, + "field": "Device Name", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": true, + "field": "Hostname", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": true, + "field": "Driver", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "view", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "Main-Views/Device-Manager/DriverDropDown", + "visible": true, + "width": "" + } + ], + "data": { + "$": [ + "ds", + 192, + 1638525899295 + ], + "$columns": [ + { + "data": [ + "IEC_Test" + ], + "name": "Device Name", + "type": "String" + }, + { + "data": [ + "lsdcknsncls" + ], + "name": "Hostname", + "type": "String" + }, + { + "data": [ + "S7300" + ], + "name": "Driver", + "type": "String" + } + ] + }, + "rows": { + "subviewExpansionMode": "single" + }, + "selection": { + "data": [ + { + "Driver": "S7300" + } + ], + "enableColumnSelection": true, + "selectedColumn": "Driver", + "selectedRow": 0 + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update-addtable-data", + "pageScope": false, + "script": "\tself.props.data \u003d payload", + "sessionScope": false, + "viewScope": true + }, + { + "messageType": "update-addtable-selectedrow", + "pageScope": false, + "script": "\tif payload \u003d\u003d -1:\n\t\tself.props.selection.selectedRow \u003d None", + "sessionScope": false, + "viewScope": true + }, + { + "messageType": "addtable-dropdown-updaterow", + "pageScope": true, + "script": "\t#newData \u003d []\n\tsystem.perspective.print(\"DropDownMessage\")\n\thostname \u003d str(payload[\u0027Hostname\u0027])\n\tvalue \u003d payload[\u0027value\u0027]\n\tdata \u003d system.dataset.toPyDataSet(self.props.data)\n\tnewData \u003d data\n\tupdate \u003d False \n\tfor row in range(data.getRowCount()):\n\t\tsystem.perspective.print(\"Looping\")\n\t\tif data[row][\u0027Hostname\u0027] \u003d\u003d hostname:\n\t\t\tsystem.perspective.print(\"New Data\")\n\t\t\tnewData \u003d system.dataset.updateRow(data , row , {\"Driver\": value})\n\t\t\tbreak\n\t\t\n\tself.props.data \u003d newData\n", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.display.table" + }, + { + "meta": { + "name": "Label_3" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "custom": { + "file_data": "" + }, + "events": { + "component": { + "onFileReceived": { + "config": { + "script": "\tsystem.perspective.print(\"uploading\")\n\tself.custom.file_data \u003d event.file.getString()\n\t\n\n" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "FileUpload" + }, + "position": { + "basis": "30px", + "shrink": 0 + }, + "propConfig": { + "custom.file_data": { + "onChange": { + "enabled": null, + "script": "\tif currentValue.value :\n\t\ttmp \u003d currentValue.value.replace(\"\\n\", \",\").replace(\u0027\"\u0027, \u0027\u0027)\n\t\t\n\t\tdata \u003d tmp.split(\",\")\n\t\theaders \u003d data[0:3]\n\t\tvalues \u003d []\n\t\tprint(headers)\n\t\n\t\tfor i in range(0,(len(data)-3),3):\n\t\t\tif i \u003d\u003d 0:\n\t\t\t\tpass\n\t\t\telse:\n\t\t\t\tvalue \u003d [data[i] , data[i+1] , data[i+2]]\n\t\t\t\t#value \u003d {\"Device name\":data[i] , \"Hostname\": data[i+1], \"Driver\":data[i+2]}\n\t\t\t\tprint(len(value))\n\t\t\t\tvalues.append(value)\n\t\t\n\t\n\t\tnew_data \u003d system.dataset.toDataSet(headers,values)\n\t\t#new_data \u003d values\n\t\tsystem.perspective.sendMessage(\"update-addtable-data\", payload \u003d new_data, scope \u003d \"view\")\n\t\tself.custom.file_data \u003d \"\"" + } + } + }, + "props": { + "fileUploadIcon": { + "color": "#000000", + "name": "Import" + }, + "style": { + "backgroundColor": "#BAB6B6", + "classes": "" + }, + "supportedFileTypes": [ + "csv" + ] + }, + "type": "ia.input.fileupload" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "custom": { + "AddTableData": { + "$": [ + "ds", + 192, + 1638525899295 + ], + "$columns": [ + { + "data": [ + "IEC_Test" + ], + "name": "Device Name", + "type": "String" + }, + { + "data": [ + "lsdcknsncls" + ], + "name": "Hostname", + "type": "String" + }, + { + "data": [ + "S7300" + ], + "name": "Driver", + "type": "String" + } + ] + } + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tdata \u003d self.custom.AddTableData\n\tpayload \u003d system.dataset.addRow(data,[\"\",\"\",\"\"])\n\tsystem.perspective.sendMessage(\"update-addtable-data\", payload\u003dpayload, scope\u003d\"view\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_0" + }, + "position": { + "basis": "30px", + "shrink": 0 + }, + "props": { + "image": { + "icon": { + "path": "material/add" + } + }, + "style": { + "classes": "Buttons/PB_1" + }, + "text": "Add Row" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "addtable-data-update", + "pageScope": false, + "script": "\t# implement your handler here\n\tself.custom.AddTableData \u003d payload", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "custom": { + "AddTableData": { + "$": [ + "ds", + 192, + 1638525899295 + ], + "$columns": [ + { + "data": [ + "IEC_Test" + ], + "name": "Device Name", + "type": "String" + }, + { + "data": [ + "lsdcknsncls" + ], + "name": "Hostname", + "type": "String" + }, + { + "data": [ + "S7300" + ], + "name": "Driver", + "type": "String" + } + ] + }, + "SelectedRow": 0 + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\trow_to_delete \u003d self.custom.SelectedRow\n\tdataset \u003d self.custom.AddTableData\n\trows \u003d dataset.getRowCount()\n\tsystem.perspective.print(\"The row is \"+ str(row_to_delete))\n\tsystem.perspective.print(\"The number of row(s) is \"+ str(rows))\n\tif row_to_delete is not None:\n\t\tif row_to_delete or (row_to_delete \u003d\u003d 0 and rows \u003e 1):\n\t\t\tsystem.perspective.print(\"Deleting \"+ str(row_to_delete))\n\t\t\tpayload \u003d system.dataset.deleteRow(dataset,row_to_delete)\n\t\telif row_to_delete \u003d\u003d 0 and rows \u003d\u003d 1:\n\t\t\tsystem.perspective.print(\"Deleting \"+ str(row_to_delete))\n\t\t\tpayload \u003d system.dataset.updateRow(dataset,row_to_delete,{\"Device Name\":\"\",\"Hostname\":\"\",\"Driver\":\"\"}) \n\t\t\t\n\t\tsystem.perspective.sendMessage(\"update-addtable-data\", payload\u003dpayload, scope\u003d\"view\")\n\t\tsystem.perspective.sendMessage(\"update-addtable-selectedrow\", payload\u003d -1, scope\u003d\"view\")\n\t\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_1" + }, + "position": { + "basis": "30px", + "shrink": 0 + }, + "props": { + "image": { + "icon": { + "path": "material/remove" + } + }, + "style": { + "classes": "Buttons/PB_1" + }, + "text": "Delete Row" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "addtable-data-update", + "pageScope": false, + "script": "\tself.custom.AddTableData \u003d payload", + "sessionScope": false, + "viewScope": true + }, + { + "messageType": "addtable-selection-update", + "pageScope": false, + "script": "\tsystem.perspective.print(payload)\n\tif payload \u003d\u003d -1:\n\t\tself.custom.SelectedRow \u003d None\t\n\telse:\n\t\tself.custom.SelectedRow \u003d payload", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "custom": { + "AddTableData": { + "$": [ + "ds", + 192, + 1638525899295 + ], + "$columns": [ + { + "data": [ + "IEC_Test" + ], + "name": "Device Name", + "type": "String" + }, + { + "data": [ + "lsdcknsncls" + ], + "name": "Hostname", + "type": "String" + }, + { + "data": [ + "S7300" + ], + "name": "Driver", + "type": "String" + } + ] + }, + "Drivers": "{\"S7300\":\"\",\"S7400\":\"\",\"S71200\":\"\",\"S71500\":\"S7\", \"CompactLogix\":\"\",\"Legacy Allen-Bradley\":\"\",\"ControlLogix\":\"\", \"LogixDriver\":\"\",\"MicroLogix\":\"\"} " + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\timport sys\n\timport re\n\tfrom java.lang import Exception\n\t\n\tdef drivers():\n\t\tdrivers_dict \u003d self.custom.Drivers\n\t\tdrivers_decode \u003d system.util.jsonDecode(drivers_dict)\n\t\treturn drivers_decode\n\t\n\tdef decode(tagPath):\n\t device_cfg \u003d system.tag.read(tagPath).value\n\t device_decode \u003d system.util.jsonDecode(device_cfg)\n\t return device_decode\n\t\n\t\n\tdef update_add_devices(device_list,drivers):\n\t\tfc \u003d system.tag.read(\"Configuration/FC\").value\n\t\tprefix \u003d fc\t\n\t\tdevices_data \u003d self.custom.AddTableData\n\t\tpy_devices \u003d system.dataset.toPyDataSet(devices_data)\n\t\tcurrent_device_list \u003d device_list.get(\"Devicestatus\",\"\")\n\t\tdevices_to_check \u003d [i for i in current_device_list]\n\t\tdevices_to_add \u003d {}\n\t\terror\u003d[]\n\t\tif py_devices:\n\t\t\tfor i,j in enumerate(py_devices):\n\t\t\t\trow \u003d[]\n\t\t\t\tname \u003d j[0]\n\t\t\t\thostname \u003d j[1]\n\t\t\t\tdriver \u003d j[2]\n\t\t\t\tsystem.perspective.print(drivers.get(j[2]))\t\n\t\t\t\tcheck_driver \u003d drivers.get(j[2],\"False\")\n\t\t\t\tif name.startswith(prefix):\n\t\t\t\t\tif name not in devices_to_check:\n\t\t\t\t\t\tif j[0] and j[1] and check_driver !\u003d \"False\":\n\t\t\t\t\t\t\trow.append(hostname)\n\t\t\t\t\t\t\trow.append(driver)\n\t\t\t\t\t\t\tdevices_to_add[name] \u003d row\n\t\t\t\t\t\telse:\n\t\t\t\t\t\t\terror.append(i)\n\t\t\t\t\telse:\n\t\t\t\t\t system.perspective.print(\"Device already exists: %s\" % (name))\n\t\t\t\t\t message \u003d {\"labelText\":\"Device already exists: %s\" % (name),\"acceptPB\":\"Ok\", \"cancelPB\":\"hide\",\"iconPath\":\"material/error\" }\n\t\t\t\t\t system.perspective.openPopup(\"Exists\",\u0027PopUp-Views/UserInfo\u0027, params \u003d {\u0027Message\u0027:message})\n\t\t\t\telse:\n\t\t\t\t\t system.perspective.print(\"Use the correct prefix: %s\" % (fc))\n\t\t\t\t\t message \u003d {\"labelText\":\"Use the correct prefix: %s\" % (fc),\"acceptPB\":\"Ok\", \"cancelPB\":\"hide\",\"iconPath\":\"material/error\" }\n\t\t\t\t\t system.perspective.openPopup(\"Exists\",\u0027PopUp-Views/UserInfo\u0027, params \u003d {\u0027Message\u0027:message})\n\t\t#\tdisplay_err\u003d\"\"\n\t\t#\tdisplay_err \u003d display_err.join(error)\n\t\t\tif error:\n\t\t\t\tdisplay_err \u003d str(error)\n\t\t\t\tsystem.perspective.print(\"Missing data in row: %s\" % (display_err))\n\t\t\t\tmessage \u003d {\"labelText\":\"Missing data in row: %s\" % (display_err),\"acceptPB\":\"Ok\", \"cancelPB\":\"hide\",\"iconPath\":\"material/error\" }\n\t\t\t\tsystem.perspective.openPopup(\"Exists\",\u0027PopUp-Views/UserInfo\u0027, params \u003d {\u0027Message\u0027:message})\n\t\t\tdevice_list[\"AddDevices\"] \u003d devices_to_add \n\t\t\tencode \u003d system.util.jsonEncode(device_list)\n\t\t\tsystem.tag.write(\"System/DeviceList\",encode)\n\t\n\ttry:\n\t\topc_drivers \u003d drivers()\n\t\tif system.tag.exists(\"System/DeviceStatus\"):\n\t\t\tcfg \u003d decode(\"System/DeviceStatus\")\n\t\t\tupdate_add_devices(cfg,opc_drivers)\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t error_description\u003dstr(lineno)+\" , \"+str(exc_type)+\" , \"+str(exc_obj)\n\t system.perspective.print(error_description)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_2" + }, + "position": { + "basis": "30px", + "shrink": 0 + }, + "props": { + "AddTableData": { + "$": [ + "ds", + 192, + 1638376388559 + ], + "$columns": [ + { + "data": [ + "IECTest1", + "IECTest2" + ], + "name": "Device Name", + "type": "String" + }, + { + "data": [ + "IECTest1", + "" + ], + "name": "Hostname", + "type": "String" + }, + { + "data": [ + "S71500", + "" + ], + "name": "Driver", + "type": "String" + } + ] + }, + "image": { + "icon": { + "path": "material/keyboard_return" + } + }, + "style": { + "classes": "Buttons/PB_1" + }, + "text": "Add Device" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "addtable-data-update", + "pageScope": false, + "script": "\t\n\tself.custom.AddTableData \u003d payload", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\theader \u003d [\"Device Name\",\"Hostname\",\"Driver\"]\n\ttable \u003d [[\"\",\"\",\"\"]]\n\tpayload \u003d system.dataset.toDataSet(header,table)\n\tsystem.perspective.sendMessage(\"update-addtable-data\", payload\u003dpayload, scope\u003d\"view\")\n\tsystem.perspective.sendMessage(\"update-addtable-selectedrow\", payload\u003d -1, scope\u003d\"view\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Icon" + }, + "position": { + "basis": "30px" + }, + "props": { + "color": "#FFFFFF", + "path": "material/delete_forever", + "style": { + "borderBottomLeftRadius": 5, + "borderBottomRightRadius": 5, + "borderColor": "#AAAAAA", + "borderStyle": "solid", + "borderTopLeftRadius": 5, + "borderTopRightRadius": 5, + "borderWidth": 1, + "classes": "Buttons/PB_1" + } + }, + "type": "ia.display.icon" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "DeleteTable" + }, + "position": { + "basis": "800px" + }, + "propConfig": { + "props.data": { + "onChange": { + "enabled": null, + "script": "\tpayload \u003d self.props.data\n\tsystem.perspective.sendMessage(\"deletetable-data-update\", payload \u003d payload , scope \u003d \"view\")" + } + }, + "props.selection.selectedRow": { + "onChange": { + "enabled": null, + "script": "\tif currentValue.value is not None:\n\t\tpayload \u003d currentValue.value\t\n\telse:\n\t\tpayload \u003d -1\n\tsystem.perspective.sendMessage(\"deletetable-selection-update\", payload \u003d payload , scope \u003d \"view\")" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": true, + "field": "Device Name", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": true, + "field": "Hostname", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": true, + "field": "Driver", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + } + ], + "data": { + "$": [ + "ds", + 192, + 1638468310855 + ], + "$columns": [ + { + "data": [ + "IEC_Test" + ], + "name": "Device Name", + "type": "String" + }, + { + "data": [ + "lsdcknsncls" + ], + "name": "Hostname", + "type": "String" + }, + { + "data": [ + "S7300" + ], + "name": "Driver", + "type": "String" + } + ] + }, + "selection": { + "data": [ + { + "Driver": "S7300" + } + ], + "enableColumnSelection": true, + "selectedColumn": "Driver", + "selectedRow": 0 + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update-deletetable-data", + "pageScope": false, + "script": "\tself.props.data \u003d payload ", + "sessionScope": false, + "viewScope": true + }, + { + "messageType": "update-deletetable-selectedrow", + "pageScope": false, + "script": "\tif payload \u003d\u003d -1:\n\t\tself.props.selection.selectedRow \u003d None", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.display.table" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\timport sys\n\tfrom java.lang import Exception\n\t\n\tdef update_delete_table():\t\n\t\t\tprefix \u003d system.tag.read(\"Configuration/FC\").value\n\t\t\tdevices\u003d system.tag.read(\"System/DeviceStatus\").value\n\t\t\tdecode_devices\u003d system.util.jsonDecode(devices)\n\t\t\tdevice_status\u003d decode_devices.get(\"Devicestatus\",\"\")\n\t\t\ttable\u003d []\n\t\t\tif device_status:\n\t\t\t\tfor i in device_status:\n\t\t\t\t\trow \u003d[]\n\t\t\t\t\tname\u003d [i]\n\t\t\t\t\tif i.startswith(prefix):\n\t\t\t\t\t\trow\u003d device_status[i]\n\t\t\t\t\t\thostname \u003d [row[3]]\n\t\t\t\t\t\tdriver \u003d [row[2]]\n\t\t\t\t\t\tnew_row \u003d name + hostname + driver\n\t\t\t\t\t\ttable.append(new_row)\n\t\t\t\n\t\t\tif not len(table):\n\t\t\t\ttable.append([\"\",\"\",\"\"])\n\t\t\t\t\t\t\n\t\t\theader\u003d [\"Device Name\",\"Hostname\",\"Driver\"]\n\t\t\tdevice_dataset \u003d system.dataset.toDataSet(header,table)\n\t\t\tsystem.perspective.print(device_dataset)\n\t\t\tsystem.perspective.sendMessage(\"update-deletetable-data\", payload \u003d device_dataset , scope\u003d\"view\") \n\t\t\t\n#\ttry:\n\tif system.tag.exists(\"System/DeviceStatus\"):\n\t update_delete_table()\n#\texcept:\n#\t logger \u003d system.util.getLogger(\"Update_delete_table\")\n#\t exc_type, exc_obj, tb \u003d sys.exc_info()" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "basis": "30px", + "shrink": 0 + }, + "props": { + "image": { + "icon": { + "path": "material/update" + } + }, + "style": { + "classes": "Buttons/PB_1" + }, + "text": "Update" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "custom": { + "DeleteTableData": { + "$": [ + "ds", + 192, + 1638468310856 + ], + "$columns": [ + { + "data": [ + "IEC_Test" + ], + "name": "Device Name", + "type": "String" + }, + { + "data": [ + "lsdcknsncls" + ], + "name": "Hostname", + "type": "String" + }, + { + "data": [ + "S7300" + ], + "name": "Driver", + "type": "String" + } + ] + }, + "SelectedRow": 0 + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\timport sys\n\tfrom java.lang import Exception\n\t\n\tdef decode(tagPath):\n\t device_cfg \u003d system.tag.read(tagPath).value\n\t device_decode \u003d system.util.jsonDecode(device_cfg)\n\t return device_decode\n\t\n\t\n\tdef update_delete_devices(device_list):\n\t\trow_to_delete \u003d self.parent.parent.getChild(\u0027DeleteTable\u0027).props.selection.selectedRow\n\t\tdelete_data \u003d self.parent.parent.getChild(\u0027DeleteTable\u0027).props.data\n\t\tsystem.perspective.print(device_list)\n\t\tpy_devices \u003d system.dataset.toPyDataSet(delete_data)\n#\t\tsystem.perspective.print(py_devices)\n\t\trow \u003d[]\n\t\tif py_devices:\n\t\t\tfor i,j in enumerate(py_devices):\n\t\t\t\tif i \u003d\u003d row_to_delete:\n\t\t\t\t\tname \u003d j[0]\n\t\t\t\t\trow.append(name)\n\t\t\tdevice_list[\"Removedevices\"] \u003d row \n\t\t\tencode \u003d system.util.jsonEncode(device_list)\n\t\t\t#proceed \u003d system.gui.confirm(\"Device %s will be removed from the gateway, do you wish to proceed?\" % (name), \"Remove Device\",1)\n\t\t\t#if proceed:\n\t\t\t#system.tag.write(\"System/DeviceList\",encode)\n\t\t\tsystem.tag.writeBlocking([\"System/DeviceList\",], encode)\n\t\t\t\n#\ttry:\n\tcfg \u003d decode(\"System/DeviceList\")\n\tupdate_delete_devices(cfg)\n\t\t\n#\texcept:\n#\t logger \u003d system.util.getLogger(\"Device_Delete\")\n#\t exc_type, exc_obj, tb \u003d sys.exc_info()\n#\t lineno \u003d tb.tb_lineno\n#\t logger.error(\"Error: %s, %s, %s\" % (lineno, exc_type, exc_obj))\n#\t " + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_0" + }, + "position": { + "basis": "30px", + "shrink": 0 + }, + "props": { + "image": { + "icon": { + "path": "material/remove" + } + }, + "style": { + "classes": "Buttons/PB_1" + }, + "text": "Remove Device" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "deletetable-selection-update", + "pageScope": false, + "script": "\tif payload \u003d\u003d -1:\n\t\tself.custom.SelectedRow \u003d None\t\n\telse:\n\t\tself.custom.SelectedRow \u003d payload", + "sessionScope": false, + "viewScope": true + }, + { + "messageType": "deletetable-data-update", + "pageScope": false, + "script": "\tself.custom.DeleteTableData \u003d payload", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "custom": { + "DeleteTableData": { + "$": [ + "ds", + 192, + 1638468310856 + ], + "$columns": [ + { + "data": [ + "IEC_Test" + ], + "name": "Device Name", + "type": "String" + }, + { + "data": [ + "lsdcknsncls" + ], + "name": "Hostname", + "type": "String" + }, + { + "data": [ + "S7300" + ], + "name": "Driver", + "type": "String" + } + ] + } + }, + "events": { + "dom": { + "onClick": { + "config": { + "script": "\timport sys\n\tfrom java.lang import Exception\n\t\n\tdef save_devices():\n\t\tdevices_to_save \u003d self.custom.DeleteTableData\n\t\tpy_devices \u003d system.dataset.toPyDataSet(devices_to_save)\n\t\tdevice_list \u003d []\n\t\tfor i,j in enumerate(py_devices):\n\t\t#check the required fields have data in them.\n\t\t\trow \u003d[]\n\t\t\tname \u003d j[0]\n\t\t\thostname \u003d j[1]\n\t\t\tdriver \u003d j[2]\n\t\t\trow.append(name)\n\t\t\trow.append(hostname)\n\t\t\trow.append(driver)\n\t\t\tdevice_list.append(row)\n\t\tHeader \u003d [\u0027Device Name\u0027,\u0027Hostname\u0027,\u0027Driver\u0027]\n\t\tdevice_dataset \u003d system.dataset.toDataSet(Header,device_list)\n\t\tcsv_file \u003d system.dataset.toCSV(device_dataset)\n\t\tsystem.perspective.download(filename\u003d \"myExport.csv\", data \u003d csv_file, contentType\u003d \"text/csv; charset\u003dutf-8\")\n#\t\tfilePath \u003d system.file.saveFile(\"myExport.csv\", \"csv\", \"Gateway Devices\") \n#\t\tif filePath:\n#\t\t system.file.writeFile(filePath, csv_file)\n\t\n\t\n#\ttry: \n\tsave_devices()\n#\texcept:\n#\t logger \u003d system.util.getLogger(\"save_devices\")\n#\t exc_type, exc_obj, tb \u003d sys.exc_info()\n#\t lineno \u003d tb.tb_lineno\n#\t logger.error(\"Error: %s, %s, %s\" % (lineno, exc_type, exc_obj))" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Icon" + }, + "position": { + "basis": "30px" + }, + "props": { + "color": "#FFFFFF", + "path": "material/save", + "style": { + "borderBottomLeftRadius": 5, + "borderBottomRightRadius": 5, + "borderColor": "#AAAAAA", + "borderStyle": "solid", + "borderTopLeftRadius": 5, + "borderTopRightRadius": 5, + "borderWidth": 1, + "classes": "Buttons/PB_1" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "deletetable-data-update", + "pageScope": false, + "script": "\tself.custom.DeleteTableData \u003d payload", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "custom": { + "DeleteTableData": "value", + "SelectedRow": "value" + }, + "events": { + "dom": { + "onClick": { + "config": { + "script": "\theader \u003d [\"Device Name\",\"Hostname\",\"Driver\"]\n\ttable \u003d [[\"\",\"\",\"\"]]\n\tdevice_dataset \u003d system.dataset.toDataSet(header,table)\n\tsystem.perspective.sendMessage(\"update-deletetable-data\", payload\u003ddevice_dataset, scope\u003d\"view\")\n\tsystem.perspective.sendMessage(\"update-deletetable-selectedrow\", payload\u003d -1, scope\u003d\"view\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Icon_0" + }, + "position": { + "basis": "30px" + }, + "props": { + "color": "#FFFFFF", + "path": "material/delete_forever", + "style": { + "borderBottomLeftRadius": 5, + "borderBottomRightRadius": 5, + "borderColor": "#AAAAAA", + "borderStyle": "solid", + "borderTopLeftRadius": 5, + "borderTopRightRadius": 5, + "borderWidth": 1, + "classes": "Buttons/PB_1" + } + }, + "type": "ia.display.icon" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "direction": "column" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "deletetable-selection-update", + "pageScope": true, + "script": "\tif payload \u003d\u003d -1:\n\t\tself.custom.SelectedRow \u003d None\t\n\telse:\n\t\tself.custom.SelectedRow \u003d payload", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Label_4" + }, + "position": { + "basis": "10px", + "grow": 1 + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "198px", + "shrink": 0 + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "230px" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label_4" + }, + "position": { + "basis": "15px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Labels/Label", + "textAlign": "center" + }, + "text": "\n" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "400px" + }, + "props": { + "style": { + "classes": "Labels/Label_1", + "textAlign": "center" + }, + "text": "Device Name" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "400px" + }, + "props": { + "style": { + "classes": "Labels/Label_1", + "textAlign": "center" + }, + "text": "Driver" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "200px" + }, + "props": { + "style": { + "classes": "Labels/Label_1", + "textAlign": "center" + }, + "text": "Enabled" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "basis": "564px" + }, + "props": { + "style": { + "classes": "Labels/Label_1", + "textAlign": "center" + }, + "text": "Connection Status" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_3" + }, + "position": { + "basis": "564px" + }, + "props": { + "style": { + "classes": "Labels/Label_1", + "textAlign": "center" + }, + "text": "Hostname" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "200px" + }, + "props": { + "direction": "column", + "style": { + "overflow": "visible" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Label_5" + }, + "position": { + "basis": "15px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Labels/Label", + "textAlign": "center" + }, + "text": "\n" + }, + "type": "ia.display.label" + } + ], + "custom": { + "update": "value", + "update_enable": "value" + }, + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "100px" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "DeviceList" + }, + "position": { + "grow": 1 + }, + "props": { + "direction": "column", + "path": "Main-Views/Device-Manager/Device", + "useDefaultViewWidth": false + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update-devicelist-data", + "pageScope": false, + "script": "\tself.props.instances \u003d payload", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.display.flex-repeater" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "basis": "784px" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "32px", + "grow": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "custom": { + "delay": 4000, + "run_update": true + }, + "meta": { + "name": "root" + }, + "propConfig": { + "custom.update": { + "binding": { + "config": { + "expression": "now({this.custom.delay})" + }, + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": "\tdef update():\n\t\tdevices \u003d system.tag.read(\"System/DeviceStatus\").value\n\t\tfc \u003d system.tag.read(\"Configuration/FC\").value\n\t\tdecode_devices \u003d system.util.jsonDecode(devices)\n\t\tdevice_status \u003d decode_devices.get(\"Devicestatus\",\"\")\n\t\tsystem.perspective.print(device_status)\n\t\tinstance_style \u003d {\"classes\":\"DeviceManager/DeviceManagerRows\"}\n\t\tinstance_position \u003d {}\n\t\ttable_data \u003d []\n\t\tif device_status:\n\t\t\tfor i in device_status:\n\t\t\t\tif i.startswith(fc):\n\t\t\t\t\trow\u003d{}\n\t\t\t\t\trow[\"device_name\"]\u003d i\n\t\t\t\t\tdevice_items \u003d device_status.get(i)\n\t\t\t\t\tsystem.perspective.print(type(device_items))\n\t\t\t\t\tenabled \u003d device_items[0]\n\t\t\t\t\tstatus \u003d device_items[1]\n\t\t\t\t\tdriver \u003d device_items[2]\n\t\t\t\t\thost_name \u003d device_items[3]\n\t\t\t\t\t\n\t\t\t\t\trow[\"status\"] \u003d status\n\t\t\t\t\trow[\"enabled\"] \u003d enabled\n\t\t\t\t\trow[\"host_name\"] \u003d host_name\n\t\t\t\t\trow[\"driver\"] \u003d driver\n#\t\t\t\t\t\n\t\t\t\t\trow[\"instanceStyle\"]\u003d instance_style\n\t\t\t\t\trow[\"instancePosition\"]\u003d instance_position\n\t\t\t\t\ttable_data.append(row)\n#\t\t\t\n\t\t\t#self.getChild(\"FlexRepeater\").props.instances \u003d table_data\n\t\t\tsystem.perspective.sendMessage(\"update-devicelist-data\", payload \u003d table_data , scope\u003d\"view\")\n\t\telse:\n#\t\t\trow \u003d row_builder.build_row(status \u003d \"\", enabled \u003d \"\", host_name\u003d\"\", driver\u003d\"\",\n#\t\t\t \t\t\t\t\t\t\tinstanceStyle\u003d instance_style, instancePosition \u003d instance_position)\n#\t\t\ttable_data.append(row)\n\t\t\tsystem.perspective.sendMessage(\"update-devicelist-data\", payload \u003d [] , scope\u003d\"view\")\n\t\t\t\t\t\n\n\tif self.custom.run_update:\n\t\tif system.tag.exists(\"System/DeviceStatus\"):\n\t\t\tupdate()\n\t\t\t\t\t\t\n\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\n\t\t\n\t\t\n#\t\theader\u003d [\"device_name\",\"enabled\",\"status\",\"driver\",\"hostname\"]\n#\t\tdevice_dataset \u003d system.dataset.toDataSet(header,table)\n#\t\tsorted \u003d system.dataset.sort(device_dataset,\"device_name\",True)\n#\t\tevent.source.parent.getComponent(\u0027DeviceTable\u0027).templateParams \u003d sorted\n#\t\n#\tdef errors():\n#\t\terrors \u003d system.tag.read(\"System/DeviceMgrErrors\").value\n#\t\tevent.source.parent.Errors \u003d errors\n#\ttry:\n#\t\tif event.source.parent.getComponent(\u0027DeviceTable\u0027).runscript:\n#\t\t\tif system.tag.exists(\"System/DeviceStatus\"):\n#\t\t\t\tsystem.util.invokeAsynchronous(update)\n#\t\t\tif system.tag.exists(\"System/DeviceMgrErrors\"):\n#\t\t\t\tsystem.util.invokeAsynchronous(errors)\n#\t\n#\texcept:\n#\t\texc_type, exc_obj, tb \u003d sys.exc_info()\n#\t\tlineno \u003d tb.tb_lineno\n#\t\terror_description\u003dstr(lineno)+\" , \"+str(exc_type)+\" , \"+str(exc_obj)\n#\t\tsystem.gui.messageBox(error_description)" + } + } + }, + "props": { + "direction": "column", + "style": { + "classes": "Background-Styles/Main-Background PopUp-Styles/Information-Device" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DriverDropDown/resource.json b/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DriverDropDown/resource.json new file mode 100644 index 0000000..3c4b086 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DriverDropDown/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "sipearso", + "timestamp": "2021-12-03T16:06:13Z" + }, + "lastModificationSignature": "636ead500d1ebb3b6b709eedf0c4838b2dc0aa72e06f879e7cbe0222594b3427" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DriverDropDown/thumbnail.png b/com.inductiveautomation.perspective/views/Main-Views/Device-Manager/DriverDropDown/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..f46bd052d31a32d88c5087f1f651770f498dc15d GIT binary patch literal 325 zcmV-L0lNN)P)$xQRpQWUU~ALziCK*pu51%DJ6-lOi7Y2b1(Cwq8k7+TlQj zdvFL(GQ3G%6;0;r7kj%WfICRYhPcxeem3xv{;IBbZ-ngnj*4dXcJmc;&Kcvwq@v9H z{9YcS#Yb?6e|QtM=d9>`?~3l9dmt!#&lmRq(5=%W&h!I4{KEMKy9@o86`)-?bnJvMjqad7ej6bZKr;*L9L4RaFT-48v5`^HprcjG;JHfw{6h)>O+0_N%rG!a0U%p$_m^_-@ygQ zCHdpXv;7M(M&=(pe0&4|06^DS_tmQh5v{kXryi#E`DnWSHev^Z!4F=;fj5_5Uot=t z=)122nIK}^w?gfD&{qx)Ze2^G3k$GT^CI*shtYsitsB+)f$7Vt>LuEPvczI-E-<)m z)XfRkT_f_bUwF+&LcrTwO4i#btBeZ0QC8=25S%*N`dVD6TrcN(8AtfXqa~f;Y-CKAk+*ZZJW`*fM?|$)6 zGfk3@LuKomVe`k{Zbw_3;Lr0uGblEpi5dw-vD-VKcu|0a-7_so7<^h0z`1|u?4l8Z zb^2E6TDM?yOel6?q5nRnZSfbMBKms`1^(VW8%P7wv$;g>Sq#qEchf)cL zoPnv0`>eV76e=g)LNa|fO{*w2$T{*Frr&`9Pod;dSnC*t+9tnH4vtO_$zD(YK1Kc+ zFG8`OF7QnW3ba>g0aV)hSCEqOYEh)g}#0L3SpcgjM=PF+Yf{-DQw;vrLh} zi3E0?DisjmgowkVtFz4v$!v$Wou6V%a$q7kP2otwLFJF5f{G=i;$DcF?VvRfB?97Q zZ}aN6vG>*(RR#hbe*ov^<)z&y1D;Ftw-<$=7X+*M&>uUGvIhIA)l7zLF8h4!t6wQs z^w|AwWgkmasDNPyz~EkQ!e!AF&LG%}c$l?U9YwVR6sT3=F%#aZn zq5Co0phSJ=NNCP7FruekqSwt}(ZGaLB&;}CMv@UkUWD~tbbuA!bzaeKnbk9?NPF0u zEr`b6&ePgnfG(PC+V`6@k}L~y#lzH-WbOAWU!#HsIzme6kW`8O9_dMTKg1@TIR~jW zlq|;lOp}*gBsC{9d`nwykp0PX29=lvr9D5{Y#B2rdT;(oPaMGsyZ5n&tI}sfoIOWK z^{ZaYq;6j2-Y^evrkYB`;idJHkBoDmJr!NYP$^&cnRjaw{`4KuLprbCo<4R!nd;{^ zWF@B1BM+x3*_n;Qk#gH{S!&phXhSZGy$x&Lfwqp;8DanF2RK?LE3pmF^<6oanM#&P zm9su3Sx*y~9646iPbo))MCW}X{JFI)g_qR*AYT_Hv%qXoAqKPPUoy%&v+rhzka_wp z+{raMU^R`o_X&Rqh~^VPArL6}}9d)jmOU=@8x#~ns4?T-G z<&>6vE3aGiXlB&z$(c2#5Ug(`rE6jolgEetH2xMMTn7X{?X?QZ6zBgN}JCo z+~X4Q_}&dBO?#XJr|tOhz(l1GA)X^}`L^wE8nEg##?%k=RI5@evT!8mkHsGSB!hrf z;z<;lBhUTrUaDL>kwp8OEo}bmq!;$5PT|jvXbOp0^tP8v(LB9l zP84Z9u-~~hS4=m?{DP86GVz<5Lenon89!jV5~0;`+j5#D?_Daot+(y|AX`Gxj*;&# z_3H(U<#jZdfB7rpr`PZXOzOJ~hM9(AbV<62pme!a2Oq zHZ8-%>?^SepPDr8qHgCeYG?qDdFn{B-<2E`(obDJj)Z5$*^!`gjmjzPLXST@(O?w0 zo46v>nfcsS#BGo6q{fvbEKq1^U*ecD((et0ck=72wy(NNXZ~ z-}XeA^y=D20dxHfVx(O#$}9&0`C%>fXTc$F6{p7wJ0|f$C0xZd5 zj>}z0taRCavV5g3=nLiu1jt=AkgN!pMMpUNO6negJsOZ~WXdHVvYo6;ND~RAk5&ap+m)dNVY^AJnvhbzxn>*;(Mx5fV^*4WDu_ZIbD49$76rc@%I9!E7r#}>TE?_wrK z-grg^=u1WV=*28vW=D96J|@aofnzFS3n#vZG7yIC-TRr%tvvWK`Ly7i%lLaRbAG~o zmF~1jZZG}$X_V%gyazF@kjYzx5F#r-Gr_@}>9|(b_DYw|7m*KHq92}9S^Y?_QHzP? zjy3ngy{73-hypRR}2wH&FVEHHyCBB5L0*Lr#lA^>D$zWbY}#yg_B{LN|$?wQui23S_v zqlY*#K5%iPe*sIbE;bXC79T{k^|r5CKbwrowuCE|{kTK7F>U&rj74|@C zlnBNBd%iXNkl2fPrOMoGbPC6PGEd6T$)0Pz9dYgaA|z!y*`)6o#4Btb`D@yB zuh-R-LWEk~k1O`bigqKH801M*mLWl_*MT29Bv>2uy8BH4R5>VPEFVA*PQg4{>gFYV zkVWY1!`vS@H>Dql%hFbJGR%$zvArZKRU4np?H1%|i51Ke@oKl;OXF5uuhpPe7Zv`Z zPS^j3o*=92ZXu7Oa7Mg{>ud5&nXIT}y=d_3MJRRb`@X?vs^P8Skp$`@ZVR;jGFt2y z^rPk)jgr(m{Pfbd@(e*L3zK4N5G%=e^HiNeb=7O3=tp0bV``O}TRzD0EdI1;DV*7; zus*lwXB=gz8fS@^F+g;Ls1H9k6UVIS&#vgR6sssJw=UGNae-afRpCGwLn0<`?k(Wi zGkE)3RwWN9%&idJaDSg2#nP#_45;>sJ!3{*-d;eJoA{a5tJ}rxtYGwAGPV2pF^BD4 zN`Gw#xaT-|T5zH5l>#gD_9~GJYqga6Nv0KUDe%m@#!xM*?)Uef@l`$nCh8S63{(cb zx|_18t+>B!N6cJBO;|5E=hC`2a4_uf3kooRhN|>>0yF4TZT8m*cGCvgg1bF3`}tL( zVoR6xh-^lVZ6|&N1829!$aR<403e3Ak@hZ|x%-vD_7Q10vB0GO_!h%Er5*-jVG+_G zB*uE-kU=u_<2#+&6P~%~-?AjTU3~6V-Q6O@Od|BTg-Q`(YFTCX*(G z&t5!_8GId8xPVpNe>4fLr*U?Ou^#-X*Dc?8KTFP^Wr2#*dUL`94ick05NB2hJ>!8h zF~r|w`)Sk=#!I#S=#jE^oNn%f4=1_7;LCmxQ~ZG1Hyu6ew$B9~B@-F9VrEJ@zN+`z z;tv6_f4qT?L@Cy5yZ45rONLGPC2M`55 zz{9GlHmdq}&mID!4qtLT&_g`Zm`{nZHC$TjeL^dq*CT6SMqi-w*8V}&S@af)lDg8EZlBHyqv^pc`?01G$4!-ZZ| zBO?Y5j*x(s?ez%WtZsg8ATl9AiPkB|k*z-HpMeW;Qb=(+Rd&_|t~eleZN9)`v4ap%5{l z{qzT3$ZB3`WhBZ!SxGPBE&5<9J6aa@+m)4{wsH5RLlIDLNLI8g?I-DYDyN;1Xqj$n<5*Bc4=s{mr25p|KkR$tFl^g^Sb z)Phc(Bula}NQ^#jtOLAr7zn4Yzg4&Y!1w{BaEU4R;0m4fcC1{lg=8%km)mt9ziBlH z+eT=E53Thh>eik>Iv$LF?tT-|3H6G3@(BESZ0RP`ntSh=R&NEM?FYihi`C^pL{uG#yfSW=wD+!TBICz;6|lyEg!i^p0_(Yor#pML%d7pnqO zNZEsF2h!o;N^S2AUm;FsNQAw6U#4}2aHOis3HKZFX>D1=H-#uwdi;IRpZ$b-$8S60 zF2I+`9?|s{MOCRWeUjIurD$l)Gp50k5T5tB0iEy>ZU%Uv7vtS_mbVJ1b`WV=lc$EI z3bmyHtR>UTA}=1B4%eExZ%SuH)}kUrWNaQ7mKjGYgvhtWMg_g6ttZT7vsYRz(g$;W z(PIG)h_J36YDJQP5cfz{*}ScYeKVzy2WY?Cxwi^w)mFJRp+fz0{u&+T_wD1kXF{Y* zA)o5M5-Hx)W3KDAyCFfiTgRJms`eIuK{O|uK>btY$cL*cGMj&XFgZdvDohh3Q>l^s zo(y>-Z>RgcBr`rN%tS0?eC&aLYvTt_{2;+-akanx`IMnx$T&JN<`}&4`VRD46)Gi} zB(XEHzXK~t?Zx;tFyaI&DkXdP6)#yQ&)D-Zs#j(RBpo|*Zu{PdSDtXjyF!+k)UH!9 z^z_z;U!w2RGvN(jNGJ@%u)63W$i}3ac#qSZ6`{J*)x^e?T%CyXm!CDdl3MfWd?rN| zb8zpg@Lw1pjPv%SiWGg{13=FE$iqXgXR+FbDMJ#Al@@oO_5Rg+CY_VugF$p>&Q)LzQoaJeOjK$f`ePtJfi~>Iupi1i`wt*KE0|Z-4lZRB#a{Xu_|q za9_hFv@p)55r*f^(Nfn^RMpBA)waum9p#|XW7$1}meo21z+Hd%Z<&wN!o&0(jnB+CqQL4-TS{1sZbnXHBgoJ%9|&?Tad_Uo5r+q-2jqb ze(4w9$p#nMA3R?1tD|CN_ zU-c!F@xgx8`?REJ(aQcn$l%CFe;jp6i%lh1{_*|#&hH;Y50aNtbIN$TUvzCVOMCL- zW%zraCaBn)si6c{h8iI^Y0+vOn;K$f@%>U!Y(kXGtucw3jEiSAz=83C)aD?0Xo-tX zQbObOu2{$OM26lyv&}^*Ll}^HsNSz#8eFb~XHVG&*x>>89P#`WVsJ~WWP)hr?H^Og zwx&3lzTI-Rt&rXgJtKVA(K!wb0DWzVTExjv#r% zGCjHUO=hlVXqSRzHT1wrA4}rN3@v^y5E8QF(_sFq2L7;G4MCDuveD%UZO9Xp?ua%; zP`FSYjK&=#`D`(n7I-%HF=?~WSB_T$$Mzb4%YEWP9 zrG>R5#~{oY3R@wewX_dC(>fSbQ!OzQT&`rr^q`P5%W3R8frhGyDJ*_;8&44i>}n}v zahRCr9a&mCmvi+RscI!DNa>vkSwzS)a80;z8!zG$C2JBt0~?;d$f~xoEq)A^c}k~S92eoA1ZX_5 zF!V_etWB>spT&#c+zP@1KbBvZT+-K#IgVFd#l=1g!imq%h`0rp|F*86o6Q6sY9XfVkFl>T?TC8Cy=pN#KC!<>oX2ZDLRD{QuhI5r90}r_o zK*;C!@_ks`^1t)@U33ao+b)fZi&JoM;YTn_=l}E4TZ;KVebfDaJZ&dc9)LOBkr&r{ z;Tt8VTaP8TfxEBc)|~e7)|9`8vYxixsMJZ3D~XtkL{n1tsq#1_Uk4py@+$l+fSUWC z5o@kRy?e>b`K4Z1T=SU^Yi4X21uI<3$5tVqK-Ju_rOEZCN^L7luaNq;^MPJ@e}*O+ zYbj<4-v706WF+h0M#unB0Yf?SAprCBcLU1`AKMAC5@WxJw!YeK?UiAG_$~_+kFh{h zsn)*H!ZPhwG!N(KBU(xknVyAO!14O<^#}U?ygCL7$}gil3XASIAIzkswsw!)z~i2% z55*f@b>%^kEGC~tWG&YGc4|y4J6gxoBwP#*+_J&xJklcyr~RRi`wi>np+hYlQ=s$( ze~UoBC!mzVHJI&*W;qCuz{(q?MO@zfT1MV{5;4~kdZKVG4M&&mu?%|M}$=A-@{m-!lYj!Av0S=rtpG6YW>kLSQT+x(-Bx!P;hI#NY~Wh$a1`%^fQT=!Gi$v zBfPh>F!bFmHndOTZLku1wK6j6K7PVOiipYm4kWA8GvJvJcf{yo^RVuJM5~l7trxv8 z&UACp8e{$15q*{}M4rXyiC@!TJ9ePgF*WxY{hux$XK1{bSKic8L5kg9YZSa~Ieix@ zB|FY(wKn$p3obeEWbMi0Yg5gC!7@Tt8(PfEXH66S*nc%ZMrMiM!ZiIIRRFD>Py*Ix zd3o7_iQ#GS(u=*#2IbBddyh}nzLWlouJ0E6X$&y~@66-yFXl-nKfqfv65SXfjTT^U z!>n$@6}DBhMfCq8BsxF*@f%FQMUbJ)nR{OwpL*hmr{_LRF56u8{=Gq7fY{K0Hnm7n ziND1~!@kRXCG@@jXy@pIJL{wXt&3D*@n!(ZTJ#Opj@1&ia|R8B){!7zduk5~baXpj zrW0y)4<7h?+XGd%d!p4ctEFc?MfUNjE3e_wnG`WzD)SAziz}lX4;d95?kTON*#3im zt&PzqP@JiTCYwV`m-6A1$I=-IJTs-U+i~V~r2hFGhZqSD)vW>5+PCYB;(7+ z3%t&1Fe|MI_N@f5KCHaa48zT!)Co00d}uf^IKCi{wv$zEcijNqGPCjhEglA`b5YV4 z(+!VK=ATeWtPcl-IL1?|#(abKf|w!lN20?Z zW`h5Z{-+E^c<%Mu#rMIvM=t&Lp`td6-_&ck&`~1LR}u^&`vSa>Tl1MqDsQCwn50ze ziL=&UaOk|A|8DudV6)RCRp$Y^=AvdzhQr3fax8ehVS+-E&Z#IsW>BE*zdGu>$wIyP zkv}Tq4z|XwwJZh&1clTj?Q!4vZ=lAdq;@4lPLYz!cCvOjyEv0q#W^cIY$*+Z4E1Za z>;b9X2KGzq#$xO{`9!c!JfsA*>cAfUIWtoKGXn-Lf+)|Rmm*76g!yWg%?ygao1Qe8 zkG9c6{>+mw*Qz=Ax}Yex=9nh4L!LW71|5}1iX*WZK$n&_AWUg3IN8gQURE!Jdrw7)dXgf-jrZU3skGikg2aSow$qrFwLD7an4DdGnTGx?p0_26*&F0fm8{#PfXhV;v~T&o>< zmx?=kQlkE3#6#l2clgAOLdOlnlvZhN{_85taHq3Q4`x1;1jEfjVW$c2Eqi;ai(k>Q zp^pwiG^Xh!n|5-Y&I$|1Q@?U!W;ZoP^P0*Su?X7vdjN_3K54(N0m#-`?(Uts4`_*p z%(L#*g#WQ(AxoT#3n!G&?GTi~cHL~z)b|+rPp>|S;cUoOR5)9+dr@smZG#$yN!ol2 z&DY9yvb{+g&bFjFE74T`c7m<>w_c=HOy~0#YyL!c8UkkzkN)dAf5mls8VlTbo)`;f zs-#BY{ZdXA1|Est6GIv{^zw}Z5vrB5oA1_sep%h(_=0ed3G90umxc;@n?5Tf>W#C= z3SsE#(l+CunM%TYG-PJL{_`JG;lScfxL3f}-fBeOqrcU1fRJWRRjoc7+;B;!d5*Goz+EiilF|VGR>{>ZEi9bU2X|{`2utQgsau1PU!} zAL#tg|I}=<;~-!cZ=`>m?CJTdIi-;37t>tR13TPz;u|aCI4S9NXB84j%`1+j4d73> zc&X_#%^hC##01Yv#Gu%Ig5xG22(45>z&Bqu-Dx}bO(xCcP1|%koJs#mN=qN`$mk>T z;!T}9Kj?p=_v!l}Zw<}^gVh;g2s57jPpa9c%@LHl`4QmyG1N`qMk*)47enP2h0A|( z*$C7^lgvUBBA}#Nu0BgfPY-o(#C#3DPG(nozFjY%&L9R+yo-QmyzrDFSY7$oxDevq zvQq2VCSJT4`HfoDMuN)KJHV=g0ylx?5*L{4F5NSXa#s?2$ZR>^P}9vMx$n>9*S@@( z#Z8+_RUUjV(xf9{^e^p*m)*R+{%&Z!!GDr9r(X0=g@ z2np|oAn)MZgPdg^qq~Eh(a4DNZK42tz{5EoF^?cxMc-@;8)+u(zxD%kLXa|}2i`I7 z;d_l_yJaEkec$iiWS{^xHR<$dt?C2@e;cg^O39$~yNI1{nm1639&C2N@KjPU4751% z{Og-?h1ie>&xMA0M%W~}*ALvq{?pzRCskIO;%;6mES7&OW-z1dEUiX+DK*g0(8j=w zhc<`z7}Rgpb6&*pFIr=o;5$~YkNyg%{3j^^)n+fZw(Z}tg)|MMmik$)byIx6Z20pw z5IrsyQu}WNTx;ILR7%SIC)E<~(LpW!G24+k0TnMTpbK76{A*v_?+YWI!ftZ@tA9f@ z@WJbUKPN+l{YUPdk5a_nV^K;tmj6uVX+GH#hAH%jdcM;;`jSo284;+6AW-?`lj0w345!R$~yFR4+4N zw&JueweKt0={>qC=Cg&j$mrV&uWD%M39M_f``q`01rnIYpry?*y^P4H_jFRBhgc?9 zM8*vKRkbq^Id=%Bnh=Ky{$+)F{Gi%COmKjZL1T_6MjCEvKt`oLkCVJJ{z2{cJ z=PdZCHY_=L|Dw3utE$JYpsZBQP9=(0Qf9H?#cv6dd=ekA7ik4(&(6b+pI^)N7*op_ zSoeR5$p4pxZ;0L5mOz$})tbIaFF ze|wIwhkKmkA7?k8>W+CTYZ5DYD++GfgzigywaK&l_6p_gPsBN75$BRcW1l#^F;Zdl z{9^9OE8I6m0pFw*PTTDgp4fEu6rcUq)?iL8i??5ZS(Ns6nkgr}Q-P&_8FgOf80 zk#w+ZH;Nkmb1w+j{m|FIl{p@Zc=TF_`0Rw`ZRq70pFRH!Tr`NLh)Ge+Vr(HPNKbI5 zR_FK@Pmoc1COW<8#M|>@*YIu&kCsCChA&!Z{OmL$-98cB&VkGVH=!6M$O+%8NPc+lFz&0INe~-Eta(O z>nlmZ-trX8yK`2!+Kg`2XSs1kb3D$^+@i6Jam+e#YTWzP{?Bv4@)A8yliKNhU&26d zM^UJEAXSOYvXQ=JOQ#dnS@S-%1(Prx*`C$dUs8`)oARc2dgfzVIl3 z`7TC&E`lrD|BklImAj0`j{NST^d&0ILI29X2FLPpkNu`qbSHnAgK#?!$WrXb506yo zWTN8f4DRdL6zR?0CCw`f!LrrD0u`-k!iN1{&6Vs@G=ee2T#1?*RWAZYf4bXqZ#$lg zFTU8UNQVng_39ev#XLYVaRT(9+OcMa0oUm+Zq)4CU3$oihbOY9+@PQm0Z_=Hg3R>s zL*O&s=ozQz&cB9N#C`JLph6!`>Qn*OWqjxT-7HaF{{b?;Qh~W4Ev*n9*Y5 znQzC^4teBPMw@n>`}H$pr!t~(6Z`t3+|_d&D{K=A`chsy_n8*jFcLQX2DZ8r z1sgRM-6WVE^R8{ell0GJAYey7dcErYHuEA$pe!&x2l-HT!ShWtLB-$s`!&T*BQ@+` zRp4UOkBihwpC{W_mj~QOSzLn4hKfDdnv-rU`xCgop)B7!WiK&|BdhV#I z+4`u*?Dx03G{c#%tGgt7q?nj&pl491oSW%ux3!Gja4KqO&3_fsbR?LX z_qX}%)lQbz-^H8f&dz1EM0^x)M4>ly3`*p7OWKHS<$(^VYUn${M}cvmnn@R>AC!k%@zh!>ug zn!e-(seeQV6Qr}}d}JGssa$;X^Yr```eN_r)bcEA;^`cM>RcS`GQrJ12PGziDFwi~ zIo&^=azfB)~d<7k5q?#d*0r zVB}EGn^}^6sSDBZCHY*3)q?o<@6q|;qQCT%mB2Bl9giv7~m@X~OWZlk}l_qjt z!sB~+zW~j`SF=MI^{O-VkA+9a0zGWbp}~I&sk-_niSz2UI<%SLAJG(2Pe_TDmW1t$ z$qzwt432?lN3{x%I=Y(C|X(U>d~h!R+=aC1<%jr?}u?v2UsKeYVvuJlMh0 zpHAjHl;w5uD{Bg-BE5Rr+^vWcYkVQ_i)&_7(6v9g9J3^;E;bch{N=7!bV&57C7vE@ zuhB{*)cn>0#kWwnXQhZF^FPkB7LIMU?DRCJUl zT^5!)dwr*BrC+)FS_Y|R@i*El`oS0GSK+BsJ}qlJRU*4p)w?~PdboeqS&1?-f-zBG z07OV`oYq{a%WABjfu0U>ySN&pRO?Su?e|>rkDot@p8b#_TEepR6OXfwgv&3GbTwA9;l;P*>crtkP;*|q6n z7JEVCc!``wqUt&P<6v4!L~!E7no;09cX`KGDGAlk)Az(FEQ|6vhaHD18Sg*n-L0>u zq!Svo>4`<|)t_f~OvLW_Zwtw{yMwk!6TcGY%>{$1XMBmW15ZdgR+1hSO;w#vTC!k< zb1!%0<B)Dt8S!{V(WTcabMud_i`& zdJ?yhK$_0VnsbEsnkc@4@|~M!&RBc}DoD}UX-KB8 zDH>G~)Q7ar-nz3(s&Z@G``b4jeQKUu`#3_qL_lfL@ZxB7t`o*`*oGF8e=9zBE=xvZ z(B@%J6MB-!GT&$su{%pbK96*ri&F4@Gtzpm_xsiFpUh_u5gmJ{A^y9ot{xce>x5Re z=mmW9CH)*NYs%{)8rFrG#4k-dmzs&FgV~6%E>rV7D@tudpsAo-82)}RbrUG14ZF6x zc1hoSmd3rn$PYTY4GQ}qyVD2 zd~SVvpX7nZ*)C_p(eL&(acHtXjnmWeV`T1mT0(CikA_Svj~-p_gjH(^Dr>imX=h%3 zD@PfPI!NCAM&BqT`8#(wT?EPqb{NtRRtk__V@hx*k>y&HXPx5*F^CZd?76==s2)#B z_<`SKoaPzK@z5bR-_)26JuEj{0GIHQJ=R$!aB_T zVwcYcuT{FIWeXa0%7cZUg2GZV0vU7UF6B?V%&!$^@3o*R3?oPUDzvmJ4sSIHq@2L; zm<}O2z}1=Tn*%IelB~ixoAlx!%g?CbgCejkLFj3MyUm~{NoE}1?$%Tja`gViT)7)kj zP`|%0I34Xiccpol#Za7CZQp`@<8{uW!<#R?gN@l8U}^ruPvjIYq7}J<`u98HftoFFq3NV67ZD82SIg_T{R9DM-%#vjpLI!|U+Z;Lw z<()_R?8eHMOri}J3Ncp*8jP1munGGgxdVnl+O&@7-f$&Y$Ig}%Td5?A?G+Y;ls~7m z2&rY8_1`dWz|Ynjdr3Z5M&z+VaZ?88yBCjLMclQ)nZA7S>MwGuB|r7a#2HP=!d9gk zz@QVMr2)U$j{2RG_P9u8c;Eqt%$^z1j`v(Jk$b~A=s2^dLL_8j=yPNP{b>-1$=n@UT zvh8&11E~D0gVOJh8jQx8WADv1Y?#LOba$zTIY&604=DTGaIa~#QpvzcAgU3so@j@w zVM3v!tis3_TTvtv6vwlZ=* zqGlCeyh;Z@W4!$JKF0rQ0J(dn7uMz%_J_81F-l>(X|h)}bPpokYm>rTy@hVRpb0$- z3yYSY@gfKLpDHDdS$3Q)Z0(h@$VDpKiV2RI?w!fXD`QyuDgqBPPOmI2^^Oe<>XvUe zyZJk*5YqtLXR51PW0sD&`}A~mqe$ok<9&E6O>S{i_9@>AC3;MTo?y57tsrCn z@6V`p1Tx{7<;yq3k;Izz*|jIClQV|4y&Y&Fm{A;x$yz`z0^z!Y>F_~!Fq^{6)zLP; zrW1xugmysVHznExXBkee&wLga{M0Fo_!w;&>kdAiyxCjDn26J($Ge-CJM$jtptAS} znevq&?aK{IrZ-jm}m-9|r-jA>^dlKZYj1FL8fgM3@~ve@P+%DeUlH#^csr~o;6 zMhJ6M&i+1gBKGQLA+**4(T}xD#ca?IfDeyM*7ko3}(c6lTaU)U^GXDT)?ubCmT)KIjV`+ zyGXty@kx_dr;<6idYUQiN9itur|2q^c~|s8;!w&pA*;Q+Hdtejc@7T}XYa*GRye=V zwsRlc$Q$QtCg0jM`d+*0)2&%679uYda>1Y#cc&MY{dx0};U}v~?R0wU5bV<_Nqnc* z8Vns4z9V}f(h$S2u{%*dHJ>}^)j8xVbAXoKb(%BjU9teV)raC>H3vl3iXR)^xJK<4 zvTK*d#=JAW(BQ|oTdXCx0RFfIF{n0PYk$WN=Abw%Zc@ZcasTgA-gabsfwFPZ&2zLI zHlObitu7&?n~+g9m*aH6mXnSrXZ&$`g4My(R)@r*YJhRq5Z)C?MeQaB%4|_nQtMQU8#1kV57U@(aFB<)-#)`L&JA9q?mu zl)UvP9(7q~Gccm8;eTRzI>yqlF_QvH(8{WN^z#eliXNZGDzkjYCL6w2tf>FF|Ju0U zJpSq+d2UHUEpF;MtU~f51fTUL`X3yGrpb5$ zrQ~jod~H$ly7@iKe;CSiGCfC2psM=l`w-XZ35mOn-#4Js*c8Y8Uu<_k1OKKK!T9l5zfR zvSL4eun+%tLwF{X!y}OiQEEct(9-$mm03yE=W(nb47=S?=f6iEZ<-)~iK~BeJ?QY} zWZr$ZFUV5Kq>}@nMs<@^ROh*#R}WY95uNUt&vlsQ8S*myIfzMJ6q3Id%nm&wXqen) zy|@rUvT~LyDr?-n!Y_&YFIL6%R!aY%6J+(pKiV;U&2p^t64ieG_bJ*`d00hxh&g^| zZtPIc(rjtj3xFU6oJi$asQE5s@=pTiZT@m|2#-M z?U^~r>vLe4SDUM&3bEg5{i>eo;Snmd3>69%r6`PclH5lwxXV)<)NGVXX7a6A>P`AL z-)!?c3ATLXvq+jdhjI2{3FXgblqNhxEvK_##*j0;i}{%5uKFCmF1E1C+EZzjSgW&!uV#^ADf8MJF>yG1$|wxy@$!w0cRbK2z$rJ3>@9=T@iH&Nu~ zydH)_TD&OfqTRzFi=Moo*o^Zkg zCN$~YH&qL-5AFFanhCyg#!MKCZEhv9l>d}|Pvu8V;!vs(m|M7zs71S+_Xk7n($(=? zuVTvs$nT4W%Hk_Mi)%@zj0D<`)7U-hE}nc~?u2+6fAOmUfo z)!4>VcucCkPW`yxA@%;F2WeHl21Q>L(N{yX-+TFG0YeDICuTc*q478W+lZV#x>h^a z;B$jP)6ibtt8PIJkolX*151o<>g)YCFomf1B7$dL?UXo0N#Z?y;k;4uRDSPNvBk ze-Gq~Cl#06^!*aIiqojPP#51+K=s_OZjWzYtgSJdHf$Wdr~aJQus;VG;klYD5|PwO znP5bu6 zL{VL!zJA;W<3WYh#WQ&Pt9OT9d$EiXAWs!R0AE~eEWGU_n9r%mx%05M(tW_}a7%(% z8sWh0xqPhu`Il>Z3WuJsM~D9x6P!R1rtjqHRV3g+`nwuy@1`~(9xIA5R;;&gI$vKD;SbsFm_nWaS5HNl?e$;dp*kh${=PByisZ$BoM)4-qkJ6Swq zWNI`T(vz8j@G)}>MZ1VZtgu^LAOTwJ#!yrlD2D$6!k*2%AqBE{X7{W_s=4U*KV(@> zsa#;{G?HsF>y^|D!%%D55@ z@C7A$w&83yyHC$%0mw$%?@ySkRS*vO7xnsRAe-K(Fel<-6@X;JTOUMfvL(wBZVc8k z4x*O&%|Kij332#^kwCrxQNcli1P7+r5vZ>ta~-T_l#<(1_hH;ol);QzB-c#)!;*^F zMRDnYpnIwDc(&6H4Q@ha*0@N2Hv8q3d5Mu5((lY5;Xpv^50cy>h;gpz0Fze9XFygu zy=kP#O>kwPZwc}vdbl+HgtUq4+FcZvue~W6`y77X(sfA^ z0$N^LZVH3GUdhK6IoE_h1CqiXZv2*5L7W_0hU5_4(Nsm8ApP14suq!7&+3Z>kHM4GV!yIZWtr3Jpy(M|qxw-@w3X?@rmioY9X%@nmu~OrP{0H#`lK z@|+{ojBD8svR{Thcf2`htNbL@z5@(Zq<*QM1^!^(YcaHvAJqA#@f~pQr1$M^C|yz@ z10xzM>An-&ny?z@$cyenMKKBHnaxSmc`SWrY`QM`h?nXhajW)M(EAVyBp{5k*$Vg9 z9~}>3d+`IPxw>IGyV6wu0>ri^Ti$bGgHI_GiEc>U%L)rH7kj+uxg@2pS=_Vb95@w> zeSpJc+Ox$7+Wv1AZBt$G@vR?=H=A}lG2bM6>snF-&R+47up}-t7J4S z5I1`<-MRmphM?vQ0|vN!z9?&*o;Jg+uCfUUY5zmbHYqh!Mci<=|A)U&DsV$)Gyoxq zl9Q7MJ`hDb{$DE!L0h5AR|#TXy@)S!H=sv_p8M!s5}gyr=EC^mG+Ebo}3dowL1)alRa_Pr0g zE!MZ9M?=S)Pi-e6(-^!~>6_Kv{;|~nHF!C`oS1kz>B>~awGsU{CHday6f8RR_R;N7 z^Cnam$$0AZJF0(wA#ynL(!rz5{rNm-K2q7~jv<|E&lQ6`1%$P_Oex{OXm! zqf;EGZ;g0jVw|sJbnnxNnKPapIT$4VMvwoLjNFU4E-F(w%|7mlnECuzlTWWp->)tg zmnaqGiN}9>t{G-XsRxc2F;2c|{0VMr{Et&pLc!;WS{b928bK z%31;!z86@{<@#x?+-?H*kgu}4n{R5Ws$Sfl6%*`#I{|$>>o6=x;(=x8%9Se*9_y7h zOgO-Bw2fDK%H=0?SKMDW zsX8y^g~zA#eX*{y;NktX@%X2;nm;$I)aTiJh{!i+^ziob-s|5G?WsR6=GD(S+hebl z%oSW3eb$@De63O3b<@ksOF{Ygvz_dccl`(~!9pS=C_@wwk~S3TQOxI6W$K<3G(UHi9Q z`TRHQiFW_%N+)4KR_48N_kVnwoPWM2Uq|Nt{rH{i?ruJLd3v8deOkA&H~%}I;LrA& zM{@RcGVT2GZazLdf`J#Tik@)r$=R%sDF+S`F8otF<;i*A*vjesvyDnpo}8F)^89(= zN>aXw^MSJ`Cnu{HzPVv|C4{{Am}cY}pNfQ{+Fzul=Cm5v(( zb40I5( dA7)Q@bR#O}aCEO)4LmiB!PC{xWt~$(6955ml%N0r literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Main-Views/Help/view.json b/com.inductiveautomation.perspective/views/Main-Views/Help/view.json new file mode 100644 index 0000000..6273751 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/Help/view.json @@ -0,0 +1,792 @@ +{ + "custom": { + "activityLogger": { + "alt_pageid": "help", + "start_time": { + "$": [ + "ts", + 192, + 1718194270770 + ], + "$ts": 1718194270770 + } + } + }, + "events": { + "system": { + "onShutdown": { + "config": { + "script": "#\tactivityLog.logger.callLogger(self, \u0027page\u0027)\n\tactivityLog.productMetrics.callLogger(self, \u0027page\u0027)" + }, + "scope": "G", + "type": "script" + }, + "onStartup": { + "config": { + "script": "\tself.custom.activityLogger.start_time \u003d system.date.now()" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": {}, + "propConfig": { + "custom.activityLogger": { + "persistent": true + }, + "custom.activityLogger.pageid": { + "binding": { + "config": { + "expression": "{page.props.path}" + }, + "transforms": [ + { + "code": "\tif value \u003d\u003d\u0027/\u0027 or value \u003d\u003d \u0027\u0027 or value \u003d\u003d None:\n\t\treturn self.custom.activityLogger.alt_pageid.lower()\n\telse:\n\t\treturn value[1:].lower()", + "type": "script" + } + ], + "type": "expr" + } + } + }, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Header" + }, + "position": { + "basis": "50px" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Body header" + }, + "position": { + "basis": "1920px" + }, + "props": { + "text": "How can we help you ?", + "textStyle": { + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "45px", + "fontWeight": "bolder", + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "120px", + "grow": 1 + }, + "props": { + "justify": "center", + "style": { + "opacity": "0.73", + "textShadow": "#AAAAAA 1px 2px 2px" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Markdown" + }, + "position": { + "basis": "94px", + "grow": 1 + }, + "props": { + "markdown": { + "escapeHtml": false + }, + "source": "\u003chtml\u003eThis page provides help on all things SCADA related. Cant find what your looking for ?. \u003cbr\u003eReach out to the MAP team for assistance.\u003c/html\u003e", + "style": { + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "20px", + "fontWeight": "lighter", + "lineHeight": "1.5", + "marginBottom": "20px", + "textAlign": "center" + } + }, + "type": "ia.display.markdown" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "58px" + }, + "props": { + "color": "#4D9CCE", + "path": "material/menu_book", + "style": { + "margin": "10px", + "marginTop": "50px" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "100px" + }, + "props": { + "text": "User Guide", + "textStyle": { + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "22px", + "fontWeight": "bold", + "marginTop": "", + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "custom": { + "buttonid": "help/user_guide" + }, + "events": { + "dom": { + "onClick": [ + { + "config": { + "script": "\tbuttonid \u003d self.custom.buttonid\n\tactivityLog.productMetrics.callLogger(self.view, \u0027click\u0027, buttonid)" + }, + "scope": "G", + "type": "script" + }, + { + "config": { + "newTab": true, + "url": "https://w.amazon.com/bin/view/EURME/MAP/Product_Management/SCADA2/Resources/UserGuide" + }, + "scope": "C", + "type": "nav" + } + ] + } + }, + "meta": { + "name": "UserGuideCard" + }, + "position": { + "basis": "400px" + }, + "props": { + "direction": "column", + "style": { + "backgroundColor": "#F2F3F4", + "classes": "FadeInFast, background, background-none", + "cursor": "pointer", + "marginBottom": "10px", + "marginRight": "50px", + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "58px" + }, + "props": { + "color": "#4D9CCE", + "path": "material/developer_mode", + "style": { + "margin": "10px", + "marginTop": "50px" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "100px" + }, + "props": { + "text": "Developer Guide", + "textStyle": { + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "22px", + "fontWeight": "bold", + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "custom": { + "buttonid": "help/dev_guide" + }, + "events": { + "dom": { + "onClick": [ + { + "config": { + "script": "\tbuttonid \u003d self.custom.buttonid\n\tactivityLog.productMetrics.callLogger(self.view, \u0027click\u0027, buttonid)" + }, + "scope": "G", + "type": "script" + }, + { + "config": { + "newTab": true, + "url": "https://w.amazon.com/bin/view/EURME/MAP/Projects/Amazon_SCADA/Expanding_BU_and_New_Regions_SCADA/AMZL/DeveloperGuide/" + }, + "scope": "C", + "type": "nav" + } + ] + } + }, + "meta": { + "name": "DevelopmentGuideCard" + }, + "position": { + "basis": "400px" + }, + "props": { + "direction": "column", + "style": { + "backgroundColor": "#F2F3F4", + "classes": "FadeInFast, background, background-none", + "cursor": "pointer", + "marginBottom": "10px", + "marginRight": "50px", + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "58px" + }, + "props": { + "color": "#4D9CCE", + "path": "material/comment", + "style": { + "margin": "10px", + "marginTop": "50px" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "100px" + }, + "props": { + "text": "Provide Feedback", + "textStyle": { + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "22px", + "fontWeight": "bold", + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "custom": { + "buttonid": "help/feedback" + }, + "events": { + "dom": { + "onClick": [ + { + "config": { + "script": "\tbuttonid \u003d self.custom.buttonid\n\tactivityLog.productMetrics.callLogger(self.view, \u0027click\u0027, buttonid)" + }, + "scope": "G", + "type": "script" + }, + { + "config": { + "newTab": true, + "url": "https://quip-amazon.com/BSxOAUz9geea/SCADA-20-Feedback" + }, + "scope": "C", + "type": "nav" + } + ] + } + }, + "meta": { + "name": "DevelopmentGuideCard_0" + }, + "position": { + "basis": "400px" + }, + "props": { + "direction": "column", + "style": { + "backgroundColor": "#F2F3F4", + "classes": "FadeInFast, background, background-none", + "cursor": "pointer", + "marginBottom": "10px", + "marginRight": 50, + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "58px" + }, + "props": { + "color": "#4D9CCE", + "path": "material/healing", + "style": { + "margin": "10px", + "marginTop": "50px" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "100px" + }, + "props": { + "text": "Report Safety Concern", + "textStyle": { + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "22px", + "fontWeight": "bold", + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "custom": { + "buttonid": "help/reportsafetyconcern" + }, + "events": { + "dom": { + "onClick": [ + { + "config": { + "script": "\tbuttonid \u003d self.custom.buttonid\n\tactivityLog.productMetrics.callLogger(self.view, \u0027click\u0027, buttonid)" + }, + "scope": "G", + "type": "script" + }, + { + "config": { + "newTab": true, + "url": "https://atoz.amazon.work/safety_observations" + }, + "scope": "C", + "type": "nav" + } + ] + } + }, + "meta": { + "name": "SafetyConcernsCard" + }, + "position": { + "basis": "400px" + }, + "props": { + "direction": "column", + "style": { + "backgroundColor": "#F2F3F4", + "classes": "FadeInFast, background, background-none", + "cursor": "pointer", + "marginBottom": "10px", + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "CardsTopRow" + }, + "position": { + "basis": "280px" + }, + "props": { + "justify": "center", + "style": { + "marginBottom": "20px", + "marginTop": "20px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "58px" + }, + "props": { + "color": "#4D9CCE", + "path": "material/confirmation_number", + "style": { + "margin": "10px", + "marginTop": "50px" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "100px" + }, + "props": { + "text": "Open a Ticket", + "textStyle": { + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "22px", + "fontWeight": "bold", + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "custom": { + "buttonid": "help/ticket" + }, + "events": { + "dom": { + "onClick": [ + { + "config": { + "script": "\tbuttonid \u003d self.custom.buttonid\n\tactivityLog.productMetrics.callLogger(self.view, \u0027click\u0027, buttonid)" + }, + "scope": "G", + "type": "script" + }, + { + "config": { + "newTab": true, + "url": "https://river.amazon.com/?org\u003dGlobal_RME" + }, + "scope": "C", + "type": "nav" + } + ] + } + }, + "meta": { + "name": "Open a Ticket" + }, + "position": { + "basis": "400px" + }, + "props": { + "direction": "column", + "style": { + "backgroundColor": "#F2F3F4", + "classes": "FadeInFast, background, background-none", + "cursor": "pointer", + "marginBottom": "10px", + "marginRight": "50px", + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "58px" + }, + "props": { + "color": "#4D9CCE", + "path": "material/playlist_add_check", + "style": { + "margin": "10px", + "marginTop": "50px" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "100px" + }, + "props": { + "text": "Commissioning Tool Guide", + "textStyle": { + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "22px", + "fontWeight": "bold", + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "custom": { + "buttonid": "help/commission_guide" + }, + "events": { + "dom": { + "onClick": [ + { + "config": { + "script": "\tbuttonid \u003d self.custom.buttonid\n\tactivityLog.productMetrics.callLogger(self.view, \u0027click\u0027, buttonid)" + }, + "scope": "G", + "type": "script" + }, + { + "config": { + "newTab": true, + "url": "https://w.amazon.com/bin/view/EURME/MAP/Product_Management/SCADA2/Resources/CommissioningToolUserGuide" + }, + "scope": "C", + "type": "nav" + } + ] + } + }, + "meta": { + "name": "Commissioning Tool guide" + }, + "position": { + "basis": "400px" + }, + "props": { + "direction": "column", + "style": { + "backgroundColor": "#F2F3F4", + "classes": "FadeInFast, background, background-none", + "cursor": "pointer", + "marginBottom": "10px", + "marginRight": "50px", + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "58px" + }, + "props": { + "color": "#4D9CCE", + "path": "material/local_library", + "style": { + "margin": "10px", + "marginTop": "50px" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "100px" + }, + "props": { + "text": "Symbol Library", + "textStyle": { + "color": "#000000", + "fontFamily": "Arial", + "fontSize": "22px", + "fontWeight": "bold", + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "custom": { + "buttonid": "help/symbol_library" + }, + "events": { + "dom": { + "onClick": [ + { + "config": { + "script": "\tbuttonid \u003d self.custom.buttonid\n\tactivityLog.productMetrics.callLogger(self.view, \u0027click\u0027, buttonid)" + }, + "scope": "G", + "type": "script" + }, + { + "config": { + "params": {}, + "view": "Symbol-Views/Symbol-Library-Views/SymbolLibraryMain" + }, + "scope": "C", + "type": "nav" + } + ] + } + }, + "meta": { + "name": "Symbol Library" + }, + "position": { + "basis": "400px" + }, + "props": { + "direction": "column", + "style": { + "backgroundColor": "#F2F3F4", + "classes": "FadeInFast, background, background-none", + "cursor": "pointer", + "marginBottom": "10px", + "marginRight": "0px", + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "CardsBottomRow" + }, + "position": { + "basis": "260px" + }, + "props": { + "justify": "center", + "style": { + "marginTop": "20px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "Card body" + }, + "position": { + "basis": "734px", + "grow": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "Body" + }, + "position": { + "basis": "980px" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Footer" + }, + "position": { + "basis": "50px" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "backgroundColor": "#EDEDED" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/Home/resource.json b/com.inductiveautomation.perspective/views/Main-Views/Home/resource.json new file mode 100644 index 0000000..dc9eb52 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/Home/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "ankikarw", + "timestamp": "2024-04-01T21:08:56Z" + }, + "lastModificationSignature": "f4866de5e70cc165986fabfabf7b2f5ff1ff2b5eba137f329fc720e91561286c" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/Home/thumbnail.png b/com.inductiveautomation.perspective/views/Main-Views/Home/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..89ac8e150be975714b6c122bca8707073e5be2b1 GIT binary patch literal 2798 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 z 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 V0u*x-#Q)&D_#_RIDwi}2_&@%|X<`5X literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Main-Views/Notify-Tool/Notify-Main/view.json b/com.inductiveautomation.perspective/views/Main-Views/Notify-Tool/Notify-Main/view.json new file mode 100644 index 0000000..143c105 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/Notify-Tool/Notify-Main/view.json @@ -0,0 +1,2890 @@ +{ + "custom": { + "EntriesList": [ + { + "PrimaryKey": "2024-05-08 10:17:51", + "author": "pll", + "body": "Introducing our brand new Announcement Feature! 🎉 Stay in the loop with important updates, new features, planned downtime events, all in one place. Never miss out again! Check it out now and stay tuned for the latest updates. 🔊", + "childproj": "https://eu-preprod.scada2.rme.amazon.dev: MAN2", + "expire": "2024-05-09 05:00:00", + "link1": "https://", + "link1title": "", + "link2": "https://", + "link2title": "", + "priority": "Healthy", + "publish": "2024-05-08 10:08:33", + "title": "📢 Exciting News! 📢", + "whids": "" + } + ], + "PreviewJSON": [ + { + "author": "cojonas", + "body": "", + "childproj": "https://eu-development.scada2.rme.amazon.dev:", + "expire": "2024-05-08 05:00:00", + "link1": "https://", + "link1title": "", + "link2": "https://", + "link2title": "", + "publish": "2024-04-26 07:07:32", + "title": "" + } + ], + "TableSelection": null, + "activityLogger": { + "alt_pageid": "notifyTool", + "start_time": { + "$": [ + "ts", + 192, + 1715164768393 + ], + "$ts": 1715164768393 + } + }, + "body": "", + "entryCount": 0, + "expire": "2024-05-09 05:00:00", + "fileName": "Notifications_as of 2024-4-8_10_40_3.xlsx", + "link1": "https://", + "link1title": "", + "link2": "https://", + "link2title": "", + "priority": "Healthy", + "publish": "2024-05-08 10:39:28", + "title": "", + "whids": "" + }, + "events": { + "system": { + "onShutdown": { + "config": { + "script": "\tactivityLog.productMetrics.callLogger(self, \u0027page\u0027)" + }, + "scope": "G", + "type": "script" + }, + "onStartup": { + "config": { + "script": "\t\t\n\tfrom datetime import datetime, timedelta\n\t\n\tself.custom.activityLogger.start_time \u003d system.date.now()\n\t\n\tsystem.perspective.sendMessage(\u0027refreshNotifyIcon\u0027)\n\tsystem.perspective.sendMessage(\u0027refreshNotifyTable\u0027)\n\tdt \u003d datetime.today()\n\tself.getChild(\"root\").getChild(\"FlexContainer\").getChild(\"FlexContainer_Left\").getChild(\"FlexContainer\").getChild(\"Publish-DateTimeInput\").props.value \u003d dt\n" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": {}, + "propConfig": { + "custom.EntriesList": { + "persistent": true + }, + "custom.PreviewJSON": { + "persistent": true + }, + "custom.TableSelection": { + "binding": { + "config": { + "path": "/root/FlexContainer_4/FlexContainer/Table.props.selection.data[0]" + }, + "type": "property" + }, + "persistent": true + }, + "custom.activityLogger": { + "persistent": true + }, + "custom.activityLogger.pageid": { + "binding": { + "config": { + "path": "page.props.path" + }, + "transforms": [ + { + "code": " if value \u003d\u003d\u0027/\u0027 or value \u003d\u003d \u0027\u0027 or value \u003d\u003d None:\n return self.custom.activityLogger.alt_pageid.lower()\n else:\n return value[1:].lower()\n\treturn value", + "type": "script" + } + ], + "type": "property" + } + }, + "custom.body": { + "binding": { + "config": { + "path": "/root/FlexContainer/FlexContainer_Middle/FlexContainer_0/Body-TextArea.props.text" + }, + "type": "property" + }, + "persistent": true + }, + "custom.entryCount": { + "persistent": true + }, + "custom.expire": { + "binding": { + "config": { + "path": "/root/FlexContainer/FlexContainer_Left/FlexContainer_0/Expire-DateTimeInput.props.formattedValue" + }, + "type": "property" + }, + "persistent": true + }, + "custom.fileName": { + "binding": { + "config": { + "expression": "\r\n\u0027Notifications_as of \u0027\r\n+ dateExtract(now(),\u0027year\u0027) +\u0027-\u0027\r\n+ dateExtract(now(),\u0027month\u0027) +\u0027-\u0027\r\n+ dateExtract(now(),\u0027day\u0027) +\u0027_\u0027\r\n+ dateExtract(now(),\u0027hour\u0027) +\u0027_\u0027\r\n+ dateExtract(now(),\u0027minute\u0027) +\u0027_\u0027\r\n+ dateExtract(now(),\u0027second\u0027)+\u0027.xlsx\u0027" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.link1": { + "binding": { + "config": { + "path": "/root/FlexContainer/FlexContainer_Right/FlexContainer/FlexContainer_2/FlexContainer/URL1-TextField.props.text" + }, + "transforms": [ + { + "code": "#\tif len(value) \u003e0:\n\tif \u0027http://\u0027 not in value and \u0027https://\u0027 not in value:\n\t\tvalue \u003d \u0027https://\u0027+value\n\n\t\treturn value\n\telse:\n\t\treturn value", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.link1title": { + "binding": { + "config": { + "path": "/root/FlexContainer/FlexContainer_Right/FlexContainer/FlexContainer_2/FlexContainer_0/URL1-NameTextField.props.text" + }, + "type": "property" + }, + "persistent": true + }, + "custom.link2": { + "binding": { + "config": { + "path": "/root/FlexContainer/FlexContainer_Right/FlexContainer/FlexContainer_3/FlexContainer/URL2-TextField.props.text" + }, + "transforms": [ + { + "code": "#\tif len(value) \u003e0:\n\tif \u0027http://\u0027 not in value and \u0027https://\u0027 not in value:\n\t\tvalue \u003d \u0027https://\u0027+value\n\n\t\treturn value\n\telse:\n\t\treturn value", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.link2title": { + "binding": { + "config": { + "path": "/root/FlexContainer/FlexContainer_Right/FlexContainer/FlexContainer_3/FlexContainer_0/URL2-NameTextField.props.text" + }, + "transforms": [ + { + "code": "#\tif len(value) \u003e0:\n\treturn value", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "/root/FlexContainer/FlexContainer_Left/FlexContainer_2/Dropdown.props.value" + }, + "type": "property" + }, + "persistent": true + }, + "custom.publish": { + "binding": { + "config": { + "path": "/root/FlexContainer/FlexContainer_Left/FlexContainer/Publish-DateTimeInput.props.formattedValue" + }, + "type": "property" + }, + "persistent": true + }, + "custom.title": { + "binding": { + "config": { + "path": "/root/FlexContainer/FlexContainer_Middle/FlexContainer/Title-TextField.props.text" + }, + "type": "property" + }, + "persistent": true + }, + "custom.whids": { + "binding": { + "config": { + "path": "/root/FlexContainer/FlexContainer_Left/FlexContainer_1/WHID-TextArea.props.text" + }, + "type": "property" + }, + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "108px" + }, + "props": { + "text": "Publish Date", + "textStyle": { + "paddingLeft": 5 + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Publish-DateTimeInput", + "tooltip": { + "enabled": true, + "location": "top-left", + "sustain": 2000 + } + }, + "position": { + "basis": "170px", + "grow": 1 + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "path": "this.props.minDate" + }, + "transforms": [ + { + "code": "\t\n\tmsg \u003d \u0027Time is UTC. Minimum publish date is \u0027 +str(value)\n\t\n\treturn msg", + "type": "script" + } + ], + "type": "property" + } + }, + "props.minDate": { + "binding": { + "config": { + "expression": "midnight(addDays(now(),-1))" + }, + "type": "expr" + } + } + }, + "props": { + "format": "YYYY-MM-DD hh:mm:ss", + "formattedValue": "2024-05-08 10:39:28", + "value": { + "$": [ + "ts", + 192, + 1715164768393 + ], + "$ts": 1715164768393 + } + }, + "type": "ia.input.date-time-input" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "40px" + }, + "props": { + "style": { + "borderBottomLeftRadius": 4, + "borderBottomRightRadius": 4, + "borderStyle": "solid", + "borderTopLeftRadius": 4, + "borderTopRightRadius": 4, + "borderWidth": 1, + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "108px" + }, + "props": { + "text": "Expire Date", + "textStyle": { + "paddingLeft": 5 + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Expire-DateTimeInput", + "tooltip": { + "enabled": true, + "location": "top-left", + "sustain": 2000 + } + }, + "position": { + "basis": "170px", + "grow": 1 + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "path": ".../FlexContainer/Publish-DateTimeInput.props.value" + }, + "transforms": [ + { + "code": "\t\n\tmsg \u003d \u0027Time is UTC. Minimum expire date is \u0027 +str(value)\n\t\n\treturn msg", + "type": "script" + } + ], + "type": "property" + } + }, + "props.minDate": { + "binding": { + "config": { + "path": ".../FlexContainer/Publish-DateTimeInput.props.value" + }, + "transforms": [ + { + "code": "\tfrom datetime import datetime, timedelta\n\tdt \u003d datetime.today()\n\t\n\treturn dt", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "format": "YYYY-MM-DD hh:mm:ss", + "formattedValue": "2024-05-09 05:00:00", + "value": { + "$": [ + "ts", + 0, + 1714766194471 + ], + "$ts": 1715274000000 + } + }, + "type": "ia.input.date-time-input" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "40px" + }, + "props": { + "style": { + "borderBottomLeftRadius": 4, + "borderBottomRightRadius": 4, + "borderStyle": "solid", + "borderTopLeftRadius": 4, + "borderTopRightRadius": 4, + "borderWidth": 1, + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5 + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "TextArea" + }, + "position": { + "basis": "308px", + "display": false + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "session.props.auth.user.roles" + }, + "type": "property" + } + } + }, + "type": "ia.input.text-area" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "152px" + }, + "props": { + "text": "WHID\u0027s", + "textStyle": { + "paddingLeft": 5 + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "WHID-TextArea", + "tooltip": { + "enabled": true, + "location": "top-left", + "sustain": 2000, + "text": "Enter WHID\u0027s for WHID specific notifications, blank for all WHID\u0027s" + } + }, + "position": { + "basis": "240px" + }, + "type": "ia.input.text-area" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "basis": "40px" + }, + "props": { + "style": { + "borderBottomLeftRadius": 4, + "borderBottomRightRadius": 4, + "borderStyle": "solid", + "borderTopLeftRadius": 4, + "borderTopRightRadius": 4, + "borderWidth": 1, + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "152px" + }, + "props": { + "text": "Priority", + "textStyle": { + "paddingLeft": 5 + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "256px" + }, + "propConfig": { + "props.options": { + "binding": { + "config": { + "path": "session.custom.colours.colour_impaired" + }, + "transforms": [ + { + "code": "\n\theaders \u003d [\u0027Priority\u0027] \n\tstates \u003d [[\u0027Healthy\u0027],[\u0027Diagnostic\u0027], [\u0027Low\u0027], [\u0027Medium\u0027], [\u0027High\u0027]]\n\tdataset \u003d system.dataset.toDataSet(headers, states)\n\t\n\treturn dataset", + "type": "script" + } + ], + "type": "property" + } + }, + "props.style.backgroundColor": { + "binding": { + "config": { + "path": "this.props.value" + }, + "transforms": [ + { + "fallback": "state5", + "inputType": "scalar", + "mappings": [ + { + "input": "Healthy", + "output": "state5" + }, + { + "input": "Diagnostic", + "output": "state4" + }, + { + "input": "Low", + "output": "state3" + }, + { + "input": "Medium", + "output": "state2" + }, + { + "input": "High", + "output": "state1" + } + ], + "outputType": "scalar", + "type": "map" + }, + { + "code": "\tprefix \u003d self.session.custom.colours[value]\n\treturn prefix", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "style": { + "fontWeight": "bold" + }, + "value": "Healthy" + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "FlexContainer_2" + }, + "position": { + "basis": "40px" + }, + "props": { + "style": { + "borderBottomLeftRadius": 4, + "borderBottomRightRadius": 4, + "borderStyle": "solid", + "borderTopLeftRadius": 4, + "borderTopRightRadius": 4, + "borderWidth": 1, + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5 + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_Left" + }, + "position": { + "basis": "300px" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "97px" + }, + "props": { + "text": "Title", + "textStyle": { + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Title-TextField", + "tooltip": { + "enabled": true, + "location": "top-left", + "sustain": 2000 + } + }, + "position": { + "basis": "150px", + "grow": 1 + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "path": "this.props.text" + }, + "transforms": [ + { + "code": "\ttooltip \u003d \u0027Required Field, Character count: \u0027 + str(len(value))\n\t\n\treturn tooltip", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "placeholder": "Enter Title" + }, + "type": "ia.input.text-field" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "40px" + }, + "props": { + "style": { + "borderBottomLeftRadius": 4, + "borderBottomRightRadius": 4, + "borderStyle": "solid", + "borderTopLeftRadius": 4, + "borderTopRightRadius": 4, + "borderWidth": 1, + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "97px" + }, + "props": { + "text": "Body", + "textStyle": { + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Body-TextArea", + "tooltip": { + "enabled": true, + "location": "top-left", + "sustain": 2000 + } + }, + "position": { + "basis": "240px", + "grow": 1 + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "path": "this.props.text" + }, + "transforms": [ + { + "code": "\ttooltip \u003d \u0027Required Field, Character count: \u0027 + str(len(value))\n\t\n\treturn tooltip", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "placeholder": "Enter Notification Text", + "rejectUpdatesWhileFocused": false, + "resize": "vertical", + "wrap": "hard" + }, + "type": "ia.input.text-area" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "143px" + }, + "props": { + "style": { + "borderBottomLeftRadius": 4, + "borderBottomRightRadius": 4, + "borderStyle": "solid", + "borderTopLeftRadius": 4, + "borderTopRightRadius": 4, + "borderWidth": 1, + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "custom": { + "PreviewJSON": "value" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tmsg \u003d {\u0027instances\u0027:[{\u0027title\u0027:self.view.custom.title, \n\t\t\u0027body\u0027:self.view.custom.body,\n\t\t\u0027publish\u0027:str(self.view.custom.publish)[:19],\n\t\t\u0027expire\u0027:str(self.view.custom.expire)[:19],\n\t\t\u0027link1\u0027:self.view.custom.link1,\n\t\t\u0027link1title\u0027:self.view.custom.link1title,\n\t\t\u0027link2\u0027:self.view.custom.link2,\n\t\t\u0027link2title\u0027:self.view.custom.link2title,\n\t\t\u0027author\u0027:self.session.props.auth.user.userName,\n\t\t\u0027priority\u0027:self.view.custom.priority,\n\t\t\u0027childproj\u0027:self.session.props.gateway.address}],\n\t\t\u0027entryCount\u0027:1}\n#\tself.view.custom.PreviewJSON \u003d value\n\n\tsystem.perspective.openPopup(\u0027jKEJ8tuj34\u0027,\u0027PopUp-Views/Notify-Tool/Notify-Popup\u0027,params\u003dmsg, modal\u003dTrue, resizable\u003dTrue, overlayDismiss\u003dTrue, title\u003d\u0027Notification Preview\u0027)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Preview-Button" + }, + "position": { + "basis": "115px" + }, + "props": { + "image": { + "icon": { + "path": "material/preview" + } + }, + "style": { + "backgroundColor": "#555555", + "classes": "Background-Styles/Controller", + "marginBottom": 5, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 5 + }, + "text": "Preview" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tfrom datetime import datetime\n\timport time\n\tfields \u003d [self.view.custom.body,\n\t\t\t\tself.view.custom.title, \n\t\t\t\tself.view.custom.publish,\n\t\t\t\tself.view.custom.expire,]\n\t\t\t\t\n\twhids \u003d str(self.view.custom.whids.upper())\t\t\t\n\ttry:\n\t\tif \u0027\u0027 not in fields and None not in fields:\n\t\t\tchidproj \u003d self.session.props.gateway.address +\u0027 \u0027+self.session.custom.fc\n\t\t\tnow \u003d datetime.now()\n\t\t\tnowstr \u003d str(now)[:19]\n\t\t\t\n\t\t\tpayload \u003d {\u0027PrimaryKey\u0027:nowstr,\n\t\t\t\t\u0027title\u0027:self.view.custom.title, \n\t\t\t\t\u0027body\u0027:self.view.custom.body,\n\t\t\t\t\u0027publish\u0027:str(self.view.custom.publish)[:19],\n\t\t\t\t\u0027expire\u0027:str(self.view.custom.expire)[:19],\n\t\t\t\t\u0027link1\u0027:self.view.custom.link1,\n\t\t\t\t\u0027link1title\u0027:self.view.custom.link1title,\n\t\t\t\t\u0027link2\u0027:self.view.custom.link2,\n\t\t\t\t\u0027link2title\u0027:self.view.custom.link2title,\n\t\t\t\t\u0027whids\u0027:whids,\n\t\t\t\t\u0027priority\u0027:self.view.custom.priority,\n\t\t\t\t\u0027author\u0027:(self.session.props.auth.user.userName)[:3],\n\t\t\t\t\u0027childproj\u0027:chidproj}\n\t\t\t\t\n#\t\t\tsystem.perspective.print(payload)\n\t\t\tnotifyTool.WriteToDynamo.DynamoWriter(payload)\n\t\t\tsystem.perspective.sendMessage(\u0027refreshNotifyTable\u0027)\n\t\telse:\n\t\t\t\n\t\t\tmsg\u003d {\u0027body\u0027:\u0027Title, Body, Publish date, and Expire date cannot be blank\u0027}\n\t\t\tsystem.perspective.openPopup(\u0027jKEJ8tuj\u0027,\u0027PopUp-Views/Notify-Tool/Notify-Submit-Popup\u0027,params\u003dmsg, modal\u003dTrue, overlayDismiss\u003dTrue, title \u003d \"Whoops, don\u0027t forget the words\")\n\texcept:\n\t\tpass\n\t\t\n\n" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Submit-Button" + }, + "position": { + "basis": "115px" + }, + "props": { + "image": { + "icon": { + "path": "material/send" + } + }, + "style": { + "backgroundColor": "#555555", + "classes": "Background-Styles/Controller", + "marginBottom": 5, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 5 + }, + "text": "Submit" + }, + "type": "ia.input.button" + }, + { + "custom": { + "PreviewJSON": "value" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tclear \u003d \u0027\u0027\n\tself.parent.parent.getChild(\"FlexContainer\").getChild(\"Title-TextField\").props.text \u003d clear\n\tself.parent.parent.getChild(\"FlexContainer_0\").getChild(\"Body-TextArea\").props.text \u003d clear\n\tself.parent.parent.parent.getChild(\"FlexContainer_Right\").getChild(\"FlexContainer\").getChild(\"FlexContainer_2\").getChild(\"FlexContainer\").getChild(\"URL1-TextField\").props.text \u003d clear\n\tself.parent.parent.parent.getChild(\"FlexContainer_Right\").getChild(\"FlexContainer\").getChild(\"FlexContainer_2\").getChild(\"FlexContainer_0\").getChild(\"URL1-NameTextField\").props.text \u003d clear\n\tself.parent.parent.parent.getChild(\"FlexContainer_Right\").getChild(\"FlexContainer\").getChild(\"FlexContainer_3\").getChild(\"FlexContainer\").getChild(\"URL2-TextField\").props.text \u003d clear\n\tself.parent.parent.parent.getChild(\"FlexContainer_Right\").getChild(\"FlexContainer\").getChild(\"FlexContainer_3\").getChild(\"FlexContainer_0\").getChild(\"URL2-NameTextField\").props.text \u003d clear\n\tself.parent.parent.parent.getChild(\"FlexContainer_Left\").getChild(\"FlexContainer_1\").getChild(\"WHID-TextArea\").props.text \u003d clear\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Preview-Button_0" + }, + "position": { + "basis": "115px" + }, + "props": { + "image": { + "icon": { + "path": "material/format_clear" + } + }, + "style": { + "backgroundColor": "#555555", + "classes": "Background-Styles/Controller", + "marginBottom": 5, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 5 + }, + "text": "Clear" + }, + "type": "ia.input.button" + }, + { + "custom": { + "PreviewJSON": "value" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\trow \u003d self.parent.parent.parent.parent.getChild(\"FlexContainer_4\").getChild(\"FlexContainer\").getChild(\"Table\").props.selection.data[0]\n\t\t\n\tself.parent.parent.getChild(\"FlexContainer\").getChild(\"Title-TextField\").props.text \u003d row[\u0027title\u0027]\n\tself.parent.parent.getChild(\"FlexContainer_0\").getChild(\"Body-TextArea\").props.text \u003d row[\u0027body\u0027]\n\tself.parent.parent.parent.getChild(\"FlexContainer_Right\").getChild(\"FlexContainer\").getChild(\"FlexContainer_2\").getChild(\"FlexContainer\").getChild(\"URL1-TextField\").props.text \u003d row[\u0027link1\u0027]\n\tself.parent.parent.parent.getChild(\"FlexContainer_Right\").getChild(\"FlexContainer\").getChild(\"FlexContainer_2\").getChild(\"FlexContainer_0\").getChild(\"URL1-NameTextField\").props.text \u003d row[\u0027link1title\u0027]\n\tself.parent.parent.parent.getChild(\"FlexContainer_Right\").getChild(\"FlexContainer\").getChild(\"FlexContainer_3\").getChild(\"FlexContainer\").getChild(\"URL2-TextField\").props.text \u003d row[\u0027link2\u0027]\n\tself.parent.parent.parent.getChild(\"FlexContainer_Right\").getChild(\"FlexContainer\").getChild(\"FlexContainer_3\").getChild(\"FlexContainer_0\").getChild(\"URL2-NameTextField\").props.text \u003d row[\u0027link2title\u0027]\n\tself.parent.parent.parent.getChild(\"FlexContainer_Left\").getChild(\"FlexContainer_1\").getChild(\"WHID-TextArea\").props.text \u003d row[\u0027whids\u0027]\n\tself.parent.parent.parent.getChild(\"FlexContainer_Left\").getChild(\"FlexContainer_2\").getChild(\"Dropdown\").props.value \u003d row[\u0027priority\u0027]" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Populate-Button" + }, + "position": { + "basis": "115px" + }, + "props": { + "image": { + "icon": { + "path": "material/upgrade" + } + }, + "style": { + "backgroundColor": "#555555", + "classes": "Background-Styles/Controller", + "marginBottom": 5, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 5 + }, + "text": "Populate" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "basis": "40px" + }, + "props": { + "justify": "space-evenly" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_Middle" + }, + "position": { + "basis": "900px" + }, + "props": { + "direction": "column", + "style": { + "borderBottomLeftRadius": 10, + "borderBottomRightRadius": 10, + "borderTopLeftRadius": 10, + "borderTopRightRadius": 10 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "URL1-Label" + }, + "position": { + "basis": "110px" + }, + "props": { + "text": "Link 1", + "textStyle": { + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "URL1-TextField" + }, + "position": { + "basis": "150px", + "grow": 1 + }, + "props": { + "placeholder": "Enter Link 1" + }, + "type": "ia.input.text-field" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "200px" + }, + "props": { + "style": { + "borderBottomLeftRadius": 4, + "borderBottomRightRadius": 4, + "borderTopLeftRadius": 4, + "borderTopRightRadius": 4, + "borderWidth": 1, + "marginBottom": 5, + "marginTop": 5 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "URL1-NameLabel" + }, + "position": { + "basis": "110px" + }, + "props": { + "style": { + "paddingLeft": 5, + "paddingRight": 5 + }, + "text": "Link 1 Name" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "URL1-NameTextField" + }, + "position": { + "basis": "150px", + "grow": 1 + }, + "props": { + "placeholder": "Enter Link 1 Title" + }, + "type": "ia.input.text-field" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "200px" + }, + "props": { + "style": { + "marginBottom": 5, + "marginTop": 5 + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_2" + }, + "position": { + "basis": "92px" + }, + "props": { + "direction": "column", + "style": { + "borderBottomLeftRadius": 4, + "borderBottomRightRadius": 4, + "borderStyle": "solid", + "borderTopLeftRadius": 4, + "borderTopRightRadius": 4, + "borderWidth": 1, + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "URL2-Label" + }, + "position": { + "basis": "110px" + }, + "props": { + "text": "Link 2", + "textStyle": { + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "URL2-TextField" + }, + "position": { + "basis": "150px", + "grow": 1 + }, + "props": { + "placeholder": "Enter Link 2" + }, + "type": "ia.input.text-field" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "200px" + }, + "props": { + "style": { + "marginBottom": 5, + "marginTop": 5 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "URL2-NameLabel" + }, + "position": { + "basis": "110px" + }, + "props": { + "style": { + "paddingLeft": 5, + "paddingRight": 5 + }, + "text": "Link 2 Name" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "URL2-NameTextField" + }, + "position": { + "basis": "150px", + "grow": 1 + }, + "props": { + "placeholder": "Enter Link 2 Title" + }, + "type": "ia.input.text-field" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "200px" + }, + "props": { + "style": { + "marginBottom": 5, + "marginTop": 5 + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_3" + }, + "position": { + "basis": "92px" + }, + "props": { + "direction": "column", + "style": { + "borderBottomLeftRadius": 4, + "borderBottomRightRadius": 4, + "borderStyle": "solid", + "borderTopLeftRadius": 4, + "borderTopRightRadius": 4, + "borderWidth": 1, + "classes": "Buttons/Button-Menu", + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5 + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_Right" + }, + "position": { + "basis": "300px", + "grow": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "800px" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "170px" + }, + "props": { + "style": { + "textAlign": "center" + }, + "text": "Notification Entries" + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "40px", + "grow": 1 + }, + "props": { + "justify": "space-around", + "style": { + "classes": "Background-Styles/Controller" + } + }, + "type": "ia.container.flex" + }, + { + "custom": { + "entries": [ + { + "PrimaryKey": "2024-05-08 10:17:51", + "author": "pll", + "body": "Introducing our brand new Announcement Feature! 🎉 Stay in the loop with important updates, new features, planned downtime events, all in one place. Never miss out again! Check it out now and stay tuned for the latest updates. 🔊", + "childproj": "https://eu-preprod.scada2.rme.amazon.dev: MAN2", + "expire": "2024-05-09 05:00:00", + "link1": "https://", + "link1title": "", + "link2": "https://", + "link2title": "", + "priority": "Healthy", + "publish": "2024-05-08 10:08:33", + "title": "📢 Exciting News! 📢", + "whids": "" + } + ], + "entryCount": 1, + "highestPriority": 5 + }, + "events": { + "dom": { + "onClick": { + "config": { + "draggable": true, + "id": "ioNP2CXn", + "modal": true, + "overlayDismiss": true, + "resizable": true, + "showCloseIcon": true, + "title": "Notifications", + "type": "open", + "viewParams": { + "entryCount": "{/root/FlexContainer_4/FlexContainer/FlexContainer_4/Icon.custom.entryCount}", + "instances": "{/root/FlexContainer_4/FlexContainer/FlexContainer_4/Icon.custom.entries}" + }, + "viewPath": "PopUp-Views/Notify-Tool/Notify-Popup", + "viewportBound": false + }, + "scope": "C", + "type": "popup" + } + } + }, + "meta": { + "name": "Icon", + "tooltip": { + "enabled": true, + "location": "bottom-right", + "style": { + "whiteSpace": "pre" + }, + "text": "📢 Exciting News! 📢\n" + } + }, + "position": { + "basis": "30px" + }, + "propConfig": { + "custom.refreshMSG": { + "binding": { + "config": { + "expression": "now(90000)\r\n// Update property value every 90 seconds, firing change script" + }, + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": "\tsystem.perspective.sendMessage(\u0027refreshNotifyIcon\u0027)\n\tsystem.perspective.sendMessage(\u0027refreshNotifyTable\u0027)" + } + }, + "position.display": { + "binding": { + "config": { + "path": "view.custom.EntriesList" + }, + "transforms": [ + { + "code": "\tfrom datetime import datetime\n\t\n#\tRead entries from dynamo table\n\treturns \u003d notifyTool.ReadFromDynamo.DynamoReader()\n\tEntriesList \u003d returns[\u0027Items\u0027]\n\t\n\tEntriesList.reverse()\n\n\n#\tCreate empty list and now string\n\tpublishdates \u003d []\n\tnow \u003d datetime.now()\n\tnowstr \u003d str(now)[:19]\n\tactiveNotify \u003d False\n\twhid \u003d self.session.custom.fc\n\tstates \u003d {\u0027Healthy\u0027:5,\u0027Diagnostic\u0027:4, \u0027Low\u0027:3, \u0027Medium\u0027:2, \u0027High\u0027:1}\n\n\tactiveEntries \u003d []\n\ttooltip \u003d []\n\tcount \u003d 0\n\thighestPriority \u003d 5\n\tfor e in EntriesList:\n\t\t\n\t\tif len(e[\u0027whids\u0027])\u003e0:\t\t\t\t# Check for WHID in whid field\n\t\t\tif whid in e[\u0027whids\u0027]:\t\t\t# Check for WHID match in whid field\n\t\t\t\t#\tCheck EntriesList for active entries based on publish and expire times\n\t\t\t\tif nowstr \u003e\u003d e[\u0027publish\u0027] and nowstr\u003c\u003dstr( e[\u0027expire\u0027]):\n\t\t\t\t\tactiveEntries.append(e)\n\t\t\t\t\ttooltip.append(e[\u0027title\u0027])\n\t\t\t\t\tactiveNotify \u003d True\n\t\t\t\t\tcount +\u003d1\n\t\t\t\t\tif states[e[\u0027priority\u0027]] \u003c highestPriority:\n\t\t\t\t\t\thighestPriority \u003d states[e[\u0027priority\u0027]]\n\t\telse:\n\t\t\tif nowstr \u003e\u003d e[\u0027publish\u0027] and nowstr\u003c\u003dstr( e[\u0027expire\u0027]):\n\t\t\t\tactiveEntries.append(e)\n\t\t\t\ttooltip.append(e[\u0027title\u0027])\n\t\t\t\tactiveNotify \u003d True\t\t\n\t\t\t\tcount +\u003d1\t\n\t\t\t\tif states[e[\u0027priority\u0027]] \u003c highestPriority:\n\t\t\t\t\thighestPriority \u003d states[e[\u0027priority\u0027]]\n\n\ttooltiptext \u003d \u0027\u0027\n\tfor i in tooltip:\n\t\ttooltiptext+\u003d i+\u0027\\n\u0027\n\t\t\n\tself.custom.entries \u003d activeEntries\n\tself.custom.highestPriority \u003d highestPriority\n\tself.custom.entryCount \u003d count\n\tself.meta.tooltip.text \u003d tooltiptext\t\n\n\treturn activeNotify", + "type": "script" + } + ], + "type": "property" + } + }, + "props.color": { + "binding": { + "config": { + "path": "this.custom.highestPriority" + }, + "transforms": [ + { + "fallback": "state5", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "state1" + }, + { + "input": 2, + "output": "state2" + }, + { + "input": 3, + "output": "state3" + }, + { + "input": 4, + "output": "state4" + }, + { + "input": 5, + "output": "state5" + } + ], + "outputType": "scalar", + "type": "map" + }, + { + "code": "\ttest \u003d self.session.custom.colours.colour_impaired\n\tstatecolor \u003d self.session.custom.colours[value]\n\treturn statecolor", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "path": "material/campaign", + "style": { + "marginLeft": 5, + "marginRight": 5 + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "refreshNotifyIcon", + "pageScope": true, + "script": "\tself.refreshBinding(\u0027position.display\u0027)\n\tself.refreshBinding(\u0027props.color\u0027)\n", + "sessionScope": true, + "viewScope": false + } + ] + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "130px" + }, + "props": { + "style": { + "textAlign": "center" + }, + "text": "Icon Preview" + }, + "type": "ia.display.label" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tjsonFile \u003d self.parent.parent.getChild(\"Table\").props.data\n\theaders \u003d list(set(jsonFile[0].keys()))\n\t\n\trowdata \u003d []\n\tfor r in jsonFile:\n\t\trow \u003d []\n\t\tfor k in headers:\n\t\t\trow.append(r[k])\n\t\trowdata.append(row)\n\t\n\tdataset \u003d system.dataset.toDataSet(headers, rowdata)\n\tdatasetexcel \u003d system.dataset.toExcel(True, [dataset])\n\t\n\tfilename \u003d self.view.custom.fileName\n\tsystem.perspective.download(filename, datasetexcel)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Retrieve_Test_0", + "tooltip": { + "enabled": true, + "text": "Download Table as Excel" + } + }, + "position": { + "basis": "115px" + }, + "props": { + "image": { + "icon": { + "path": "material/cloud_download" + } + }, + "style": { + "backgroundColor": "#555555", + "classes": "Background-Styles/Controller", + "marginBottom": 5, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 5 + }, + "text": "Download" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\ttry:\n\t\treturns \u003d notifyTool.ReadFromDynamo.DynamoReader()\n\t\tself.view.custom.EntriesList \u003d returns[\u0027Items\u0027]\n\n\texcept:\n\t\tsystem.perspective.print(\u0027Error manual refreshing from Dynamo Table\u0027)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Retrieve_Test", + "tooltip": { + "enabled": true, + "text": "Manual Refresh of Table" + } + }, + "position": { + "basis": "115px" + }, + "props": { + "image": { + "icon": { + "path": "material/get_app" + } + }, + "style": { + "backgroundColor": "#555555", + "classes": "Background-Styles/Controller", + "marginBottom": 5, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 5 + }, + "text": "Refresh" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t\n\tPK \u003d self.view.custom.TableSelection[\u0027PrimaryKey\u0027]\n\tPub \u003d self.view.custom.TableSelection[\u0027publish\u0027]\n\n\treturns \u003d notifyTool.DeleteFromDynamo.DynamoDeleter(PrimaryKey\u003dPK,publish\u003dPub)\n\tsystem.perspective.sendMessage(\u0027refreshNotifyTable\u0027)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Delete-Button", + "tooltip": { + "enabled": true, + "text": "Permanently Delete selected entry" + } + }, + "position": { + "basis": "115px" + }, + "props": { + "image": { + "icon": { + "path": "material/delete_forever" + } + }, + "style": { + "backgroundColor": "#555555", + "classes": "Background-Styles/Controller", + "marginBottom": 5, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 5 + }, + "text": "Delete" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer_4" + }, + "position": { + "basis": "40px" + }, + "props": { + "justify": "flex-end" + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Table" + }, + "position": { + "basis": "400px", + "grow": 1 + }, + "propConfig": { + "props.data": { + "binding": { + "config": { + "path": "view.custom.EntriesList" + }, + "type": "property" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "priority", + "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": "Priority" + }, + "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": true, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 60 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "PrimaryKey", + "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": "Submit Date" + }, + "justify": "center", + "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": "descending", + "sortable": true, + "strictWidth": true, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 85 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "publish", + "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": "Publish Date" + }, + "justify": "center", + "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": "ascending", + "sortable": true, + "strictWidth": true, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 85 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "expire", + "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": "Expire Date" + }, + "justify": "center", + "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": true, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 85 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "title", + "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": "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "Body" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "body", + "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": "Body" + }, + "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": true, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 450 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "author", + "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": "Author" + }, + "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": true, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 80 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "link1title", + "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": "Link 1 Title" + }, + "justify": "center", + "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": true, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 140 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "link1", + "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": "Link 1" + }, + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "link2title", + "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": "Link 2 Title" + }, + "justify": "center", + "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": true, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 140 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "link2", + "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": "Link 2" + }, + "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": "", + "overflowWrap": "break-word" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": "falseq", + "field": "childproj", + "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": "Published from:" + }, + "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": "", + "overflowWrap": "break-word" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "whids", + "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": "WHID Specific" + }, + "justify": "center", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + } + ], + "rows": { + "style": { + "marginBottom": 2.5, + "marginTop": 2.5, + "overflowWrap": "break-word" + } + }, + "sortOrder": [ + "PrimaryKey", + "publish" + ], + "style": { + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5 + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "refreshNotifyTable", + "pageScope": true, + "script": "\ttry:\n\t\treturns \u003d notifyTool.ReadFromDynamo.DynamoReader()\n\t\tself.view.custom.EntriesList \u003d returns[\u0027Items\u0027]\n\t\tself.refreshBinding(\u0027props.data\u0027)\n\t\t# implement your handler here\n\texcept:\n\t\tsystem.perspective.print(\u0027Error updating Notification Table\u0027)", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.display.table" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_4" + }, + "position": { + "basis": "1300px", + "grow": 1 + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "path": "session.props.auth.user.roles" + }, + "transforms": [ + { + "code": "\n\troles \u003d [\u0027Authenticated/Roles/eurme-ignition-admins\u0027]\n\tauth \u003d system.perspective.isAuthorized(False, securityLevels\u003droles)\n\treturn auth", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "direction": "column", + "style": { + "classes": "Background-Styles/Controller" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/OilMonitoring/resource.json b/com.inductiveautomation.perspective/views/Main-Views/OilMonitoring/resource.json new file mode 100644 index 0000000..ad2aa8c --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/OilMonitoring/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-08-01T07:50:50Z" + }, + "lastModificationSignature": "aa458112aea94477b10f64a8c4d68192312975c5ace962c447a7198f757b5fa8" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/OilMonitoring/thumbnail.png b/com.inductiveautomation.perspective/views/Main-Views/OilMonitoring/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..235ed32b5fd3d5a6e8b4378562783e7b00b4bb6a GIT binary patch literal 14217 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

ky63OC?$Np=Hn+sYt6BNgep?>Xw=>tS==+ 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 z zAj}Yh8zNGt12FP=zzrD8d61M6j^GAL9WiLJh)r;V*q;z^zfN#Nh!rBZpEvl>gfN5k ze}76e z%*@Rhb`nBZBMn%7|Naf}^z<|`Hueol6oK+nK59N@XlSV1p8+-**&*=F^NFdc?)v{@ zt0`#HlQ6Zo!6MmFRi(IZH1HG=5s^M3i6J&379k~57J3w_{XDb0?72Y;4u*WM>sifMfW-bORGT!5PUS78VC?|6}BX(~)I|IsCvb zg_o?XJLQ5W37I_+nIa^i!uUiI?8S}Q+Hhx!P0RjgXDJCIb8>R_IVsc*sr4QA3X`xC z4Y9weBTx>I`D9~kuwg=*)Nn0v{I97f+&(<8=0YYq{FuFLuBlPZ*78TBG%Jg6NY}gM z{a^oqk%`;``$g*~#v3rj0Ot!>&Qz=a(f<&fSp$d~`(L(b-w&ey$U$ zFvg)R{ZDK8{?l67Xtmjytu4pGHHS*wW+lqGdWFRqu!qe0&-@K_Az7H2!RYJjBV}0N zqEHT4|M$!@;=Et9loq4I|Hpikuk715+gxF~e!N>{r6p^FK#})}6DMXYHeJT}^3|)E z>EIGoev+8)<&6^GdHDFw8jD>&{N;;DR8$mjQ~QEv?QLxa!1|m+(Yz;9!{KiU7Jy1t9|vaqtYUVqB=?Afy!Sy{U@T^LwqPJ1lqbmHuVTeqzI)6bOl zonC2wWafm546`j;kb6XYq=J<~Z)#A;Hp^Jg-li;3p-P2cV^wzO=nDirPr#}tHqzrYiVH-a00fgo`DKEH5V_ZeLQR~JndVK zo;r2Psib5})@0Sw({dahJ$?+Vo`J0=XP=HKEj2TFI<}nj^7cOb_xt_+88ak8g_OSg z0)ttxMMu~~;d-WnO!ow^3;u54dSgTe~DWM4fU<3Xt literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Main-Views/S3/manage/view.json b/com.inductiveautomation.perspective/views/Main-Views/S3/manage/view.json new file mode 100644 index 0000000..e35b3d6 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/S3/manage/view.json @@ -0,0 +1,918 @@ +{ + "custom": { + "api_region_name": "eu", + "api_stage": "prod", + "enable_site_selection": true, + "help_url": "https://w.amazon.com/bin/view/EURME/MAP/Projects/Amazon_SCADA/Expanding_BU_and_New_Regions_SCADA/AMZL/DeveloperGuide/#H7.1SCADAFileManagementUtility", + "image_file_container_basis": "50%", + "image_file_content_shown": true, + "image_file_prefix": "SCADA//images/", + "image_file_suffix": ".svg", + "instances_file_prefix": "SCADA/EWR4/instance_configs/", + "loading": false, + "migrate_enabled": false, + "selected_image": null, + "selected_whid": "", + "site_folder": "SCADA//", + "site_image_list": [], + "site_source_list": [], + "source_file_container_basis": "50%", + "source_file_content_shown": true, + "source_file_prefix": "SCADA//source/", + "source_file_suffix": ".drawio", + "stage_config": { + "account_id": "006306898152", + "api_call_role": "arn:aws:iam::609617486056:role/RMESDScadaS3ManagementAPIcallRole-prod-eu-west-1", + "endpoint": "https://eu-west-1.scada-s3-management.scada.eurme.amazon.dev/", + "lambda_name": "RMESDScadaS3ManagementFlaskLambda-prod", + "region": "eu-west-1", + "repo_bucket": "ignition-image-repo", + "s3_region": "eu-west-1", + "source_bucket": "ignition-image-source" + }, + "title_text": "S3 File Management", + "upload_enabled": true, + "user_roles": [ + "rme-ctrl-map-all", + "rme-ctrl-all", + "rme-grt-all", + "na-rme-all", + "watrmecomms-l4-l8-bb-all", + "eurme-ignition-developers", + "eurme-ignition-admins", + "eurme-ignition-managers", + "eurme-ignition-users", + "maplab-rme-all", + "eurme-ignition-ae-india" + ], + "whid": "" + }, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\tselected_image \u003d self.params.selected_image\n\tself.custom.selected_image \u003d selected_image\n\tselected_site \u003d self.params.selected_site\n\tif not selected_site:\n\t\tselected_site \u003d self.custom.whid\n\tself.custom.selected_whid \u003d selected_site" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": { + "selected_image": null, + "selected_site": null + }, + "propConfig": { + "custom.api_region_name": { + "binding": { + "config": { + "path": "session.custom.aws.prefix" + }, + "type": "property" + }, + "persistent": true + }, + "custom.api_stage": { + "persistent": true + }, + "custom.enable_site_selection": { + "binding": { + "config": { + "expression": "isAuthorized(false, \u0027Authenticated/Roles/eurme-ignition-developers\u0027)" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.help_url": { + "persistent": true + }, + "custom.image_file_container_basis": { + "binding": { + "config": { + "expression": "if(!{view.custom.image_file_content_shown},\u0027auto\u0027,\r\n\tif({view.custom.source_file_content_shown},\u002750%\u0027,\u0027100%\u0027))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.image_file_content_shown": { + "binding": { + "config": { + "path": "/root/FlexContainer File Configs/Image File Config.props.params.content_shown" + }, + "type": "property" + }, + "persistent": true + }, + "custom.image_file_prefix": { + "binding": { + "config": { + "expression": "{view.custom.site_folder}+\u0027images/\u0027" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.image_file_suffix": { + "persistent": true + }, + "custom.loading": { + "persistent": true + }, + "custom.migrate_enabled": { + "binding": { + "config": { + "expression": "{view.custom.flow_view_edit_mode.reviewer_enabled}\r\n\u0026\u0026!isNull({view.custom.stage_source})\r\n\u0026\u0026len({view.custom.stage_source})\r\n\u0026\u0026!isNull({view.custom.stage_destination})\r\n\u0026\u0026len({view.custom.stage_destination})" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.selected_image": { + "persistent": true + }, + "custom.selected_whid": { + "onChange": { + "enabled": null, + "script": "\t# DEVNOTE: During peer review, noticed that when files are selected and then \n\t# the whid is changed, that a loop of file updates can be triggered\n\t# therefore, clear the \"selected_image\" custom prop on whid change\n\tself.custom.selected_image \u003d None\n\t" + }, + "persistent": true + }, + "custom.site_folder": { + "binding": { + "config": { + "expression": "stringFormat(\u0027SCADA/%s/\u0027, {view.custom.selected_whid})" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.site_image_list": { + "binding": { + "config": { + "path": "view.custom.selected_whid" + }, + "transforms": [ + { + "code": "\tif not value:\n\t\treturn []\n\tfrom AWS.s3 import S3Manager\n\t\n\tusername \u003d self.session.props.auth.user.userName\n\tapi_region_name \u003d self.custom.api_region_name\n\t\n\ts3m \u003d S3Manager(api_region_name\u003dapi_region_name, username\u003dusername)\n\t\n\tsite \u003d value\n\tbucket \u003d self.custom.stage_config.repo_bucket\n\t\n\treturn s3m.fetch_object_list_by_site_and_bucket(site, bucket)", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.site_source_list": { + "binding": { + "config": { + "path": "view.custom.selected_whid" + }, + "transforms": [ + { + "code": "\tif not value:\n\t\treturn []\n\tfrom AWS.s3 import S3Manager\n\t\n\tusername \u003d self.session.props.auth.user.userName\n\tapi_region_name \u003d self.custom.api_region_name\n\t\n\ts3m \u003d S3Manager(api_region_name\u003dapi_region_name, username\u003dusername)\n\t\n\tsite \u003d value\n\tbucket \u003d self.custom.stage_config.source_bucket\n\t\n\treturn s3m.fetch_object_list_by_site_and_bucket(site, bucket)", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.source_file_container_basis": { + "binding": { + "config": { + "expression": "if(!{view.custom.source_file_content_shown},\u0027auto\u0027,\r\n\tif({view.custom.image_file_content_shown},\u002750%\u0027,\u0027100%\u0027))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.source_file_content_shown": { + "binding": { + "config": { + "path": "/root/FlexContainer File Configs/Source File Config.props.params.content_shown" + }, + "type": "property" + }, + "persistent": true + }, + "custom.source_file_prefix": { + "binding": { + "config": { + "expression": "{view.custom.site_folder}+\u0027source/\u0027" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.source_file_suffix": { + "persistent": true + }, + "custom.stage_config": { + "binding": { + "config": { + "expression": "{view.custom.api_region_name}" + }, + "transforms": [ + { + "code": "\treturn AWS.s3.STAGE_CONFIG[\u0027prod\u0027][value]", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "custom.title_text": { + "persistent": true + }, + "custom.upload_enabled": { + "persistent": true + }, + "custom.user_roles": { + "binding": { + "config": { + "path": "session.props.auth.user.roles" + }, + "type": "property" + }, + "persistent": true + }, + "custom.whid": { + "binding": { + "config": { + "path": "session.custom.fc" + }, + "type": "property" + }, + "persistent": true + }, + "params.selected_image": { + "paramDirection": "input", + "persistent": true + }, + "params.selected_site": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 825, + "width": 1200 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "Header" + }, + "position": { + "grow": 1 + }, + "props": { + "style": { + "opacity": "0.73", + "overflow": "auto", + "textShadow": "#AAAAAA 1px 2px 2px" + }, + "text": "S3 SCADA File Management", + "textStyle": { + "fontSize": 30, + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "events": { + "dom": { + "onClick": { + "config": { + "newTab": true, + "url": "{view.custom.help_url}" + }, + "scope": "C", + "type": "nav" + } + } + }, + "meta": { + "name": "Icon", + "tooltip": { + "enabled": true, + "text": "View documentation for this tool" + } + }, + "position": { + "basis": "30px" + }, + "props": { + "path": "material/help_outline", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.display.icon" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "30px", + "shrink": 0 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "Header" + }, + "position": { + "basis": "75px", + "shrink": 0 + }, + "props": { + "justify": "center", + "style": { + "classes": "Framework/Card/Title_transparent", + "textTransform": "capitalize" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Folder Config" + }, + "position": { + "basis": "50%", + "grow": 1 + }, + "propConfig": { + "props.params.params.enables.site": { + "binding": { + "config": { + "path": "view.custom.enable_site_selection" + }, + "type": "property" + } + }, + "props.params.params.image_count": { + "binding": { + "config": { + "expression": "try(len({view.custom.site_image_list}),0)" + }, + "type": "expr" + } + }, + "props.params.params.selected_whid": { + "binding": { + "config": { + "path": "view.custom.selected_whid" + }, + "type": "property" + } + }, + "props.params.params.source_count": { + "binding": { + "config": { + "expression": "try(len({view.custom.site_source_list}),0)" + }, + "type": "expr" + } + } + }, + "props": { + "params": { + "open_expanded": true, + "params": { + "enables": {} + }, + "path": "Objects/Templates/S3/Management/manage", + "show_box_shadow_on_expanded": true, + "title": "Bucket Configuration", + "useDefaultHeight": false, + "useDefaultWidth": false + }, + "path": "Framework/Card/Card_Collapsible_Transparent" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "Site Config" + }, + "position": { + "basis": "50%", + "grow": 1 + }, + "propConfig": { + "props.params.params.enables.site": { + "binding": { + "config": { + "path": "view.custom.enable_site_selection" + }, + "type": "property" + } + }, + "props.params.params.image_count": { + "binding": { + "config": { + "expression": "try(len({view.custom.site_image_list}),0)" + }, + "type": "expr" + } + }, + "props.params.params.selected_whid": { + "binding": { + "config": { + "path": "view.custom.selected_whid" + }, + "type": "property" + } + }, + "props.params.params.source_count": { + "binding": { + "config": { + "expression": "try(len({view.custom.site_source_list}),0)" + }, + "type": "expr" + } + } + }, + "props": { + "params": { + "open_expanded": true, + "params": { + "enables": {} + }, + "path": "Objects/Templates/S3/Management/site", + "show_box_shadow_on_expanded": true, + "title": "Site Configuration", + "useDefaultHeight": false, + "useDefaultWidth": false + }, + "path": "Framework/Card/Card_Collapsible_Transparent" + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "FlexContainer Site" + }, + "position": { + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Image File Config" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "position.basis": { + "binding": { + "config": { + "path": "view.custom.image_file_container_basis" + }, + "type": "property" + } + }, + "props.params.params.bucket": { + "binding": { + "config": { + "path": "view.custom.stage_config.repo_bucket" + }, + "type": "property" + } + }, + "props.params.params.enables.delete": { + "binding": { + "config": { + "path": "view.custom.upload_enabled" + }, + "type": "property" + } + }, + "props.params.params.enables.upload": { + "binding": { + "config": { + "path": "view.custom.upload_enabled" + }, + "type": "property" + } + }, + "props.params.params.files": { + "binding": { + "config": { + "path": "view.custom.site_image_list" + }, + "type": "property" + } + }, + "props.params.params.prefix": { + "binding": { + "config": { + "path": "view.custom.image_file_prefix" + }, + "type": "property" + } + }, + "props.params.params.selected_file": { + "binding": { + "config": { + "path": "view.custom.selected_image" + }, + "type": "property" + } + }, + "props.params.params.suffix": { + "binding": { + "config": { + "path": "view.custom.image_file_suffix" + }, + "type": "property" + } + }, + "props.params.params.whid": { + "binding": { + "config": { + "path": "view.custom.selected_whid" + }, + "type": "property" + } + } + }, + "props": { + "params": { + "anchor_position": "left", + "content_shown": true, + "open_expanded": true, + "params": { + "enables": { + "download": true, + "file": true, + "object_key": false + }, + "upload_file_types": [ + "svg" + ] + }, + "path": "Objects/Templates/S3/Management/file", + "show_box_shadow_on_expanded": true, + "title": "Image SVG Files", + "useDefaultHeight": false, + "useDefaultWidth": false + }, + "path": "Framework/Card/Card_Collapsible_Transparent_with_Anchor", + "style": { + "overflow": "auto" + } + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "Source File Config" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "position.basis": { + "binding": { + "config": { + "path": "view.custom.source_file_container_basis" + }, + "type": "property" + } + }, + "props.params.params.bucket": { + "binding": { + "config": { + "path": "view.custom.stage_config.source_bucket" + }, + "type": "property" + } + }, + "props.params.params.enables.delete": { + "binding": { + "config": { + "path": "view.custom.upload_enabled" + }, + "type": "property" + } + }, + "props.params.params.enables.upload": { + "binding": { + "config": { + "path": "view.custom.upload_enabled" + }, + "type": "property" + } + }, + "props.params.params.files": { + "binding": { + "config": { + "path": "view.custom.site_source_list" + }, + "type": "property" + } + }, + "props.params.params.prefix": { + "binding": { + "config": { + "path": "view.custom.source_file_prefix" + }, + "type": "property" + } + }, + "props.params.params.selected_file": { + "binding": { + "config": { + "path": "view.custom.selected_image" + }, + "type": "property" + } + }, + "props.params.params.suffix": { + "binding": { + "config": { + "path": "view.custom.source_file_suffix" + }, + "type": "property" + } + }, + "props.params.params.whid": { + "binding": { + "config": { + "path": "view.custom.selected_whid" + }, + "type": "property" + } + } + }, + "props": { + "params": { + "anchor_position": "right", + "content_shown": true, + "open_expanded": true, + "params": { + "enables": { + "download": true, + "file": true, + "object_key": false + }, + "upload_file_types": [ + "drawio" + ] + }, + "path": "Objects/Templates/S3/Management/file", + "show_box_shadow_on_expanded": true, + "title": "Source DRAWIO Files", + "useDefaultHeight": false, + "useDefaultWidth": false + }, + "path": "Framework/Card/Card_Collapsible_Transparent_with_Anchor", + "style": { + "overflow": "auto" + } + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "FlexContainer File Configs" + }, + "position": { + "shrink": 0 + }, + "props": { + "justify": "space-between" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "newTab": true, + "url": "{view.custom.help_url}" + }, + "scope": "C", + "type": "nav" + } + } + }, + "meta": { + "name": "Button Documentation", + "tooltip": { + "enabled": true, + "location": "bottom", + "text": "View online documentation for this utility" + } + }, + "props": { + "image": { + "icon": { + "path": "material/info" + } + }, + "primary": false, + "style": { + "margin": "4px", + "padding": "4px" + }, + "text": "Documentation" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsite \u003d self.view.params.selected_site\n\tnull \u003d None\n\tquery_params \u003d {\n\t\t\"copy_option\": null,\n\t\t\"destination_view\": null,\n\t\t\"destination_site\": site,\n\t\t\"destination_bucket\": null,\n\t\t\"end_time\": null,\n\t\t\"error_occurred\": null,\n\t\t\"operation\": null,\n\t\t\"source_view\": null,\n\t\t\"source_site\": null,\n\t\t\"source_bucket\": null,\n\t\t\"start_time\": null,\n\t\t\"username\": self.session.props.auth.user.userName\n\t}\n\t# Open audit log viewer\n\tview_path \u003d \u0027PopUp-Views/S3/Audit/Log_Viewer\u0027\n\tparams \u003d {\u0027query_params\u0027: query_params}\n\tsystem.perspective.openPopup(\u0027Audit Log Viewer\u0027, view_path, \n\t\t\t\t\t\t\t\tparams, \u0027SCADA Audit Logs\u0027)\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button Audit Log", + "tooltip": { + "enabled": true, + "location": "bottom", + "text": "View SCADA S3 audit logs for current user and site" + } + }, + "props": { + "image": { + "icon": { + "path": "material/table_view" + } + }, + "primary": false, + "style": { + "margin": "4px", + "padding": "4px" + }, + "text": "Audit Logs" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t# build out the object key from repo bucket, site, selected view, and suffix\n\tbucket \u003d self.view.custom.stage_config.repo_bucket\n\tsite \u003d self.view.params.selected_site\n\tprefix \u003d self.view.custom.source_file_prefix\n\tview \u003d self.view.params.selected_image\n\tsuffix \u003d self.view.custom.image_file_suffix\n\tobj_key \u003d \u0027%s%s%s\u0027 % (prefix, view, suffix)\n\t# build out query params from local variables\n\tquery_params \u003d {\n\t\t\"view\": view,\n\t\t\"object_key\": obj_key,\n\t\t\"site\": site,\n\t\t\"bucket\": bucket\n\t}\n\t# Open version history log viewer\n\tview_path \u003d \u0027PopUp-Views/S3/Versions/Log_Viewer\u0027\n\tparams \u003d {\u0027query_params\u0027: query_params}\n\tsystem.perspective.openPopup(\u0027Version Log Viewer\u0027, view_path, \n\t\t\t\t\t\t\t\tparams, \u0027SCADA S3 Version History Log Viewer\u0027)\n\t\t\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button Version History", + "tooltip": { + "enabled": true, + "location": "bottom", + "text": "View SCADA S3 version history for currently selected file" + } + }, + "props": { + "image": { + "icon": { + "path": "material/history" + } + }, + "primary": false, + "style": { + "margin": "4px", + "padding": "4px" + }, + "text": "Version History" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer Buttons" + }, + "position": { + "basis": "50px", + "shrink": 0 + }, + "props": { + "justify": "flex-end" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "50px", + "grow": 1, + "shrink": 0 + }, + "props": { + "direction": "column", + "justify": "flex-end" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "scripts": { + "customMethods": [ + { + "name": "show_confirm_dialog", + "params": [], + "script": "\t# ~~ 12 PARAMETERS ~~\n\t\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t\t# show close button\t\t(default \u003d true) boolean\n\t\t# btn text primary\t\t(default \u003d \"Primary\")\n\t\t# btn text secondary\t(default \u003d \"Secondary\")\n\t\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\t\n\t\tmsg \u003d \"Update Instance Configuration for MP%s?\" % (self.view.params.instance.viewParams.mhe_id)\n\t\tAlerts.showAlert(\n\t\t\t\"info\", \n\t\t\t\"Update Instance Config?\", \n\t\t\tmsg, \n\t\t\t\"true\",\n\t\t\t\"Continue\", \n\t\t\t\"Cancel\", \n\t\t\t\"chevron_right\", \n\t\t\t\"\", \n\t\t\t\"right\", \n\t\t\t\"confirm_update_instance_config\", \n\t\t\t\"closePopup\", \n\t\t\t\"closePopup\"\n\t\t)\n\t\t" + }, + { + "name": "show_success_dialog", + "params": [ + "msg\u003dNone" + ], + "script": "\t# ~~ 13 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\t# payload\t\t\t\t(default \u003d {}) add a payload here to return to the target message handler\n\t\n\tAlerts.showAlert(\n\t\t\"success\", \n\t\t\"Instance Updated\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"OK\", \n\t\t\"CLOSE\", \n\t\t\"\", \n\t\t\"\", \n\t\t\"right\", \n\t\t\"closePopup\", \n\t\t\"closePopup\", \n\t\t\"closePopup\",\n\t\t{}\n\t)\n\t\t" + }, + { + "name": "show_warning_dialog", + "params": [ + "msg\u003dNone" + ], + "script": "\t# ~~ 12 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\n\tAlerts.showAlert(\n\t\t\"warning\", \n\t\t\"Instance Not Updated\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"OK\", \n\t\t\"CLOSE\", \n\t\t\"\", \n\t\t\"\", \n\t\t\"right\", \n\t\t\"closePopup\", \n\t\t\"closePopup\", \n\t\t\"closePopup\"\n\t)\n\t\t" + }, + { + "name": "show_error_dialog", + "params": [ + "msg\u003dNone" + ], + "script": "\t# ~~ 12 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\n\tAlerts.showAlert(\n\t\t\"error\", \n\t\t\"Instance Update Error!\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"OK\", \n\t\t\"CLOSE\", \n\t\t\"\", \n\t\t\"\", \n\t\t\"right\", \n\t\t\"closePopup\", \n\t\t\"closePopup\", \n\t\t\"closePopup\"\n\t)\n\t\t" + }, + { + "name": "update_bindings", + "params": [], + "script": "\tself.view.custom.loading \u003d False\n\t\t" + } + ], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update_selected_whid", + "pageScope": false, + "script": "\t# implement your handler here\n\tself.view.custom.selected_whid \u003d payload.get(\u0027whid\u0027, None)\n", + "sessionScope": true, + "viewScope": true + }, + { + "messageType": "update_selected_image", + "pageScope": false, + "script": "\t# implement your handler here\n\tself.view.custom.selected_image \u003d payload.get(\u0027image\u0027, None)\n\t", + "sessionScope": true, + "viewScope": true + }, + { + "messageType": "update_file_binding", + "pageScope": false, + "script": "\t# update the appropriate binding to fetch an updated dataset of S3 objects,\n\t# depending upon which bucket was updated\n\tbucket \u003d payload.get(\u0027bucket\u0027, None)\n\tif bucket \u003d\u003d self.view.custom.stage_config.repo_bucket:\n\t\tself.view.refreshBinding(\u0027custom.site_image_list\u0027)\n\tif bucket \u003d\u003d self.view.custom.stage_config.source_bucket:\n\t\tself.view.refreshBinding(\u0027custom.site_source_list\u0027)", + "sessionScope": true, + "viewScope": false + } + ] + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/TempMonitoring/resource.json b/com.inductiveautomation.perspective/views/Main-Views/TempMonitoring/resource.json new file mode 100644 index 0000000..f88c0b5 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Main-Views/TempMonitoring/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-08-01T07:50:53Z" + }, + "lastModificationSignature": "02fec01785029e7278ff7a13d4860c24dbe8a6d97c63152c2db49f6ccb93b088" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Main-Views/TempMonitoring/thumbnail.png b/com.inductiveautomation.perspective/views/Main-Views/TempMonitoring/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..af3cfd92adc9aee85be6f61f1da9824fed111c23 GIT binary patch literal 5947 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 Z-W{}CsB{oCeF5epD9fwM)yjMb`+xAmy}tke literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json b/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json new file mode 100644 index 0000000..c4ea686 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Navigation-Views/Docked-South/view.json @@ -0,0 +1,151 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 193, + "width": 1920 + } + }, + "root": { + "children": [ + { + "children": [ + { + "custom": { + "show_view": "Alarms" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload \u003d {}\n\tif self.custom.show_view \u003d\u003d \"Alarms\":\n\t\tself.custom.show_view \u003d \"State\"\n\t\tpayload[\"data\"] \u003d \"State\"\n\t\thandle_icon \u003d \"material/play_arrow\"\n\telif self.custom.show_view \u003d\u003d \"State\":\t\n\t\tself.custom.show_view \u003d \"Alarms\"\n\t\tpayload[\"data\"] \u003d \"Alarms\"\n\t\thandle_icon \u003d \"material/notifications_active\"\n\tsystem.perspective.alterDock(\"Docked-South\", { \"handleIcon\": handle_icon } )\n\tsystem.perspective.sendMessage(\"change-docked-view\", \n\t\t\t\t\t\t\t\t\tpayload \u003d payload, scope \u003d \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Show", + "tooltip": { + "enabled": true + } + }, + "position": { + "basis": "70px", + "display": false + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "case({this.custom.show_view},\r\n\"Alarms\", \"Displaying active alarms\",\r\n\"State\", \"displaying current state of equipment\",\r\n\"Unknown\")" + }, + "type": "expr" + } + }, + "props.image.icon.path": { + "binding": { + "config": { + "expression": "case({this.custom.show_view},\r\n\"Alarms\", \"material/play_arrow\",\r\n\"State\", \"material/notifications_active\",\r\n\"material/device_unknown\")" + }, + "type": "expr" + } + }, + "props.text": { + "binding": { + "config": { + "expression": "case({this.custom.show_view},\r\n\"Alarms\", \"State\",\r\n\"State\", \"Alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "height": 32, + "icon": { + "color": "#FFFFFF" + }, + "position": "top", + "width": 32 + }, + "style": { + "classes": "Buttons/Button-Menu", + "color": "#FFFFFF", + "margin": 1 + }, + "textStyle": { + "classes": "Text-Styles/Docked-Buttons" + } + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "70px", + "shrink": 0 + }, + "props": { + "direction": "column", + "style": { + "backgroundColor": "#3B3B3B" + } + }, + "type": "ia.container.flex" + }, + { + "custom": { + "view": "Alarms" + }, + "meta": { + "name": "EmbeddedView" + }, + "position": { + "basis": "1850px", + "grow": 1 + }, + "propConfig": { + "props.path": { + "binding": { + "config": { + "expression": "case({this.custom.view},\r\n\"Alarms\", \"Alarm-Views/AlarmTable\",\r\n\"State\", \"State-Views/State-Table\",\r\n\"Alarm-Views/Docked-Alarm\")" + }, + "type": "expr" + } + } + }, + "props": { + "loading": { + "order": "with-parent" + }, + "params": { + "length_of_table_data": 353 + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "change-docked-view", + "pageScope": true, + "script": "\tview \u003d payload[\"data\"]\n\tself.custom.view \u003d view", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "root" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Navigation-Views/Docked-West/resource.json b/com.inductiveautomation.perspective/views/Navigation-Views/Docked-West/resource.json new file mode 100644 index 0000000..43795f5 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Navigation-Views/Docked-West/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-12T19:54:03Z" + }, + "lastModificationSignature": "b501603e98191e16f87052eeb73a1ef3e4cecabeb30ead6fe78ecb6eb27c1857" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Navigation-Views/Docked-West/thumbnail.png b/com.inductiveautomation.perspective/views/Navigation-Views/Docked-West/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..060df03baf7851c8802772eba4f62b0b42faafec GIT binary patch literal 9114 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 Y0T%0ZmR9L@5dZ)H07*qoM6N<$f+hvz`Tzg` literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Navigation-Views/Docked-West/view.json b/com.inductiveautomation.perspective/views/Navigation-Views/Docked-West/view.json new file mode 100644 index 0000000..8df13c4 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Navigation-Views/Docked-West/view.json @@ -0,0 +1,832 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 1080, + "width": 70 + } + }, + "root": { + "children": [ + { + "children": [ + { + "custom": { + "show": false + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tmap_selected \u003d self.session.custom.alarm_filter.show_map\n\tself.custom.show \u003d False\n\tif not map_selected:\n\t\tsystem.perspective.navigate(\"/\")\n\telse:\n\t\tsystem.perspective.navigate(\"/MAP-Home\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Home", + "tooltip": { + "enabled": true, + "text": "Home" + } + }, + "position": { + "basis": "70px" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "path": "session.props.theme" + }, + "transforms": [ + { + "code": "\tif \u0027dark\u0027 in value:\n\t\treturn \u0027Buttons/Button-Menu\u0027\n\telse:\n\t\treturn \u0027Buttons/Button-Menu\u0027", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "image": { + "height": 32, + "icon": { + "color": "#FFFFFF", + "path": "material/home" + }, + "position": "top", + "width": 32 + }, + "style": { + "margin": 1 + }, + "text": "Home", + "textStyle": { + "fontSize": 10 + } + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tif self.props.selected \u003d\u003d True and self.page.props.path \u003d\u003d \"/\":\n\t\tsystem.perspective.navigate(\"/MAP-Home\")\n\t\t\n\telif self.page.props.path \u003d\u003d \"/MAP-Home\":\n\t\tsystem.perspective.navigate(\"/\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "ToggleSwitch", + "tooltip": { + "enabled": true + } + }, + "position": { + "basis": "60px" + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "path": "session.custom.alarm_filter.show_map" + }, + "transforms": [ + { + "expression": "if({value}, \"Toggle for home card view\", \"Toggle for home detailed view\")", + "type": "expression" + } + ], + "type": "property" + } + }, + "position.display": { + "binding": { + "config": { + "path": "/root.custom.show_home_selector" + }, + "type": "property" + } + }, + "props.selected": { + "binding": { + "config": { + "bidirectional": true, + "path": "session.custom.alarm_filter.show_map" + }, + "type": "property" + } + } + }, + "props": { + "color": { + "background-color": "", + "selected": "#FFFFFF", + "unselected": "#FFFFFF" + }, + "label": { + "position": "left", + "style": { + "classes": "", + "fontSize": "10px" + }, + "text": "Map View" + }, + "style": { + "borderBottomLeftRadius": "5px", + "borderBottomRightRadius": "5px", + "borderColor": "#AAAAAA", + "borderStyle": "solid", + "borderTopLeftRadius": "5px", + "borderTopRightRadius": "5px", + "borderWidth": "0.5px", + "classes": "Buttons/Button-Menu", + "margin": "1px" + } + }, + "type": "ia.input.toggle-switch" + } + ], + "events": { + "dom": { + "onMouseEnter": { + "config": { + "script": "\tself.parent.custom.show_home_selector \u003d True" + }, + "scope": "G", + "type": "script" + }, + "onMouseLeave": { + "config": { + "script": "\tself.parent.custom.show_home_selector \u003d False" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "FlexContainer" + }, + "propConfig": { + "position.basis": { + "binding": { + "config": { + "expression": "if({parent.custom.show_home_selector} \u003d True, \"130px\", \"70px\")" + }, + "type": "expr" + } + } + }, + "props": { + "direction": "column", + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.closePopup(\"DevicePopUP\")\n\tsystem.perspective.closePopup(\"StatusPopUP\")\n\tself.custom.show \u003d False\n\tsystem.perspective.navigate(\"/Real-Time\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Alarms", + "tooltip": { + "enabled": true, + "text": "Alarms" + } + }, + "position": { + "basis": "70px" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "path": "session.props.theme" + }, + "transforms": [ + { + "code": "\tif \u0027dark\u0027 in value:\n\t\treturn \u0027Buttons/Button-Menu\u0027\n\telse:\n\t\treturn \u0027Buttons/Button-Menu\u0027", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "image": { + "height": 32, + "icon": { + "color": "#FFFFFF", + "path": "material/access_alarm" + }, + "position": "top", + "width": 32 + }, + "style": { + "margin": 1 + }, + "text": "Alarms", + "textStyle": { + "classes": "Text-Styles/Docked-Buttons" + } + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\n\tsystem.perspective.openPopup(id \u003d \"Search\", view \u003d \"PopUp-Views/Search\", \n\t\t\t\t\t\t\t\t\t\t\t\tshowCloseIcon \u003d False, modal \u003d True,\n\t\t\t\t\t\t\t\t\t\t\t\tviewportBound \u003d True,\n\t\t\t\t\t\t\t\t\t\t\t\tdraggable \u003d False,\n\t\t\t\t\t\t\t\t\t\t\t\toverlayDismiss \u003d True\n\t\t\t\t\t\t\t\t\t\t\t\t)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "search", + "tooltip": { + "enabled": true, + "text": "Search" + } + }, + "position": { + "basis": "70px" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "path": "session.props.theme" + }, + "transforms": [ + { + "code": "\tif \u0027dark\u0027 in value:\n\t\treturn \u0027Buttons/Button-Menu\u0027\n\telse:\n\t\treturn \u0027Buttons/Button-Menu\u0027", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "image": { + "height": 32, + "icon": { + "color": "#FFFFFF", + "path": "material/search" + }, + "position": "top", + "width": 32 + }, + "style": { + "margin": 1 + }, + "text": "Search", + "textStyle": { + "classes": "Text-Styles/Docked-Buttons" + } + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.session.custom.searchId \u003d \"\"\n\tself.session.custom.deviceSearchId \u003d \"\"\n\tsystem.perspective.closePopup(id \u003d \"TagSearch\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Search off", + "tooltip": { + "enabled": true, + "text": "Search Off" + } + }, + "position": { + "basis": "70px" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "path": "session.props.theme" + }, + "transforms": [ + { + "code": "\tif \u0027dark\u0027 in value:\n\t\treturn \u0027Buttons/Button-Menu\u0027\n\telse:\n\t\treturn \u0027Buttons/Button-Menu\u0027", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "image": { + "height": 32, + "icon": { + "color": "#FFFFFF", + "path": "material/search_off" + }, + "position": "top", + "width": 32 + }, + "style": { + "margin": 1 + }, + "text": "Search Off", + "textStyle": { + "classes": "Text-Styles/Docked-Buttons" + } + }, + "type": "ia.input.button" + }, + { + "custom": { + "show": false + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "draggable": false, + "id": "IL8RVZ5T", + "modal": true, + "overlayDismiss": true, + "position": { + "relativeLocation": "top-right" + }, + "positionType": "relative", + "resizable": false, + "showCloseIcon": false, + "type": "open", + "viewParams": { + "viewFocus": "{session.custom.view_in_focus}" + }, + "viewPath": "PopUp-Views/Detail-View-Filter", + "viewportBound": true + }, + "scope": "C", + "type": "popup" + } + } + }, + "meta": { + "name": "Filter", + "tooltip": { + "enabled": true + } + }, + "position": { + "basis": "70px" + }, + "propConfig": { + "custom.filters_active": { + "binding": { + "config": { + "expression": "if(!{session.custom.alarm_filter.show_diagnostic} ||\r\n!{session.custom.alarm_filter.show_gateways} ||\r\n!{session.custom.alarm_filter.show_low_alarm} ||\r\n{session.custom.alarm_filter.orderby} ||\r\n!{session.custom.alarm_filter.show_running} ||\r\n!{session.custom.alarm_filter.show_safety}, \r\nTrue,\r\nFalse)\r\n" + }, + "type": "expr" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({this.custom.filters_active}, \"Status Filters are active\",\r\n\"Select Status Filters\")" + }, + "type": "expr" + } + }, + "props.image.icon.color": { + "binding": { + "config": { + "expression": "if({this.custom.filters_active},\r\n\"#FF8C00\",\r\n\"#FFFFFF\")\r\n" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "height": 32, + "icon": { + "path": "material/filter_alt", + "style": { + "classes": "" + } + }, + "position": "top", + "width": 32 + }, + "style": { + "classes": "Buttons/Button-Menu, filter-button", + "margin": 1 + }, + "text": "Filter", + "textStyle": { + "classes": "Text-Styles/Docked-Buttons" + } + }, + "type": "ia.input.button" + }, + { + "custom": { + "show": false + }, + "events": { + "component": { + "onActionPerformed": [ + { + "config": { + "params": {}, + "view": "Main-Views/CT_Main" + }, + "enabled": false, + "scope": "C", + "type": "nav" + }, + { + "config": { + "script": "\tsystem.perspective.closePopup(\"DevicePopUP\")\n\tsystem.perspective.closePopup(\"StatusPopUP\")\n\tself.custom.show \u003d False\n\tsystem.perspective.navigate(\"/Tools\")" + }, + "scope": "G", + "type": "script" + } + ] + } + }, + "meta": { + "name": "Tools", + "tooltip": { + "enabled": true + } + }, + "position": { + "basis": "70px" + }, + "propConfig": { + "custom.has_role": { + "binding": { + "config": { + "expression": "isAuthorized(false, \u0027Authenticated/Roles/eurme-ignition-developers\u0027, \r\n\t\u0027Authenticated/Roles/eurme-ignition-ae\u0027, \u0027Authenticated/Roles/narme-ignition-developers\u0027)" + }, + "type": "expr" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({this.custom.has_role}\u003d False, \r\n\"You do not have the required role to access this page\",\r\n\"Access tools page\")\r\n" + }, + "type": "expr" + } + }, + "props.enabled": { + "binding": { + "config": { + "path": "this.custom.has_role" + }, + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "session.props.theme" + }, + "transforms": [ + { + "code": "\tif \u0027dark\u0027 in value:\n\t\treturn \u0027Buttons/Button-Menu\u0027\n\telse:\n\t\treturn \u0027Buttons/Button-Menu\u0027", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "image": { + "height": 32, + "icon": { + "color": "#FFFFFF", + "path": "material/handyman" + }, + "position": "top", + "width": 32 + }, + "style": { + "margin": 1 + }, + "text": "Tools", + "textStyle": { + "classes": "Text-Styles/Docked-Buttons" + } + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "page": "/Command" + }, + "scope": "C", + "type": "nav" + } + } + }, + "meta": { + "name": "Control", + "tooltip": { + "enabled": true + } + }, + "position": { + "basis": "70px" + }, + "propConfig": { + "custom.has_role": { + "binding": { + "config": { + "expression": "{session.custom.fc}" + }, + "transforms": [ + { + "code": "#\trme_role \u003d value +\"-rme-all\"\n\trme_role \u003d \"eurme-ignition-developers\"\n\troles \u003d (self.session.props.auth.user.roles)\n\tif (rme_role.lower() in roles \n\tor rme_role.upper() in roles):\n\t\treturn True\n\telse:\n\t\treturn False", + "type": "script" + } + ], + "type": "expr" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({this.custom.has_role}\u003d False, \r\n\"You do not have the required role to access this page\",\r\n\"Access controls page\")\r\n" + }, + "type": "expr" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "session.props.theme" + }, + "transforms": [ + { + "code": "\tif \u0027dark\u0027 in value:\n\t\treturn \u0027Buttons/Button-Menu\u0027\n\telse:\n\t\treturn \u0027Buttons/Button-Menu\u0027", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "image": { + "height": 32, + "icon": { + "color": "#FFFFFF", + "path": "material/gamepad" + }, + "position": "top", + "width": 32 + }, + "style": { + "margin": 1 + }, + "text": "Control", + "textStyle": { + "classes": "Text-Styles/Docked-Buttons" + } + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.closePopup(\"DevicePopUP\")\n\tsystem.perspective.closePopup(\"StatusPopUP\")\n\tself.custom.show \u003d False\n\tsystem.perspective.navigate(\"/Help\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Help", + "tooltip": { + "enabled": true, + "text": "Navigate to the help wiki" + } + }, + "position": { + "basis": "70px" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "path": "session.props.theme" + }, + "transforms": [ + { + "code": "\tif \u0027dark\u0027 in value:\n\t\treturn \u0027Buttons/Button-Menu\u0027\n\telse:\n\t\treturn \u0027Buttons/Button-Menu\u0027", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "image": { + "height": 32, + "icon": { + "color": "#FFFFFF", + "path": "material/help_outline" + }, + "position": "top", + "width": 32 + }, + "style": { + "margin": 1 + }, + "text": "Help", + "textStyle": { + "classes": "Text-Styles/Docked-Buttons" + } + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.navigateBack()" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Back", + "tooltip": { + "enabled": true, + "text": "Back" + } + }, + "position": { + "basis": "70px" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "path": "session.props.theme" + }, + "transforms": [ + { + "code": "\tif \u0027dark\u0027 in value:\n\t\treturn \u0027Buttons/Button-Menu\u0027\n\telse:\n\t\treturn \u0027Buttons/Button-Menu\u0027", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "image": { + "height": 32, + "icon": { + "color": "#FFFFFF", + "path": "material/keyboard_return" + }, + "position": "top", + "width": 32 + }, + "style": { + "margin": 1 + }, + "text": "Back", + "textStyle": { + "fontSize": 10 + } + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\turl \u003d self.session.custom.download_url\n\tself.session.custom.download_url \u003d None\n\tsystem.perspective.navigate(url \u003d url , newTab \u003d True)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Downloads", + "tooltip": { + "enabled": true, + "text": "Notifications" + } + }, + "position": { + "basis": "70px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "if(isNull({session.custom.download_url}), False, True)" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "height": 32, + "icon": { + "color": "#FF8C00", + "path": "material/cloud_download" + }, + "position": "top", + "width": 32 + }, + "style": { + "classes": "Buttons/Button-Menu", + "color": "#FFFFFF", + "margin": 1 + }, + "text": "Download", + "textStyle": { + "classes": "Text-Styles/Docked-Buttons" + } + }, + "type": "ia.input.button" + } + ], + "custom": { + "show_home_selector": false + }, + "meta": { + "name": "root" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "path": "session.props.theme" + }, + "transforms": [ + { + "code": "\tif \u0027dark\u0027 in value:\n\t\treturn \u0027Buttons/Button-Menu\u0027\n\telse:\n\t\treturn \u0027Buttons/Button-Menu\u0027", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "direction": "column", + "style": {} + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Navigation-Views/Key/resource.json b/com.inductiveautomation.perspective/views/Navigation-Views/Key/resource.json new file mode 100644 index 0000000..d4d42ee --- /dev/null +++ b/com.inductiveautomation.perspective/views/Navigation-Views/Key/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-04-26T10:20:19Z" + }, + "lastModificationSignature": "b0f5e9b1786a8a65c858881880ac11a8a492dac59145bc2bf93a80b54ed06edb" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Navigation-Views/Key/thumbnail.png b/com.inductiveautomation.perspective/views/Navigation-Views/Key/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..109f5a6cca01211780a69b2e58c00ea576342318 GIT binary patch literal 9829 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 Q@c;k-07*qoM6N<$g4)PlTmS$7 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Navigation-Views/Nav_Button/view.json b/com.inductiveautomation.perspective/views/Navigation-Views/Nav_Button/view.json new file mode 100644 index 0000000..ec8c9ef --- /dev/null +++ b/com.inductiveautomation.perspective/views/Navigation-Views/Nav_Button/view.json @@ -0,0 +1,97 @@ +{ + "custom": {}, + "params": { + "direction": { + "downward": false, + "left": false, + "right": false, + "upward": false + }, + "pageid": "" + }, + "propConfig": { + "params.direction": { + "paramDirection": "input", + "persistent": true + }, + "params.pageid": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 45, + "width": 45 + } + }, + "root": { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.navigate(\"/\" + self.view.params.pageid)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button", + "tooltip": { + "enabled": true + } + }, + "position": { + "basis": "45px" + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "path": "view.params.pageid" + }, + "type": "property" + } + }, + "props.align": { + "persistent": true + }, + "props.image.icon.path": { + "binding": { + "config": { + "expression": "if({view.params.direction.upward},\"material/keyboard_arrow_up\",\nif({view.params.direction.downward},\"material/keyboard_arrow_down\",\nif({view.params.direction.left},\"material/keyboard_arrow_left\",\nif({view.params.direction.right},\"material/keyboard_arrow_right\",0))))" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "height": 45, + "icon": { + "color": "#000000" + }, + "position": "center", + "width": 45 + }, + "style": { + "backgroundColor": "#F6F6F6" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Navigation-Views/NavigationButton/resource.json b/com.inductiveautomation.perspective/views/Navigation-Views/NavigationButton/resource.json new file mode 100644 index 0000000..f0a43c0 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Navigation-Views/NavigationButton/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "whealja@amazon.co.uk", + "timestamp": "2022-08-24T10:17:11Z" + }, + "lastModificationSignature": "eda236777a6fe09a312612c0eaf0475b2d9a47596efab02d8e65adc05be5046d" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Navigation-Views/NavigationButton/thumbnail.png b/com.inductiveautomation.perspective/views/Navigation-Views/NavigationButton/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..afad639e948037785e97eb52858336bf0f0e070b GIT binary patch literal 278 zcmV+x0qOpUP)D#h z*<+nrjFR3^N(@ZZg{97IMce9YX0p;<|3?U#EXnTVNh!GB7a{!Ti6gpoQ51oCp661^wgO1eY-4{d54Ila0vgY<45Xnz c9LH_yZ|F=!ZnKoXbpQYW07*qoM6N<$f|Vb6&;S4c literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Navigation-Views/NavigationButton/view.json b/com.inductiveautomation.perspective/views/Navigation-Views/NavigationButton/view.json new file mode 100644 index 0000000..562c9a3 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Navigation-Views/NavigationButton/view.json @@ -0,0 +1,141 @@ +{ + "custom": {}, + "params": { + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "params.tagProps": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 41, + "width": 83 + } + }, + "root": { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tif self.view.params.tagProps[0] is not True:\n\t\tnavigation.additional_view.navigate_to_additional_view(self)\n\telse:\n\t\tnavigation.navigate_to_page.detailed_view(self, self.view.params.tagProps[2],self.view.params.tagProps[2], self.view.params.tagProps[3])" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "basis": "41px" + }, + "propConfig": { + "custom.page_id": { + "binding": { + "config": { + "path": "view.params.tagProps[2]" + }, + "type": "property" + } + }, + "custom.status": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "direct", + "tagPath": "Configuration/DetailedViews.value" + }, + "transforms": [ + { + "code": "\t\n\tjson_decode \u003d system.util.jsonDecode(value)\n\tpage_id \u003d self.custom.page_id\n\tpage_status \u003d json_decode.get(\"AdditionalPages\",{}).get(page_id,5)\n\treturn page_status", + "type": "script" + } + ], + "type": "tag" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "{this.custom.status}" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "State-Styles/Background-Fill/State1" + }, + { + "input": 2, + "output": "State-Styles/Background-Fill/State2" + }, + { + "input": 3, + "output": "State-Styles/Background-Fill/State3" + }, + { + "input": 4, + "output": "State-Styles/Background-Fill/State4" + }, + { + "input": 5, + "output": "Buttons/Clear-Background" + }, + { + "input": 6, + "output": "State-Styles/Background-Fill/State6" + }, + { + "input": 0, + "output": "State-Styles/Background-Fill/State0" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/navigation" + } + }, + "style": {}, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/PowerTable/ColumnSelection/resource.json b/com.inductiveautomation.perspective/views/Objects/PowerTable/ColumnSelection/resource.json new file mode 100644 index 0000000..5f02148 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/PowerTable/ColumnSelection/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "5355db48f4985d2afb9e8d4b0a16738fd00ad258f4a027e351f57ba9fc88b7f8" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/PowerTable/ColumnSelection/thumbnail.png b/com.inductiveautomation.perspective/views/Objects/PowerTable/ColumnSelection/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e000b2540436bf8166e8d3676dedccf150be80 GIT binary patch literal 5991 zcmc(jRa6uJv&WGXq-!Ol1qo?nX;46rZkFzl5|9q*6maS8j-{k)X>gYX6j+)?N?f{| z>-T!U`+gth%R)CnBIFz`(#DQdW}J{@0QJ%I+!Ve<(IZ5Ca3it1K_4 z>ua{3w`;^Qo;^CL1~<*!$?6F8+y1aU2#?O%Ia4*b%+gsg4FKtmRWnEE{vO7&&B&HVBxc#YYoZfSxgo+d+KG z@2D_2%QlKuu=t|hAp)a0c48f%U57;E7Ft{i+B5xOwnLptV74O_=(8v87yt#WR5x4a zDPUS$bdq`)e6f8Jjc;bsWDDgxvMS8<()_zj95So3OQ>#vmp{?$i#yt=%dV0 zk;$UWLnNAW`N<*1yN+Nvm37z~Sk;ktYaq~@9IE>@n18|t_ph!hcPQ^54Wk|OSrSmihnZj_E? zDni3bg-|}aFXwpi5-arXyuCRWX3rcP`eErdraXnsyW?YV1$h-!@Ux*93Fsb?E4@x^ z%?=4)7F)C9AN^4Ekffo}TO7BKSMLVze@MFkaWcrTQ`w2+;XP=9RT2u_B?rA{Q+<#x%A*)z>CCz-p=tpKtVwa+b__0y+K zgurH?6VMdODNZMPM&JY_Qrw{?rj#G*T>87hxrqLg#_0lIEDbZZG(N3YzxaGnbA7J& zyI&xze71OpUM{+@$Vd_hez^(ca^1`8WCJ5rKAl0Tn+Z}oG^}b#OG+l>FRB%k}G~rTv0@RXmWnSP)%CN)+lo= z^LT!ks~@U4b+Pf~uEOKO0S0%|6Vq5rlCB{)w=y)p57)oHOIJHruhkgAs{eAo^fsiF z6`i}yiz4@Nj`J={z(mBb_!|{SNEWS+Fp32=FX*;E%%%)ti!5L1l=w^M5X|=Zd;5aP zXQaIjqVbHmQ+3`~#U~UzoSeF{l~)E;e_0Wz6`GG&8FcB<3|# zZRD*7VYKt5mAZ<4bt-cstdT=;>ivvbX*SF#M0B*Qj8{pAOj_2O&$KqS-QLv8%y?|w zv8$^!pM?1}FdztZ-&}-cIn#DJW~ehA7GMjF2fa@#g>^|k=o9F+LmdsmRM(my?>3&c zzn}`FQc|xJzhS?Csup1H39P=Xq`3?cmn{z0*@&ICceS@ZcRCIc$saki+CK`eCY^a! zfc)N|VWY{HI`6ZruVwr=vs=BjYfR?gMEFJ;`@r5huu!p9#maY667vJC9_GDdEhet$ zeo_IFUNITK0prUzpdVGzL%ZF3zL%9b**3`Mmxczw*#!Jxbdw+x-ADSXfzWiohYHc4 z_28>Mna+39y*C6aVSrH`K%>h1b$E&m-1vHFGCM0zSCCpf3H!|+-`X2y?q+FH|* z&asasH?~7M@RXz1kscqnu0xoh$dHHJ!!NKyl^u0jcH$kY1l_{l^vDVsrHFg!;+6L08ph{> z$;?Hjmc2ZcM+V%6eEGW4XW2Qgq{b)nDi~_A@sh`{dza1 zYAN`PAvdEj-jLqgSO~f*MhN*l%baltwr1~0pkm81_s%oPSe+G*Otzplt4p@M^yoRR z8J}RiyJL8kvN!U~+bg5Jo~v5~=+HtwG+{C%gIzk{3mD1ML4E!zR9hp^lNie%O?^8HfV@gb9t=UhjL$cwdt|MHO%TQbEk(2g-8TI%*X5W zo_)fBgPYV?1P|fZ!YXM zv@Jm|%k2(sz~c|H%qQb?5w)(2iq_K(!V1t3jWDL7_tsX2 z%5&Y6U;UpvBw_->qnHZ{DeI0aR{?fz0TQ>j_B0GX|5J9YBVF*h`;Qtx57MkMIs zIyD~B5F{4yyc*D-G89hxyVJMV4EOcExSUHz)7AWyi1N`GLS2~cENk=5i>1Qm7u<0Ts-gBNfdX3ocfWdGknZ~WeJ^ndYV?uFOcRQ zVV4k^Z-nwG7Sk<37Frggdtb{8rb~oWK}bZbZL@Y8b;TfWT0i8_G55kGx4`w1%cifl zdM;sMI7lDG@xAB%SL=G*8W;B6h#8E&n{9D*z43*9qm6F%pvek9kj_)+N2z@Pb}E5xv$h4BJwkcl30VM&a?QRx?e zJnJU8@X)GTRe-YQZF+IOAP94E2mr8uQKC4D8k&#LFL&Q-FYoLU$(F8~UeBhbDk$Bh z@odu+V4@NR<(}>fX1UJPe!J`vHDzHyT6yM2{6;Z<_WQng1}R^&0G-l*B*MB8$WdjP zzVy=bb_mBquei8X>s?Sx1~~4kfP-o2sYjyNQ}GlQxGv@O6V%;Y7(y`F(WtXvE5BNU zsgiV+cB~t4B5&htF~FNfhtl*@{TjDx#X#}LWl%1ZT*Y%k{C*ykJf?WBKI$A-Dj824 zZ!Mkh3k;PLPDrU5+l%mX4-(BP;tiCbE-9}AQ8VvC5x-+B&zMMYh{&Fc?0eEF5<*NLq3PIvZg^sMCN$eJY1FsYS>^#`~+z>kHvHmkqpuD1uFlP)IIIVwe=46*Im4>+? zd)nW1Fqn2gWnMMlcC7!G&bf)_iq$!dVn=F=TQ5fTE|iIin) z-QTRt<^&Fpo1Uwa+J~0N^1RbwJ8c}EJ-_W0T+|JB1NPhSut#z$0&)j^#s70JCTqD1>v&`G<&IWmVm5 zLe~ZH@~!>ee6Mh<{X*LrkX|dYu;H}Vb>rY6-P7yYHaU<`Wr#lvf7I@Wxq^^v{kR=j zjUDuMkm^Bd&CM&a@=c_*;o!38DFKynbq{x*ykb3<|^C%nca4?X( zIj<+l?^%9orzB`R(za9a&(}Q2q)<$0V!q)_hqpZ43kbbeQ2}}RQ`?(=W|W12_LY^J z2tK&mL0*WxI_mz<*dB{_>$zg-ldb5kn^vE>o8dZw+usK>KjXM51Kl9L!+ALcYtoWp zs~3bmpAoLN;b@iCM%(s#4?SiW5qD$YnSAd_B$^p@Ah7Xm>f>zE*N>?ziOvq6gKe$t z$1A;5!zv)<<~6$q-xuHsEpGO9b>&$gale_vPt*8rIYuRvy0GYdPZfv-J?nvN-ZlHb zRqstV9h)ErB@gl91`LacEO(p_c9c~`&e}ep-{+Pm=7n2#^@fig&WjU-cbeZgt5x!| z6<2gV9L)KgbD?S5)ddmOunWJ%zPWkm%Cr2X7C}g%6EeVA=+)Ys$4cmYZO7#HN%*tV zj>!O6M2?-+RVAT1nQ{fl>r*HeK>Av`hKz_2m-=uFWBg~^Ygo7 zCilKBI!fxGEHdG8d}_VjiJNShF4u(kh1-W~q7N$$^nLLx-DL!Bc>|h=LvTROpfKH-S5iumF+aoq7p&3GT%RfQ zrV+${5A2}Zui%-%s?@th=UE}l3F zQbOXD45?E_6B8?7KCy2&Ct*4)W7z$Uhw|z0PgP+`I5X<;<-qi8y=ct(0=#UE5t9yf z*rPf|DG+R#-Z;BE9UNE6@(?tsd^Nbfv9NagPurQ#Qf@;ghv5RpgHw$B)>O&DIIIs( z#vRUBXa`Ykob6^>&AzGSyQiTeMNbLom{GpblsI^X6`be@L=%mjqHZ*pb=qN*C7oR^ z8`{rDw9(?o;`g(@>E%%qolDz%qe<*lL(}ZWDG`3BC>H+nzDYviNw{nYReE3jzhtsU zeLScc*_pqcU_pBY89Vk@Id@8MS!wIjJ#F>3f!m@)@2(o`9wo5|U9?4b{ZgP z4h^VGR+rNCGekGnp1ajS{BIzxi0JF|Xm0b_dglOaHH|M-XyRy%t_U?E$(BbRXH8|a zSlR@+DJa3ye`$KwD;Y4!g(g7=3TNfcz^aWSN-oIIcer4JOp!U2u&~FO<8|Hxn&E2x zfG#&qa(~+;{LgtaH$$1Z$gAxR2fv_R97w_HheC6EPskLG~Vn*%}CCGwRUfd{eBuZDr^G6QCSwMG5wvNKBZw(-!WL+14D# zt+K9mD8 zOH6z;Z4P<#hc7>I`FZ>PNs35%b0)rj0FwMJV8*Q(PHT11D>1O=qGu@Sr;&Brnu!mx z7v#Svu_>=gzWqkc!$Crwj$Fm-=OJcY@igDu7F7_meh{)Y-=W@;*5*YL6VLN&t%TUIjtq> zX{hK{zfF=klbL`1Os2wrVoaHVzs~Tu6@Q`L}Q(hA#nf zIjA;yh5=-S=qFRxv2>J5qMi|j;G;*eRO%;0|Eh`NLn1pq7*MBN`E`2!kZwK_e;Gsw zx{sBsi}C|Q*>&E#0pL#@A;qq32cU;TE&{iCabCKwzDX&QE5d7VlYho3aD1<90k8lWy9vf7h5Ee?_E1Ny=wJ-XR=5-v)@fkg$Qhxm=l_}74 k_3P8(*^S;x#^Q}W0m@z^WK#m~N&o-=07*qoM6N<$f?0;>0ssI2 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Objects/PowerTable/ColumnSelectionTile/view.json b/com.inductiveautomation.perspective/views/Objects/PowerTable/ColumnSelectionTile/view.json new file mode 100644 index 0000000..4192b88 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/PowerTable/ColumnSelectionTile/view.json @@ -0,0 +1,84 @@ +{ + "custom": {}, + "params": { + "Hidden": true, + "Name": "Planned_Stop_Or_Not_Used" + }, + "propConfig": { + "params.Hidden": { + "paramDirection": "inout", + "persistent": true + }, + "params.Name": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 37, + "width": 200 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "ColumnSelect" + }, + "position": { + "basis": "36px" + }, + "propConfig": { + "props.selected": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.Hidden" + }, + "type": "property" + }, + "onChange": { + "enabled": null, + "script": "\t#Use previous value. If you\u0027re clicking -, you want to remove then toggle to +. Vice versa with clicking +.\n\tif getattr(previousValue, \u0027value\u0027, None) is not None:\n\t\tsystem.perspective.sendMessage(\u0027column-visibility\u0027, {str(self.view.params.Name): previousValue.value}, scope\u003d\u0027page\u0027)" + } + }, + "props.text": { + "binding": { + "config": { + "path": "view.params.Name" + }, + "type": "property" + } + } + }, + "props": { + "checkedIcon": { + "path": "material/add" + }, + "indeterminateIcon": { + "path": "material/add" + }, + "style": { + "fontSize": 12, + "overflow": "visible" + }, + "uncheckedIcon": { + "path": "material/remove" + } + }, + "type": "ia.input.checkbox" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "overflow": "visible" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuGroup/resource.json b/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuGroup/resource.json new file mode 100644 index 0000000..13d0b7e --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuGroup/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "042a5f32b94dbea311e35657f7cb1aec712b6e41ce83b2678546c81c6a4e9774" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuGroup/thumbnail.png b/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuGroup/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..cc584ec5e103f6f5efe7669d54a29277c28a8eba GIT binary patch literal 2377 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 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuGroup/view.json b/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuGroup/view.json new file mode 100644 index 0000000..00dc9bb --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuGroup/view.json @@ -0,0 +1,171 @@ +{ + "custom": { + "filter_list": [ + { + "color": "#8B008B", + "filter_id": 5, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + }, + "text": "CP30" + }, + { + "color": "#8B008B", + "filter_id": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + }, + "text": "CP71" + }, + { + "color": "#8B008B", + "filter_id": 4, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + }, + "text": "CP72" + } + ] + }, + "params": { + "filters": [ + { + "color": "#8B008B", + "column": "controller", + "group": 0, + "id": 3, + "text": "CP71" + }, + { + "color": "#8B008B", + "column": "controller", + "group": 0, + "id": 4, + "text": "CP72" + }, + { + "color": "#8B008B", + "column": "controller", + "group": 0, + "id": 5, + "text": "CP30" + } + ], + "group_name": "value" + }, + "propConfig": { + "custom.filter_list": { + "binding": { + "config": { + "path": "view.params.filters" + }, + "transforms": [ + { + "code": "\tinstances \u003d []\n\tfor filter in value:\n\t\tinstance \u003d {\"instanceStyle\": {\n\t\t \t\t\t\"classes\": \"\"},\n\t\t \t\t\t \"instancePosition\": {}}\n\t \tinstance[\u0027text\u0027] \u003d filter.text\n\t \tinstance[\u0027color\u0027] \u003d filter.color\n\t \tinstance[\u0027filter_id\u0027] \u003d filter.id\n\t \tinstances.append(instance)\n\t\n\treturn sorted(instances, key\u003dlambda d: d[\u0027text\u0027])", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "params.filters": { + "paramDirection": "input", + "persistent": true + }, + "params.group_name": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 178, + "width": 214 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Title" + }, + "position": { + "basis": "32px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "expression": "UPPER({view.params.group_name})" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "borderBottomStyle": "solid", + "borderBottomWidth": 1, + "classes": "Title/Text", + "fontSize": 13, + "marginLeft": "10%", + "marginRight": "10%", + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Filters" + }, + "position": { + "basis": "138px", + "shrink": 0 + }, + "propConfig": { + "props.instances": { + "binding": { + "config": { + "path": "view.params.filters" + }, + "transforms": [ + { + "code": "\treturn sorted(value, key\u003dlambda d: d[\u0027text\u0027])", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "alignContent": "flex-start", + "direction": "column", + "path": "Objects/PowerTable/FilterMenuItem", + "style": { + "marginBottom": 5, + "marginLeft": "12%", + "marginRight": "12%" + }, + "useDefaultViewWidth": false + }, + "type": "ia.display.flex-repeater" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "overflow": "visible" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuItem/resource.json b/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuItem/resource.json new file mode 100644 index 0000000..b5a2845 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuItem/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "362d7b7a0c9428fa8665f4cc724d263e16ef92e5a6d34b5035722fbb6ec9f915" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuItem/thumbnail.png b/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuItem/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..4b9da024338ee096a917e9fdff2e7db70b82f5ba GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^fk4c{!2~2L*SV+yDJM@C$B>G+yAwC^GAMAc+?{4P zlZz>6!9_Pt;XhNS=j++0weJpRJ+k7FfM6)&Mf26K_DOC1lf7@Ql9S7sIWyC~@fk#{ YJGtrA``)$XK+_mJUHx3vIVCg!03#PE#sB~S literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuItem/view.json b/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuItem/view.json new file mode 100644 index 0000000..7841930 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterMenuItem/view.json @@ -0,0 +1,172 @@ +{ + "custom": {}, + "params": { + "active": false, + "color": "", + "id": "", + "text": "" + }, + "propConfig": { + "params.active": { + "paramDirection": "inout", + "persistent": true + }, + "params.color": { + "paramDirection": "input", + "persistent": true + }, + "params.id": { + "paramDirection": "input", + "persistent": true + }, + "params.text": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 28, + "width": 183 + } + }, + "root": { + "children": [ + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.sendMessage(\u0027activate-filter\u0027, payload \u003d {\u0027id\u0027:self.view.params.id}, scope \u003d \u0027page\u0027)\n\tself.view.params.active \u003d True " + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "AddButton" + }, + "position": { + "basis": "30px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "!{view.params.active}" + }, + "type": "expr" + } + }, + "props.color": { + "binding": { + "config": { + "path": "view.params.color" + }, + "type": "property" + } + } + }, + "props": { + "path": "material/add", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.display.icon" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.sendMessage(\u0027deactivate-filter\u0027, payload \u003d {\u0027id\u0027:self.view.params.id}, scope \u003d \u0027page\u0027)\n\tself.view.params.active \u003d False " + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "RemoveButton" + }, + "position": { + "basis": "30px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "{view.params.active}" + }, + "type": "expr" + } + }, + "props.color": { + "binding": { + "config": { + "path": "view.params.color" + }, + "type": "property" + } + } + }, + "props": { + "path": "material/remove", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "FilterText" + }, + "position": { + "basis": "153px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.text" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Page/Text", + "fontSize": 12 + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "root" + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "deactivate-filter", + "pageScope": true, + "script": "\t# implement your handler here\n\tif payload[\u0027id\u0027] \u003d\u003d self.view.params.id or payload[\u0027id\u0027] \u003d\u003d -1:\n\t\tself.view.params.active \u003d False", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterTile/resource.json b/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterTile/resource.json new file mode 100644 index 0000000..212f0a6 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterTile/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "b7fee667758367985e1153d9364a1122b4598435b9735d1fa2d0f6f1b44d2faf" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterTile/view.json b/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterTile/view.json new file mode 100644 index 0000000..596b166 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/PowerTable/FilterTile/view.json @@ -0,0 +1,157 @@ +{ + "custom": {}, + "params": { + "color": "#FF3535", + "id": "", + "text": "Active, Unacknowledged" + }, + "propConfig": { + "params.color": { + "paramDirection": "input", + "persistent": true + }, + "params.id": { + "paramDirection": "input", + "persistent": true + }, + "params.text": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 16, + "width": 193 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "FilterColor" + }, + "position": { + "basis": "11px" + }, + "propConfig": { + "props.style.backgroundColor": { + "binding": { + "config": { + "path": "view.params.color" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "borderBottomLeftRadius": 5, + "borderTopLeftRadius": 5 + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "FilterText" + }, + "position": { + "basis": "149px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.text" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Page/Text", + "fontSize": 12, + "marginLeft": 10 + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "Left" + }, + "position": { + "basis": "169px" + }, + "props": { + "style": { + "overflow": "visible" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.sendMessage(\u0027deactivate-filter\u0027, payload \u003d {\u0027id\u0027:self.view.params.id}, scope \u003d \u0027page\u0027)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "DeactivateButton" + }, + "position": { + "basis": "25px" + }, + "props": { + "path": "material/close", + "style": { + "cursor": "pointer", + "marginRight": 5 + } + }, + "type": "ia.display.icon" + } + ], + "meta": { + "name": "Right" + }, + "position": { + "basis": "25px" + }, + "props": { + "justify": "flex-end" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "justify": "space-between", + "style": { + "borderBottomLeftRadius": 5, + "borderBottomRightRadius": 5, + "borderStyle": "solid", + "borderTopLeftRadius": 5, + "borderTopRightRadius": 5, + "borderWidth": 1, + "classes": "Page/Page", + "overflow": "visible" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/Input/Generic Numeric Input/resource.json b/com.inductiveautomation.perspective/views/Objects/Templates/Input/Generic Numeric Input/resource.json new file mode 100644 index 0000000..e5f5340 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/Input/Generic Numeric Input/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "c688472fe4a4f5d17e8f6112d802b2008a083e34e0dcace3bd6e105b91cf94e7" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/Input/Generic Numeric Input/thumbnail.png b/com.inductiveautomation.perspective/views/Objects/Templates/Input/Generic Numeric Input/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..4fbefa79dfe57289295106773770f1c0e1699ba2 GIT binary patch literal 327 zcmV-N0l5B&P)0003FNkl zzu%ONmXYcFLLv;nu!vf;KcaWBLu$EWdZlAp1)WfOCD6u*{$+{tcK{KPF)$A3TNXce zd-&3$HVOIsg2D`L({@DkE>SVHVHgOYV&PyM6bnQ^2D%(wfRd@LTUv4G{C&C}Ap%08 z3~KdD?UPG^5=<;?j7-dQM#wJ1l%+LdVrBu_DVP)xoYh000BrNkl2s_03+%r1vFbkbv2UxDnzS@o*ve|aKZMT(n6X`GOcxKM4hbN20VwY}y`hEB_tml`{2cXZNhd=pl z=j)fL*;KV0&#=Iio*=aNHbnhUl*@unaaxvt5ZdGB^ttoJ$|2J}1wPVE_ZG*~6_Pxg zBNTYRyMPZu0e}dhZ+R%FW(Js>4??QpIv)BmRIL9Yjz~vEo`=`n zoT86gxPDCGt4ADHdc^UX9&x;;4;6?0-&lGl9QeMyn!wK+88$TS<%nTjja+ZH)Scb$ zPu*K~cf+gK>%`k-*W=eV~$(tDKt4mf<cI1d{lQU{;m6i& zJi)mvCk{u--1NtyG@M$xW(p(CFwAD7)#79u`eRuc@B@~Yb;DpgT!E%H6E)l*{I580 zSDN6|lR_a|Jc)ST1r&%(cDx74J(X~X=^)4>$UZ3JOYx@U!3l9I;>R!CX zCBxgqVIvVs7CQqXPW2|p5IG{p^cs~zUNJ|*pH_E@mHI{`%dx#kEIq;}%U zF}UYFND_r+zg?|m=>1SQb0#ZUk|bzmHrGq}{Yd&i(wttc6wg&MB$>#SDXLI8t|ckj zLP+U%i7Zp1_UN91e03|D#{U{dXZ4ME4J?pl1ALBb2im~L@tfuSUA+ZI@N|_*bS0V~ zt3wT63chDYBSc$-6Rtz%nRfLs-4v{;xUoZtD!})PJ05QDl9Cgcx`T1_+4{;x-iClm zW^(&SThT*RS2n{0H}?Y%miMz;WD{JV!AWI3nwKWx%NIZIGg6~K{rF3IGMgo0xoYh0009PNklscH{?>O>g%d6o4)T`FKP>Iw~b98hLQl?1_vB&0m8a50b+=`d+Zs{*e33A z(`LJi)R$EP50ySy=gfV6GiQ#uZK=JP?W}+5->=wPWwKQwnR-w%q255sf8IK0booQ8r(J<1PojfI0SHz zwS0^pSggHmxQ$~At+yHW*Uvk{Qg$jWj|MTrIe%klvwJQY|lF@Z$ z0XYoQ22ikp!1(53X5yd(S=S{&w{NvyhcGN=5%y!pYva31Z)#T`E+mZ}MWxZygk4b= zGQInC1Fp@km@~I**D$QHNp0#N>^PneDG*v>+oR6awM{S?PO!~9P=^I0KuZ?5$i|S% znKKw8!sh0}+$#uoFQtZfId*yp8ULhOKW&d-=Y4(j`K)zZYnj-V_QgozuxGH@WO!Vv zw}*sSMCRTD_Dqe`SwOVmq;7t0(e8^iw^XNgo_3`Aj05EL`gSMDpP1xD?^jo%3$^ zRXCMz_Qod2(U9{`!-=*&Jxm89#D%>=LygB0hjK*_4?ovyFTy+JmOjH2{X3La5V##@ zA-wirt(10QLsn5iihIoBGQ{mzqT?OH0O=&3!bKE5xXqmjnP4u*8DLx7Djpu6vp}6`_$JybZVwswi)9VqQ(V-h+8mGga(Zp3gQw)B!G<~iu7WdOia4G^dZjl zH^ZI#-E-~?=evgsIV+}xLRL8Ah1ahZD4)xw0tfp}Pbi*Mrnm6!*M?$9)pVl33Z?vcm^EX(c@Lu!O^QWaTWFbU*OlcITEg@`vIa&$!*E9LEd& z!F;j#3a=Q5yhz94y;Cg5FjZwL`j3u!x^>&g#xLpvmU0Eq{#c9#{g-r=?+%tq*L4Id z*4iD@ZXdo7dGmG$c+knmd?-;Z;;yrT)G7wzg?^ockrbVa?R*K$^l=DwljXY58`_<- zc^|!6APh^WV)wettlhbjB}q4}}ZSGvMb#d4!PHwxTkhK_rr0?=jNv2di|6R(IW zLLUTl2GB7s_0xhUuLU9?1JiBvK@2XPOYLK`5 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label/view.json b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label/view.json new file mode 100644 index 0000000..946df88 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label/view.json @@ -0,0 +1,68 @@ +{ + "custom": {}, + "params": { + "stylePath": "value", + "text": "value" + }, + "propConfig": { + "params.stylePath": { + "paramDirection": "input", + "persistent": true + }, + "params.text": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 30, + "width": 210 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "209px" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "expression": "{view.params.stylePath}" + }, + "type": "expr" + } + }, + "props.text": { + "binding": { + "config": { + "expression": "{view.params.text}" + }, + "type": "expr" + } + } + }, + "props": { + "style": {} + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "root" + }, + "props": { + "alignItems": "center", + "justify": "center", + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_CenterAlign/resource.json b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_CenterAlign/resource.json new file mode 100644 index 0000000..d56f9aa --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_CenterAlign/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "06d57baccc7fb39326e99dfea475efcce07ccbacf54459b186edd0c155395ba1" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_CenterAlign/thumbnail.png b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_CenterAlign/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..ac549f0d25888cf5fd3e4716a49c9220e8d1efbe GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^@j%SV!2~4NST8pQQl6eJjv*Cs$pX@>I~bXF9nf%K zYPKjja#U4Cg?)X?0r#?=hy{CH7Q29JZAR(oqN}2+1zn@ eB*ZN0#PCe7M%DS=zb!yR89ZJ6T-G@yGywp|f+%tT literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_CenterAlign/view.json b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_CenterAlign/view.json new file mode 100644 index 0000000..016aab8 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_CenterAlign/view.json @@ -0,0 +1,58 @@ +{ + "custom": {}, + "params": { + "text": "value" + }, + "propConfig": { + "params.text": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 30, + "width": 210 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "209px", + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "expression": "{view.params.text}" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "classes": "Text/CenterAlign_with_Padding" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "root" + }, + "props": { + "alignItems": "center", + "justify": "center", + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_LeftAlign/resource.json b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_LeftAlign/resource.json new file mode 100644 index 0000000..caff74c --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_LeftAlign/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "0ca93bdfcf583b6cef05bd9e9b969e861af11e537426c518c5f4f8ec5c5d36d1" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_LeftAlign/thumbnail.png b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_LeftAlign/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..8f01e41b8b6f3908fc77ad37e10003c0bd5bd812 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^@j%SV!2~4NST8pQQcpZx978JNl0U3}vx$r2d2)h4 zQi6aC3&#td1<6lTkJfZa-Q9euQDuT{z`10OSzB&xtXkBQzGYATo;l|aC@(N>=)2gZ z$?+ok-Q}GE9!xixpW3v2kenU!YT2nB?pi;NoUA^cq~vpl6@s=W3d7mc7%uRX= z>RBhSZ2D-?zpUe+rsn+6}Ltla$k&e@rr zR#V~x+OT7ed-f3pB^3=VB_%b*&Q6u3OLqKZSzWF6WY=v*Ne8`UQc;S9g@THTf{BU> goGFV>U*cwD(5=2E+T!1O3g}-3Pgg&ebxsLQ05r325C8xG literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_LeftAlign/view.json b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_LeftAlign/view.json new file mode 100644 index 0000000..d554ba8 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_LeftAlign/view.json @@ -0,0 +1,58 @@ +{ + "custom": {}, + "params": { + "text": "value" + }, + "propConfig": { + "params.text": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 30, + "width": 210 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "209px", + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "expression": "{view.params.text}" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "classes": "Text/LeftAlign_with_Padding" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "root" + }, + "props": { + "alignItems": "center", + "justify": "center", + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_RightAlign/resource.json b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_RightAlign/resource.json new file mode 100644 index 0000000..01ba7be --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_RightAlign/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "bb306833584878d2e43268c5b636724521f396c487325c652b74dcbd16fa016f" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_RightAlign/thumbnail.png b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_RightAlign/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..c1dcae3eb238b685d7aecf100e1fcd473f2efbae GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^@j%SV!2~4NST8pQQr4a>jv*Cs$v;fF3YghS8Uq_x z+??6De{eD>9Lso-!1x~szCZuI{^A8k<^v|5-{0TA_w{r6-Cu=HFfc6Kl6U0SLyKoX PV;DSL{an^LB{Ts5t%)kt literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_RightAlign/view.json b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_RightAlign/view.json new file mode 100644 index 0000000..998ac83 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_RightAlign/view.json @@ -0,0 +1,58 @@ +{ + "custom": {}, + "params": { + "text": "value" + }, + "propConfig": { + "params.text": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 30, + "width": 210 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "209px", + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "expression": "{view.params.text}" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "classes": "Text/RightAlign_with_Padding" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "root" + }, + "props": { + "alignItems": "center", + "justify": "center", + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_legend/resource.json b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_legend/resource.json new file mode 100644 index 0000000..9b608a7 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_legend/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "d98d49b989e27566aaa84a5f2dd4e1daee08d1264e9c9bd4e62006c7990e5360" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_legend/thumbnail.png b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_legend/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..4b495d84d0f94a6da7c5fed52d832591878323f7 GIT binary patch literal 4145 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 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_legend/view.json b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_legend/view.json new file mode 100644 index 0000000..6fe6401 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/Labels/label_legend/view.json @@ -0,0 +1,710 @@ +{ + "custom": { + "font_size": ".57vmax" + }, + "params": {}, + "propConfig": { + "custom.font_size": { + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 149, + "width": 423 + } + }, + "root": { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "160px" + }, + "propConfig": { + "props.textStyle.fontSize": { + "binding": { + "config": { + "path": "view.custom.font_size" + }, + "type": "property" + } + } + }, + "props": { + "text": "Color Legend", + "textStyle": { + "paddingLeft": 5 + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_4" + }, + "position": { + "basis": "35px", + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#3B3B3B", + "borderColor": "#CAC3C3", + "borderStyle": "solid", + "borderWidth": 1, + "overflow": "hidden", + "paddingLeft": 5 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "148px", + "grow": 1 + }, + "propConfig": { + "props.textStyle.fontSize": { + "binding": { + "config": { + "path": "view.custom.font_size" + }, + "type": "property" + } + } + }, + "props": { + "text": "MHE Stopped" + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer", + "tooltip": { + "enabled": true, + "sustain": 1500, + "text": "MHE is stopped (State2)" + } + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.style.backgroundColor": { + "binding": { + "config": { + "path": "session.custom.colours.state0" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "borderBottomLeftRadius": 4, + "borderBottomRightRadius": 4, + "borderTopLeftRadius": 4, + "borderTopRightRadius": 4, + "marginBottom": 0, + "marginLeft": 10, + "marginRight": 5, + "marginTop": 1, + "overflow": "hidden", + "paddingLeft": 10 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "148px", + "grow": 1 + }, + "propConfig": { + "props.textStyle.fontSize": { + "binding": { + "config": { + "path": "view.custom.font_size" + }, + "type": "property" + } + } + }, + "props": { + "text": "MHE Running" + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_0", + "tooltip": { + "enabled": true, + "sustain": 1500, + "text": "MHE is running (State3)" + } + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.style.backgroundColor": { + "binding": { + "config": { + "path": "session.custom.colours.state5" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "borderBottomLeftRadius": 4, + "borderBottomRightRadius": 4, + "borderTopLeftRadius": 4, + "borderTopRightRadius": 4, + "marginBottom": 0, + "marginLeft": 5, + "marginRight": 10, + "marginTop": 1, + "overflow": "hidden", + "paddingLeft": 10 + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "45px", + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#3B3B3B", + "borderColor": "#CAC3C3", + "borderStyle": "solid", + "borderWidth": 1, + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "148px", + "grow": 1 + }, + "propConfig": { + "props.textStyle.fontSize": { + "binding": { + "config": { + "path": "view.custom.font_size" + }, + "type": "property" + } + } + }, + "props": { + "text": "Healthy" + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.style.backgroundColor": { + "binding": { + "config": { + "path": "session.custom.colours.state5" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "borderBottomLeftRadius": 4, + "borderBottomRightRadius": 4, + "borderTopLeftRadius": 4, + "borderTopRightRadius": 4, + "marginBottom": 0, + "marginLeft": 10, + "marginRight": 5, + "marginTop": 1, + "overflow": "hidden", + "paddingLeft": 10 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "148px", + "grow": 1 + }, + "propConfig": { + "props.textStyle.fontSize": { + "binding": { + "config": { + "path": "view.custom.font_size" + }, + "type": "property" + } + } + }, + "props": { + "text": "Diagnostic" + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_0", + "tooltip": { + "enabled": true, + "sustain": 1500, + "text": "Diagnostic Information" + } + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.style.backgroundColor": { + "binding": { + "config": { + "path": "session.custom.colours.state4" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "borderBottomLeftRadius": 4, + "borderBottomRightRadius": 4, + "borderTopLeftRadius": 4, + "borderTopRightRadius": 4, + "marginBottom": 0, + "marginLeft": 5, + "marginRight": 10, + "marginTop": 1, + "overflow": "hidden", + "paddingLeft": 10 + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_0", + "tooltip": { + "enabled": true, + "sustain": 1500, + "text": "Healthy, no active alarms" + } + }, + "position": { + "basis": "45px", + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#3B3B3B", + "borderColor": "#CAC3C3", + "borderStyle": "solid", + "borderWidth": 1, + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "148px", + "grow": 1 + }, + "propConfig": { + "props.textStyle.fontSize": { + "binding": { + "config": { + "path": "view.custom.font_size" + }, + "type": "property" + } + } + }, + "props": { + "text": "Low", + "textStyle": { + "color": "#000000" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer", + "tooltip": { + "enabled": true, + "sustain": 1500, + "text": "Running at reduced capacity" + } + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.style.backgroundColor": { + "binding": { + "config": { + "path": "session.custom.colours.state3" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "borderBottomLeftRadius": 4, + "borderBottomRightRadius": 4, + "borderTopLeftRadius": 4, + "borderTopRightRadius": 4, + "marginBottom": 0, + "marginLeft": 10, + "marginRight": 5, + "marginTop": 1, + "overflow": "hidden", + "paddingLeft": 10 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "148px", + "grow": 1 + }, + "propConfig": { + "props.textStyle.fontSize": { + "binding": { + "config": { + "path": "view.custom.font_size" + }, + "type": "property" + } + } + }, + "props": { + "text": "Medium" + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_0", + "tooltip": { + "enabled": true, + "sustain": 1500, + "text": "Controlled stop" + } + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.style.backgroundColor": { + "binding": { + "config": { + "path": "session.custom.colours.state2" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "borderBottomLeftRadius": 4, + "borderBottomRightRadius": 4, + "borderTopLeftRadius": 4, + "borderTopRightRadius": 4, + "marginBottom": 0, + "marginLeft": 5, + "marginRight": 10, + "marginTop": 1, + "overflow": "hidden", + "paddingLeft": 10 + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "basis": "45px", + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#3B3B3B", + "borderBottomLeftRadius": 4, + "borderBottomRightRadius": 4, + "borderColor": "#CAC3C3", + "borderStyle": "solid", + "borderTopLeftRadius": 4, + "borderTopRightRadius": 4, + "borderWidth": 1, + "overflow": "hidden", + "paddingLeft": 1 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "148px", + "grow": 1 + }, + "propConfig": { + "props.textStyle.fontSize": { + "binding": { + "config": { + "path": "view.custom.font_size" + }, + "type": "property" + } + } + }, + "props": { + "text": "High" + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer", + "tooltip": { + "enabled": true, + "sustain": 1500, + "text": "Uncontrolled stop" + } + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.style.backgroundColor": { + "binding": { + "config": { + "path": "session.custom.colours.state1" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "borderBottomLeftRadius": 4, + "borderBottomRightRadius": 4, + "borderTopLeftRadius": 4, + "borderTopRightRadius": 4, + "marginBottom": 0, + "marginLeft": 10, + "marginRight": 5, + "marginTop": 1, + "overflow": "hidden", + "paddingLeft": 10 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "draggable": true, + "id": "K1uUHAix", + "modal": true, + "overlayDismiss": true, + "resizable": true, + "showCloseIcon": true, + "title": "Legend", + "type": "open", + "viewPath": "PopUp-Views/Legend", + "viewportBound": false + }, + "scope": "C", + "type": "popup" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "basis": "168px", + "grow": 1 + }, + "propConfig": { + "props.textStyle.fontSize": { + "binding": { + "config": { + "path": "view.custom.font_size" + }, + "type": "property" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/legend_toggle" + }, + "style": { + "backgroundColor": "#555555" + } + }, + "justify": "start", + "style": { + "backgroundColor": "#555555", + "paddingLeft": 8 + }, + "text": "DETAILS" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#555555", + "marginBottom": 0, + "marginLeft": 5, + "marginRight": 10, + "marginTop": 1 + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_2" + }, + "position": { + "basis": "45px", + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#3B3B3B", + "borderColor": "#CAC3C3", + "borderStyle": "solid", + "borderWidth": 1, + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_6" + }, + "position": { + "basis": "800px", + "grow": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "classes": "Background-Styles/Controller" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Log_Table/resource.json b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Log_Table/resource.json new file mode 100644 index 0000000..f5a2fc4 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Log_Table/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "d6456d87111a4d77b947cae139502a425f551a7d2474e675d6bab666810042bf" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Log_Table/thumbnail.png b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Log_Table/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..a117e46ab6657d89f9513a9ec33bc4a6e7b218b5 GIT binary patch literal 2638 zcmeH}dsNcd7RSLJP9=7)In9`+GlnvmW+R#J>W-G8`M749m5?Pm`NCjS2m_~98h3nw zj|5Hhj@p!7u}lpgphGpHk_nnGe2^e%iVD8)0rQ*x=AW5=??0Wj_F8A1{l`B0bH4k# z4kf_P6SDijZV(6rL3nutf18975ZSsp)5R7}4~ z*YrF2dY$DW<&T)8bxFFJa`^#@#Ba|&rE%mOFQ%Aec2&rF)4~_tPL8+Nmu6>Y6B2*vmfaIVbm`$EcMiHFMbOH8jp%YW(k5PC zBj$X4k++C{vKZTDpyWc)q108?%G?N(Fh%!}108Hl6=B}7P}P=kZXu;ic_RkNaa$8)xJ3^2I+0WT0hq+|(@X`WrFL!HYWN2q(g8A}H6)Ov# zH<0s{e!I6bF6I48itFfo*#4r4{oC!qnF!UZV;2TTk;;JS+J3=z6l;EtqktD zNn2{$wpS0$Uo(N3@oqs^BL{WOQgS{IHduJM&tFe&M&4ZHrSF{|YjyEOTuT!KRd!|? zX~&53x3ycVlnx);*1UH0dVdJ2!f_sW+1sn54;J}XXpJdqXzLYHwOe z-nGH)0)YSx$&W;D(Hd{>EH_j$mixkzN0-I89=Daj>vRd#)6@w!b?#SciZt*ERU9#$ z*Cv~(9b~VL5#hWpTW)ddpfRR}ntS-tt<~WemJBbd^riee*g14QcChyA=9aRXD3V%s z%rP0gtKjbWM}8F^g#TtBQthIUm#tQYqL{uZF{inFD0;-crKc|JK$a-aI_aowte6zG zR%qG$B;rV1C-TPN@rpxE^itQQx9%G&b3Qce{L|~dJ;M&wMfv+hrsuCm9C5Ht2+Ym1 zm=tAImmyOYUln&x%z|;nMEK=*0Yk?sJwwea?A*JavAQcHugXuVRH{%2+ATkI>Z_i@ z3&Mq7qBr9~G9i42!=jr`{aIeR%eRKGuAFL=0X6oq!F{5FEpOK~>z=XPlQY{;Le{7O z#x5?E8O(|fwDTdU3 z-rp_XNZG0SfiAiC1=5kAj7W-8b6$@h3Wz^m9{$+pXl_IGleFxnREy|5n|`jQlVKmD zQQ|if1a~OlNuPakn5jm#Mqv%?Ex|jQs;3_@BYp5)HjNSB`diC0z_cUDU(`Y~;sM2@ zea4ltu8^85^vn_Ij;jcxxv^FvR<^y?>uiw&h68#V{yg#HJ0H+N=&o)tt87kP0om4+WnAQp!d|(`O01%!as;6Pp72)H4nY2E!RQ)%|z}03L_K!NB|Z z`6x-!MB9(8#8t&`{l||iZb?bW80YF5JR0O6{GOKvfy3eH`Ujoy3lo~Hjr3FF`-!0V z7rn1DjiaKXvQ3<@YYP(hJ)8|i^IgzS;m>b~D%ouIKA4}$DbnWP)9ZjExncYD+AO>gK&hH^HRowsp literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Log_Table/view.json b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Log_Table/view.json new file mode 100644 index 0000000..9dd7586 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Log_Table/view.json @@ -0,0 +1,1123 @@ +{ + "custom": { + "filter_menu_data": [ + { + "filters": [ + { + "color": "#8B008B", + "column": "test1", + "group": 1, + "id": 0, + "text": "value1" + } + ], + "group_name": "test1", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "filters": [ + { + "color": "#00CED1", + "column": "test2", + "group": 2, + "id": 1, + "text": "value2" + } + ], + "group_name": "test2", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + } + ], + "filtered_table_data": [], + "filters": { + "active": [], + "default_colors": [ + "#8B008B", + "#00CED1", + "#FF8C00", + "#708090", + "#DC143C", + "#FFDEAD", + "#7B68EE", + "#4169E1", + "#F4A460", + "#9ACD32" + ], + "number_of_groups": "value", + "selection_active": false + }, + "table_data": [], + "use_filtered_table": false + }, + "params": { + "DoubleClick": { + "Enabled": false, + "MP": "MP", + "Sts": "STATUS", + "TextCode": "TEXT_CODE", + "WHID": "WHID" + }, + "NavigationSettings": { + "BaseUrl": "", + "Column": "", + "Enabled": false + }, + "SelectedRow": [], + "VisibleColCount": 5, + "filters": [ + { + "column": "test1", + "group": 1, + "text": "value1" + }, + { + "column": "test2", + "group": 2, + "text": "value2" + } + ], + "header_order": [ + "timestamp", + "username", + "operation", + { + "field": "destination_bucket", + "visible": true + }, + "destination_site", + "destination_view", + { + "field": "destination_object_key", + "visible": false + }, + { + "field": "destination_version_id", + "visible": false + }, + "expires", + { + "field": "source_bucket", + "visible": true + }, + "source_site", + "source_view", + { + "field": "source_object_key", + "visible": false + }, + { + "field": "source_version_id", + "visible": false + }, + { + "field": "response", + "visible": false + }, + "error_occurred", + { + "field": "error_message", + "visible": true + }, + { + "field": "audit_id", + "visible": false + }, + { + "field": "copy_option", + "visible": false + }, + { + "field": "ttl", + "visible": false + } + ], + "key_to_read_from": "use_param", + "puToDismiss": "", + "table_data": [], + "title": "S3 SCADA Audit Logs" + }, + "propConfig": { + "custom.filter_menu_data": { + "binding": { + "config": { + "path": "view.custom.filters.deactive" + }, + "transforms": [ + { + "code": "\tinstances \u003d []\n\tgroups \u003d {}\n\tfor filter in value:\n\t \tif not groups.has_key(filter.column):\n\t \t\tgroups[filter.column] \u003d []\n\t \tgroups[filter.column].append(filter)\n\tfor key in groups:\n\t\tinstance \u003d {\"instanceStyle\": {\n\t \t\t\t\"classes\": \"\"},\n\t \t\t\t \"instancePosition\": {}}\n\t \tgroups[key].sort()\n\t \tinstance[\u0027filters\u0027] \u003d groups[key]\n\t \tinstance[\u0027group_name\u0027] \u003d key\n\t \tinstances.append(instance)\n\treturn instances", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.filtered_table_data": { + "binding": { + "config": { + "expression": "if({view.custom.table_data} !\u003d {view.custom.filters.active},\r\n{view.custom.filters.active},\r\n{view.custom.filters.active})" + }, + "transforms": [ + { + "code": "\tfiltered_table \u003d []\n\tif len(value) \u003e 0:\n\t\tfilter_lookup \u003d {}\n\t\tfor act_filter in value:\n\t\t\tif act_filter[\u0027column\u0027] not in filter_lookup:\n\t\t\t\tfilter_lookup[act_filter[\u0027column\u0027]] \u003d []\n\t\t\tfilter_lookup[act_filter[\u0027column\u0027]].append(act_filter[\u0027text\u0027])\n\t\tfor row in self.custom.table_data:\n\t\t\tsystem.perspective.print(row)\n\t\t\tshould_filter \u003d {}\t\t\n\t\t\t# Handles stylized rows\t\n\t\t\tif \u0027style\u0027 in row and \u0027value\u0027 in row and len(row) \u003d\u003d2:\n\t\t\t\t#for column in row:\n\t\t\t\t\t#system.perspective.print(\u0027value:%s\u0027%column)\n\t\t\t\t\tdata_columns \u003d row[\u0027value\u0027]\n\t\t\t\t\tfor s_column in data_columns:\n\t\t\t\t\t\tif s_column in filter_lookup:\n\t\t\t\t\t\t\tif data_columns[s_column] in filter_lookup[s_column]:\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tshould_filter[s_column] \u003d True\n\t\t\t\t\t\t\telse:\n\t\t\t\t\t\t\t\tshould_filter[s_column] \u003d False\n\t\t\t\t\t\telse:\n\t\t\t\t\t\t\tshould_filter[s_column] \u003d False\t\n\t\t\telse:\n\t\t\t\tfor column in row:\n\t\t\t\t\tif column in filter_lookup:\n\t\t\t\t\t\tif row[column] in filter_lookup[column]:\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tshould_filter[column] \u003d True\n\t\t\t\t\t\telse:\n\t\t\t\t\t\t\tshould_filter[column] \u003d False\n\t\t\t\t\telse:\n\t\t\t\t\t\tshould_filter[column] \u003d False\n\t\t\tif sum(should_filter.values()) \u003d\u003d len(filter_lookup.keys()):\n\t\t\t\tfiltered_table.append(row)\n\n\treturn filtered_table", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "custom.filters": { + "persistent": true + }, + "custom.filters.deactive": { + "binding": { + "config": { + "path": "view.params.filters" + }, + "transforms": [ + { + "code": "\t\n\tfilters \u003d []\n\tgroups \u003d []\n\tfor index, filter in enumerate(value):\n\t\tnew_filter \u003d {}\t\n\t\tif not filter.has_key(\u0027group\u0027):\n\t\t\tnew_filter[\u0027group\u0027] \u003d 0\n\t\telse:\n\t\t\tnew_filter[\u0027group\u0027] \u003d filter.group\n\t\tif not filter.has_key(\u0027color\u0027):\n\t\t\tif new_filter[\u0027group\u0027] not in groups:\n\t\t\t\tgroups.append(new_filter[\u0027group\u0027])\n\t\t\tnew_filter[\u0027color\u0027] \u003d self.custom.filters.default_colors[groups.index(new_filter[\u0027group\u0027])]\n\t\telse:\n\t\t\tnew_filter[\u0027color\u0027] \u003d filter.color\n\t\tif not filter.has_key(\u0027text\u0027):\n\t\t\tnew_filter[\u0027text\u0027] \u003d \u0027Filter \u0027 + str(index)\n\t\telse:\n\t\t\tnew_filter[\u0027text\u0027] \u003d filter.text\n\t\tif not filter.has_key(\u0027column\u0027):\n\t\t\tnew_filter[\u0027column\u0027] \u003d 0\n\t\telse:\n\t\t\tnew_filter[\u0027column\u0027] \u003d filter.column\n\t\tnew_filter[\u0027id\u0027] \u003d index\n\t\tfilters.append(new_filter)\t\t\t\t\n\treturn filters", + "type": "script" + } + ], + "type": "property" + } + }, + "custom.table_data": { + "binding": { + "config": { + "expression": "if({view.params.key_to_read_from} \u003d \u0027use_param\u0027,\r\n{view.params.table_data},\r\nproperty(concat(\u0027session.custom.tableComponentData.\u0027,{view.params.key_to_read_from})))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.use_filtered": { + "persistent": true + }, + "custom.use_filtered_table": { + "binding": { + "config": { + "path": "view.custom.filtered_table_data" + }, + "transforms": [ + { + "code": "\treturn len(value) \u003e 0", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "params.DoubleClick": { + "paramDirection": "input", + "persistent": true + }, + "params.NavigationSettings": { + "paramDirection": "input", + "persistent": true + }, + "params.SelectedRow": { + "binding": { + "config": { + "path": "/root/Table.props.selection.data" + }, + "type": "property" + }, + "paramDirection": "output", + "persistent": true + }, + "params.VisibleColCount": { + "paramDirection": "input", + "persistent": true + }, + "params.filters": { + "paramDirection": "input", + "persistent": true + }, + "params.header_order": { + "paramDirection": "input", + "persistent": true + }, + "params.key_to_read_from": { + "paramDirection": "input", + "persistent": true + }, + "params.puToDismiss": { + "paramDirection": "input", + "persistent": true + }, + "params.table_data": { + "paramDirection": "input", + "persistent": true + }, + "params.title": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 844 + } + }, + "root": { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Title" + }, + "position": { + "basis": "100%" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.title" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Title/Text", + "fontSize": 14, + "overflow": "visible" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "Title" + }, + "position": { + "basis": "50%" + }, + "props": { + "style": { + "fontSize": 1, + "marginLeft": 10, + "overflow": "visible" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "FilterCheck", + "tooltip": { + "enabled": true, + "location": "top-left", + "text": "Enable Table Search" + } + }, + "position": { + "basis": "108px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "LEN({..../Table.props.data})\u003e0" + }, + "type": "expr" + } + } + }, + "props": { + "checkedIcon": { + "style": { + "fontSize": 16 + } + }, + "indeterminateIcon": { + "style": { + "fontSize": 16 + } + }, + "style": { + "fontSize": 12 + }, + "text": "Search?", + "textPosition": "left", + "uncheckedIcon": { + "style": { + "fontSize": 16 + } + } + }, + "type": "ia.input.checkbox" + }, + { + "meta": { + "name": "Spacer1" + }, + "position": { + "basis": "1px" + }, + "props": { + "style": { + "classes": "General/Divider" + } + }, + "type": "ia.container.flex" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\ttable \u003d self.parent.parent.parent.getChild(\"Table\")\n\t# ignition perspective has a bug with table where the only way to \n\t# actually de-select and remove the row highlight is to set the\n\t# row and column to -1 and THEN None\n\t# this will automatically clear the selection.data array\n\ttable.props.selection.selectedRow \u003d -1\n\ttable.props.selection.selectedColumn \u003d -1\n\ttable.props.selection.selectedRow \u003d None\n\ttable.props.selection.selectedColumn \u003d None" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "ClearSelectionButton", + "tooltip": { + "enabled": true, + "location": "top-left", + "text": "Clear Selection" + } + }, + "position": { + "basis": "31px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "len({..../Table.props.selection.data})\u003e0" + }, + "type": "expr" + } + } + }, + "props": { + "path": "material/clear", + "style": { + "classes": "General/Button" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Spacer2" + }, + "position": { + "basis": "1px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "../ClearSelectionButton.position.display" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "General/Divider" + } + }, + "type": "ia.container.flex" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "draggable": false, + "id": "ColumnSelection", + "modal": true, + "overlayDismiss": true, + "position": { + "relativeLocation": "bottom-left" + }, + "positionType": "relative", + "resizable": true, + "showCloseIcon": true, + "type": "toggle", + "viewParams": { + "Columns": "{/root/TableHeader/TableActions/ColumnSelectionButton.custom.Columns}" + }, + "viewPath": "Objects/PowerTable/ColumnSelection", + "viewportBound": false + }, + "scope": "C", + "type": "popup" + } + } + }, + "meta": { + "name": "ColumnSelectionButton", + "tooltip": { + "enabled": true, + "location": "top-left", + "text": "+/- Columns" + } + }, + "position": { + "basis": "29px" + }, + "propConfig": { + "custom.Columns": { + "binding": { + "config": { + "path": "..../Table.props.columns" + }, + "transforms": [ + { + "code": "\tcolumns \u003d {}\n\tif len(value) \u003e 0:\n\t\tfor column in value:\n\t\t\t#field \u003d column.field\n\t\t\tfield \u003d column.header.title\n\t\t\tif field \u003d\u003d \u0027\u0027:\n\t\t\t\tfield \u003d \u0027None\u0027\n\t\t\tcolumns[field] \u003d column.visible\n\treturn columns", + "type": "script" + } + ], + "type": "property" + } + }, + "position.display": { + "binding": { + "config": { + "expression": "LEN({..../Table.props.data})\u003e0" + }, + "type": "expr" + } + } + }, + "props": { + "path": "material/view_column", + "style": { + "classes": "General/Button", + "fontSize": 12, + "marginBottom": 5, + "marginTop": 5 + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Spacer4" + }, + "position": { + "basis": "1px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "LEN({..../Table.props.data})\u003e0" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "classes": "General/Divider" + } + }, + "type": "ia.container.flex" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tself.view.custom.filters.selection_active \u003d not self.view.custom.filters.selection_active" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "FilterButton", + "tooltip": { + "enabled": true, + "location": "top-left", + "text": "Filter Table" + } + }, + "position": { + "basis": "29px", + "display": false + }, + "props": { + "path": "material/filter_list", + "style": { + "classes": "General/Button", + "fontSize": 12, + "marginBottom": 5, + "marginTop": 5 + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Spacer3" + }, + "position": { + "basis": "1px" + }, + "props": { + "style": { + "classes": "General/Divider" + } + }, + "type": "ia.container.flex" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\n\tcsv_headers \u003d []\n\tcsv_data \u003d []\n\tsystem.perspective.print(\u0027DOWNLOADING TABLE DATA\u0027)\n\tsource_data \u003d self.parent.parent.parent.getChild(\"Table\").props.data\n\theaders \u003d source_data[0].keys()\n\t\n\tif \u0027style\u0027 in headers and \u0027value\u0027 in headers and len(headers) \u003d\u003d 2:\n\t\tdata \u003d [row[\u0027value\u0027] for row in source_data]\n\telse:\n\t\tdata \u003d source_data\n\t\t\n\tfor record in data:\n\t\tif len(csv_headers) \u003d\u003d 0:\n\t\t\tcsv_headers \u003d record.keys()\n\t\t\tcsv_headers.sort()\n\t\t\tcsv_headers \u003d [str(i) for i in csv_headers]\n\t\tcsv_row \u003d []\n\t\tfor index in range(len(record)):\n\t\t\tcsv_row.append(str(record[csv_headers[index]]))\n\t\tcsv_data.append(csv_row)\n\t\n\ttry:\n\t\tcsv_dataset \u003d system.dataset.toDataSet(csv_headers, csv_data)\n\texcept Exception, e:\n\t\tsystem.perspective.print(str(e))\n\tcsv_export \u003d system.dataset.toCSV(csv_dataset)\n\tfilename \u003d \u0027{0}.csv\u0027.format(str(system.date.now()).replace(\u0027 \u0027, \u0027_\u0027))\n\tsystem.perspective.download(filename, csv_export)\n\t\n\tsystem.perspective.print(\u0027DONE DOWNLOADING TABLE DATA\u0027)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "SettingsButton", + "tooltip": { + "enabled": true, + "location": "top-left", + "text": "Download Table Contents" + } + }, + "position": { + "basis": "30px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "LEN({..../Table.props.data})\u003e0" + }, + "type": "expr" + } + } + }, + "props": { + "path": "material/cloud_download", + "style": { + "classes": "General/Button", + "marginRight": 10 + } + }, + "type": "ia.display.icon" + } + ], + "meta": { + "name": "TableActions", + "tooltip": { + "location": "top-right" + } + }, + "position": { + "grow": 1 + }, + "props": { + "justify": "flex-end" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "TableHeader" + }, + "position": { + "shrink": 0 + }, + "props": { + "justify": "space-between", + "style": { + "borderBottomStyle": "solid", + "borderBottomWidth": 1, + "cursor": "pointer" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "FilterMenu" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "props.instances": { + "binding": { + "config": { + "path": "view.custom.filter_menu_data" + }, + "type": "property" + } + } + }, + "props": { + "alignContent": "flex-start", + "alignItems": "flex-start", + "path": "Objects/PowerTable/FilterMenuGroup", + "style": { + "overflow": "visible" + }, + "useDefaultViewHeight": false, + "useDefaultViewWidth": false, + "wrap": "wrap" + }, + "type": "ia.display.flex-repeater" + } + ], + "meta": { + "name": "FilterSelection" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "view.custom.filters.selection_active" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "borderBottomStyle": "solid", + "borderBottomWidth": 1, + "classes": "Menu/Menu", + "overflow": "visible", + "paddingLeft": 10, + "paddingRight": 10 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "FiltersLabel" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.custom.filters.active" + }, + "transforms": [ + { + "code": "\t\n\treturn \u0027\u0027.join([\u0027FILTERS (\u0027, str(len(value)), \u0027):\u0027])", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Menu/Menu Page/Text", + "fontSize": 10, + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "FiltersCarousel" + }, + "propConfig": { + "props.views": { + "binding": { + "config": { + "path": "view.custom.filters.active" + }, + "transforms": [ + { + "code": "\n\tviews \u003d []\n\tfor filter in value:\n\t\tcarousel_view \u003d {\n\t\t\t\u0027viewPath\u0027:\u0027Components/PowerTable/FilterTile\u0027,\n\t\t\t\u0027direction\u0027 : \u0027row\u0027,\n\t\t\t\u0027viewParams\u0027: {},\n\t\t\t\u0027justify\u0027:\u0027flex-start\u0027,\n\t\t\t\u0027alignItems\u0027: \u0027center\u0027}\n\t\tcarousel_view[\u0027viewParams\u0027][\u0027color\u0027] \u003d filter[\u0027color\u0027]\n\t\tcarousel_view[\u0027viewParams\u0027][\u0027text\u0027] \u003d filter[\u0027text\u0027]\t\n\t\tcarousel_view[\u0027viewParams\u0027][\u0027id\u0027] \u003d filter[\u0027id\u0027]\t\n\t\t\n\t\tviews.append(carousel_view)\n\treturn views", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "appearance": { + "arrows": { + "next": { + "style": { + "marginRight": 5 + } + }, + "previous": { + "style": { + "marginLeft": 5 + } + } + }, + "dots": { + "enabled": false + }, + "slidePadding": 3, + "slidesToShow": 5, + "useDefaultViewHeight": true, + "useDefaultViewWidth": true + }, + "style": { + "overflow": "visible", + "textAlign": "left" + } + }, + "type": "ia.display.carousel" + } + ], + "meta": { + "name": "Left" + }, + "position": { + "basis": "90%" + }, + "props": { + "style": { + "overflow": "visible" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.custom.filters.active \u003d []\n\tsystem.perspective.sendMessage(\u0027deactivate-filter\u0027, payload \u003d {\u0027id\u0027:-1}, scope \u003d \u0027page\u0027)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "ClearButton" + }, + "position": { + "basis": "51px" + }, + "props": { + "primary": false, + "style": { + "classes": "Menu/Item", + "fontSize": 12, + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5 + }, + "text": "Clear", + "textStyle": { + "classes": "Page/Text" + } + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "Right" + }, + "position": { + "basis": "10%" + }, + "props": { + "justify": "flex-end", + "style": { + "overflow": "visible" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "Filters" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "view.custom.filters.active" + }, + "transforms": [ + { + "code": "\treturn len(value) \u003e 0", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "style": { + "overflow": "visible" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "ReulstLengthLabel" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "view.custom.filters.active" + }, + "transforms": [ + { + "code": "\treturn len(value) \u003e 0", + "type": "script" + } + ], + "type": "property" + } + }, + "props.text": { + "binding": { + "config": { + "path": "../Table.props.data" + }, + "transforms": [ + { + "code": "\treturn \u0027\u0027.join([str(len(value)), \u0027 results within filters\u0027])", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Menu/Item Page/Text", + "fontSize": 12, + "paddingLeft": 5, + "textTransform": "lowercase" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "pager" + }, + "position": { + "basis": "35px", + "display": false, + "shrink": 0 + }, + "propConfig": { + "props.params.number_of_pages": { + "binding": { + "config": { + "expression": "len({../Table.custom.raw_data})" + }, + "type": "expr" + } + }, + "props.params.options_for_pagers": { + "binding": { + "config": { + "path": "../Table.props.pager.options" + }, + "type": "property" + } + } + }, + "props": { + "params": { + "number_of_items_per_page": 100, + "page_selected": 0 + }, + "path": "Components/PowerTable/pager" + }, + "type": "ia.display.view" + }, + { + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\t# grab row JSON from double-click\n\td \u003d event.value\n\t# build out query_params from row values\n\tquery_params \u003d {\n\t\t\"view\": d.destination_view,\n\t\t\"object_key\": d.destination_object_key,\n\t\t\"site\": d.destination_site,\n\t\t\"bucket\": d.destination_bucket\n\t}\n\t# Open version history log viewer\n\tview_path \u003d \u0027PopUp-Views/S3/Versions/Log_Viewer\u0027\n\tparams \u003d {\u0027query_params\u0027: query_params}\n\tsystem.perspective.openPopup(\u0027Version Log Viewer\u0027, view_path, \n\t\t\t\t\t\t\t\tparams, \u0027SCADA S3 Version History Log Viewer\u0027)\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Table" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "custom.raw_data": { + "binding": { + "config": { + "expression": "IF({../pager.props.params.number_of_items_per_page} \u003e 0,\r\nIF(LEN({view.custom.filters.active})\u003d0, {view.custom.table_data}, {view.custom.filtered_table_data}),\u0027\u0027)" + }, + "transforms": [ + { + "code": "\tlist_of_data \u003d []\n\tsingle_list \u003d []\n\tfor item in value:\n\t\tif len(single_list) \u003c self.getSibling(\"pager\").props.params.number_of_items_per_page:\n\t\t\tsingle_list.append(item)\n\t\telse:\n\t\t\tlist_of_data.append(single_list)\n\t\t\tsingle_list \u003d []\n\t\t\tsingle_list.append(item)\n\tif len(single_list) \u003e 0:\n\t\tlist_of_data.append(single_list)\n\treturn list_of_data", + "type": "script" + } + ], + "type": "expr" + } + }, + "props.columns": { + "binding": { + "config": { + "path": "view.custom.table_data" + }, + "transforms": [ + { + "code": "\tfrom helper.helper import sanitize_tree\n\tcolumns \u003d []\n\tif len(value) \u003e 0:\n\t\trequestedHeaders \u003d sanitize_tree(self.view.params.header_order)\n\t\tfrom pprint import pformat\n#\t\tsystem.perspective.print(pformat(requestedHeaders))\n\t\theaders \u003d []\n\t\tif len(requestedHeaders) \u003e 0:\n\t\t\tfor item in requestedHeaders:\n\t\t\t\tif \u0027style\u0027 in value[0].keys() and \u0027value\u0027 in value[0].keys() and len(value[0].keys()) \u003d\u003d2:\n\t\t\t\t\tif item in value[0][\u0027value\u0027].keys():\n\t\t\t\t\t\theaders.append(item)\n\t\t\t\telse:\n\t\t\t\t\tif item in value[0].keys():\n\t\t\t\t\t\theaders.append(item)\n\t\t\t\t\tif isinstance(item, dict) and \u0027field\u0027 in item and item[\u0027field\u0027] in value[0].keys():\n\t\t\t\t\t\theaders.append(item)\n\t\tif len(headers) \u003d\u003d 0:\n\t\t\theaders \u003d value[0].keys()\n\t\tfor header in headers:\t\n\t\t\tfield \u003d header\n\t\t\tvisible \u003d True\n\t\t\ttry:\n\t\t\t\ttitle \u003d str(header).replace(\u0027_\u0027, \u0027 \u0027).upper()\n\t\t\texcept:\n\t\t\t\ttitle \u003d \u0027\u0027\n\t\t\tif isinstance(header, dict):\n\t\t\t\tfield \u003d header.get(\u0027field\u0027, \u0027\u0027)\n\t\t\t\tvisible \u003d header.get(\u0027visible\u0027, True)\n\t\t\t\ttitle \u003d header.get(\u0027title\u0027, field.replace(\u0027_\u0027, \u0027 \u0027).upper())\n\t\t\tcolumn \u003d {\n\t\t\t \"field\": field,\n\t\t\t \"visible\": visible,\n\t\t\t \"editable\": True,\n\t\t\t \"render\": \"auto\",\n\t\t\t \"justify\": \"center\",\n\t\t\t \"align\": \"center\",\n\t\t\t \"resizable\": True,\n\t\t\t \"sortable\": True,\n\t\t\t \"sort\": \"none\",\n\t\t\t \"viewPath\": \"\",\n\t\t\t \"viewParams\": {},\n\t\t\t \"boolean\": \"checkbox\",\n\t\t\t \"number\": \"value\",\n\t\t\t \"progressBar\": {\n\t\t\t\t\"max\": 100,\n\t\t\t\t\"min\": 0,\n\t\t\t\t\"bar\": {\n\t\t\t\t \"color\": \"\",\n\t\t\t\t \"style\": {\n\t\t\t\t\t\"classes\": \"\"\n\t\t\t\t }\n\t\t\t\t},\n\t\t\t\t\"track\": {\n\t\t\t\t \"color\": \"\",\n\t\t\t\t \"style\": {\n\t\t\t\t\t\"classes\": \"\"\n\t\t\t\t }\n\t\t\t\t},\n\t\t\t\t\"value\": {\n\t\t\t\t \"enabled\": True,\n\t\t\t\t \"format\": \"0,0.##\",\n\t\t\t\t \"justify\": \"center\",\n\t\t\t\t \"style\": {\n\t\t\t\t\t\"classes\": \"\"\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t },\n\t\t\t \"toggleSwitch\": {\n\t\t\t\t\"color\": {\n\t\t\t\t \"selected\": \"\",\n\t\t\t\t \"unselected\": \"\"\n\t\t\t\t}\n\t\t\t },\n\t\t\t \"numberFormat\": \"0,0.##\",\n\t\t\t \"dateFormat\": \"MM/DD/YYYY\",\n\t\t\t \"width\": \"\",\n\t\t\t \"strictWidth\": False,\n\t\t\t \"style\": {\n\t\t\t\t\"classes\": \"\"\n\t\t\t },\n\t\t\t \"header\": {\n\t\t\t\t\"title\": title,\n\t\t\t\t\"justify\": \"center\",\n\t\t\t\t\"align\": \"center\",\n\t\t\t\t\"style\": {\n\t\t\t\t \"classes\": \"\",\n\t\t\t\t \u0027fontSize\u0027:\u002712px\u0027\n\t\t\t\t}\n\t\t\t },\n\t\t\t \"footer\": {\n\t\t\t\t\"title\": \"\",\n\t\t\t\t\"justify\": \"left\",\n\t\t\t\t\"align\": \"center\",\n\t\t\t\t\"style\": {\n\t\t\t\t \"classes\": \"\"\n\t\t\t\t}\n\t\t\t }\n\t\t\t}\t\t\t\n\t\t\tcolumns.append(column)\n#\t\tif self.view.params.header_order !\u003d [] and len(headers) \u003d\u003d len(self.view.params.header_order):\n#\t\t\tnew_columns \u003d [None] * len(columns)\n#\t\t\tfor column in columns:\n#\t\t\t\tindex \u003d self.view.params.header_order.index(column[\u0027field\u0027])\n#\t\t\t\tnew_columns[index] \u003d column\n#\t\t\tcolumns \u003d new_columns\n\treturn columns", + "type": "script" + } + ], + "type": "property" + } + }, + "props.data": { + "binding": { + "config": { + "expression": "IF({../pager.props.params.number_of_items_per_page} \u003e 0,\r\nIF(LEN({view.custom.filters.active})\u003d0, {view.custom.table_data}, {view.custom.filtered_table_data}),\u0027\u0027)" + }, + "type": "expr" + } + }, + "props.filter.enabled": { + "binding": { + "config": { + "path": "../TableHeader/TableActions/FilterCheck.props.selected" + }, + "type": "property" + }, + "onChange": { + "enabled": null, + "script": "\tif not getattr(currentValue, \u0027value\u0027, None):\n\t\t# clear filter text when filter is disabled\n\t\tself.props.filter.text \u003d \u0027\u0027\n\t\t" + } + } + }, + "props": { + "cells": { + "allowEditOn": "long-press", + "style": { + "fontSize": 12 + } + }, + "filter": {}, + "pager": { + "initialOption": 100, + "options": [ + 25, + 50, + 100, + 500, + 1000 + ] + }, + "style": { + "overflow": "visible" + } + }, + "type": "ia.display.table" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "overflow": "visible" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "activate-filter", + "pageScope": true, + "script": "\t# implement your handler here\n\tfilter_position \u003d payload[\u0027id\u0027]\n\tsystem.perspective.print(filter_position)\n\tadd \u003d True\n\tfor filter in self.view.custom.filters.active:\n\t\tif filter.id \u003d\u003d filter_position:\n\t\t\tadd \u003d False\n\tif add:\n\t\tfor filter in self.view.custom.filters.deactive:\n\t\t\tif filter.id \u003d\u003d filter_position:\t\t\t\t\n\t\t\t\tself.view.custom.filters.active.append(filter)", + "sessionScope": true, + "viewScope": false + }, + { + "messageType": "deactivate-filter", + "pageScope": true, + "script": "\tfilter_position \u003d payload[\u0027id\u0027]\n\tsystem.perspective.print(filter_position)\n\t\n\tif filter_position \u003d\u003d -1 :\n\t\tself.view.custom.filters.active \u003d []\n\telse:\n\t\tfor index, filter in enumerate(self.view.custom.filters.active):\n\t\t\tif filter.id \u003d\u003d filter_position:\n\t\t\t\tsystem.perspective.print(filter.id)\n\t\t\t\tself.view.custom.filters.active.pop(index)\n\n#\tfor filter in self.view.custom.filter_menu_data:\n#\t\tif filter.filter_id \u003d\u003d filter_position:\n#\t\t\tsystem.perspective.print(filter.filter_id)\n#\t\t\tfilter.active \u003d False\n#\t\t\tbreak", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "column-visibility", + "pageScope": true, + "script": "\t# implement your handler here\n\ttable_columns \u003d self.getChild(\"Table\").props.columns\n\tfor table_column in table_columns:\n\t\t#if payload.keys()[0] \u003d\u003d table_column[\u0027field\u0027]:\n\t\tif payload.keys()[0] \u003d\u003d table_column[\u0027header\u0027][\u0027title\u0027]:\n\t\t\ttable_column.visible \u003d payload.values()[0]\n", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Query_Options/resource.json b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Query_Options/resource.json new file mode 100644 index 0000000..2df2e26 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Query_Options/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "eac7cc93eb116e5b7b75c2a35599e533d5bce56505a610ad0263f68553ee74ce" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Query_Options/thumbnail.png b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Query_Options/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..bc0f83b694ff9379e0ac8e023a62f7a4215bc0f4 GIT binary patch literal 20387 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 U`qec(;cxS?XY9~bDDPYU1^W6Z2LJ#7 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Query_Options/view.json b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Query_Options/view.json new file mode 100644 index 0000000..030be53 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Audit/Query_Options/view.json @@ -0,0 +1,1954 @@ +{ + "custom": { + "api_region_name": "na", + "bucket_options": [ + { + "label": "Image Files", + "value": "na-ignition-image-repo" + }, + { + "label": "Source Files", + "value": "na-ignition-image-source" + } + ], + "copy_option_options": [ + { + "label": "Both", + "value": "both" + }, + { + "label": "SVG", + "value": "svg" + }, + { + "label": "DRAWIO", + "value": "drawio" + } + ], + "default_query_params": { + "copy_option": null, + "destination_bucket": null, + "destination_site": null, + "destination_view": "", + "end_time": null, + "error_occurred": null, + "operation": null, + "source_bucket": null, + "source_site": null, + "source_view": "", + "start_time": null + }, + "destination_view_options_by_site_and_bucket": [], + "destination_view_suffix": null, + "destination_whid_options": [], + "error_occurred_options": [ + { + "label": "True", + "value": true + }, + { + "label": "False", + "value": false + } + ], + "operation_options": [ + { + "label": "Copy Single", + "value": "copy_single" + }, + { + "label": "Upload", + "value": "upload" + }, + { + "label": "Delete", + "value": "delete" + }, + { + "label": "Add New Site", + "value": "add_new_site" + } + ], + "source_view_options_by_site_and_bucket": [], + "source_view_suffix": null, + "source_whid_options": [], + "stage_config": { + "account_id": "925510716640", + "endpoint": "https://scada-s3-management.narme-scada.rme.amazon.dev/", + "lambda_name": "RMESDScadaS3ManagementFlaskLambda-prod", + "region": "us-east-2", + "repo_bucket": "na-ignition-image-repo", + "s3_region": "us-east-1", + "source_bucket": "na-ignition-image-source" + } + }, + "params": { + "query_params": { + "copy_option": null, + "destination_bucket": null, + "destination_site": null, + "destination_view": "", + "end_time": null, + "error_occurred": null, + "operation": null, + "source_bucket": null, + "source_site": null, + "source_view": "", + "start_time": null, + "username": "" + } + }, + "propConfig": { + "custom.api_region_name": { + "binding": { + "config": { + "path": "session.custom.aws.prefix" + }, + "type": "property" + }, + "persistent": true + }, + "custom.bucket_options": { + "binding": { + "config": { + "path": "view.custom.stage_config" + }, + "transforms": [ + { + "code": "\treturn [{\u0027value\u0027: value.repo_bucket, \u0027label\u0027: \u0027Image Files\u0027},\n\t\t\t{\u0027value\u0027: value.source_bucket, \u0027label\u0027: \u0027Source Files\u0027}]", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.copy_option_options": { + "persistent": true + }, + "custom.default_query_params": { + "persistent": true + }, + "custom.default_query_params.username": { + "binding": { + "config": { + "path": "session.props.auth.user.userName" + }, + "type": "property" + } + }, + "custom.destination_view_options_by_site_and_bucket": { + "binding": { + "config": { + "expression": "{view.params.query_params.destination_site}+{view.params.query_params.destination_bucket}" + }, + "transforms": [ + { + "code": "\tbucket \u003d self.params.query_params.destination_bucket\n\tsite \u003d self.params.query_params.destination_site\n\tif bucket and site:\n\t\tfrom AWS.s3 import S3Manager\n\t\tfrom helper.helper import sanitize_tree\n\t\tfrom pprint import pformat\n\t\t\n\t\tapi_stage \u003d \u0027prod\u0027\n\t\tusername \u003d self.session.props.auth.user.userName\n\t\tapi_region_name \u003d self.view.custom.api_region_name\n\t\t\n\t\ts3m \u003d S3Manager(api_stage, api_region_name, username)\n\t\tsuffix \u003d self.custom.destination_view_suffix\n\t\tfiles \u003d sanitize_tree(s3m.fetch_object_list_by_site_and_bucket(site, bucket))\n\t\treturn [{\u0027value\u0027: x[\u0027Filename\u0027].replace(suffix,\u0027\u0027), \n\t\t\t\t\u0027label\u0027: x[\u0027Filename\u0027].replace(suffix,\u0027\u0027)} for x in files]\n\treturn []", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "custom.destination_view_suffix": { + "binding": { + "config": { + "path": "view.params.query_params.destination_bucket" + }, + "transforms": [ + { + "code": "\tif value:\n\t\tstage_config \u003d self.custom.stage_config\n\t\tif value \u003d\u003d stage_config.get(\u0027repo_bucket\u0027, None):\n\t\t\treturn \".svg\"\n\t\tif value \u003d\u003d stage_config.get(\"source_bucket\", None):\n\t\t\treturn \".drawio\"\n\treturn value", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.destination_whid_options": { + "binding": { + "config": { + "path": "view.params.query_params.destination_bucket" + }, + "transforms": [ + { + "code": "\tif value:\n\t\tfrom AWS.s3 import S3Manager\n\t\t\n\t\tapi_stage \u003d \u0027prod\u0027\n\t\tusername \u003d self.session.props.auth.user.userName\n\t\tapi_region_name \u003d self.custom.api_region_name\n\t\t\n\t\ts3m \u003d S3Manager(\u0027prod\u0027, api_region_name, username)\n\t\t\n\t\treturn [{\u0027value\u0027: x, \u0027label\u0027: x} for x in s3m.fetch_site_list(value)]\n\treturn []", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.error_occurred_options": { + "persistent": true + }, + "custom.operation_options": { + "binding": { + "config": { + "expression": "1" + }, + "transforms": [ + { + "code": "\tfrom AWS.s3 import OPERATION_MAP\n\treturn [{\u0027value\u0027:k, \u0027label\u0027:k.replace(\u0027_\u0027,\u0027 \u0027).title()} \n\t\t\tfor k,v in OPERATION_MAP.iteritems()\n\t\t\tif v.get(\u0027method\u0027, \u0027\u0027) in (\u0027PUT\u0027, \u0027POST\u0027, \u0027DELETE\u0027)\n\t\t\tand k not in (\u0027query_audit_table\u0027, )]", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "custom.source_view_options_by_site_and_bucket": { + "binding": { + "config": { + "expression": "{view.params.query_params.source_site}+{view.params.query_params.source_bucket}" + }, + "transforms": [ + { + "code": "\tbucket \u003d self.params.query_params.source_bucket\n\tsite \u003d self.params.query_params.source_site\n\tif bucket and site:\n\t\tfrom AWS.s3 import S3Manager\n\t\tfrom helper.helper import sanitize_tree\n\t\tfrom pprint import pformat\n\t\t\n\t\tapi_stage \u003d \u0027prod\u0027\n\t\tusername \u003d self.session.props.auth.user.userName\n\t\tapi_region_name \u003d self.view.custom.api_region_name\n\t\t\n\t\ts3m \u003d S3Manager(api_stage, api_region_name, username)\n\t\tsuffix \u003d self.custom.source_view_suffix\n\t\tfiles \u003d sanitize_tree(s3m.fetch_object_list_by_site_and_bucket(site, bucket))\n\t\treturn [{\u0027value\u0027: x[\u0027Filename\u0027].replace(suffix,\u0027\u0027), \n\t\t\t\t\u0027label\u0027: x[\u0027Filename\u0027].replace(suffix,\u0027\u0027)} for x in files]\n\treturn []", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "custom.source_view_suffix": { + "binding": { + "config": { + "path": "view.params.query_params.source_bucket" + }, + "transforms": [ + { + "code": "\tif value:\n\t\tstage_config \u003d self.custom.stage_config\n\t\tif value \u003d\u003d stage_config.get(\u0027repo_bucket\u0027, None):\n\t\t\treturn \".svg\"\n\t\tif value \u003d\u003d stage_config.get(\"source_bucket\", None):\n\t\t\treturn \".drawio\"\n\treturn value", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.source_whid_options": { + "binding": { + "config": { + "path": "view.params.query_params.source_bucket" + }, + "transforms": [ + { + "code": "\tif value:\n\t\tfrom AWS.s3 import S3Manager\n\t\t\n\t\tapi_stage \u003d \u0027prod\u0027\n\t\tusername \u003d self.session.props.auth.user.userName\n\t\tapi_region_name \u003d self.custom.api_region_name\n\t\t\n\t\ts3m \u003d S3Manager(\u0027prod\u0027, api_region_name, username)\n\t\t\n\t\treturn [{\u0027value\u0027: x, \u0027label\u0027: x} for x in s3m.fetch_site_list(value)]\n\treturn []", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.stage_config": { + "binding": { + "config": { + "expression": "{view.custom.api_region_name}" + }, + "transforms": [ + { + "code": "\treturn AWS.s3.STAGE_CONFIG[\u0027prod\u0027][value]", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "params.query_params": { + "onChange": { + "enabled": null, + "script": "\tif not missedEvents and origin in (\u0027Binding\u0027, \u0027Script\u0027, \u0027BindingWriteback\u0027):\n\t\tpayload \u003d currentValue.value\n\t\tsystem.perspective.sendMessage(\u0027audit_table_query_params_changed\u0027, payload, scope\u003d\u0027session\u0027)\n\t\t" + }, + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 600 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "shrink": 0 + }, + "props": { + "style": { + "borderStyle": "none", + "classes": "Framework/Card/Title_transparent" + }, + "text": "Select Query Params" + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t# reset query params to default values \n\t# (stored in `view.custom.default_query_params`)\n\tself.view.params.query_params \u003d self.view.custom.default_query_params" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear Button", + "tooltip": { + "enabled": true, + "location": "bottom-right", + "text": "Clear Selections" + } + }, + "position": { + "shrink": 0 + }, + "props": { + "image": { + "icon": { + "path": "material/clear_all" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t# refresh audit table query via message handler\n\tsystem.perspective.sendMessage(\u0027refresh_audit_table_data\u0027, scope\u003d\u0027session\u0027)\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Refresh Button", + "tooltip": { + "enabled": true, + "location": "bottom-right", + "text": "Refresh Data" + } + }, + "position": { + "shrink": 0 + }, + "props": { + "image": { + "icon": { + "path": "material/refresh" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "grow": 1 + }, + "props": { + "justify": "flex-end" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer Header" + }, + "position": { + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Title_transparent", + "marginBottom": "2px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label", + "textAlign": "right" + }, + "text": "Operation" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "propConfig": { + "props.options": { + "binding": { + "config": { + "path": "view.custom.operation_options" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.query_params.operation" + }, + "type": "property" + } + } + }, + "props": { + "dropdownOptionStyle": { + "overflowWrap": "break-word", + "whiteSpace": "normal" + }, + "multiSelect": true, + "showClearIcon": true + }, + "type": "ia.input.dropdown" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.params.query_params.operation \u003d None\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear Button" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.operation})\r\n\u0026\u0026{view.params.query_params.operation}!\u003d\u0027\u0027" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/clear" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "Operation" + }, + "position": { + "basis": "335px", + "shrink": 0 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label", + "textAlign": "right" + }, + "text": "Copy Option" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "propConfig": { + "props.options": { + "binding": { + "config": { + "path": "view.custom.copy_option_options" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.query_params.copy_option" + }, + "type": "property" + } + } + }, + "props": { + "dropdownOptionStyle": { + "overflowWrap": "break-word", + "whiteSpace": "normal" + }, + "showClearIcon": true + }, + "type": "ia.input.dropdown" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.params.query_params.copy_option \u003d None\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear Button" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.copy_option})\r\n\u0026\u0026{view.params.query_params.copy_option}!\u003d\u0027\u0027" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/clear" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "Copy Option", + "visible": false + }, + "position": { + "basis": "335px", + "shrink": 0 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "shrink": 0 + }, + "props": { + "justify": "center" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label", + "textAlign": "right" + }, + "text": "Username" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "TextField" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.query_params.username" + }, + "type": "property" + } + } + }, + "props": { + "placeholder": "Enter username..." + }, + "type": "ia.input.text-field" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.params.query_params.username \u003d None\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear Button" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.username})\r\n\u0026\u0026{view.params.query_params.username}!\u003d\u0027\u0027" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/clear" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "Username" + }, + "position": { + "basis": "335px", + "shrink": 0 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label", + "textAlign": "right" + }, + "text": "Error Occurred?" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "propConfig": { + "props.options": { + "binding": { + "config": { + "path": "view.custom.error_occurred_options" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.query_params.error_occurred" + }, + "type": "property" + } + } + }, + "props": { + "dropdownOptionStyle": { + "overflowWrap": "break-word", + "whiteSpace": "normal" + }, + "showClearIcon": true + }, + "type": "ia.input.dropdown" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.params.query_params.error_occurred \u003d None\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear Button" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.error_occurred})\r\n\u0026\u0026{view.params.query_params.error_occurred}!\u003d\u0027\u0027" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/clear" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "Error Occurred" + }, + "position": { + "basis": "335px", + "shrink": 0 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "shrink": 0 + }, + "props": { + "justify": "center" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label", + "textAlign": "right" + }, + "text": "Dest. Bucket" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "propConfig": { + "props.options": { + "binding": { + "config": { + "path": "view.custom.bucket_options" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.query_params.destination_bucket" + }, + "type": "property" + } + } + }, + "props": { + "dropdownOptionStyle": { + "overflowWrap": "break-word", + "whiteSpace": "normal" + }, + "showClearIcon": true + }, + "type": "ia.input.dropdown" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.params.query_params.destination_bucket \u003d None\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear Button" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.destination_bucket})\r\n\u0026\u0026{view.params.query_params.destination_bucket}!\u003d\u0027\u0027" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/clear" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "Destination Bucket" + }, + "position": { + "basis": "335px", + "shrink": 0 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label", + "textAlign": "right" + }, + "text": "Source Bucket" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "propConfig": { + "props.options": { + "binding": { + "config": { + "path": "view.custom.bucket_options" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.query_params.source_bucket" + }, + "type": "property" + } + } + }, + "props": { + "dropdownOptionStyle": { + "overflowWrap": "break-word", + "whiteSpace": "normal" + }, + "showClearIcon": true + }, + "type": "ia.input.dropdown" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.params.query_params.source_bucket \u003d None\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear Button" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.source_bucket})\r\n\u0026\u0026{view.params.query_params.source_bucket}!\u003d\u0027\u0027" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/clear" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "Source Bucket" + }, + "position": { + "basis": "335px", + "shrink": 0 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "shrink": 0 + }, + "props": { + "justify": "center" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label", + "textAlign": "right" + }, + "text": "Dest. Site" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.destination_bucket})\r\n\u0026\u0026len({view.params.query_params.destination_bucket})\u003e0" + }, + "type": "expr" + } + }, + "props.options": { + "binding": { + "config": { + "path": "view.custom.destination_whid_options" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.query_params.destination_site" + }, + "type": "property" + } + } + }, + "props": { + "dropdownOptionStyle": { + "overflowWrap": "break-word", + "whiteSpace": "normal" + }, + "showClearIcon": true + }, + "type": "ia.input.dropdown" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.params.query_params.destination_site \u003d None\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear Button" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.destination_site})\r\n\u0026\u0026{view.params.query_params.destination_site}!\u003d\u0027\u0027" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/clear" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "Destination Site" + }, + "position": { + "basis": "335px", + "shrink": 0 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label", + "textAlign": "right" + }, + "text": "Source Site" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.source_bucket})\r\n\u0026\u0026len({view.params.query_params.source_bucket})\u003e0" + }, + "type": "expr" + } + }, + "props.options": { + "binding": { + "config": { + "path": "view.custom.source_whid_options" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.query_params.source_site" + }, + "type": "property" + } + } + }, + "props": { + "dropdownOptionStyle": { + "overflowWrap": "break-word", + "whiteSpace": "normal" + }, + "showClearIcon": true + }, + "type": "ia.input.dropdown" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.params.query_params.source_site \u003d None\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear Button" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.source_site})\r\n\u0026\u0026{view.params.query_params.source_site}!\u003d\u0027\u0027" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/clear" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "Source Site" + }, + "position": { + "basis": "335px", + "shrink": 0 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_2" + }, + "position": { + "shrink": 0 + }, + "props": { + "justify": "center" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label", + "textAlign": "right" + }, + "text": "Dest. View" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "len({view.custom.destination_view_options_by_site_and_bucket})\u003e0" + }, + "type": "expr" + } + }, + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.destination_bucket})\r\n\u0026\u0026len({view.params.query_params.destination_bucket})\u003e0\r\n\u0026\u0026!isNull({view.params.query_params.destination_site})\r\n\u0026\u0026len({view.params.query_params.destination_site})\u003e0" + }, + "type": "expr" + } + }, + "props.options": { + "binding": { + "config": { + "path": "view.custom.destination_view_options_by_site_and_bucket" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.query_params.destination_view" + }, + "type": "property" + } + } + }, + "props": { + "dropdownOptionStyle": { + "overflowWrap": "break-word", + "whiteSpace": "normal" + }, + "showClearIcon": true + }, + "type": "ia.input.dropdown" + }, + { + "meta": { + "name": "TextField" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "len({view.custom.destination_view_options_by_site_and_bucket})\u003d0" + }, + "type": "expr" + } + }, + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.destination_bucket})\r\n\u0026\u0026len({view.params.query_params.destination_bucket})\u003e0\r\n\u0026\u0026!isNull({view.params.query_params.destination_site})\r\n\u0026\u0026len({view.params.query_params.destination_site})\u003e0" + }, + "type": "expr" + } + }, + "props.text": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.query_params.destination_view" + }, + "type": "property" + } + } + }, + "props": { + "placeholder": "Enter View..." + }, + "type": "ia.input.text-field" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.params.query_params.destination_view \u003d \u0027\u0027\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear Button" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.destination_view})\r\n\u0026\u0026{view.params.query_params.destination_view}!\u003d\u0027\u0027" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/clear" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "Destination View" + }, + "position": { + "basis": "335px", + "shrink": 0 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label", + "textAlign": "right" + }, + "text": "Source View" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "len({view.custom.source_view_options_by_site_and_bucket})\u003e0" + }, + "type": "expr" + } + }, + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.source_bucket})\r\n\u0026\u0026len({view.params.query_params.source_bucket})\u003e0\r\n\u0026\u0026!isNull({view.params.query_params.source_site})\r\n\u0026\u0026len({view.params.query_params.source_site})\u003e0" + }, + "type": "expr" + } + }, + "props.options": { + "binding": { + "config": { + "path": "view.custom.source_view_options_by_site_and_bucket" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.query_params.source_view" + }, + "type": "property" + } + } + }, + "props": { + "dropdownOptionStyle": { + "overflowWrap": "break-word", + "whiteSpace": "normal" + }, + "multiSelect": true, + "showClearIcon": true + }, + "type": "ia.input.dropdown" + }, + { + "meta": { + "name": "TextField" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "len({view.custom.source_view_options_by_site_and_bucket})\u003d0" + }, + "type": "expr" + } + }, + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.source_bucket})\r\n\u0026\u0026len({view.params.query_params.source_bucket})\u003e0\r\n\u0026\u0026!isNull({view.params.query_params.source_site})\r\n\u0026\u0026len({view.params.query_params.source_site})\u003e0" + }, + "type": "expr" + } + }, + "props.text": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.query_params.source_view" + }, + "type": "property" + } + } + }, + "props": { + "placeholder": "Enter View..." + }, + "type": "ia.input.text-field" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.params.query_params.source_view \u003d \u0027\u0027\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear Button" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.source_view})\r\n\u0026\u0026{view.params.query_params.source_view}!\u003d\u0027\u0027" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/clear" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "Source View" + }, + "position": { + "basis": "335px", + "shrink": 0 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_3" + }, + "position": { + "shrink": 0 + }, + "props": { + "justify": "center" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label", + "textAlign": "right" + }, + "text": "Start Time" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "DateTimeInput" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "propConfig": { + "props.value": { + "binding": { + "config": { + "path": "view.params.query_params.start_time" + }, + "transforms": [ + { + "code": "\tif value:\n\t\ttry:\n\t\t\treturn system.date.parse(value, \u0027yyyy-MM-dd HH:mm:ss\u0027)\n\t\texcept:\n\t\t\treturn None\n\treturn value", + "type": "script" + } + ], + "type": "property" + }, + "onChange": { + "enabled": null, + "script": "\tif not missedEvents and origin in (\u0027Browser\u0027,):\n\t\tif currentValue.value:\n\t\t\tdt \u003d currentValue.value\n\t\t\tdt_str \u003d system.date.format(dt, \u0027yyyy-MM-dd HH:mm:ss\u0027)\n\t\t\tself.view.params.query_params.start_time \u003d dt_str" + } + } + }, + "props": { + "format": "YYYY-MM-DD HH:mm:ss", + "formattedValue": null, + "placeholder": "Select start time" + }, + "type": "ia.input.date-time-input" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.params.query_params.start_time \u003d None\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear Button" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.start_time})\r\n\u0026\u0026{view.params.query_params.start_time}!\u003d\u0027\u0027" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/clear" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "Start Time" + }, + "position": { + "basis": "335px", + "shrink": 0 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label", + "textAlign": "right" + }, + "text": "End Time" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "DateTimeInput" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "propConfig": { + "props.value": { + "binding": { + "config": { + "path": "view.params.query_params.end_time" + }, + "transforms": [ + { + "code": "\tif value:\n\t\ttry:\n\t\t\treturn system.date.parse(value, \u0027yyyy-MM-dd HH:mm:ss\u0027)\n\t\texcept:\n\t\t\treturn None\n\treturn value", + "type": "script" + } + ], + "type": "property" + }, + "onChange": { + "enabled": null, + "script": "\tif not missedEvents and origin in (\u0027Browser\u0027,):\n\t\tif currentValue.value:\n\t\t\tdt \u003d currentValue.value\n\t\t\tdt_str \u003d system.date.format(dt, \u0027yyyy-MM-dd HH:mm:ss\u0027)\n\t\t\tself.view.params.query_params.end_time \u003d dt_str" + } + } + }, + "props": { + "format": "YYYY-MM-DD HH:mm:ss", + "formattedValue": null, + "placeholder": "Select end time" + }, + "type": "ia.input.date-time-input" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.params.query_params.end_time \u003d None\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear Button" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.end_time})\r\n\u0026\u0026{view.params.query_params.end_time}!\u003d\u0027\u0027" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/clear" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "End Time" + }, + "position": { + "basis": "335px", + "shrink": 0 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_4" + }, + "position": { + "shrink": 0 + }, + "props": { + "justify": "center" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/copy/resource.json b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/copy/resource.json new file mode 100644 index 0000000..e90dc0b --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/copy/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "de6caa97b915c7345ca2436f9b302d5ce8c30843587e3c09e00b6e0494689951" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/copy/thumbnail.png b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/copy/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..9ef8a5a354febafa50e22fa4f219995f21053de5 GIT binary patch literal 16086 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 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/manage/view.json b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/manage/view.json new file mode 100644 index 0000000..c3d30df --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/manage/view.json @@ -0,0 +1,1041 @@ +{ + "custom": { + "api_region_name": "eu", + "developer_user": true, + "enable_add_new_site": true, + "enabled_whids": [ + "DNK7", + "EWR4" + ], + "expanded": false, + "loading": false, + "new_site_is_not_in_S3": true, + "new_site_to_add": "EWR4", + "show_add_new_site": false, + "stage_config": { + "account_id": "006306898152", + "api_call_role": "arn:aws:iam::609617486056:role/RMESDScadaS3ManagementAPIcallRole-prod-eu-west-1", + "endpoint": "https://eu-west-1.scada-s3-management.scada.eurme.amazon.dev/", + "lambda_name": "RMESDScadaS3ManagementFlaskLambda-prod", + "region": "eu-west-1", + "repo_bucket": "ignition-image-repo", + "s3_region": "eu-west-1", + "source_bucket": "ignition-image-source" + }, + "whid": "", + "whids_in_s3": [ + "BOS3", + "BRS1", + "CGN9", + "DAO1", + "DAO3", + "DAR2", + "DBE2", + "DBH3", + "DBI7", + "DBT3", + "DCT7", + "DCT9", + "DCZ3", + "DCZ4", + "DEH1", + "DER1", + "DER2", + "DER3", + "DER5", + "DFV1", + "DHA1", + "DHE3", + "DHE4", + "DHE6", + "DIF2", + "DIF6", + "DIP1", + "DLO1", + "DLO2", + "DLO3", + "DLO4", + "DLO5", + "DLO7", + "DLZ1", + "DLZ2", + "DLZ3", + "DMA3", + "DMA4", + "DMA6", + "DMV1", + "DMV3", + "DMZ2", + "DMZ4", + "DNC1", + "DNC2", + "DNE2", + "DNG2", + "DNM7", + "DNP1", + "DNX3", + "DNZ2", + "DPI3", + "DPU1", + "DRM2", + "DSI2", + "DSO2", + "DSY6", + "DTC2", + "DVN1", + "DVN2", + "DVN5", + "DWN2", + "IST2", + "MAD6", + "MAN2", + "QCB6" + ] + }, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\tself.custom.expanded \u003d False\n\tself.custom.new_site_to_add \u003d self.params.selected_whid" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": { + "enables": {}, + "selected_whid": "EWR4" + }, + "propConfig": { + "custom.api_region_name": { + "binding": { + "config": { + "path": "session.custom.aws.prefix" + }, + "type": "property" + }, + "persistent": true + }, + "custom.developer_user": { + "binding": { + "config": { + "expression": "isAuthorized(false, \u0027Authenticated/Roles/eurme-ignition-developers\u0027)" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.enable_add_new_site": { + "binding": { + "config": { + "expression": "isAuthorized(false, \u0027Authenticated/Roles/rme-c4\u0027, \u0027Authenticated/Roles/narme-ignition-developers\u0027,\r\n\t\t\t\u0027Authenticated/Roles/eurme-ignition-developers\u0027)\r\n" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.enabled_whids": { + "binding": { + "config": { + "expression": "{session.custom.fc}" + }, + "transforms": [ + { + "code": "\tchild_projects \u003d config.project_config.get_child_scada_projects()\n\treturn [x.replace(\u0027_SCADA\u0027,\u0027\u0027) for x in child_projects]", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "custom.expanded": { + "persistent": true + }, + "custom.loading": { + "persistent": true + }, + "custom.new_site_is_not_in_S3": { + "binding": { + "config": { + "expression": "{view.custom.new_site_to_add}+toStr({view.custom.whids_in_s3})" + }, + "transforms": [ + { + "code": "\tnew_site \u003d self.custom.new_site_to_add\n\twhids \u003d self.custom.whids_in_s3\n\tif new_site and new_site not in whids:\n\t\treturn True\n\treturn False", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "custom.new_site_to_add": { + "persistent": true + }, + "custom.show_add_new_site": { + "persistent": true + }, + "custom.stage_config": { + "binding": { + "config": { + "expression": "{view.custom.api_region_name}" + }, + "transforms": [ + { + "code": "\treturn AWS.s3.STAGE_CONFIG[\u0027prod\u0027][value]", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "custom.whid": { + "binding": { + "config": { + "path": "session.custom.fc" + }, + "type": "property" + }, + "persistent": true + }, + "custom.whids_in_s3": { + "binding": { + "config": { + "expression": "{session.custom.fc}" + }, + "transforms": [ + { + "code": "\tfrom AWS.s3 import S3Manager\n\t\n\tusername \u003d self.session.props.auth.user.userName\n\tapi_region_name \u003d self.custom.api_region_name\n\t\n\ts3m \u003d S3Manager(\u0027prod\u0027, api_region_name, username)\n\n\tbucket \u003d self.custom.stage_config.repo_bucket\n\treturn s3m.fetch_site_list(bucket)\n", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "params.enables": { + "paramDirection": "input", + "persistent": true + }, + "params.selected_whid": { + "onChange": { + "enabled": null, + "script": "\tself.custom.new_site_to_add \u003d getattr(currentValue, \u0027value\u0027, \u0027\u0027)" + }, + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 330, + "width": 600 + } + }, + "root": { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label Text/RightAlign_with_Padding", + "paddingLeft": "5px" + }, + "text": "S3 Image Bucket:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "label_LeftAlign" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "!{view.params.enables.bucket}" + }, + "type": "expr" + } + }, + "props.params.text": { + "binding": { + "config": { + "path": "view.custom.stage_config.repo_bucket" + }, + "type": "property" + } + } + }, + "props": { + "path": "Objects/Templates/Labels/label_LeftAlign", + "style": { + "classes": "Framework/Card/Value" + } + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "FlexContainer Image Bucket" + }, + "position": { + "basis": "26px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label Text/RightAlign_with_Padding", + "paddingLeft": "5px" + }, + "text": "S3 Source Bucket:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "label_LeftAlign" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "!{view.params.enables.bucket}" + }, + "type": "expr" + } + }, + "props.params.text": { + "binding": { + "config": { + "path": "view.custom.stage_config.source_bucket" + }, + "type": "property" + } + } + }, + "props": { + "path": "Objects/Templates/Labels/label_LeftAlign", + "style": { + "classes": "Framework/Card/Value" + } + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "FlexContainer Source Bucket" + }, + "position": { + "basis": "26px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label Text/RightAlign_with_Padding", + "paddingLeft": "5px" + }, + "text": "Child Projects:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "label_LeftAlign" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.params.text": { + "binding": { + "config": { + "expression": "len({view.custom.enabled_whids})" + }, + "type": "expr" + } + } + }, + "props": { + "path": "Objects/Templates/Labels/label_LeftAlign", + "style": { + "classes": "Framework/Card/Value" + } + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "100px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label Text/RightAlign_with_Padding", + "paddingLeft": "5px" + }, + "text": "Sites in S3:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "label_LeftAlign_0" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.params.text": { + "binding": { + "config": { + "expression": "len({view.custom.whids_in_s3})" + }, + "type": "expr" + } + } + }, + "props": { + "path": "Objects/Templates/Labels/label_LeftAlign", + "style": { + "classes": "Framework/Card/Value" + } + }, + "type": "ia.display.view" + }, + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.custom.expanded \u003d not self.view.custom.expanded" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "propConfig": { + "props.image.icon.path": { + "binding": { + "config": { + "expression": "if({view.custom.expanded}, \u0027material/expand_less\u0027, \u0027material/expand_more\u0027)" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": {} + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "grow": 1, + "shrink": 0 + }, + "props": { + "justify": "flex-end" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer Sites" + }, + "position": { + "basis": "26px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label Text/RightAlign_with_Padding", + "paddingLeft": "5px" + }, + "text": "Site to Add:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "label_LeftAlign" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "props.params.text": { + "binding": { + "config": { + "path": "view.custom.new_site_to_add" + }, + "type": "property" + } + } + }, + "props": { + "path": "Objects/Templates/Labels/label_LeftAlign", + "style": { + "classes": "Framework/Card/Value" + } + }, + "type": "ia.display.view" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t# show confirm dialog for user before adding site\n\tself.show_confirm_dialog()\n" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button Add New Site", + "tooltip": { + "location": "bottom", + "style": { + "whiteSpace": "pre" + } + } + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "meta.tooltip.enabled": { + "binding": { + "config": { + "path": "this.props.enabled" + }, + "type": "property" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "stringFormat(\u0027Add %s site folder to the image and source buckets:\\n[%s, %s]\u0027,\r\n\t{view.custom.new_site_to_add},{view.custom.stage_config.repo_bucket},\r\n\t{view.custom.stage_config.source_bucket})" + }, + "type": "expr" + } + }, + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.custom.new_site_to_add})\r\n\u0026\u0026len({view.custom.new_site_to_add})\r\n\u0026\u0026{view.custom.new_site_is_not_in_S3}\r\n\u0026\u0026{view.custom.developer_user}" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/library_add" + } + }, + "style": { + "margin": "2px" + }, + "text": "Add Site" + }, + "scripts": { + "customMethods": [ + { + "name": "show_success_dialog", + "params": [ + "msg\u003dNone" + ], + "script": "\t# ~~ 13 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\t# payload\t\t\t\t(default \u003d {}) add a payload here to return to the target message handler\n\t\n\tAlerts.showAlert(\n\t\t\"success\", \n\t\t\"New Site Added\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"OK\", \n\t\t\"CLOSE\", \n\t\t\"\", \n\t\t\"\", \n\t\t\"left\", \n\t\t\"closePopup\", \n\t\t\"closePopup\", \n\t\t\"closePopup\",\n\t\t{}\n\t)\n\t\t\t\t\t" + }, + { + "name": "show_warning_dialog", + "params": [ + "msg\u003dNone" + ], + "script": "\t# ~~ 13 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\t# payload\t\t\t\t(default \u003d {}) add a payload here to return to the target message handler\n\t\n\tAlerts.showAlert(\n\t\t\"warning\", \n\t\t\"New Site NOT Added\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"OK\", \n\t\t\"CLOSE\", \n\t\t\"\", \n\t\t\"\", \n\t\t\"left\", \n\t\t\"closePopup\", \n\t\t\"closePopup\", \n\t\t\"closePopup\",\n\t\t{}\n\t)\n\t\t\t\t\t" + }, + { + "name": "show_error_dialog", + "params": [ + "msg\u003dNone" + ], + "script": "\t# ~~ 13 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\t# payload\t\t\t\t(default \u003d {}) add a payload here to return to the target message handler\n\t\n\tAlerts.showAlert(\n\t\t\"error\", \n\t\t\"New Site Add Error!\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"OK\", \n\t\t\"CLOSE\", \n\t\t\"\", \n\t\t\"\", \n\t\t\"left\", \n\t\t\"closePopup\", \n\t\t\"closePopup\", \n\t\t\"closePopup\",\n\t\t{}\n\t)\n\t\t\t\t\t" + }, + { + "name": "show_confirm_dialog", + "params": [ + "payload\u003dNone" + ], + "script": "\t# ~~ 13 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\t# payload\t\t\t\t(default \u003d {}) add payload of data to pass to the popup\n\tmsg \u003d (\u0027Are you sure you want to add %s site to S3? \u0027\n\t\t\u0027\\nThis will create a new folder in the in each of the image repo and source file S3 buckets\u0027) % (\n\t\tself.view.custom.new_site_to_add)\n\tpayload \u003d {}\t\t\n\tAlerts.showAlert(\n\t\t\"info\", \n\t\t\"Add New Site to S3?\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"Continue\", \n\t\t\"Cancel\", \n\t\t\"library_add\", \n\t\t\"\", \n\t\t\"left\", \n\t\t\"confirm_add_new_site\", \n\t\t\"closePopup\", \n\t\t\"closePopup\",\n\t\tpayload\n\t)\n\t\t\t" + }, + { + "name": "update_bindings", + "params": [], + "script": "\t\"\"\"\n\t\tAfter data saved to S3, refresh session and view bindings\n\t\"\"\"\n\tself.view.refreshBinding(\u0027custom.enabled_whids\u0027)\n\tself.view.refreshBinding(\u0027custom.whids_in_s3\u0027)\n\tproject_table \u003d self.parent.parent.getChild(\"FlexContainer Tables\").getChild(\"FlexContainer Projects\").getChild(\"Table\")\n\tproject_table.refreshBinding(\u0027props.data\u0027)\n\tsystem.perspective.sendMessage(\u0027update_enabled_whids\u0027, {}, scope\u003d\u0027session\u0027)\n\tself.view.custom.new_site_to_add \u003d None\n\tself.view.custom.loading \u003d False\n\t\t" + }, + { + "name": "add_new_site", + "params": [], + "script": "\t\"\"\"\n\t\tCall AWS.s3.S3Manager.add_new_site() method with user selections\n\t\"\"\"\n\tfrom AWS.s3 import S3Manager\n\tfrom pprint import pformat\n\tfrom helper.helper import sanitize_tree\n\t\n\tapi_region_name \u003d self.view.custom.api_region_name\n\tusername \u003d self.session.props.auth.user.userName\n\tsite \u003d self.view.custom.new_site_to_add\n\tself.view.custom.loading \u003d True\n\n\ts3m \u003d S3Manager(\u0027prod\u0027, api_region_name, username)\n\t# Setting `bucket` \u003d \u0027both\u0027 will add the site folder to both the image and source buckets\n\tbucket \u003d \u0027both\u0027\n\toperation \u003d \u0027add_new_site\u0027\n\tparams \u003d {\u0027site\u0027: site, \u0027bucket\u0027: bucket}\n\ttry:\n\t\tresp \u003d getattr(s3m, operation)(**params)\n\t\tmsg \u003d pformat(sanitize_tree(resp))\n\t\tsystem.perspective.print(msg)\n\t\tresp_code \u003d resp.get(\u0027code\u0027, None)\n\t\tif (resp_code and resp_code !\u003d 200) or (not resp_code and \u0027message\u0027 in resp):\n\t\t\t# \u0027code\u0027 in resp indicates API encountered and returned an error\n\t\t\tself.show_error_dialog(msg)\n\t\t\tself.view.custom.loading \u003d False\n\t\telse:\n\t\t\tself.show_success_dialog(msg)\n\t\t\tself.update_bindings()\n\texcept:\n\t\timport traceback\n\t\tmsg \u003d \u0027Error executing %s operation! \\nError: %s\u0027 % (\n\t\t\t\toperation, traceback.format_exc())\n\t\tsystem.perspective.print(msg)\n\t\tself.view.custom.loading \u003d False\n\t\tself.show_error_dialog(msg)\n\t" + } + ], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "confirm_add_new_site", + "pageScope": false, + "script": "\tsystem.perspective.closePopup(\u0027alertDialog\u0027)\n\t# call the add_new_site custom method\n\tself.add_new_site()\n\t\t\t", + "sessionScope": true, + "viewScope": true + } + ] + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer Add New Site" + }, + "position": { + "basis": "32px", + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "{view.custom.developer_user}\r\n\u0026\u0026!isNull({view.custom.new_site_to_add})\r\n\u0026\u0026{view.custom.new_site_is_not_in_S3}" + }, + "type": "expr" + } + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "events": { + "component": { + "onSelectionChange": { + "config": { + "script": "\t# validate the selection data is not null\n\tif self.props.selection.data:\n\t\tproject \u003d self.props.selection.data[0].Project\n\t\tif getattr(project, \u0027value\u0027, None):\n\t\t\t# if this returns something, the row is styled, grab the value\n\t\t\tproject \u003d project.get(\u0027value\u0027)\n\t\tproject_site \u003d project.replace(\"_SCADA\", \"\")\n\t\tself.view.custom.new_site_to_add \u003d project_site\n" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Table" + }, + "position": { + "basis": "200px", + "shrink": 0 + }, + "propConfig": { + "props.data": { + "binding": { + "config": { + "expression": "toStr({view.custom.enabled_whids})+toStr({view.custom.whids_in_s3})" + }, + "transforms": [ + { + "code": "\tenabled_whids \u003d self.view.custom.enabled_whids\n\twhids_in_s3 \u003d self.view.custom.whids_in_s3\n\tdata \u003d [{\u0027Project\u0027: x + \u0027_SCADA\u0027} for x in enabled_whids]\n\tfor row in data:\n\t\tproject \u003d row[\u0027Project\u0027]\n\t\twhid \u003d project.replace(\u0027_SCADA\u0027,\u0027\u0027)\n\t\tif whid not in whids_in_s3:\n\t\t\tstyle \u003d {\u0027backgroundColor\u0027: \u0027#FFFF00\u0027}\n\t\t\trow[\u0027Project\u0027] \u003d {\u0027value\u0027: project, \u0027style\u0027: style}\n\treturn data", + "type": "script" + } + ], + "type": "expr" + } + }, + "props.filter.enabled": { + "onChange": { + "enabled": null, + "script": "\tif not getattr(currentValue, \u0027value\u0027, None):\n\t\t# clear filter text when filter is disabled\n\t\tself.props.filter.text \u003d \u0027\u0027\n\t\t" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Project", + "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": "center", + "style": { + "classes": "" + }, + "title": "Child Project" + }, + "justify": "center", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + } + ], + "style": { + "margin": "5px" + } + }, + "type": "ia.display.table" + } + ], + "meta": { + "name": "FlexContainer Projects" + }, + "position": { + "basis": "50%", + "grow": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Table" + }, + "position": { + "basis": "200px", + "shrink": 0 + }, + "propConfig": { + "props.data": { + "binding": { + "config": { + "path": "view.custom.whids_in_s3" + }, + "transforms": [ + { + "code": "\treturn [{\u0027WHID\u0027: x} for x in value]", + "type": "script" + } + ], + "type": "property" + } + }, + "props.filter.enabled": { + "onChange": { + "enabled": null, + "script": "\tif not getattr(currentValue, \u0027value\u0027, None):\n\t\t# clear filter text when filter is disabled\n\t\tself.props.filter.text \u003d \u0027\u0027\n\t\t" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "WHID", + "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": "center", + "style": { + "classes": "" + }, + "title": "FC" + }, + "justify": "center", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + } + ], + "style": { + "margin": "5px" + } + }, + "type": "ia.display.table" + } + ], + "meta": { + "name": "FlexContainer Site Folders" + }, + "position": { + "basis": "50%", + "grow": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer Tables" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer Projects vs Folders" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "view.custom.expanded" + }, + "type": "property" + } + } + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "100%", + "grow": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/site/resource.json b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/site/resource.json new file mode 100644 index 0000000..327cb93 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/site/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "008cfd8ad0041b228fc19fdb399fb3f145b0d7963cdc789a5aada7c6f83c546a" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/site/thumbnail.png b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Management/site/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0b6ad794a2441de0961e458c5fa781485c3e5f GIT binary patch literal 3500 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 Ios78q5Ay1=6#xJL literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/S3/Versions/Log_Table/view.json b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Versions/Log_Table/view.json new file mode 100644 index 0000000..0c15c08 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Versions/Log_Table/view.json @@ -0,0 +1,1139 @@ +{ + "custom": { + "api_region_name": "na", + "filter_menu_data": [ + { + "filters": [ + { + "color": "#8B008B", + "column": "test1", + "group": 1, + "id": 0, + "text": "value1" + } + ], + "group_name": "test1", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "filters": [ + { + "color": "#00CED1", + "column": "test2", + "group": 2, + "id": 1, + "text": "value2" + } + ], + "group_name": "test2", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + } + ], + "filtered_table_data": [], + "filters": { + "active": [], + "default_colors": [ + "#8B008B", + "#00CED1", + "#FF8C00", + "#708090", + "#DC143C", + "#FFDEAD", + "#7B68EE", + "#4169E1", + "#F4A460", + "#9ACD32" + ], + "number_of_groups": "value", + "selection_active": false + }, + "stage_config": { + "account_id": "925510716640", + "endpoint": "https://scada-s3-management.narme-scada.rme.amazon.dev/", + "lambda_name": "RMESDScadaS3ManagementFlaskLambda-prod", + "region": "us-east-2", + "repo_bucket": "na-ignition-image-repo", + "s3_region": "us-east-1", + "source_bucket": "na-ignition-image-source" + }, + "table_data": [], + "use_filtered_table": false + }, + "params": { + "DoubleClick": { + "Enabled": false, + "MP": "MP", + "Sts": "STATUS", + "TextCode": "TEXT_CODE", + "WHID": "WHID" + }, + "NavigationSettings": { + "BaseUrl": "", + "Column": "", + "Enabled": false + }, + "SelectedRow": [], + "VisibleColCount": 5, + "filters": [ + { + "column": "test1", + "group": 1, + "text": "value1" + }, + { + "column": "test2", + "group": 2, + "text": "value2" + } + ], + "header_order": [ + { + "field": "VersionId", + "title": "VERSION ID", + "visible": true + }, + { + "field": "LastModified", + "title": "LAST MODIFIED", + "visible": true + }, + { + "field": "Size", + "title": "SIZE (Bytes)", + "visible": true + }, + { + "field": "IsLatest", + "title": "IS LATEST?", + "visible": true + }, + { + "field": "Key", + "title": "OBJECT KEY", + "visible": true + }, + { + "field": "StorageClass", + "title": "STORAGE CLASS", + "visible": false + }, + { + "field": "ETag", + "title": "ETAG", + "visible": false + } + ], + "key_to_read_from": "use_param", + "puToDismiss": "", + "table_data": [], + "title": "SCADA S3 Version History" + }, + "propConfig": { + "custom.api_region_name": { + "binding": { + "config": { + "path": "session.custom.aws.prefix" + }, + "type": "property" + }, + "persistent": true + }, + "custom.filter_menu_data": { + "binding": { + "config": { + "path": "view.custom.filters.deactive" + }, + "transforms": [ + { + "code": "\tinstances \u003d []\n\tgroups \u003d {}\n\tfor filter in value:\n\t \tif not groups.has_key(filter.column):\n\t \t\tgroups[filter.column] \u003d []\n\t \tgroups[filter.column].append(filter)\n\tfor key in groups:\n\t\tinstance \u003d {\"instanceStyle\": {\n\t \t\t\t\"classes\": \"\"},\n\t \t\t\t \"instancePosition\": {}}\n\t \tgroups[key].sort()\n\t \tinstance[\u0027filters\u0027] \u003d groups[key]\n\t \tinstance[\u0027group_name\u0027] \u003d key\n\t \tinstances.append(instance)\n\treturn instances", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.filtered_table_data": { + "binding": { + "config": { + "expression": "if({view.custom.table_data} !\u003d {view.custom.filters.active},\r\n{view.custom.filters.active},\r\n{view.custom.filters.active})" + }, + "transforms": [ + { + "code": "\tfiltered_table \u003d []\n\tif len(value) \u003e 0:\n\t\tfilter_lookup \u003d {}\n\t\tfor act_filter in value:\n\t\t\tif act_filter[\u0027column\u0027] not in filter_lookup:\n\t\t\t\tfilter_lookup[act_filter[\u0027column\u0027]] \u003d []\n\t\t\tfilter_lookup[act_filter[\u0027column\u0027]].append(act_filter[\u0027text\u0027])\n\t\tfor row in self.custom.table_data:\n\t\t\tsystem.perspective.print(row)\n\t\t\tshould_filter \u003d {}\t\t\n\t\t\t# Handles stylized rows\t\n\t\t\tif \u0027style\u0027 in row and \u0027value\u0027 in row and len(row) \u003d\u003d2:\n\t\t\t\t#for column in row:\n\t\t\t\t\t#system.perspective.print(\u0027value:%s\u0027%column)\n\t\t\t\t\tdata_columns \u003d row[\u0027value\u0027]\n\t\t\t\t\tfor s_column in data_columns:\n\t\t\t\t\t\tif s_column in filter_lookup:\n\t\t\t\t\t\t\tif data_columns[s_column] in filter_lookup[s_column]:\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tshould_filter[s_column] \u003d True\n\t\t\t\t\t\t\telse:\n\t\t\t\t\t\t\t\tshould_filter[s_column] \u003d False\n\t\t\t\t\t\telse:\n\t\t\t\t\t\t\tshould_filter[s_column] \u003d False\t\n\t\t\telse:\n\t\t\t\tfor column in row:\n\t\t\t\t\tif column in filter_lookup:\n\t\t\t\t\t\tif row[column] in filter_lookup[column]:\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tshould_filter[column] \u003d True\n\t\t\t\t\t\telse:\n\t\t\t\t\t\t\tshould_filter[column] \u003d False\n\t\t\t\t\telse:\n\t\t\t\t\t\tshould_filter[column] \u003d False\n\t\t\tif sum(should_filter.values()) \u003d\u003d len(filter_lookup.keys()):\n\t\t\t\tfiltered_table.append(row)\n\n\treturn filtered_table", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "custom.filters": { + "persistent": true + }, + "custom.filters.deactive": { + "binding": { + "config": { + "path": "view.params.filters" + }, + "transforms": [ + { + "code": "\t\n\tfilters \u003d []\n\tgroups \u003d []\n\tfor index, filter in enumerate(value):\n\t\tnew_filter \u003d {}\t\n\t\tif not filter.has_key(\u0027group\u0027):\n\t\t\tnew_filter[\u0027group\u0027] \u003d 0\n\t\telse:\n\t\t\tnew_filter[\u0027group\u0027] \u003d filter.group\n\t\tif not filter.has_key(\u0027color\u0027):\n\t\t\tif new_filter[\u0027group\u0027] not in groups:\n\t\t\t\tgroups.append(new_filter[\u0027group\u0027])\n\t\t\tnew_filter[\u0027color\u0027] \u003d self.custom.filters.default_colors[groups.index(new_filter[\u0027group\u0027])]\n\t\telse:\n\t\t\tnew_filter[\u0027color\u0027] \u003d filter.color\n\t\tif not filter.has_key(\u0027text\u0027):\n\t\t\tnew_filter[\u0027text\u0027] \u003d \u0027Filter \u0027 + str(index)\n\t\telse:\n\t\t\tnew_filter[\u0027text\u0027] \u003d filter.text\n\t\tif not filter.has_key(\u0027column\u0027):\n\t\t\tnew_filter[\u0027column\u0027] \u003d 0\n\t\telse:\n\t\t\tnew_filter[\u0027column\u0027] \u003d filter.column\n\t\tnew_filter[\u0027id\u0027] \u003d index\n\t\tfilters.append(new_filter)\t\t\t\t\n\treturn filters", + "type": "script" + } + ], + "type": "property" + } + }, + "custom.stage_config": { + "binding": { + "config": { + "expression": "{view.custom.api_region_name}" + }, + "transforms": [ + { + "code": "\treturn AWS.s3.STAGE_CONFIG[\u0027prod\u0027][value]", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "custom.table_data": { + "binding": { + "config": { + "expression": "if({view.params.key_to_read_from} \u003d \u0027use_param\u0027,\r\n{view.params.table_data},\r\nproperty(concat(\u0027session.custom.tableComponentData.\u0027,{view.params.key_to_read_from})))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.use_filtered": { + "persistent": true + }, + "custom.use_filtered_table": { + "binding": { + "config": { + "path": "view.custom.filtered_table_data" + }, + "transforms": [ + { + "code": "\treturn len(value) \u003e 0", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "params.DoubleClick": { + "paramDirection": "input", + "persistent": true + }, + "params.NavigationSettings": { + "paramDirection": "input", + "persistent": true + }, + "params.SelectedRow": { + "binding": { + "config": { + "path": "/root/Table.props.selection.data" + }, + "type": "property" + }, + "paramDirection": "output", + "persistent": true + }, + "params.VisibleColCount": { + "paramDirection": "input", + "persistent": true + }, + "params.filters": { + "paramDirection": "input", + "persistent": true + }, + "params.header_order": { + "paramDirection": "input", + "persistent": true + }, + "params.key_to_read_from": { + "paramDirection": "input", + "persistent": true + }, + "params.puToDismiss": { + "paramDirection": "input", + "persistent": true + }, + "params.table_data": { + "paramDirection": "input", + "persistent": true + }, + "params.title": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 844 + } + }, + "root": { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Title" + }, + "position": { + "basis": "100%" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.title" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Title/Text", + "fontSize": 14, + "overflow": "visible" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "Title" + }, + "position": { + "basis": "50%" + }, + "props": { + "style": { + "fontSize": 1, + "marginLeft": 10, + "overflow": "visible" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "FilterCheck", + "tooltip": { + "enabled": true, + "location": "top-left", + "text": "Enable Table Search" + } + }, + "position": { + "basis": "108px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "LEN({..../Table.props.data})\u003e0" + }, + "type": "expr" + } + } + }, + "props": { + "checkedIcon": { + "style": { + "fontSize": 16 + } + }, + "indeterminateIcon": { + "style": { + "fontSize": 16 + } + }, + "style": { + "fontSize": 12 + }, + "text": "Search?", + "textPosition": "left", + "uncheckedIcon": { + "style": { + "fontSize": 16 + } + } + }, + "type": "ia.input.checkbox" + }, + { + "meta": { + "name": "Spacer1" + }, + "position": { + "basis": "1px" + }, + "props": { + "style": { + "classes": "General/Divider" + } + }, + "type": "ia.container.flex" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\ttable \u003d self.parent.parent.parent.getChild(\"Table\")\n\t# ignition perspective has a bug with table where the only way to \n\t# actually de-select and remove the row highlight is to set the\n\t# row and column to -1 and THEN None\n\t# this will automatically clear the selection.data array\n\ttable.props.selection.selectedRow \u003d -1\n\ttable.props.selection.selectedColumn \u003d -1\n\ttable.props.selection.selectedRow \u003d None\n\ttable.props.selection.selectedColumn \u003d None" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "ClearSelectionButton", + "tooltip": { + "enabled": true, + "location": "top-left", + "text": "Clear Selection" + } + }, + "position": { + "basis": "31px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "len({..../Table.props.selection.data})\u003e0" + }, + "type": "expr" + } + } + }, + "props": { + "path": "material/clear", + "style": { + "classes": "General/Button" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Spacer2" + }, + "position": { + "basis": "1px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "../ClearSelectionButton.position.display" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "General/Divider" + } + }, + "type": "ia.container.flex" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "draggable": false, + "id": "ColumnSelection", + "modal": true, + "overlayDismiss": true, + "position": { + "relativeLocation": "bottom-left" + }, + "positionType": "relative", + "resizable": true, + "showCloseIcon": true, + "type": "toggle", + "viewParams": { + "Columns": "{/root/TableHeader/TableActions/ColumnSelectionButton.custom.Columns}" + }, + "viewPath": "Objects/PowerTable/ColumnSelection", + "viewportBound": false + }, + "scope": "C", + "type": "popup" + } + } + }, + "meta": { + "name": "ColumnSelectionButton", + "tooltip": { + "enabled": true, + "location": "top-left", + "text": "+/- Columns" + } + }, + "position": { + "basis": "29px" + }, + "propConfig": { + "custom.Columns": { + "binding": { + "config": { + "path": "..../Table.props.columns" + }, + "transforms": [ + { + "code": "\tcolumns \u003d {}\n\tif len(value) \u003e 0:\n\t\tfor column in value:\n\t\t\t#field \u003d column.field\n\t\t\tfield \u003d column.header.title\n\t\t\tif field \u003d\u003d \u0027\u0027:\n\t\t\t\tfield \u003d \u0027None\u0027\n\t\t\tcolumns[field] \u003d column.visible\n\treturn columns", + "type": "script" + } + ], + "type": "property" + } + }, + "position.display": { + "binding": { + "config": { + "expression": "LEN({..../Table.props.data})\u003e0" + }, + "type": "expr" + } + } + }, + "props": { + "path": "material/view_column", + "style": { + "classes": "General/Button", + "fontSize": 12, + "marginBottom": 5, + "marginTop": 5 + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Spacer4" + }, + "position": { + "basis": "1px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "LEN({..../Table.props.data})\u003e0" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "classes": "General/Divider" + } + }, + "type": "ia.container.flex" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tself.view.custom.filters.selection_active \u003d not self.view.custom.filters.selection_active" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "FilterButton", + "tooltip": { + "enabled": true, + "location": "top-left", + "text": "Filter Table" + } + }, + "position": { + "basis": "29px", + "display": false + }, + "props": { + "path": "material/filter_list", + "style": { + "classes": "General/Button", + "fontSize": 12, + "marginBottom": 5, + "marginTop": 5 + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Spacer3" + }, + "position": { + "basis": "1px" + }, + "props": { + "style": { + "classes": "General/Divider" + } + }, + "type": "ia.container.flex" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\n\tcsv_headers \u003d []\n\tcsv_data \u003d []\n\tsystem.perspective.print(\u0027DOWNLOADING TABLE DATA\u0027)\n\tsource_data \u003d self.parent.parent.parent.getChild(\"Table\").props.data\n\theaders \u003d source_data[0].keys()\n\t\n\tif \u0027style\u0027 in headers and \u0027value\u0027 in headers and len(headers) \u003d\u003d 2:\n\t\tdata \u003d [row[\u0027value\u0027] for row in source_data]\n\telse:\n\t\tdata \u003d source_data\n\t\t\n\tfor record in data:\n\t\tif len(csv_headers) \u003d\u003d 0:\n\t\t\tcsv_headers \u003d record.keys()\n\t\t\tcsv_headers.sort()\n\t\t\tcsv_headers \u003d [str(i) for i in csv_headers]\n\t\tcsv_row \u003d []\n\t\tfor index in range(len(record)):\n\t\t\tcsv_row.append(str(record[csv_headers[index]]))\n\t\tcsv_data.append(csv_row)\n\t\n\ttry:\n\t\tcsv_dataset \u003d system.dataset.toDataSet(csv_headers, csv_data)\n\texcept Exception, e:\n\t\tsystem.perspective.print(str(e))\n\tcsv_export \u003d system.dataset.toCSV(csv_dataset)\n\tfilename \u003d \u0027{0}.csv\u0027.format(str(system.date.now()).replace(\u0027 \u0027, \u0027_\u0027))\n\tsystem.perspective.download(filename, csv_export)\n\t\n\tsystem.perspective.print(\u0027DONE DOWNLOADING TABLE DATA\u0027)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "SettingsButton", + "tooltip": { + "enabled": true, + "location": "top-left", + "text": "Download Table Contents" + } + }, + "position": { + "basis": "30px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "LEN({..../Table.props.data})\u003e0" + }, + "type": "expr" + } + } + }, + "props": { + "path": "material/cloud_download", + "style": { + "classes": "General/Button", + "marginRight": 10 + } + }, + "type": "ia.display.icon" + } + ], + "meta": { + "name": "TableActions", + "tooltip": { + "location": "top-right" + } + }, + "position": { + "grow": 1 + }, + "props": { + "justify": "flex-end" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "TableHeader" + }, + "position": { + "shrink": 0 + }, + "props": { + "justify": "space-between", + "style": { + "borderBottomStyle": "solid", + "borderBottomWidth": 1, + "cursor": "pointer" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "FilterMenu" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "props.instances": { + "binding": { + "config": { + "path": "view.custom.filter_menu_data" + }, + "type": "property" + } + } + }, + "props": { + "alignContent": "flex-start", + "alignItems": "flex-start", + "path": "Components/PowerTable/FilterMenuGroup", + "style": { + "overflow": "visible" + }, + "useDefaultViewHeight": false, + "useDefaultViewWidth": false, + "wrap": "wrap" + }, + "type": "ia.display.flex-repeater" + } + ], + "meta": { + "name": "FilterSelection" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "view.custom.filters.selection_active" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "borderBottomStyle": "solid", + "borderBottomWidth": 1, + "classes": "Menu/Menu", + "overflow": "visible", + "paddingLeft": 10, + "paddingRight": 10 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "FiltersLabel" + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.custom.filters.active" + }, + "transforms": [ + { + "code": "\t\n\treturn \u0027\u0027.join([\u0027FILTERS (\u0027, str(len(value)), \u0027):\u0027])", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Menu/Menu Page/Text", + "fontSize": 10, + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "FiltersCarousel" + }, + "propConfig": { + "props.views": { + "binding": { + "config": { + "path": "view.custom.filters.active" + }, + "transforms": [ + { + "code": "\n\tviews \u003d []\n\tfor filter in value:\n\t\tcarousel_view \u003d {\n\t\t\t\u0027viewPath\u0027:\u0027Components/PowerTable/FilterTile\u0027,\n\t\t\t\u0027direction\u0027 : \u0027row\u0027,\n\t\t\t\u0027viewParams\u0027: {},\n\t\t\t\u0027justify\u0027:\u0027flex-start\u0027,\n\t\t\t\u0027alignItems\u0027: \u0027center\u0027}\n\t\tcarousel_view[\u0027viewParams\u0027][\u0027color\u0027] \u003d filter[\u0027color\u0027]\n\t\tcarousel_view[\u0027viewParams\u0027][\u0027text\u0027] \u003d filter[\u0027text\u0027]\t\n\t\tcarousel_view[\u0027viewParams\u0027][\u0027id\u0027] \u003d filter[\u0027id\u0027]\t\n\t\t\n\t\tviews.append(carousel_view)\n\treturn views", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "appearance": { + "arrows": { + "next": { + "style": { + "marginRight": 5 + } + }, + "previous": { + "style": { + "marginLeft": 5 + } + } + }, + "dots": { + "enabled": false + }, + "slidePadding": 3, + "slidesToShow": 5, + "useDefaultViewHeight": true, + "useDefaultViewWidth": true + }, + "style": { + "overflow": "visible", + "textAlign": "left" + } + }, + "type": "ia.display.carousel" + } + ], + "meta": { + "name": "Left" + }, + "position": { + "basis": "90%" + }, + "props": { + "style": { + "overflow": "visible" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.custom.filters.active \u003d []\n\tsystem.perspective.sendMessage(\u0027deactivate-filter\u0027, payload \u003d {\u0027id\u0027:-1}, scope \u003d \u0027page\u0027)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "ClearButton" + }, + "position": { + "basis": "51px" + }, + "props": { + "primary": false, + "style": { + "classes": "Menu/Item", + "fontSize": 12, + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5 + }, + "text": "Clear", + "textStyle": { + "classes": "Page/Text" + } + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "Right" + }, + "position": { + "basis": "10%" + }, + "props": { + "justify": "flex-end", + "style": { + "overflow": "visible" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "Filters" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "view.custom.filters.active" + }, + "transforms": [ + { + "code": "\treturn len(value) \u003e 0", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "style": { + "overflow": "visible" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "ReulstLengthLabel" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "view.custom.filters.active" + }, + "transforms": [ + { + "code": "\treturn len(value) \u003e 0", + "type": "script" + } + ], + "type": "property" + } + }, + "props.text": { + "binding": { + "config": { + "path": "../Table.props.data" + }, + "transforms": [ + { + "code": "\treturn \u0027\u0027.join([str(len(value)), \u0027 results within filters\u0027])", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Menu/Item Page/Text", + "fontSize": 12, + "paddingLeft": 5, + "textTransform": "lowercase" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "pager" + }, + "position": { + "basis": "35px", + "display": false, + "shrink": 0 + }, + "propConfig": { + "props.params.number_of_pages": { + "binding": { + "config": { + "expression": "len({../Table.custom.raw_data})" + }, + "type": "expr" + } + }, + "props.params.options_for_pagers": { + "binding": { + "config": { + "path": "../Table.props.pager.options" + }, + "type": "property" + } + } + }, + "props": { + "params": { + "number_of_items_per_page": 100, + "page_selected": 0 + }, + "path": "Components/PowerTable/pager" + }, + "type": "ia.display.view" + }, + { + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\t# grab row JSON from double-click\n\td \u003d event.value\n\t# build out the stage, site, flow-view, and copy_option from the object-key in row\n\tobj_key \u003d d.Key\n\tpath \u003d obj_key.split(\u0027/\u0027)\n\tsite \u003d path[1]\n\tfilename \u003d path[-1]\n\tview \u003d filename.replace(\".svg\",\"\").replace(\".drawio\",\"\")\n\t# from filename suffix, fetch bucket name from \"stage_config\" custom prop\n\tstage_config \u003d self.view.custom.stage_config\n\tbucket \u003d None\n\tif filename.endswith(\".svg\"):\n\t\tbucket \u003d stage_config.repo_bucket\n\tif filename.endswith(\".drawio\"):\n\t\tbucket \u003d stage_config.source_bucket\n\t# build out query_params from row values\n\t# flowview, site, and stage are multi-select dropdowns so need to be cast as lists\n\tnull \u003d None\n\tquery_params \u003d {\n\t\t\"copy_option\": null,\n\t\t\"destination_view\": view,\n\t\t\"destination_site\": site,\n\t\t\"destination_bucket\": bucket,\n\t\t\"end_time\": null,\n\t\t\"error_occurred\": null,\n\t\t\"operation\": null,\n\t\t\"source_view\": \"\",\n\t\t\"source_site\": null,\n\t\t\"source_bucket\": null,\n\t\t\"start_time\": null,\n\t\t\"username\": \"\"\n\t}\n\t# Open audit log viewer\n\tview_path \u003d \u0027PopUp-Views/S3/Audit/Log_Viewer\u0027\n\tparams \u003d {\u0027query_params\u0027: query_params}\n\tsystem.perspective.openPopup(\u0027Audit Log Viewer\u0027, view_path, \n\t\t\t\t\t\t\t\tparams, \u0027SCADA S3 Audit Logs\u0027)\n" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Table" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "custom.raw_data": { + "binding": { + "config": { + "expression": "IF({../pager.props.params.number_of_items_per_page} \u003e 0,\r\nIF(LEN({view.custom.filters.active})\u003d0, {view.custom.table_data}, {view.custom.filtered_table_data}),\u0027\u0027)" + }, + "transforms": [ + { + "code": "\tlist_of_data \u003d []\n\tsingle_list \u003d []\n\tfor item in value:\n\t\tif len(single_list) \u003c self.getSibling(\"pager\").props.params.number_of_items_per_page:\n\t\t\tsingle_list.append(item)\n\t\telse:\n\t\t\tlist_of_data.append(single_list)\n\t\t\tsingle_list \u003d []\n\t\t\tsingle_list.append(item)\n\tif len(single_list) \u003e 0:\n\t\tlist_of_data.append(single_list)\n\treturn list_of_data", + "type": "script" + } + ], + "type": "expr" + } + }, + "props.columns": { + "binding": { + "config": { + "path": "view.custom.table_data" + }, + "transforms": [ + { + "code": "\tfrom helper.helper import sanitize_tree\n\tcolumns \u003d []\n\tif len(value) \u003e 0:\n\t\trequestedHeaders \u003d sanitize_tree(self.view.params.header_order)\n\t\tfrom pprint import pformat\n#\t\tsystem.perspective.print(pformat(requestedHeaders))\n\t\theaders \u003d []\n\t\tif len(requestedHeaders) \u003e 0:\n\t\t\tfor item in requestedHeaders:\n\t\t\t\tif \u0027style\u0027 in value[0].keys() and \u0027value\u0027 in value[0].keys() and len(value[0].keys()) \u003d\u003d2:\n\t\t\t\t\tif item in value[0][\u0027value\u0027].keys():\n\t\t\t\t\t\theaders.append(item)\n\t\t\t\telse:\n\t\t\t\t\tif item in value[0].keys():\n\t\t\t\t\t\theaders.append(item)\n\t\t\t\t\tif isinstance(item, dict) and \u0027field\u0027 in item and item[\u0027field\u0027] in value[0].keys():\n\t\t\t\t\t\theaders.append(item)\n\t\tif len(headers) \u003d\u003d 0:\n\t\t\theaders \u003d value[0].keys()\n\t\tfor header in headers:\t\n\t\t\tfield \u003d header\n\t\t\tvisible \u003d True\n\t\t\ttry:\n\t\t\t\ttitle \u003d str(header).replace(\u0027_\u0027, \u0027 \u0027).upper()\n\t\t\texcept:\n\t\t\t\ttitle \u003d \u0027\u0027\n\t\t\tif isinstance(header, dict):\n\t\t\t\tfield \u003d header.get(\u0027field\u0027, \u0027\u0027)\n\t\t\t\tvisible \u003d header.get(\u0027visible\u0027, True)\n\t\t\t\ttitle \u003d header.get(\u0027title\u0027, field.replace(\u0027_\u0027, \u0027 \u0027).upper())\n\t\t\tcolumn \u003d {\n\t\t\t \"field\": field,\n\t\t\t \"visible\": visible,\n\t\t\t \"editable\": True,\n\t\t\t \"render\": \"auto\",\n\t\t\t \"justify\": \"center\",\n\t\t\t \"align\": \"center\",\n\t\t\t \"resizable\": True,\n\t\t\t \"sortable\": True,\n\t\t\t \"sort\": \"none\",\n\t\t\t \"viewPath\": \"\",\n\t\t\t \"viewParams\": {},\n\t\t\t \"boolean\": \"checkbox\",\n\t\t\t \"number\": \"value\",\n\t\t\t \"progressBar\": {\n\t\t\t\t\"max\": 100,\n\t\t\t\t\"min\": 0,\n\t\t\t\t\"bar\": {\n\t\t\t\t \"color\": \"\",\n\t\t\t\t \"style\": {\n\t\t\t\t\t\"classes\": \"\"\n\t\t\t\t }\n\t\t\t\t},\n\t\t\t\t\"track\": {\n\t\t\t\t \"color\": \"\",\n\t\t\t\t \"style\": {\n\t\t\t\t\t\"classes\": \"\"\n\t\t\t\t }\n\t\t\t\t},\n\t\t\t\t\"value\": {\n\t\t\t\t \"enabled\": True,\n\t\t\t\t \"format\": \"0,0.##\",\n\t\t\t\t \"justify\": \"center\",\n\t\t\t\t \"style\": {\n\t\t\t\t\t\"classes\": \"\"\n\t\t\t\t }\n\t\t\t\t}\n\t\t\t },\n\t\t\t \"toggleSwitch\": {\n\t\t\t\t\"color\": {\n\t\t\t\t \"selected\": \"\",\n\t\t\t\t \"unselected\": \"\"\n\t\t\t\t}\n\t\t\t },\n\t\t\t \"numberFormat\": \"0,0.##\",\n\t\t\t \"dateFormat\": \"MM/DD/YYYY\",\n\t\t\t \"width\": \"\",\n\t\t\t \"strictWidth\": False,\n\t\t\t \"style\": {\n\t\t\t\t\"classes\": \"\"\n\t\t\t },\n\t\t\t \"header\": {\n\t\t\t\t\"title\": title,\n\t\t\t\t\"justify\": \"center\",\n\t\t\t\t\"align\": \"center\",\n\t\t\t\t\"style\": {\n\t\t\t\t \"classes\": \"\",\n\t\t\t\t \u0027fontSize\u0027:\u002712px\u0027\n\t\t\t\t}\n\t\t\t },\n\t\t\t \"footer\": {\n\t\t\t\t\"title\": \"\",\n\t\t\t\t\"justify\": \"left\",\n\t\t\t\t\"align\": \"center\",\n\t\t\t\t\"style\": {\n\t\t\t\t \"classes\": \"\"\n\t\t\t\t}\n\t\t\t }\n\t\t\t}\t\t\t\n\t\t\tcolumns.append(column)\n#\t\tif self.view.params.header_order !\u003d [] and len(headers) \u003d\u003d len(self.view.params.header_order):\n#\t\t\tnew_columns \u003d [None] * len(columns)\n#\t\t\tfor column in columns:\n#\t\t\t\tindex \u003d self.view.params.header_order.index(column[\u0027field\u0027])\n#\t\t\t\tnew_columns[index] \u003d column\n#\t\t\tcolumns \u003d new_columns\n\treturn columns", + "type": "script" + } + ], + "type": "property" + } + }, + "props.data": { + "binding": { + "config": { + "expression": "IF({../pager.props.params.number_of_items_per_page} \u003e 0,\r\nIF(LEN({view.custom.filters.active})\u003d0, {view.custom.table_data}, {view.custom.filtered_table_data}),\u0027\u0027)" + }, + "type": "expr" + } + }, + "props.filter.enabled": { + "binding": { + "config": { + "path": "../TableHeader/TableActions/FilterCheck.props.selected" + }, + "type": "property" + }, + "onChange": { + "enabled": null, + "script": "\tif not getattr(currentValue, \u0027value\u0027, None):\n\t\t# clear filter text when filter is disabled\n\t\tself.props.filter.text \u003d \u0027\u0027\n\t\t" + } + } + }, + "props": { + "cells": { + "allowEditOn": "long-press", + "style": { + "fontSize": 12 + } + }, + "filter": {}, + "pager": { + "initialOption": 100, + "options": [ + 25, + 50, + 100, + 500, + 1000 + ] + }, + "style": { + "overflow": "visible" + } + }, + "type": "ia.display.table" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "overflow": "visible" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "activate-filter", + "pageScope": true, + "script": "\t# implement your handler here\n\tfilter_position \u003d payload[\u0027id\u0027]\n\tsystem.perspective.print(filter_position)\n\tadd \u003d True\n\tfor filter in self.view.custom.filters.active:\n\t\tif filter.id \u003d\u003d filter_position:\n\t\t\tadd \u003d False\n\tif add:\n\t\tfor filter in self.view.custom.filters.deactive:\n\t\t\tif filter.id \u003d\u003d filter_position:\t\t\t\t\n\t\t\t\tself.view.custom.filters.active.append(filter)", + "sessionScope": true, + "viewScope": false + }, + { + "messageType": "deactivate-filter", + "pageScope": true, + "script": "\tfilter_position \u003d payload[\u0027id\u0027]\n\tsystem.perspective.print(filter_position)\n\t\n\tif filter_position \u003d\u003d -1 :\n\t\tself.view.custom.filters.active \u003d []\n\telse:\n\t\tfor index, filter in enumerate(self.view.custom.filters.active):\n\t\t\tif filter.id \u003d\u003d filter_position:\n\t\t\t\tsystem.perspective.print(filter.id)\n\t\t\t\tself.view.custom.filters.active.pop(index)\n\n#\tfor filter in self.view.custom.filter_menu_data:\n#\t\tif filter.filter_id \u003d\u003d filter_position:\n#\t\t\tsystem.perspective.print(filter.filter_id)\n#\t\t\tfilter.active \u003d False\n#\t\t\tbreak", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "column-visibility", + "pageScope": true, + "script": "\t# implement your handler here\n\ttable_columns \u003d self.getChild(\"Table\").props.columns\n\tfor table_column in table_columns:\n\t\t#if payload.keys()[0] \u003d\u003d table_column[\u0027field\u0027]:\n\t\tif payload.keys()[0] \u003d\u003d table_column[\u0027header\u0027][\u0027title\u0027]:\n\t\t\ttable_column.visible \u003d payload.values()[0]\n", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/S3/Versions/Query_Options/resource.json b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Versions/Query_Options/resource.json new file mode 100644 index 0000000..bae3958 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Versions/Query_Options/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "7903445fab505d3339d6d97c7ad5b2513699d87a88f8618f0e6cea428e0cda72" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/S3/Versions/Query_Options/thumbnail.png b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Versions/Query_Options/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..510a0a19f09100daad93a081424b5d6436146a56 GIT binary patch literal 6917 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 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Objects/Templates/S3/Versions/Query_Options/view.json b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Versions/Query_Options/view.json new file mode 100644 index 0000000..7eb98ea --- /dev/null +++ b/com.inductiveautomation.perspective/views/Objects/Templates/S3/Versions/Query_Options/view.json @@ -0,0 +1,773 @@ +{ + "custom": { + "api_region_name": "na", + "bucket_options": [ + { + "label": "Image Files", + "value": "na-ignition-image-repo" + }, + { + "label": "Source Files", + "value": "na-ignition-image-source" + } + ], + "default_query_params": { + "bucket": null, + "object_key": null, + "site": null, + "view": null + }, + "destination_view_suffix": null, + "object_key": null, + "stage_config": { + "account_id": "925510716640", + "endpoint": "https://scada-s3-management.narme-scada.rme.amazon.dev/", + "lambda_name": "RMESDScadaS3ManagementFlaskLambda-prod", + "region": "us-east-2", + "repo_bucket": "na-ignition-image-repo", + "s3_region": "us-east-1", + "source_bucket": "na-ignition-image-source" + }, + "view_options_by_site_and_bucket": [], + "view_suffix": null, + "whid_options": [] + }, + "params": { + "query_params": { + "bucket": null, + "object_key": null, + "site": null, + "view": null + } + }, + "propConfig": { + "custom.api_region_name": { + "binding": { + "config": { + "path": "session.custom.aws.prefix" + }, + "type": "property" + }, + "persistent": true + }, + "custom.bucket_options": { + "binding": { + "config": { + "path": "view.custom.stage_config" + }, + "transforms": [ + { + "code": "\treturn [{\u0027value\u0027: value.repo_bucket, \u0027label\u0027: \u0027Image Files\u0027},\n\t\t\t{\u0027value\u0027: value.source_bucket, \u0027label\u0027: \u0027Source Files\u0027}]", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.default_query_params": { + "persistent": true + }, + "custom.object_key": { + "binding": { + "config": { + "path": "view.params.query_params" + }, + "transforms": [ + { + "code": "\tstage_config \u003d self.custom.stage_config\n\tbucket \u003d self.params.query_params.bucket\n\tsite \u003d self.params.query_params.site\n\tview \u003d self.params.query_params.view\n\tif bucket and site and view:\n\t\tif bucket \u003d\u003d stage_config.repo_bucket:\n\t\t\tsuffix \u003d \u0027.svg\u0027\n\t\t\tsubfolder \u003d \u0027images\u0027\n\t\telse:\n\t\t\tsuffix \u003d \u0027.drawio\u0027\n\t\t\tsubfolder \u003d \u0027source\u0027\n\t\treturn \"SCADA/%s/%s/%s%s\" % (site, subfolder, view, suffix)\n\telse:\n\t\treturn None\n", + "type": "script" + } + ], + "type": "property" + }, + "onChange": { + "enabled": null, + "script": "\td \u003d self.params.query_params\n\tif getattr(currentValue, \u0027value\u0027, None):\n\t\tself.params.query_params.object_key \u003d currentValue.value\n\t" + }, + "persistent": true + }, + "custom.stage_config": { + "binding": { + "config": { + "expression": "{view.custom.api_region_name}" + }, + "transforms": [ + { + "code": "\treturn AWS.s3.STAGE_CONFIG[\u0027prod\u0027][value]", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "custom.view_options_by_site_and_bucket": { + "binding": { + "config": { + "expression": "{view.params.query_params.site}+{view.params.query_params.bucket}" + }, + "transforms": [ + { + "code": "\tbucket \u003d self.params.query_params.bucket\n\tsite \u003d self.params.query_params.site\n\tif bucket and site:\n\t\tfrom AWS.s3 import S3Manager\n\t\tfrom helper.helper import sanitize_tree\n\t\tfrom pprint import pformat\n\t\t\n\t\tapi_stage \u003d \u0027prod\u0027\n\t\tusername \u003d self.session.props.auth.user.userName\n\t\tapi_region_name \u003d self.view.custom.api_region_name\n\t\t\n\t\ts3m \u003d S3Manager(api_stage, api_region_name, username)\n\t\tsuffix \u003d self.custom.view_suffix\n\t\tfiles \u003d sanitize_tree(s3m.fetch_object_list_by_site_and_bucket(site, bucket))\n\t\treturn [{\u0027value\u0027: x[\u0027Filename\u0027].replace(suffix,\u0027\u0027), \n\t\t\t\t\u0027label\u0027: x[\u0027Filename\u0027].replace(suffix,\u0027\u0027)} for x in files]\n\treturn []", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "custom.view_suffix": { + "binding": { + "config": { + "path": "view.params.query_params.bucket" + }, + "transforms": [ + { + "code": "\tif value:\n\t\tstage_config \u003d self.custom.stage_config\n\t\tif value \u003d\u003d stage_config.get(\u0027repo_bucket\u0027, None):\n\t\t\treturn \".svg\"\n\t\tif value \u003d\u003d stage_config.get(\"source_bucket\", None):\n\t\t\treturn \".drawio\"\n\treturn value", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.whid_options": { + "binding": { + "config": { + "path": "view.params.query_params.bucket" + }, + "transforms": [ + { + "code": "\tif value:\n\t\tfrom AWS.s3 import S3Manager\n\t\t\n\t\tapi_stage \u003d \u0027prod\u0027\n\t\tusername \u003d self.session.props.auth.user.userName\n\t\tapi_region_name \u003d self.custom.api_region_name\n\t\t\n\t\ts3m \u003d S3Manager(\u0027prod\u0027, api_region_name, username)\n\t\t\n\t\treturn [{\u0027value\u0027: x, \u0027label\u0027: x} for x in s3m.fetch_site_list(value)]\n\treturn []", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "params.query_params": { + "onChange": { + "enabled": null, + "script": "\tif not missedEvents and origin in (\u0027Binding\u0027, \u0027Script\u0027, \u0027BindingWriteback\u0027):\n\t\tpayload \u003d currentValue.value\n\t\tsystem.perspective.sendMessage(\u0027list_versions_query_params_changed\u0027, payload, scope\u003d\u0027session\u0027)\n\t\t" + }, + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 600 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "shrink": 0 + }, + "props": { + "style": { + "borderStyle": "none", + "classes": "Framework/Card/Title_transparent" + }, + "text": "Select Query Params" + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t# reset query params to default values \n\t# (stored in `view.custom.default_query_params`)\n\tself.view.params.query_params \u003d self.view.custom.default_query_params" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear Button", + "tooltip": { + "enabled": true, + "location": "bottom-right", + "text": "Clear Selections" + } + }, + "position": { + "shrink": 0 + }, + "props": { + "image": { + "icon": { + "path": "material/clear_all" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t# refresh version table query via message handler\n\tsystem.perspective.sendMessage(\u0027refresh_version_table_data\u0027, scope\u003d\u0027session\u0027)\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Refresh Button", + "tooltip": { + "enabled": true, + "location": "bottom-right", + "text": "Refresh Data" + } + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.bucket})\r\n\u0026\u0026!isNull({view.params.query_params.site})\r\n\u0026\u0026!isNull({view.params.query_params.view})\r\n\u0026\u0026!isNull({view.params.query_params.object_key})" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/refresh" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "grow": 1 + }, + "props": { + "justify": "flex-end" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer Header" + }, + "position": { + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Title_transparent", + "marginBottom": "2px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label", + "textAlign": "right" + }, + "text": "Bucket" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "540px", + "grow": 1 + }, + "propConfig": { + "props.options": { + "binding": { + "config": { + "path": "view.custom.bucket_options" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.query_params.bucket" + }, + "type": "property" + } + } + }, + "props": { + "dropdownOptionStyle": { + "overflowWrap": "break-word", + "whiteSpace": "normal" + }, + "showClearIcon": true + }, + "type": "ia.input.dropdown" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.params.query_params.bucket \u003d None\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear Button" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.bucket})\r\n\u0026\u0026{view.params.query_params.bucket}!\u003d\u0027\u0027" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/clear" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "Bucket" + }, + "position": { + "basis": "100%", + "grow": 1 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "shrink": 0 + }, + "props": { + "justify": "center" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label", + "textAlign": "right" + }, + "text": "Site" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "540px", + "grow": 1 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.bucket})\r\n\u0026\u0026len({view.params.query_params.bucket})\u003e0" + }, + "type": "expr" + } + }, + "props.options": { + "binding": { + "config": { + "path": "view.custom.whid_options" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.query_params.site" + }, + "type": "property" + } + } + }, + "props": { + "dropdownOptionStyle": { + "overflowWrap": "break-word", + "whiteSpace": "normal" + }, + "showClearIcon": true + }, + "type": "ia.input.dropdown" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.params.query_params.site \u003d None\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear Button" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.site})\r\n\u0026\u0026{view.params.query_params.site}!\u003d\u0027\u0027" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/clear" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "Site" + }, + "position": { + "basis": "100%", + "grow": 1 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_2" + }, + "position": { + "shrink": 0 + }, + "props": { + "justify": "center" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label", + "textAlign": "right" + }, + "text": "View" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "540px", + "grow": 1 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.bucket})\r\n\u0026\u0026len({view.params.query_params.bucket})\u003e0\r\n\u0026\u0026!isNull({view.params.query_params.site})\r\n\u0026\u0026len({view.params.query_params.site})\u003e0" + }, + "type": "expr" + } + }, + "props.options": { + "binding": { + "config": { + "path": "view.custom.view_options_by_site_and_bucket" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.query_params.view" + }, + "type": "property" + } + } + }, + "props": { + "dropdownOptionStyle": { + "overflowWrap": "break-word", + "whiteSpace": "normal" + }, + "showClearIcon": true + }, + "type": "ia.input.dropdown" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.params.query_params.view \u003d None\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear Button" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!isNull({view.params.query_params.view})\r\n\u0026\u0026{view.params.query_params.view}!\u003d\u0027\u0027" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/clear" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "View" + }, + "position": { + "basis": "100%", + "grow": 1 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_3" + }, + "position": { + "shrink": 0 + }, + "props": { + "justify": "center" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "125px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label", + "textAlign": "right" + }, + "text": "Object Key" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.query_params.object_key" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Framework/Card/Value", + "textAlign": "left" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "Object Key" + }, + "position": { + "basis": "100%", + "grow": 1 + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_4" + }, + "position": { + "shrink": 0 + }, + "props": { + "justify": "center" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Command-Authenticate/resource.json b/com.inductiveautomation.perspective/views/PopUp-Views/Command-Authenticate/resource.json new file mode 100644 index 0000000..f51e02d --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Command-Authenticate/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-05-16T14:07:14Z" + }, + "lastModificationSignature": "5ba5f4a3894c68eeed86c821495f3d891d998677db1cb0830e0b7a09e0215d34" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Command-Authenticate/thumbnail.png b/com.inductiveautomation.perspective/views/PopUp-Views/Command-Authenticate/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..ba1ce9240ded1c5c100480ea38de1551f6c1d41e GIT binary patch literal 8362 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 jvYWi=CwiB1`*I|IA8uWhvtGGDr literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Command-Authenticate/view.json b/com.inductiveautomation.perspective/views/PopUp-Views/Command-Authenticate/view.json new file mode 100644 index 0000000..83e5cc2 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Command-Authenticate/view.json @@ -0,0 +1,184 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 240, + "width": 400 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Header" + }, + "position": { + "height": 32, + "width": 400 + }, + "props": { + "style": { + "background-color": "#555555", + "fontWeight": "bold", + "textAlign": "center" + }, + "text": "Command Authentication" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Password Label" + }, + "position": { + "height": 32, + "width": 152, + "x": 115.5, + "y": 68 + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-White-12pt", + "fontSize": 18 + }, + "text": "Enter Username" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "PasswordField" + }, + "position": { + "height": 32, + "width": 229, + "x": 85.5, + "y": 116 + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-12pt", + "fontSize": 16 + } + }, + "type": "ia.input.password-field" + }, + { + "meta": { + "name": "Error Label", + "visible": false + }, + "position": { + "height": 32, + "width": 270, + "x": 56.5, + "y": 143 + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-12pt", + "color": "#FF8000", + "fontSize": 16, + "textAlign": "center" + }, + "text": "Login does not match" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tusername \u003d self.session.props.auth.user.userName\n\tlogin \u003d self.getSibling(\"PasswordField\").props.text\n\t\n\tif username \u003d\u003d login.lower():\n\t\tuser_valid \u003d True\n\telse:\n\t\tuser_valid \u003d False\n\t\n\trme_role \u003d self.session.custom.fc +\"-rme-c2c-all\"\n\tadmin_role \u003d \"eurme-ignition-admins\"\n\troles \u003d (self.session.props.auth.user.roles)\n\tif (rme_role.lower() in roles \n\tor rme_role.upper() in roles) or admin_role in roles:\n\t\thas_role \u003d True\n\telse:\n\t\thas_role \u003d False\n\t\n\tif user_valid and has_role:\n\t\tself.session.custom.command_auth.auth_time \u003d system.date.now()\n\t\tself.session.custom.command_auth.enabled \u003d True\n\t\tsystem.perspective.closePopup(\u0027\u0027)\n\telse:\n\t\tself.getSibling(\"Error Label\").meta.visible \u003d True" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Authenticate" + }, + "position": { + "height": 34, + "width": 120, + "x": 71, + "y": 191 + }, + "props": { + "image": { + "height": 20, + "width": 20 + }, + "style": { + "backgroundColor": "#555555", + "classes": "Background-Styles/Controller" + }, + "text": "Authenticate" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.closePopup(\u0027\u0027)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Cancel" + }, + "position": { + "height": 34, + "width": 120, + "x": 209, + "y": 191 + }, + "props": { + "image": { + "height": 20, + "width": 20 + }, + "style": { + "backgroundColor": "#555555", + "classes": "Background-Styles/Controller" + }, + "text": "Cancel" + }, + "type": "ia.input.button" + } + ], + "custom": { + "tags_data": { + "$": [ + "ds", + 192, + 1671029641714 + ], + "$columns": [ + { + "data": [], + "name": "Tags", + "type": "String" + } + ] + } + }, + "meta": { + "name": "root" + }, + "props": { + "style": { + "classes": "Background-Styles/Controller" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information-Docked-East/resource.json b/com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information-Docked-East/resource.json new file mode 100644 index 0000000..5de24c0 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information-Docked-East/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-05-13T15:36:14Z" + }, + "lastModificationSignature": "a90cb76f89d400f2fc12d26c1c27cb534cf2a776e48b0b8631c62f465b395d12" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information-Docked-East/thumbnail.png b/com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information-Docked-East/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..a54fd8553525be82a8cbba8794275f6c6ce87b43 GIT binary patch literal 8190 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 O0&R6YwF(v65C03U)3*x% literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information-Docked-East/view.json b/com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information-Docked-East/view.json new file mode 100644 index 0000000..e4d037f --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information-Docked-East/view.json @@ -0,0 +1,1099 @@ +{ + "custom": { + "PLC_list": null, + "running_state": -1, + "state": 5, + "views_data": [] + }, + "params": { + "tagProps": [ + "PLC01/PS1-9/101SN01_ES", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.PLC_list": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]Configuration/PLC" + }, + "transforms": [ + { + "code": "\tdevices \u003d system.util.jsonDecode(value)\n\tplcList \u003d []\n\tfor k in devices.keys():\n\t\tplcList.append(k)\n\t\t\n\treturn(sorted(set(plcList)))\n", + "type": "script" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.running_state": { + "binding": { + "config": { + "expression": "try(jsonGet({session.custom.state_messages},{this.custom.tag_path_to_lookup}),-1)\t\r\n" + }, + "transforms": [ + { + "expression": "if({value} !\u003d -1, try(jsonGet({value},\"state\"),4),{value})", + "type": "expression" + } + ], + "type": "expr" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "if(isNull({value}), 0, {value})", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.views_data": { + "binding": { + "config": { + "struct": { + "equipment_id": "{view.params.tagProps[0]}" + }, + "waitOnAll": true + }, + "transforms": [ + { + "code": "\tproject_info \u003d system.perspective.getProjectInfo()\n\t#self.custom.views_data \u003d project_info\n\tviews \u003d project_info.get(\"views\")\n\t#equipment_id \u003d self.view.params.tagProps[0]\n\tviews_data \u003d [i for i in views if i[\"path\"].startswith(\"Custom-Views/\"+ value.equipment_id)]\n\t#self.custom.views_data \u003d views_data\n\t\n\treturn views_data", + "type": "script" + } + ], + "type": "expr-struct" + }, + "persistent": true + }, + "params.tagProps": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "width": 400 + } + }, + "root": { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "expression": "\u0027Source ID: \u0027 + {view.params.tagProps[0]}" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "color": "#FFFF", + "fontFamily": "Arial", + "fontSize": 14, + "fontWeight": "bold", + "paddingLeft": 10 + } + }, + "type": "ia.display.label" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.closeDock(\u0027Docked-East\u0027)\n\tself.getSibling(\"tabs\").props.currentTabIndex \u003d 0" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Icon", + "tooltip": { + "enabled": true, + "style": { + "cursor": "pointer" + }, + "text": "Close faceplate" + } + }, + "props": { + "path": "material/close", + "style": { + "cursor": "pointer", + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5 + } + }, + "type": "ia.display.icon" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "30px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "200px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "session.custom.command_auth.enabled" + }, + "type": "property" + } + }, + "props.text": { + "binding": { + "config": { + "expression": "\u0027Control Enabled Timeout: \\n\u0027 + ({session.custom.command_auth.timeout_sp} - {session.custom.command_auth.auth_timeout}) + \u0027 seconds\u0027" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "color": "#000000", + "fontFamily": "Arial", + "fontSize": 14, + "fontWeight": "bold", + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5, + "whiteSpace": "pre" + }, + "textStyle": { + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tif self.session.custom.command_auth.enabled:\n\t\t\tself.session.custom.command_auth.enabled \u003d False\n\telse:\n\t\t#self.session.custom.command_auth.enabled \u003d True\n\t\tsystem.perspective.openPopup(\u0027command-auth\u0027, \u0027PopUp-Views/Command-Authenticate\u0027, showCloseIcon \u003d False, draggable \u003d False, modal \u003d True, overlayDismiss \u003d True)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_0", + "tooltip": { + "enabled": true, + "location": "bottom", + "style": { + "whiteSpace": "pre" + } + } + }, + "position": { + "basis": "170px", + "shrink": 0 + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "//if({this.props.enabled}, \u0027Re-Authenticate to Enable Command Controls\u0027, \u0027Insufficient Privileges - User Role Required: \u0027 + {session.custom.fc} + \u0027-rme-all\u0027)\r\nif({session.custom.command_auth.enabled},\u0027Click to Disable Controls.\u0027, \u0027Re-Authenticate to Enable Command Controls \\nUser Role Required: \u0027 + {session.custom.fc} + \u0027-rme-all\u0027)" + }, + "type": "expr" + } + }, + "props.image.icon.path": { + "binding": { + "config": { + "expression": "if({session.custom.command_auth.enabled},\u0027material/lock_open\u0027,\u0027material/lock\u0027)" + }, + "type": "expr" + } + }, + "props.text": { + "binding": { + "config": { + "expression": "if({session.custom.command_auth.enabled},\u0027Disable Controls\u0027,\u0027Enable Controls\u0027)" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": {} + }, + "primary": false, + "style": { + "marginBottom": 5, + "marginRight": 25, + "marginTop": 5 + } + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "50px" + }, + "props": { + "justify": "flex-end" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "EmbeddedView" + }, + "position": { + "basis": "400px", + "shrink": 0 + }, + "propConfig": { + "props.params.value.tagProps[0]": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "type": "property" + } + } + }, + "props": { + "params": { + "value": { + "tagProps": [ + null, + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + } + }, + "path": "Symbol-Views/Controller-Views/CommandControlActions" + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "50px" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "100px", + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "transforms": [ + { + "code": "\n\tplcList \u003d self.view.custom.PLC_list\n\n\tshowCommand \u003d False\n\n\tfor i in plcList:\n\t\tif value \u003d\u003d i:\n\t\t\tshowCommand \u003d True\n\n\treturn showCommand", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "direction": "column", + "style": { + "classes": "Buttons/Clear-Background" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "32px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "if({../AlarmTable.props.params.length_of_table_data} \u003d 0, True, False)" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "classes": "Labels/Label_1", + "marginTop": 20 + }, + "text": "No Active Alarms" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "AlarmTable" + }, + "position": { + "basis": "733px", + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "if({this.props.params.length_of_table_data} \u003e 0, True, False)" + }, + "type": "expr" + } + }, + "props.params.tagProps[0]": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "type": "property" + } + } + }, + "props": { + "params": { + "alarm_states": [ + "Shelved", + "Active", + "Not Active" + ], + "length_of_table_data": 0, + "show_severity_column": true, + "show_state_column": true, + "table_type": "Docked-East", + "tagProps": [ + null + ] + }, + "path": "Alarm-Views/AlarmTable" + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "Active_tab" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "NameField" + }, + "position": { + "basis": "50%", + "grow": 1 + }, + "props": { + "style": { + "paddingLeft": 20 + }, + "text": "NAME" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "DeviceName" + }, + "position": { + "basis": "50%", + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "backgroundColor": "#FFFFFF", + "classes": "Text-Styles/Ariel-Bold-12pt", + "paddingLeft": 10 + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "Name" + }, + "position": { + "basis": "35px" + }, + "props": { + "style": { + "classes": "PopUp-Styles/InfoLabel" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "NameField" + }, + "position": { + "basis": "50%", + "grow": 1 + }, + "props": { + "style": { + "paddingLeft": 20 + }, + "text": "PRIORITY" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Priority" + }, + "position": { + "basis": "50%", + "grow": 1 + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d False, {view.custom.state}, {view.custom.state} + 300) " + }, + "transforms": [ + { + "fallback": "State-Styles/Background-Fill/State0", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "State-Styles/Background-Fill/State1" + }, + { + "input": 2, + "output": "State-Styles/Background-Fill/State2" + }, + { + "input": 3, + "output": "State-Styles/Background-Fill/State3" + }, + { + "input": 4, + "output": "State-Styles/Background-Fill/State4" + }, + { + "input": 5, + "output": "State-Styles/Background-Fill/State5" + }, + { + "input": 6, + "output": "State-Styles/Background-Fill/State6" + }, + { + "input": 0, + "output": "State-Styles/Background-Fill/State0" + }, + { + "input": 301, + "output": "State-Styles/Alt-Background-Fill/State1" + }, + { + "input": 302, + "output": "State-Styles/Alt-Background-Fill/State2" + }, + { + "input": 303, + "output": "State-Styles/Alt-Background-Fill/State3" + }, + { + "input": 304, + "output": "State-Styles/Alt-Background-Fill/State4" + }, + { + "input": 305, + "output": "State-Styles/Alt-Background-Fill/State5" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "props.tag_path_to_lookup": { + "binding": { + "config": { + "expression": "\"[\\\"\" + {view.params.tagProps[0]} + \"\\\"]\"" + }, + "type": "expr" + } + }, + "props.text": { + "binding": { + "config": { + "expression": "{view.custom.state}" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 0, + "output": "Stopped" + }, + { + "input": 1, + "output": "High Priority" + }, + { + "input": 2, + "output": "Medium Priority" + }, + { + "input": 3, + "output": "Low Priority" + }, + { + "input": 4, + "output": "Diagnostic" + }, + { + "input": 5, + "output": "Healthy" + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "style": { + "paddingLeft": 10, + "textAlign": "left" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "Priority" + }, + "position": { + "basis": "35px" + }, + "props": { + "style": { + "classes": "PopUp-Styles/InfoLabel" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "NameField" + }, + "position": { + "basis": "50%", + "grow": 1 + }, + "props": { + "style": { + "paddingLeft": 20 + }, + "text": "RUNNING STATUS" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Priority" + }, + "position": { + "basis": "50%", + "grow": 1 + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired},\r\n{view.custom.running_state} + 300, {view.custom.running_state})" + }, + "transforms": [ + { + "fallback": "State-Styles/Background-Fill/StateUnknown", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "State-Styles/Background-Fill/State1" + }, + { + "input": 2, + "output": "State-Styles/Background-Fill/State0" + }, + { + "input": 3, + "output": "State-Styles/Background-Fill/State5" + }, + { + "input": 301, + "output": "State-Styles/Background-Fill/State1" + }, + { + "input": 302, + "output": "State-Styles/Background-Fill/State0" + }, + { + "input": 303, + "output": "State-Styles/Alt-Background-Fill/State5" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "props.tag_path_to_lookup": { + "binding": { + "config": { + "expression": "\"[\\\"\" + {view.params.tagProps[0]} + \"\\\"]\"" + }, + "type": "expr" + } + }, + "props.text": { + "binding": { + "config": { + "expression": "{view.custom.running_state}" + }, + "transforms": [ + { + "fallback": "Unknown", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Faulted" + }, + { + "input": 2, + "output": "Stopped" + }, + { + "input": 3, + "output": "Running" + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "style": { + "paddingLeft": 10, + "textAlign": "left" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "Running Status" + }, + "position": { + "basis": "35px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "{view.custom.running_state} \u003e -1" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "classes": "PopUp-Styles/InfoLabel" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "100px" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "Info_tab" + }, + "position": { + "tabIndex": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "32px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "len({../Views_list.props.data}) \u003d 0" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "classes": "Labels/Label_1", + "marginTop": 20 + }, + "text": "No Configured Custom Views" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onRowDoubleClick": [ + { + "config": { + "script": "\trow \u003d event.value\n\tcustom_view \u003d row.get(\"path\",\"none\")\n\tif custom_view !\u003d \"None\":\n\t\tequipment_id \u003d custom_view.split(\"/\")[1]\n\t\turl_to_navigate \u003d \"/CustomView/%s/\" % (equipment_id,)\n\t\tsystem.perspective.navigate(page \u003d url_to_navigate)\n\t\tsystem.perspective.sendMessage(\"plc-to-display\", payload \u003d {\"device\":\"none\",\"show_controls\":False,\"area\":\"none\"}, scope \u003d \"page\")\n\t\tsystem.perspective.closePopup(id\u003d \"StatusPopUP\")\n\t\tself.parent.parent.parent.getChild(\"tabs\").props.currentTabIndex \u003d 0\n\t\t\n\t" + }, + "scope": "G", + "type": "script" + }, + { + "config": { + "draggable": true, + "id": "W1H0Nole", + "modal": false, + "overlayDismiss": false, + "resizable": true, + "showCloseIcon": true, + "title": "InfoPopUp", + "type": "close", + "viewPath": "PopUp-Views/Controller-Equipment/Information", + "viewportBound": false + }, + "scope": "C", + "type": "popup" + } + ] + } + }, + "meta": { + "name": "Views_list" + }, + "position": { + "basis": "915px", + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "len({this.props.data}) \u003e 0" + }, + "type": "expr" + } + }, + "props.data": { + "binding": { + "config": { + "path": "view.custom.views_data" + }, + "type": "property" + } + } + }, + "type": "ia.display.table" + } + ], + "meta": { + "name": "Views_tab" + }, + "position": { + "tabIndex": 2 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "classes": "Labels/Label_1", + "marginTop": 20 + }, + "text": "For Future Development" + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "OEE_tab" + }, + "position": { + "tabIndex": 3 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "tabs" + }, + "position": { + "grow": 1 + }, + "props": { + "menuType": "modern", + "tabSize": { + "width": 1000 + }, + "tabStyle": { + "active": { + "classes": "", + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": 14, + "fontWeight": "bold", + "paddingLeft": 10 + }, + "inactive": { + "classes": "", + "color": "#B8B8B8", + "fontFamily": "Arial", + "fontSize": 14, + "fontWeight": "bold", + "paddingLeft": 10 + } + }, + "tabs": [ + "Alarms", + "Info", + "Views", + "KPI\u0027s" + ] + }, + "type": "ia.container.tab" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "basis": "670px", + "grow": 1 + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "800px", + "grow": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "classes": "Buttons/Button-Menu" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information/resource.json b/com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information/resource.json new file mode 100644 index 0000000..3c17ef6 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "pllincol@amazon.co.uk", + "timestamp": "2022-08-12T12:01:32Z" + }, + "lastModificationSignature": "c66773013ad855e48d0803e226e5396a760eaceeeb8ff89e1f4cba7f551125a6" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information/thumbnail.png b/com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..01179799da5cc0926f8810883dcf615667d1f911 GIT binary patch literal 55493 zcmX_n18`*T6K$N0H@0nOW81dvWMkX5osDhVwr$&f^ZUP7uj-qrTQgJl>wCKUobJAN z!sTVf;GnUffq;PEB*cXkfq;N}0mn}Wi>#da$~m`E;%8;VqkiF9E@wyjnh!GRwd3`E}Xa0+gD?o_LUJUxLjT~Gq_U5V0yKany$;S61A z-mjaT6waIpaK>G}C%98;?tA7lGuYD$SmyuEpiBN` z2^vuZ0}&XD&o`}!opA(_gvP+a^7MGN5cQ%<)D;6<Aaob~wI!%18BO#;V1Ogbjt@6JAN6Hv=uWHWL3gf?y=tMr9LbWHh-f{{pc`W$Ze1Q;uh z|4iIg_s{^1aA32TKishE5s5aNOk=cOWuU8-Ij!ROXKErnGxY=AF{tzLPj*-od7c_$ zmV8>$Fq>R9i(S9hPpL%K9qR0SsUp|+`z?u5iC|u`)(SK8^~@O59TW6@u&w=MIvbnA zfn<!CY`#dh%j4;K3tP+%;B4(EOlH%u1X69M%hkX4 zhhy1Xu6TcJH>TBjq0RtrK^&-d#omhb!Z>t!eK6M^rO!Q;`K&gZU6-V}6PT_2cK{k+a-#NqGp zWV+f%7t#MhgZ8T)xXbkhuY9AyOwQU65Y4i=yj}Wz0f5a8bZK?kQCd*Ihn;+0_d?aG zwa->+^j4~M>XL^dP&YbU?EsfwTZKxk`VT(i=XP%(S97$d9=M3<8c!8UYOCG(;%FjO z2sFgvU^rTxMf2l+g1*iqkxZt4T>g!8rLAY&4-3-~;291_GEp4g-;Tq=0b1*2O611~ zyni)>pv^!3&mn(0U3KXPb!V7SN9i? zdiqQ5C)2o(E<4@c7$DlRu=uQU*_^>cZQdVj<ovbx#s0))UIF9=Ml zLZX&-AVf==^`(yX@NteDJxd;8sNdGt5ZeFDn^>U7mS?t!J;3IZQFyboYq^5^KyKj* zh1R}BUEpW+ob^TiVqSjetH7F#Yam$mVd=hLK2M;vtBO%^`)<<{uhHihg2L6fk=w@> ztoltpN5|bl+FSBzV!b1WISb$bV~@zQRJhZ?lUTg9rlJqJH$7ylb-V2FC8Tvv0qD+h zU^tG0`&FBV#u6m@Pw1ZVzFELd==1uGUANapsX12rfmwk6iF{Es#j$D6EHsv&KMu4g7Ms&TRf^Gn-9scDgg0f~Yy2Y)C!A!)Y~JYh)$PE2c7~bay=h zNQ7Rap2W!FKdI>|O0qf}jRz#F=lkOsC_3ZeRk1#Ud1kbOc>PW|GvN103#Ssr#_!oB z+D5}seSW;|_k-IxW)dDp#g|pyOkINQxwW`NX2n@@dlMx+MRlFYkAFb*t803`Ij!I* zuDCrODF8cty+7XLxOb#wl99R6W2)OldcDia=BjnA>_KS zERTaisq=&lT##3Q!gZgUmZs2aU|0ITYr+C|aa&ue%|1 zw0on05I6u0um!g)FhwoE_qtu5<_A~TY7x2?3^VZfet!a#aiqP`WFlp!4Hz7`7K_bV z{o#0u)*;)*uVrkl^501e2anTq5;&wkZss4mVlRM>eLP=1?2qun-Il_%JuY@V!m#fk zZ?L%EAN~cX20ot;AZTNC$0lId8|ne71mJAf(^-Eu9@qDjn4H0xGhXMuhUhKRz)Sn{ z`=befJoz4tqngS{*Qz{c!{c!PDwn}<}9D!EgF$cN5OXACe$yt9jJzc>#vo$*2>4r4W!vH zlg0c$qmh_9HzJ#!Ipawa!_%b-^j|=-fc&WQ8}<&Q04>kkYO+#`V*!Ss=yks=C{);M znBlcrDo0JMllWCdIIq2c9z8&RIgrL^1OVY7vpEOB3lz)g?}6vbb#_8RK$stle84WC zKIm}12;n5822>ChfcOf9#SF;4TCF<(q&-DT+BiDBE{jBc7#=|E+U@s1h8K@>qrAUu zkp{%fdEX9^rD6S8EEmlINV3yo!~+sO&p*sMm)E-%9HTp5C=}#rERkHGmERvE?Vnxu z8$^i%K->X}2<|m__i@ux0^jU5S0EBr-{-mZH4tF{Pt1gL=RmouiU2@IuiiL(tsCHK z0S*@Zk+W3)$BPw&7MQsbF8~OmP#*V3sd|cLSL;pUBI!&fAqe=kf7=)sGudqRDK$gb z3gc$fiWwN^$hP6ABJu=j%fq5Y6S$nu!FaU+Wf91cF^aYj?Rq5gVvF6*_t%GzrH6+H zpx8F(3qvG!3##KsH8MEXj~ev?6h9Oi?M{?ctX9iWdwkAyxThHozBB~6@%1~V_33FA z;T+-Nx1snxKxinK((?9MVmP9cCIBn=5jcQJYs(djpzqr}p3WiQuzJ1M^RW=7)0rWW zIm~AXq@nj^rYx7rueQ533@>J}s3CyBB-&d6?y*}J=4Q?d`&AH_8k8(-2my=1KUS_% zfx#yk;HXfpOgU)|0PU`eG4GT?-+)KKj>?lxS%(6TQs|DmU~Y$nr6zaMuOO)R7mfbM zlA0c&Vw!?9IZ}8+DzzHCa=Z>0A}}tu8-oW-C--z`m&4I`2pqPdv_W5~LZLcZFD^>A z&)0jN%|vbqolk^;ZQ>_2i528D(M1?oalT+M^y)ak5<{oFblLczbY`>VDlPOa^Uc<~ zmK`6hGDT7rV06#*MvGI}CAZ(CgKYWA-*Q67s93?;W|to;=?X5Fs|tmp zaEsUo?NX_9)T)(0LW8Zc*_^9RwtJs~w8*H?Q8LEtqud8Wq6{2;0ga6;X&_v`tt%lW z_XRQvjv`R0vDTfg4zg5?#t6suiwj2|PG-!C1q{=T($@JtZ-w$eA#Dkx0hO_-2~=cy z-7A>cp}#XyC(s|^j0|?&QBdYnfZ>RX#9}dvl^V!=K(nVqs&(DrZc|62T5>b66hifU zMf$gZ9t?u@7+D!)w>AMoUTcfEGOsrx>IhFW$nc=t{-sXqcq3POR}|NE483E=j0rSC z*&kun`*BXJ@(mn7DsW6~lDg7B*07*I^LQb{5H)xqT5BpQm`+~3+sl2jx~h(U6(1%? zS#;c|;jH`P1dpTv(187-n!sJKEp`-zPFs~R6(iZ}xanqA0y3P;P*<TP#8zu}JyxBNqL8cSS%e=y7eG$GF`R~RMluL(vvKMZw5GAD?u zeniABm2=E)BRo2^`9AqIyq*kQRb+Nl+;1SU` zf%=U8d(MVh8U+C)AkpL|e9|*%jG*a(Fk!F6sSI)$sthGZLUirsqMW)!JWh7e*1!`u z788!JoRcP&hs=Q1NV%|6B9RP35|%;~`N{7Uz*&O5IXs@~{Yum8&s(lLB5{)kemThG zveFqWP|$Tfr;`;5X=xzWI$-_bTf%&8tKHsQX$)Xteb4?-l2SeLk(49*2U+u6&T+>4 z!^{l&jBpq-+)C#IxRMN!@{uCD$O}+dr@^#)`8Y=-bj)ZWlg792fFP#aMfz2H-y092 z5;C)jNvYp&eoRP)aBFZjwU4_woFgY{tSRQ46(n@@BzT@(pX8Etw7L*&|zpC7}R6j13^EdUlWX1 ztGOKpieI_gzB6O6I1B{^r(Ux*FMX}IsCKw!Bl1JD@+Z4}fhda6XIQIy0d=4pg+7B_ zdLWh=taRLA^rm~@517FA7c#R?2)xoolt&?g{ONGvi!i9az&W8qmOUJpOq>%Q5KJ z8$8S3zzJ#T_IkU&Sg9dK3L_e2=wP<|6axdr`HhsL*!}SSLHW;r}?ExhtR0J2f z2J%j?(D#J;1$OLbZiMC5-*XS!#jYaoPOTSV>*BTK`iS0{==$i!s0D%Lx1Pqvr!kDg zK>#VfW5s1^k0A8O0sqGQhND3_eyc^V2g};+<}gt1>j>SJ>(6($D%|=uC+lO7Bj=E?2%^Jmf-`E;yn>WDqrkm-0)&OKrrnl>rD% zIu)9N;hGI}m&`G5)Z`Z{;!VqjE7#RJug=$;f=o)mH6B0PJS?+zgK{-;28K+MPKc>v z7~1KBOOSkj&0Vu*xBrge-Cb-Ps3!RT^^r_^?kPGX-i0Z*XhDdKRfOeC_0l(*dG8&j zH#~yS>^IvVvST^IVzorsZc6>HZ2_zvrlSl_lkr81h2qIi)BVOWIytFhW1r~H77`I( zDI#;U6`n23{-|yO8{2!JJ-=2>tz908@z8{NozAuY$!0VpxYi=g-+l-0a@xR44 zVT$b-ox@z=E}1W0caAV`38`qcO|5Yt8;;c?rQDM|IhOU`;>&dO=5ci?M7RfsR&7@( zcz-fnszxpIYO*h)rqiQSzH^9|OpR1krBi%!FmSaw3P!H)R#gm!J>pB$J4U?7{)}XG zG)4R3S0fee)UPbqTjgikY^uQwIZF+LsWv^qI^;QbPd3MWHK$DXXV z200UdsuA%E9Ib|<%Vo%&KCvW=`?4l*L9`=}S7Kb|t^wgi{(4tkuw!#sVTjT*!%>hO zpQ(*NU~W*?Y=Z4i2L|@-{BFRUotU-W--1OrzRa?E++34!IPpzr+3eahx$esKX^}7D z8Y54Cm<2~NLY{ke-(~9vR%|=W!>P{I zz_)z_(_%LABkjVIDU17+&iMB$Jb3IM`^O~6B`t0WRVGjhgtMCBB!EEo8PMExObK)pjD zw`G(|Ap`uIU2zh>1p_s4_q(WbkzCzjq+Q-N_JRW)&jqamGW#U@4jBV6?~PX087U zwneqWaJw|v>la@xU!}2oVd0Ob$Lm=uJk`6)=x=af#OfZjN8rYyJ}<$f$Ybe{r<~1S z*6vSeluT*xuZ%U=cOk|Dt&C2dkik$e?~WXcN$##`jNCu}V9~iNmbAqlC!rLIcXzoo zP<`_)lD`|e9gmB6wz?##K)5)+YYVoCf(&-*>h<+#MUbGY85-MlcGVw?A`fRtXiY(d z-|s1^?s^0%VNQwU#FvtA6;U$@Wfp^L37QiZ-2*ikk6pgX{iHYUuVrnk657A&{ZPxG zVfWvefx3ADcKoHf^e0$d_C5=~z9U*qXLs2ha?5s}n|W6Ug30(L%g|^wcr+@1+%A>v zclLIVar?0U1XS_DZMR`(vC*$q`7$)Q)Oy$GSH%W6YeE9NmDR=Ic4k@YHK2b0-`8gp zxRe17qXvamRSd230r>%o(0q+IsYj^Z_Sb$kO+OQ_FM&01L=L>=8oGE19<2(CW`$tY z)vb0%t&iy`V8{y069Mk|Rk13Y8(X`ZjosSIegXbTv89R12_J)IgJ9KBzV>8SzwW$T zk0{hcbmZ2m1zNWoi`$*7^~b)}D0jCByN~%K*my`3OQ%S*Z{Z{WGPX=M{k;zm-1vO( zwyRh)0Ov!#)iDR;pli2Nr76<69c$ZPT<@Mo_en+vTZU&~dU_qfmIYHmX1XAy?v3sl z1tdAV-usm8{#)zIYzg?$C1L-Y;>PIUU_Viv_6ASGXHj*9YH4%8 z)1ReEoz`M)f19=&ELGq*qB{rbp;iq(A`LUGi^A=}gXM;d<;HfQA@TNhak4h$RVj0X8|JQaGxmQfi zFWYTQSg?TXo?pimdE@CLuPzQ#yCtB3LcpwmSXpU{b$D?l!~Uzu)Q zt<$gWIfhTI!33Z~k%0c94HE2o&b^4Y@eKH53vtnc*iYIZyWT)}g2m%&yWr~J87jvO z2bN>I_S7gkQ6f^oCsTtxu12_6CwF?bARjE6-+3g6$_u+>i~4?NdO8|Dn<#%8StB?i z7c43b8=Zs1>CDz>D|Nd4HJewLKcOacLRTi+7UE%fyBc>A9Fq&bg%EV!0*A|v)b2v; zbfRlMzBxO!ksp~V#L5SKL|Nf7orS>ThLO=G-%{%JplW^;GF!!!KQJQ5j25(P4Q;cD zsM*c-_%=Jcbdis_Q{ErjB8Y4jKHbQfpTO!UAA&c$?fVa6qtfy8vuHL!CEun)=*lD5 zb_@OqkIc&h0dA`cy?m3!=}fZJ`DOO=MhLwo2#pS*XbE1Y4bO5`HTH%BL$j7a2& z@lZvop!FB%=ybAAV1Gy$6{ssNn)nGlM&(A!QY+s+hfC#B$%WZf%zcZV8bOou3ZE~w z1cO6NNs9CqWu`W7xl$+ZI#hmWWoX)WLZ=(u((93YrYAue&X9sR`HdW^8PPml&VhHN zYhELdC~%E#s_D47ggte@y^moxG?5ns%?${Rt~8_5oV`jNcZ`K5$01j$gBOE@0r z5SMEh)*GTSUVE0ut9tnXmjIACkAlDw6(Nc*qm_((P4haQ9zT68)U`m7qm zR;8WWg_1oZ(A3w`IXRQI4ZiE|--`8A3+~(457uUC?Wq?ontJ*^) zE?R?=L#Km}V6dKK)ScM_cFkPf(CJMGBVJlt751=pt6kF1Vm z?R%7t1L!rUM6Q?u8702pd;H)9QZnoq&DuHQu3jT!5eZwjwnihC;917`H4T+mW02tA4A zbaZ-f=w(=R>ZD#zqHeS55;}F~Sk^86d&SuUYSkC<9WMi1FQGL*7`C6`R7sVXbP7_^ zJ%5=$&wB0GAolNH)3F3)6IY8W2FRy_jkmwqeZmGRAQ=jps2U)c{l?|r-sWPb$zXe-*ImSS|f zX?WbxzYPcthtmgFNUqL;%qaEL>i3r3Hi9c&krSqalTh(+k)Ag>Rx31^u}M)L+H9j@ z@-cfHm^!TnnSV#jDLxgDT8dKtiH5)v^-;&yXeHWrkC*i(&M%2a+amgi6;7#)xa2`u zYo~U&RX^;FA5A-pzu*&nkBtZtjCa;j$@hpH{U{b8Mv4Y}7X^kVTtXkF z-G-OmBJ2#G8-kmN<5V_7}g1!e#7_~|bq@)^-%niw#AvG&Kvs0=L14T5{!vR{)0 z3qM*EOzyUamqVkKBJqJE#DyiIbh_bQJ!}pqy2ibyqlx7EPhB5GTt#00l$YmH2uoI? z4{Ls(eIy&}AH;}f&XA;(OpC_kMA4|DrN3p5mrO;nTp+DA>8%u&h-A3Lc(GC3zs-)W z)5aH;5Q)i(qE$uV@R6>@Z!cvM(YA|<%Em0(lJ-g*VN0&MxlAXBk95Z`uAe6fFn)Ua zi{G8c*TaF&-9p71F3qKiKc&Ruehgv>yDr3x&M(DNuROZl7{nVO6GiidUviMl_S(1ORT(`UZLHs^&}=p7>V=PIgt8wZz}XZ;lUN!)f-*V*Md5*`yj zn}z&cApP`KVs0(60GvuB(<#Ds9dWCkdcD)CQM}3A12;aq&_NRykm9X90u2K5y)NgJMR4hoPZ+wmqE!O3mh|@umrOL(W;@Z4Q6|lck z`HzA^EAvB#`B(-fm&ccOy(&vr^=Ke#E<&`=JbAmVRim}gUD3(!a4@e+o~(5Gb#imaS&4|tU8W|~X7`|Guqdj%I& zu*Qu!E=|XHTmHrmki}Gfp=agq-dCs5z_odCZ?q0PJ9zUJPl@zD!)+jA8 z$CtQf<9Bs${wtQ>?owflH+!1I2`CqvnH~x3PPzP)?GS}f-5%7!TrRP7TD1!U8}dft z@^JdpYCy2ARJ&QUGkUN#ky1YZX z63x0O9lN-XIzLgnlJ0f$$92av+bI+lsMXh~m4~PmRa)*-7FG;dA0?oo?c;kAQZ+ZE zDh^P~ijjTmvACe##Gf_0AeS(T$5ath#cMJg&}x9>fc&*ewWJalw!X`af2RO4tEt)0+kwp=p#(|=%tlU5up*e|H;-WqZl9! z-3Q3-pC5)=QKgojB$rc9R*|94S_B?Z){-t%684f0G@8AgyJ`;d80xk8DJ@QdW@>v| zMQaTYg2c!)0=bjjZWd*kE;*!UQ8fC=j|;?qbE}>?<7nGD8B4}ZDu;&mnd1mJwjHZ_ zXq(G;$h=biiIi&^y3=5=7CC%y(|p@L03zblkNY!9&uxq+hMxw7Lr)wSg<;9ctD2jRlQ` z%dg38Ycw-w@I1_s;f8V7haPMn3 zASxWpX1(NpFT;~Qj>3%=SJ0uV=;wJoX7FC5d_d;2vJW7VSUcbXE!J?PIRclM_~ItV zXl9a7!`sHvZ^#^(erz48;~mXdXLM$%Lq4W9)zxypl`TjCSWK=>u38JX)UKtr21!T@?-SxuPdPH`nG?>t z=n{|lrtV(6Tu+bf3oJ>5PQDSe04YDa6rIfXqHH)7)S=pkZvi3tI+Nm+LphV-Nc(-3qORRZWQVs+(E%5?wOI%oW2=lobK$}^14(yQ z6H-U5!^U`C7uomouNIT~)(zx=DnnZ_<5Lj ztwaYKl;gO$epA%FW2Ws-IF@f5N;MT++xo23u+2ueCk7ha%n`+Id^ zcSXx>G5sxC&3*Tq>WU1P=K#6K%|DC7Gut@#acF{WHuDn|8@z!eLFVEzc(T$z9dSEX zo~hOCJS}9is-eZ*ImKJSzA|c7_`b(*xHTzX%kx{N4tMnh&!sWxct%>~R?9oDU%Hev zlFWAd)-|7@jQl&QY<=geD<7u$_C_>cV(v;O?$KP9pm7$6NwHa%&OeGmA6}(@zOn84 zr4^>_-OyM}eNLRQOW&_}SMoz#x^jRsn=lnV?yc;GL7Xi?fOZ)I@cc6( z)H_!fPPL@*`FBU0fdEMWmrn_lQispq3VpDkTz7;c! zPzs|PHOl1N%3M!I5jWE`4~HJorSRYG7zTE;S~mU2scmHSb|W~arGWbd9+D4lBs(^= z9)IP@Z@X3DaK=|ytOIXe>DPapum;qEx@F;q(5wR0irL0Qc42FkBHONfZb~PfPaEf- z{dslUN$yNso57u9j!o3*ri}7wmFrc(Y)j=VOKMbRnXJ8_*;|)iUfcP|b4DedAHeA) zf-0=*0V<6e8IN1gH@8rBJBZP@$Fwy!ziJ%$41k{si^a=+cVPc1oLG@~k$;U>GPapY zHK00WUHq`DCutqgubCrf`mN_hnt#bRkNw(|dfo_+{r4%P#jbEi0ZRRK&so%_12j{HwW#fuj zkn5M2-HFf5u?>`1PkaH6KLM?J@dBmmjeE(AXQa=qr4NacR&&1Vew6EJtLsV5@9w_~ z8{WMgKfM)mOl%#1esZZE^F3v&Q)r}9=|orvs$?VXMF10OCopt7S4upaPWx_n`Zwn3 zFgo!NhTrN zA&=W(bS5H~a$tbM!-y7BVWgVJ3B6~_jk&Epn%Dxy_fW;YNIJy!6$!HVw<^ zO_%>ttA5?;AsyXq7tlIA+|7Mef2m*+a=S_dyr1zqM^oT&?BR9NW2Utzy9AarU#Hj` z`tEWi*q?W5UNdX^{AJV6v06L~pQ2KI4v;HIb6G_Y5Jyd92DO@#8UDo)s9M{r%;UbF z&3(WF?P22~8AGrA41z$42@4oFEFGfFhfo=w-J<;^VH{7Q(cH6HE4u3iG7huA8MND; z8&vGYwg2ZWum3r*YzaTI+^ekF;i01~fVMYYRIy$Cl_2id?ILsxVR^ItQmvi(z1s~Q zxSjq$1i}1>21ijoEj`ULEuQI=us86Fsf&4aVx<$lD;S$BC*98-WF*)9{!9rD`eJ6# z{<`4Y$m=fow_c}mZBbbv`BMGcdODZ)k#)}!!^zxG2JOD5MN7s&pIBK=h{?!Ysg0+J z93wtEe0~WNV|*AH1OuO&^8FO78L!$gT|Jdh$yD)0vxg^wlv=+1s@vY!AS_L9WCHUD z!veR@K3pz=D8bA}>?l}NPB~1mqcH@bKq+)#P^OCJcsur zcMVxjm{Dldk8^ox7mCLArT{bDxndKD3~NsP=rRF;#NtV;FeITcAuw(cMH7SoJ^b3% z+q1lH=f^V<*7}>4Htf;LiiT^mNk{>N264q(dKScr<^o4&y>n2dP9F^OfCFyoL%2f6C0De%(@H#x>e*m=^vS~*P z+i(>80=($q3@K?wS7@0x(ldB|=X0Uv!02{sQ4`VvPy{Xd>lM~4^gP<@N@asIED~TQ z<%&oNi+mu$v`t^d$mA$!_97sNZ5MO)lFgE?MzvzTm(5EqAdpelkeV$__AQ;Rf*GeF zI-38XP{Fn=KT3g?`*b`YrimWNmu2V-v0DnPgwD&Pib@VHG((Kxp{gh@+x(3odBBG7 z<))=~$I4*#2qWnf{d&cBZeCiFZZX8!#wI2w(U=yVo_tsP8sV?rBEl57Gfo7wQhxzd z#xfobY;uX+BE{rv+1>8Z>8yo!^jTETL<4Uxm_E^WPETqwi)eTGOE9cZ^6UL-k@dZ1 z;SrVe`L%g6?DW?PsF>7i8^x*5{tS0-OL8A{DB{*2&HgD6{PlJbwZm{-GEDaiJPz^^ zzteIwyo@mohEgZDHMs5s!bO+s0vLf?fa4ZhdDL8Qte zfWDF3xBTEn9la@k9qo_8q}7^AZvk1w9}9B`7|hRy2#7#@t!?IjorDKL)GWSPeD;mG%ZXPU8en3R9!bisdzW!c!Tk?tC_Ab!P9Y%#PSE1G zXmRZ45;avq+)6hrPc-OVq}8S0<{!=(QNn@|WZ2{Mi2#4w5q^yZ%lFd^qIm2wCBR*z zqvln4NZs^-e)SsCX#sAAlPoZuN5sU(l}_u4v(?H_5N?tu-kPhc7Uq&z(wYkM{18Q45AN+2N~`>YDfsL$t6TBKENd|os^>>PF&a) z+GpaggU({v_^`WiuVAxS^ra%a8wMe$-W})do5QGTN=REv2eZvFEqZ z&?lVvHF@tWIN$@;Ylq7)j{QfeB_=zC?jXhantaQ^$512if!DmUlc=0lvrL3x0vzdq zv};ngQdB#gro>ZV(VXd?`mPF8 z;B$hLa@z`{7y(8NgHg{v>e|YGqjUW^hUNRUONT1-i~A^z@IW~E2RIKl1?-nhHT}Cq z_9nAn+R-!Lwq#*Xh0R>A6CL)#R#&N694elQ+qK5uAaUQ#+Y4|=MVbY$M;yao47eQ)Igv(Ul-$=Vxi9&PQyTm|+ z=ddL}rc6ZYF6m-S60z@@NO3}(yyVHS`MYaNh@M_m8Y!G=h;5tY#m_=2jzLii_KRm} zQoeU6Uw#VO7C*2eedj7`^rV?`6`_}O3k~`z$o>Pb@+g3ATgM08YT}vN{6z>HxQZ6W z7CCU6}#I6m%C+eFxRKV6bGa7#y2JjpqK;pRstv+k4e>n5cnHMG{ZQD2(>KqFch-{qXo#LE9gIQ; z&1Y#@h3RM4=-5^o8zuV&ccsIUF2aG1e_v8MMd;lxvOQatarCEHg8uto0Up&wWEPEW{~rYY1j)#G2z*t(D7y$QFfi zkI$e&IoHiB8dr@$ZdNWfttG?6@)nIVp#}9w6$4aI=*fS{Qa++L)T|CQ!~kTwzw%s3 zc#*irSLCw4A-LngwhlY6%F89zAeRq!t}(^lNfnMjJFsOv?t>nFh`HE~z4J_AQJs%( zU@s@xq4Cv%F+H8yIGAEoOWv6HYE1<1B8A@l*xsE}k={#B%o-mu=;NsQJRr*}*03d+ zx2Z4fY~&l_6%e-(2oYca7$wm_bbR&7ZQDTb!+qC1Z8?hdp>0cYV?RR6A zQlIX}WnR9=wpUEx=y1$%9Ea|B(U-6#d${2;i-5E=U7ShBb9>4Re(q|1o@0Gq5Plx;zbE*FOMDD8Z+dzgGXQ|Nq0B z|L~;7oTf`p0fFFA0&h}QN z0p2mq%iC=_&Hunm;*Hi3_gD3;guz`kN5Y)cC|ui3_b9g`Iox}>GGEMUh7i+^iZzk2 zUTnSr(Vj0$hcvjMK_@ij%iiT}YnXH6T9?9+ovTGEZ&WU{;o$}KO$*L2GY;t)yQs~L zsF|E>Dwu%slWFgAAKU!XMe?N9-lbWk*W#QzWET z!&jzw@b|^44h&~Y$tpVN#_`#Ta&J5I3>!>IM|3Forn}9CUZuVJUDx&5wRF&)pYeQH zS@>8(lYB3DB{IH_Oh@K*jKhKg-pkJJI^_9x+*-yscVkOhbYM#KF@~yb=i9#TS(Z8< zC|R=v$CS-taxeL?eq+mmZAW*la|f@CoYX6%kTrRIB)CZjuT4W6&&T9%4n!H}x*GsJ zV1g;RFR+i*S~1h&DbnjT+vLRrH+YiAs@2#yeZNF#7;2>kNx@}br8lT&exJ}T<;))I zIOAQ=lR77?M48&YtZW<(<2rBmexq-HBXWggY!KOEH#~IMyO52ONxLIIQ^}>3iEhgv zg8}9(n0QW0n$*|A4SpMYumQ9k7NLBzhky4j@7u(+A$If@oM{~1TXcgFhC-wZy&XBG zG>+n?NHumWOs|8oJNe9u$q&TK>YaY#=!r?Ypl}*J3Sh#Sy?c!XHZPcg z8elSM(<$kRQ3=%BVkb*ymsl-!AB(kP@F}5UxyTbBz$_P)Z1OcLA@}uO6E7*9T%^gb zL0HNcsAyy+xd$bT%Q%Gvk1u6d{cD^Q=XzEllrHEWV>%8Kge4HRl*o;uQ09}3 zP=lT8-`@-)@2lm0B!LcjbYWvxVRtfq#F;dOhP+3{F$S$|qyWk%_#AL_daTgC%rIB;>C@}b-;Xyy+FLBtC+%MaJo18L=_xpEc zGDwxHd<)$yXP=hKU{PThK-V=NPsq>P{p)8X?1Qb;Fsm^n&b9`}^21|O7%kRh@3`R1 z3{EMSth0A1a&mxAE?raH^5&F>D3WYYAM{7y8qHX+{!xf<_jeBUj0ffleQATa45)m;jITSQ znJL=z$0s@bG#P4UcM$y2ZL6MS2@C+9OSY;j{k8Ez1^@frB8RnHw#kZ5(lfPk-v3d{ zl_Z67dck^0$CU?tdV2aJm$$?ySY-2WMz@|sflnuCMaxfEjLwcPfzVo0PvwB#0!wh5 z2Yh^3LiG=Y`!$=q*+8a?BGf8Tqf3PEiH}U8odP>@!%bN}JF=NXj|T$s0_J6OCX>B< zhf!{TIuqQdlux$H6_?=NWg0>buZlQ2d;e)nZiIm#F^N-L`oXgfy3lU3DUCJe10<<9 zV!d)tHc@yS=Zhnr`jL8A<;059WrELKMx+`FP*ex_!QN%@q!I(%V`(H8rSEIdsy|P# zCX!8oh)$Ll!@LN!$$Q(xNn2z9{Mq1zK)>Jn>)9(uwKPw+ zY_of{B{R5M-kdp2)>cm7Uz1XtOvDDt zRHu=;zhA%q=|CEjDp;QitVwndClf@W4{RcI{vIQVcDh6D8y+fVLQnJYGhyq`r#qC5 z)Q2n^Yv`Re9-a>+EOh3EVN%xWR&_zfA0hJZPl9SNAu~rN|K+pgM3|l79RGO#^u>ha zhGJG583645B^FUTt5gOdN~IMD(dqU4e*h3c@4gKv>H{*^JLZpFE+z)E3lkL?d&hXO zR`ZvM*Z3~@r;6mVTrz;61m~76WE}d)WKTPYF?J0FZ_rNm;j_W=ZE>Cu7#^oDRu5yQ zOLLJKTeiYVd<9e+BY^DTf1vEk*1F%gstR-LHIp~0%}j}9ymwzRiQ^Cc(1V%ASTTV? zCkC{jJMe8GM*)B3#@J62nGtyH>~_j-0v1$04Xgf^-3r`*p8MhKs6)>qRk>E{E3ulK}XL4eFhj6s- z9s9wkqzh+v^pxgRCRk((DZ$-C330tybyCQ>5)+Kal;4H&#%XHig4<{LxL`Mi1IHgh zWEq>gj0BDa5qM%~5DD0%aCY-!VK~0~LC)HpcsM%@?u9oJ&Mw`}Oh^Sx$ME4KLLrkh z)(t5_b)gfo(Q0O+#Vb|Fgi2)#XE(-$vx9!j97f;%Z2>W6dd3e`IJ=KDZEV}4YDHXh z1(rDPq^b)BSgEnv!FKF((cb=}m@2R)V-{paXZ=J87$VpuRBbL6xIvP#EJO9;^{kO33?BshNRtQLHKE-CS5sz3~|stj$z zc7E7ggd(cR&1wfji5VF*M*PAAO`RvUVuJW&on%o*@j(AjSTRuO9po`SP(@3fRLFO!xSmSmv6KvQfy+Yz~QEPk@i!q#%&Ef1&j6q|?U-S)?z$e05;i>?R zh4)7c(9%Qh*Aiq8xL7K6>?3axZKtNi24;F@MTN_QY~vO%-TL9|&{fYZ15rG`)2Z_{ zK#c5(vvLJc*Y00xUSSP^WSYqBKP-XAh;WzbbI5pk3{Xpbs72I~RjiD9-zCg*f(Pp7 z&xeV9=v`O$t3CY1m|~%jgmqh780l%=e}7ME`^88X&aR5;qx*0iwZ%h1%|Q$ohw-x3 z1WANn%l|w2DFgZG&|9_-k;XWn0%Xrc4Mrna=#WuxMR8ppV*$nlrvVNEHO896;ut>C z5sbTWOEH|#eJH{0C1FO9SQxZwlN^G%OBMSOuECv0ZpAFjvtBq|IJ>`mz#yYY6@EK2 zL%Mr`$n1)xGk-hPg|mYo=2BE^;R=l(PjLGli3M}@s41F(sR`(qOQv*tUsSP?rd-^6 zkV3q;1!EWqH9?96BP-lu?)|?0Yhjg^X3W?aad?UOqa(bGj(uefftANmZGrXiqP25j5jrAiMUr(22B1j-_y1+6YuXE)GxW=r5SwSP<8k)?s#3QITlRD(B-K>jZIV>nd!Gv&j zK(TzS@WBXT`!EZ$7RjT6U>J@1+xr;|A0x%tGE6`t-FaQiuS_0HA(+}NyJQ4W%oQ8- z_5!6w#+Y?@3WpS93gfU9%zyaoC_DIISa8l@B`m;vTZAXf1@@HbhYAQ`Y8^d-Ms(>f zg6p+aOhtO3GG-k+&Jb{?@Ip+9aJl@~+F6|~pt1{RSHOj{LqnLT4;|BtjZ*#Ph2iYV z$vhQwn-cQ5Ee^&2ZD?>&#r(YsdNJq1N#!o9Y5d6(!D>J8+FN*k-%LLD-*72zdrD$B zySy%bd#Za;nAdFqDQe;D++GI@S7q%Kk8cx6iT_34+s$b%oLx%7_M;T{r-RUprrB#v z#rtv-V?np!ses$qp}VzI?!!yDZF0)oOIGE4@i>GT!`Zoiiz}QE&JGE_bVZ8^{0rOk zlj^wRvoiZ~n%f*>k26<| zpvX)?7S5pY3Z*v<4b!{K7)Unaq=IWn;o06KNNB&Qw@{yFiGjgE2HUE`i0} z_6B1?UWa5U=gb*HEu5V!LtI?V)ywNRn;wr3X+2uw;#b1%%&g9_jr7stHKL{KMbqj; zt2B+)ZyT-GMxWJMMAPf4FtxTa7kuTS6g6u{9o*4UuEegX;MfqWrblY4g4LR;iF-M36nU5HmKBE&(*ZM z>25eylA)dK$gwUA#yENYb-Lq-eJxf!TBBvOVSAO7s41~Ybp!EPnXOr{)N?r|Z?TJX z$9J+W;@3V&&uYf6Z8(W7$3~jaj(^L?!8&@zlseIp@n^YJvR16|l5vLWRwns;GeEs^ zcB<|0(Re+h`32S7aO}b#Y-;>j{~`uL9NWa20xhAP^cS)6SzpHVc%gC7u6>1i4)z!I zmXVYSLM3X3_)M+!?30qL%CR;xl_&FWE0;{NGMSS(mUAt1;q3m~ z-~Ijn`1}9z-~R3&k~x`^Ihm9BC3CK^^Jdq7KjmCXnX`o|o-0@(nUgu0lR24RGAo>2 zi#!Fr;mvT<*XXpdTS= zGu+jC-h`UjHKI)9r5bnQXxoK-`j1%6*Z?!PnN2x?RR3BWPrOciFB}()7uNLgj14U= zFG3>`E4BQ*Iy^(;g$?Ee z75;_n|E+Nag|o}N)387#x0lLAjww*5--i|W%IAORjhh!+nqfdtLcJz6?8Ga zEILkN3x(rPm3lr79v7wSKYP&Xr@QTAI!Ej_toilrI^A_t$i-XZsS>qf|K4Zx*oLyi zF0wmYM^Iu1*i+oTSM6MLv5pKe?PYTV)NWZ9gh}AIyS9h4fcpnszh*WOZyW0%ph&_w z(X@nccEwycyJGIY!nn3L^vPWAVF z#{=aVw$`BS>$J_MnMuuIIoGK9bDI4%uh*h$bly_M@9^)Xxfm0l57PmFML&2oTgBqY z6{xJ?**0dXnbe}&lVBgpoDT` zZGIO_P@(qT$PrINj|~0odrRO(P1Vth);(f}4nV0xADyr0HbA2oIYp;0Af9o_khxHJ zi&yI00W~}JRn4ybW3lEkclSCOsL`LVr|BpNEcV0ML1*WF3N-|Dbp7>oMcx`cEw&Mz z{6T3Qg`B-eHEl0+w&paq-Mw5xNgA@+u)RuP^t|uI_d2b0265VaRcO*lP%Bth13g%> zwhF0<5F#73TkCqN8FV+R~Cg}sJK{(BA6R_JFqnCI~|dVZ5^+m)2?7k7sxr)dJlJJ_Q?yA8ajBsz@c5XVeGu(s41}{Ti-Y|>b2F0wI!>BiO#3hmEO?; zw_1Lx7QUJ+$r(E%7Iu=UXu_=65$9^nb&zcG+?Y$0ncAF`V}FCBPEP*%rt#PRxV%FQLVlsbW%mG>1>r89`(n=)n#O4jvWs=qI8{JJnjaDX69{Mo#wDZHvXK7&1;lH_#KT`JH=$ zxJ!REf&wF&Sb5l1w~bWjUO;EXE??7O{MxNV0AI06d=4Hfu0WOTZ_R{7mSw4WO^L#e zy#lcRXdQFBa@||MU7;&lbQKPW-H*2v`{2ec1zy>@TLCOCUDb&<6qtEp-4+!p)J-?V zs@Snl1F!0WRAwRZY4LD&yAF8A&nTFHiR`m*c8|RGOX)!8`O7joRKvm|{bObbQVVB? z)xb<-AyqHTcHn2E3mt+$9zQMeE?(8)V3Zu)gEjzMxLgPRHtx_l=t*;8E-Ds*YL~7_ zioRc?@E^DC$S&k{ORJARQ@{}tlkU7Fy1@RL2UPoGF^-um_*i4yyh{;qXbOvrv{PaG zUh#DCDxDBLg z^|c!c-Z5pa_rrQc4*@F%`@i!^g{km|!rsR1g5v58p}lpFB3FR+$328R3X45uwg8H~ zhxBZ%RG=Pg?oz5hV6qByeE-D0_xrWccs14q2Z9iw1}1fVmg&g)1&L!IlQ((x3AY0GX& zHebz)Vc3Z2vD4zj&d=+Tp6 zB*KT(uHEX8{ZWlT?V0lmWYE(E**kGY5nR?g{^5GiUB@r<2u1-L)PJPYpDT*%v066EaCRdm32^vAvT%0W z-8|8Cz?%qXhbx3>Lkzab0Mxu0v8jUW;`3xH3bDhLIxBBMKaOu=WFsui$t zqVObJfNGj;+f!>V#JF)suTx)5(pb#A?wn%zhMIkmv1n8t0|eX;$gJSKBC$AP$Q8Ju z7pyJNl$&>?|8+i=K+---3cl{#FGB#efrmOLjq%lrIMe9feD-O;t!4-)BkuFA{R+i| zHv@|?tPdW^Dfw)OtS5X2VP**Zd{IvVIe(et7MFa@7CEix_}zQbL>wtBpu*WbR5&~1 z2p$+9^A()&sIFX7Q>kt_kE^kKovbtV8cM();|s$2fhbF*J*#uBQPZb2E18b#5yh!Q zy+0o+qLD>R08_`1@lp)LZr@=UP%iMv(IP~4)h3M)al}=@VMN<+u|7PqWtaEwMWtGU#z0#XS4H#ZJgE?BfK`Q~s1VwY^3x*}W~%{Bb)u;Qyk$i{ zv+JKqXd1BD7|ZxhnoJ>14LXS!0V(1*XsqT5kbJL{%t3|5(n(zYC98!M?hFzMAoeS2 z<{n=;V-#2xRB9r>nCS=g{vaWo9Wy2CS(G0Pr~2XSR%k73;p`X`fJ5h-31>$aXfi7d zaPY&~;T2-$P|xu2ML>#od4la5*jkyz{edl515k0pc^ z`hqXQQxj)<*KWq*k!R~n^J_B`CxQxS7Vt~~;pYfXybZ*Uk`)`YMugWm{)~<_;>j}# z*ull4N17+7$wCC@sd`JXgBcEEVgbp3?k}nCS7sM}jD?GZDM6S?7}kF)C&T%U?-@Bq3+m&Ao@COh=%G3gMia zN4a*3+(0HSoNcCD94Pc{sEfsd$Ap66(j&plW>3Rfy5cY*{W!2kPHHw=x=MF(8E6e- z0YC8S_1kDw8BM%Yte$!D%z+qaWR%KS6I7kYVbX>j(jPiqy;&9TJz*HCg4c;|GaLj0 zUljsq=gToN0Tx3ryA5cnv!OT|s4iC9LK8ClkuI7M^LD*98VIXS)VtRZ$?nRHu?73w zrP4$EQ2c@?Ph@|&OHGDj|1*(=t3M0+fEBoYQ(7cnW3Uz$&%)U~^8Qdrv5qX99ZChf z@C!4P7|!nD8wh7tPu3IZB7p`z4s>315oTG!V+u(i#(a;JBvIJDx11vs6{)-A7W;@0 z;)=Q=2FOO8*7}JPYsmZ*iO8dTCsi{9a+}Bfbx#c!=I-_#{RB+c_*^ulWq8NfQk~T+ zi~~2^+e61RyPIzd6A}1#)6^7oFd6nM7M?7WHkWR>XE)(reEs86K%C{b{L0M8)f?t23VtTz_-K#{2qKMNFLKW&MD%>ynz6*Tm>>F9K2NO6se{RGmsu;GyPx9 zx3NE~VESc70w!8OlBnFVuMosFW5G+CxS!aFMxUrz7>30`zEKruXxd4Of|VQOzKxiu zi$3lr`Kj|{ySw&RM=RD#4siE)3g3Zp#U-ny$-j9Q_pd$^V=s;~VUhJ20}3S|hS6jQ zi&yFAA+8s#ly`&ht=l4mnPyQx=5WBN*hp%|^waqZ{nCVcUa*pk8grHY3L<-cJHt}o zoq<&cXK@xTmjK`;;Tl6f9I+p%`NVnxKI<%-EV-UK*DK#h4hwcluM4t)Jj?c83y44x zbBX*^X(l|8MlATmSur7jPDBpthWzw!vCtVv1&1n9has!qR#OGn%tp4!1X%@e)U|RG z*=RVT-_2dH`et3!5rA0eMb=v^@L?SI&>+(cm;eO=%&Lp&glkL;wjK(bcGfE?TlYYD z&mnpihUUN*Banxw%J2TW5UfBId>CE5wi@`dHCh;zbZ_u54p;`XNoYHt5tRf_$%%XO z2?CScUzRamgck3f*>LdX)1w?fxl}Zp9^PK z!2Nk%ntKah*afOeaUrT~e~AT~(tZy2&fVBn*v0NH?)H)7ce{4*-Sn!roTNXWi(IEy z0p--SbyV0zS4)X+3NdP7Oh9B;PI0d(inzbP!}BFW z1D_?`jw@g(==KTuk-kd!;p`mo`5d(c-OdNAnYoKB$@yHgKxhNx+>SikqmvR3XP3{y z*`+JS;)P3Ed2HDg6M&L#m~Y_42<;bgZ~X0*adG$ec6ptEnGD!=j=Vn+&d!9eXney{ zaSLbXWEH^eu9<0rI?eq$oX5SJrZtPQXp#m#F(x{C^11zgNU!vwa_p|X2{0i~bNkZr zW^+u!SI)vAF`Qk(mM>q04JEVwDRG4JJE_R)b{&a3CbaPomnm)=Q%t1Y+jgmg``y`E zKxWKJsKhbOLJsA1YMTRRnoQXbXIC>)x}LVVR%{%t)hb%Er9LY+iS35<<8j%}Se3Y4 z_i4|^6HDAiYnx_ccN3#a)rsv)wif(G5_i(tE?hlpQOll>36|KA)sMxta{HgHFxFk1 z0ITCa?r#Zx1KID_kH=-#sg68<2+s}YXYXcHj&+d`&d&CJmvV6VuydRLNX`w?e(KPXf=P@=|z;?eERTJwWhy*R&2ou8?kxg;US zhW0b>-~E_o7N{yAzL}phm;8LTH|hRsN4tKu2Ou8n%)cw*6DYKO1^%1d=eU#AIWu_{ zwafsqi^Q03%0GcpHfCdSoK*ihH6A?8e|P*GTnSHQyc-{^KQwCxXoS;XEk>xVb{K8Q`yG{%P7=JJZMLa-a2339TZYG0cC00R=`#ehI zYWFG)+-GicGYtd4)y+ZwmKY4NB02Q4yQLAU45r^hx|+T>up$HwBeQrg}| zpJ26|&|sPiA62xPwhEVWVR#C=?S6iwuQa#KjZf?P7qfM0yH-oOZH6FR#BDXVaizOJ z9)(?iIBjdK5Ziue<4tv=E9zoL+0Itm^qL*Hq>Bre&+Wd@w(~Ks+pd`A z-n15TyG?Cxqc+C6h;}9zRso*IP>R=-q`B~kwx!XwIg9d4q2Y2!_Jv%7a`I5nZArGB zwl<Br@5`cCM_o9w!hWzDPS=e<59=_!AgvsI;6XhPS%CpDj5%FXWM~%y|7%u z?dgtblWWknffsZU2=!nEDXh;sMO=#$8QaI2UH^0LP9nXN+iTJ(`ojhtRzK!y%{ts>$Es|*vVCH08SMw|pSaVUlIL;z-qT$yA_{Z6KXKMYS?w;y?sVxN1H!f$ z8?vSbc4DMVebq6YG;tKNZnLiKL$>YHJos*!jy8SwgAPv6Q6Ber*#g(zAZ^xV`!%Tud`M?LNpGJ;nQDF;!^XQD@p{+-Nh+T(C^1Zr)9QCP_b) zrB~H-)ar-zUi)6!YChvzola@dO&#TRyVD`KYkwWUpye;W)}d*|{&Gmv!A}S3I4smcl5LzOzhByG*g>cC z3c9d?nOn}Tj(oFF!6sl33jgggU6*aB^F>Qmd9xR*f*qEF;BpN$I>4{+q3B%n zgJhsy8}V_6axRRXZ&q?bPI2MvK5&1rAtqL~o^xCQ4mr=*k%i-khX|6Z)`*hhyl$4nO*JhEcF4$GsnXcNMZt7q!UjKo1n+3gWNv~>Z};O&;?^L*U1i0^I6$NCZ)TQHPtWX03xfnLuSa(lzBQb z&j34qp#zs(qj(rEj0ieIv$yX`e-_b; z!#Y6-P)H0+h5qxGbO;i%_aD*u-`cH36}K=ABt)}>J5ax6mkwFiY!&m2GI#oF*$h2q zecK)#)jxkZHa8@Ovtx1sOh23*ka98E@w&GQXNRoA?sQvxWF2i8vgz%}DLRk8bH5^1 z%=}LA_s(9_!A)oYBA{NhQd9owO^OmSb#5%eF&v~OLzuBZ2NO@9S0Dl`Y#w*`3SQs1 zrGa2x5u_da)Wz4L&J?RV97^5a=&D9%X)17+?(ZV#-yo-W4046-D`>{Sra(A3Z zg+$%DBfhNOEc+0Atgp7Fgy}d{q_H!^bnu5?k00yMJw{;648e;GU?>p-#2AIzv0rWC z3h)(!{^KndS*AjEV4iE#qzTO`Rq=vPqKuQlqY3ncg<@csjHh7@72$(=tiGxAox74D z%nh_2IjQTfCJAWF!DtszqG>19JbOV0Eu~TfC{LqZ_wN$`xeqsCVnO$W~G;7n?2ts z+l7HR9nxEQqGkHMxLDvOxPvj%gkd^ymX70O8`tHk+%u;r1E9^DKTK}kBA8^{6SlKw zUvk*pTGEYJ$vL*|kl`OaDsJ$XkqTh|w?$fqequ@(4tWo;g!CU{$DLuYZO^zGm&8`z%k_NLD%&)knB~GCdQ{VcDrQa>2 zi?jw_9Q#e3A(mp;gdM!k|IL%XBk6-XY^VY;A4ZdEkvd&jE>-3fY{CnWqS8Z*4Z_o* z@g(Q?S;xD@L8GJOxx^(L6RreeX6JgA^TH?$>JT;Z$i;*|Jtj}m2CxauL;&Wm2$jKV|u`#T>qD+=RzR>0t zIacc5ZaEHuxh$byWPr?W>LU=7^=~LppU#1{5bhcEkldkLa1wDkYAo61e>9c?vC-M@ z4k)ysH+XrfK1s{r9BGyk0;siOi?IF-uWQP=p;@|&J z4bF}jfGgbij?4`9a*BXmWN>yJdP<+sRnkxF%^wzhzhBrQ6c$?8c2&FcbNONtF_iP_ zX7U1P7Ysps@CxQo?Zri^s#SN5#-4sjsVlN(3=0oG_*hT0YFCKoNb6shhC^7ZkaPD+ z*%)pU;IS_Tc6fiRj}Fp{$#Z0(^yRC)dT;@^Z|E%%;0I7|`QOi!36Wh@43SGEg#25M zV8ux=ue(jIkg+xjh6jLksM#eY(kpJqEl867T&PDSr2NEkte9d9AZQO_Vic<^^|b(Q zmD}-`d&%MMk;u3;T9IYXVfovls~WlH8DS6B4Z{tQ{;DjTMdg-{6jAX9LJE;@^U zr-fJ`Hr8c8a`Ojjzk8V!hKdsQ(U`6SY6N*S@3vvVC!tbrdUh1R*-eli#4{qw(NpCDns-rV5y08y z>G@OuXSYL^BP{**tHas-az5bfaEOSQ4Q(O8$DA-T%%0Tv*_U*jWW)!OY-Cl$;O>K^ z(l8tgq$E8e5=j;-w;~$i4MyE- zq@G8i_LRr!@y=L>1E=BykrCPjw>irxxJ?p9doW}|J1&^)$Fq$E%XOolOzSXktP*Z> zki;KvfS1QcBs&9X!`P9++Xhm+=2Q>Ps6%wPAXFf^cqy#b^c10RxZ(nbm%hoTc6Nb3FLLU;=QQc#`3*}-$t8FUhBArtg(ZLv=hG<%_rqb>f)1Ak>Vbdur_ z9bqIWR61ij1DB`PYoGYt*xolHeH5O7A$oO>ecS>?oxNBF48ze+A{-SmTxD>BnNWcC zPykKKXs&bt>nJh+a&F35+DS5no}dQ!O|<>`UTOnMyYh+PTTFFe%x6zD7$t-n+q?TgRN`qK@$duJ|yfrkN$WEl_0x9=rFM79kMB$0Bq!-KPUAUkGNoT1}8vRA|zv6 z9KmTcHfU-tA#P!GI6=6#(8Sl?1_8KNDi8kT9_Ukfg85nS$%r74gdLWlVz2@X=Yk-bvq2yJU*SbWih6@MI~%B>~z`nq09 z9|)>sUP#Ds-YAn}6E#w}S&b4Q44qE~$c!QKUEM_W5TdY8f3{r%&JJ5Gv)A-F23?+G zIB8LL>VmRtW<}nq;q0<)E(8N)#s_5XpM9Z(tI($DoL4wILqBskJC{_(>EY~bPFqm2 zc`%JhN_8?gJ9_OZCxthycKwtF+TT2%7Gu+TGHe=6na@=+E=461Hh{~q4|%!*7g}QB zXBE^_x^`hnddNxi(rExantOOGLC#lg@@W8e7p%Grk@h3)j) zu7{2nwGR=@tmdlu@TVp(>Gj9=Bjhx1Pjoi8dv#p3^E{D0YEsm^h%@?oQ)NM0DMs5K z!m^Vx#Nh1CgeT`hL6br_yV6L4t|}*kvx}NkCHDxTt$O8=AfkHwxR>|8@qK4VT!=N! z21sr(9gEJ^fBFk;uC5z#{hvW~fA)M5Jdu*vT=DwTsx;LTimODbdZZpXYpTVn&Vd@-zj9fZtF!j! zT>E`toBai?_ZPIOPOa+=U8wf7*)PsqkXzSVO7kR5X%bbz+5OKnoL!pIl%_QO9#RI{ z_3Eqxjj!Eb*!Dm{n>3{rt?RCQR08Gz+Vg1R!3^9 zp88K`(bLmEA^j_)>TluWZ@xtS`qgmEqPJ`*@1g8?Sl~=4LaaLNtFfTWsqb6QDR>na zdv6$r@QPj(`in@XYL`cFc5zg$x}m5g@q>ww^S%@PtyU)GNL`b^^NrrXMw(d`zK!+$ zIJ;aw<0We_vr5wV$4#WUncP3Clc_6P#MMkgnM)Y3Su_t6cKOU-pZiHM?-v~KoyLYf=X1LK z64#buW2_iuy5y(W_nDi1#5F&)o%N3z%v!a);_^nx0plyzKBrX#0+=$JDKq8hK1fTZ z-rK6F{EltarXqP+sV>&cYIAT6n`(W|ut`!ZdVY1&fV0v|V=e`<4d#x&oXxiR;kOLY zx`mt&xvrsoeH)!dLhemqC#S#VRkpuH_kY@cCD@Eb6i6v~1(5CYmHfF?v1gVf`IAPS?&`CjGAU zE|=Jpel_n^Ej@DCmD%k55tFrsgw~FntVP_2c>eNazD=Hot}K_fJn@3yyUrV&UCWz= z2>0wuTGQ3EqgJOp`?55%OMkIw^)o7P`$#R9Ubspti`?d0c2mh`UQ$UkiZ(BKOe-Ub zLnK2w^4u#b4`BsQu2Vh528nikFD-gm`K0PWl&@^kG8hEv^R#assI$nfeNXY^u32hB zsZAQk2i@3PH>E<(-gvuivG#c_MT@5?^?@=C&JH17-Ao+t#fR_;w!l?%fcDd7^h662 zZcxX^-K)M}zrHm2ne|d*DtTyylolf$J59H_)GoRYp`a}(8tyxv^r^}L?-mCoaXZgqLZVR#=oK))y!5U##%b(Cv z;(lYa%P=I+#2CI?@74i!_V2QT^HQmwa}GDj)}n{d<9 z9@J9BpATvgI%M#)VrbpcdYC+`k$HlkFbF_^0^REOS)&5rbGT5@# z7WO{#ve-yHFK?1gw=%0vz2jMvJ9^~!>YHlem(}6y78;ygb_i_MS z^cQ`jAJjL(vPf>^ZjI}FdTddQ)(a2GevNA za~5lDD_y>Ko;XQ2zxrA`xJaD-m%Eee-bns2SNmA~p98Q>7ox9w2nXeUnm zo9~2#^wfGGFTDAl%mDKyr=Xsh3j}BabNBxs!gMjJ^EQ4wLyE)Mkr~l1oarSc(!cGW zDY|^HO`!toC9gkGnY{L9Wz+O)z&M43t=qK>8RNuFtbIYisc;Vie(M9Rr>YoR{K*Qke zdmkyHL~wRr@0BSEQ0`~NSFD=U>G%mD3D6!ARalDUQ~1M=4bS7 zQ8xAw4Qh;oz=t|3+^X@O8{d%>@WqatvhoT2{vlTlz)VQ2I`)wd!u2#X1XYrNKNrf4 zay$I2k54fH$EdDrM*S|LQ*XVm=twu;eqTJqrJ|4sv{`2v8VNfFc=R^`sbIW4hN^d8 z?vdUyLOt-KyaDclgbBrX;zg-F2T@~GW#kkY>GijXjYtZiFbIGNJHM2xVX%c`AtrSj zq{YFc6kYlW{E1vu!`Ax5rIS&ES<9AGWabitEBQ|_$AuwXa`nb7WzTGMkIaH_&48M; z@rGW>mp3Tp;|eFtkUA1NNI>X31&$pz9JzynmOzhDSs02__;$afa^kq63IXb!Ey<1V z3M+(RARd7f4Ee!a95HDrZUvWpZC80%*v(jgv!u7U_#b{!;g7Z}t>Y}-T)J2f9cTz= zhr7hZkZ~_sB@=CFzS19e5{iHMRj^E$8AiKzpK<~6&8uxG`sHOB)S!zF8;D2v{s$GS zb*(~!uk9u&!*+bV5dICRuaUvoVKBG=WLgc*?zw7kb~O8o^8#n5XJ@U%7Q7qbnSeTX ziNLqe1bVUSOO2*4OK5;X=z7>dkH|?67^qP@ld?MF;WzWt#b=z~iHQkB<6P$S3`{-C1&nJ10-d^IWo$mwXlV3l$-`uFyQ$1d$anP zVloN%Zi`!kC#Ww3GdS?inSvanJW2~cyAKktC_wo_dyKy48x1A@Jx91a=uEyXsK2JG z;u&LED#6eEpA7BL5=Y)hZEby`5Rv|ak1H98IQV0Rp(+&EK>n*e8rcyL@Qi&8PZKY> zg%q-h5YFcIXY*L2};C0NJP+0l;6Z^noQBn+sF9yKcvD zY|lPDE?I%{Vk&H9yAq~eqiT{_C%J^{**WD`r#SwuUUaQ0k&xI}`g7|x$ zb0>$h8#G>d76QfNkC`U75{I+<&k)Xzu@!CwKTEN9x9EWb#=ubS{K45>qmax-o;YK^ znui(?mS`TXlkK^e6>;G+8*b~4y97>1>>g-BR>kJQKjZ&g?~aCRg|ci%73 zAg_wS@-hx*hi2ojkYm3wx_iH|lJCIr@(7p~_JhP{E|9k+g7&Zn-*qR8#El9bgdcnp z13*|uvWypFu#9oyPdSd}Or9-EhQsJBTAE>iKxiP$XLyKVqjIPy``6yAQ+WnwcTE>v z)x5JxqFN9~N({0KL!c@ug!yp5AsLa>eGkj|GFC$mAyNSjierXPi1!>bRW-oO)z2oc zzg-XhXyMAIl*-l3_j%5q;6skR+J)#58VCnk-K?}7ErqM7M@fi&;Ij*Q+##WJA)Wyx z$1{}MbP=+3l$NMZ;t8+N9O@wl@-I-qobH2l7LzC6LdS?Ps9Xp86cwD|E@ZVtLB{)a zs!p{;)u%D}pqtd%;q2gJmVtv2DCkwm^}#%w9DCcYH|+K*oWGhTVlzu}46!OFgsSsd zP$dTH#f3t?G7P#>Lk7$6kMNnV@tF`_mEN#7lal%I97Dh>v$v(5)fX9V7-i&8>MM&A z4rgZ&cKJ3Pgp|CYed>;u>(>zZu4*DCG`6pws%srorZ@&?r@1l)`4#_WYOPbYL4oBv zoL#fvb&$`|@f}UNFgQD07$Xm|JkknBax1Y9*PI7+Pn-(Q&gL^UIyIbKiJ{MB*tCs8 zQ!u~EvFs8yLB~7dxON#K=v>04aQVb3{<C0}YY}!#^Wi7hsw`nI$77b>}+N{?Ic*>#S z%IuU+fA!h6RkLSf-_(vSj8B)1PDRC{s-h|7L3#U)=95QgSHaxfdOIgMY_QK64)D0b zY4iT;2TOg1b_DYkvc-87@yD4{N96SfO^wN={A6%;C`rq1!ul(@&~SDUTckgyg|mxF zdZz+r`q>!U<0S(fKH0=_2{&dGu8MJvxj_A_myEZtJ}YhMNx52GxHWVm;%8iGBjqoR zcpF2)bcT5OM7UI^S|xR_PPIW=%Gsk~W5rK0b4PD0vG1Bf>^sI?n$i@J<~*2^NH@~z zk*5FF)L{0?Wu30d+LP7%>-<)G@>-@TO=(I~n$D0yIJ^JxxBrxevrAK&(v+s(Lk;d* zv9#OO*@tsm9V%{rxTsy4(v+q&rRfYwFOdw+&OWf^ZzR){rZlA~O=m#iTlk_5C#qge z#z-&7VsF#@Hf0f5{kcTX5E2@1``{FZ4_NJ+HsP zOub93P`s%T)xaN%eyf#9Ia1dYz1J>{xEj76cNSIchnM(~nk8d(`c=LYuRrx{jsBL! z%6qjn#1y}z#RG>?*I63sKn=@E zZLK$;MjL9C0tcFG*sQW~D^0(Orh1hc%2{5UU=E z9ZbX~aQVXOgngdWlic8Mc-)H>wAHPf*ypDOn`RR{<7K?&GW$fWgShzX;CPuPwx*M& z#(Qz0C}Gpt9FU^aCR##{o=|RlfZ;w{P+jgI9v0jDYVS_2eMFivf7mzC5Ke1N*!0hc51RYwV!APy z!klUIMv+t_yD-zBwjA;?VPELgwT61-ZBFgi1t&MIK&JL>=Pdg?xSN|BRKn1(v=dIq zjbQ7X+r@@Zk$@uGDwSDE$=9ADX~Z?GT1*?Co&24`1fy6y_3Im|v2-e%XUs)5Wu*e?c>Yx_PnLPqfv-73O4tPB zsdJOBznvU$w_5w~O2PKrK2n{^G@Qh-)3pB2*H$&}ti``W?o_W`cLz@pn8>sTh0E~L z1}!3dYMqvU)cSmNc*xzCKcTzO0Iwfi%x(ic6r)<$j^dRYstz)Gdc9ogHC=Re&;$TfL94zo z$1M{UaSFQoe%->s>k!jr3EelhjRCc7P-w?qRy?7qe4cq~2QMIHhH!RJ(~e>t+~_w} zO@&J^7V}5S*L1ZM$FhOD?o&_U13Ck@(VymB)Vo*T6vhyRC(P8E&haw>FDXv8&>HT= zt96UD&uPhWuaUvLdfI>oM8gM;*HWnUuL~cqrHPN@h>WT>ZdR)hE(O*+qx}KnbnV*b zwSU9yx>1WRLh876n7l2X8cER}x`V2e)XC~ETMM6=n_TsDC0t-b_Ot_eH*PH*Wt%=< zjo9^7a@t(2Z(aVl)?=Y_bQR;7JVy(+j~*3H4;`DmSXhl-NvSFQg5_Ex*rq~D<+y|$ zI7n}otdToz(arR%wU9*K+iHNA6@rJ@@wx1F{&Hy~w!!UYERb5G=y%Q%q)q>ET0e*7 zP(K{RLRxf{k-zu=QeAAi=OKra7aoBBm~sNKNejvn(so40P)f_IPJ z0i4|`t?b6~S3Ok)XGejhYjp&H3eK)ly_mmDmw29%dY4+Ea)+~9pvCO3y(NXD4WI1P z@_f8Jz6r(q>`PhobFXNz=D|bKGq< zzLxypBjGu~89d0n^90$4I8Zh!Ve@s3tDjMm5ZsSHi6MQ*NJZfx9K-o?1QAmMy2{q7 zyR?^$&M0u_8FdtgI+DEup%g!2NsIF3_>Cv%tR ztm9$s{6b&_I9bo=hfLI|=?jt{@019J->nt*$dNMSCEt9jdT7R_r8>wqY?82$aLpJR z9igdITQ|@o4B?jvOyp06l@3egfN8$0wZ~B5bP)<@=$r2*M@23o@JF6rr!wCikXC76+g2>YX`UM3mpdsgvxSj@--TXLvef^oHgu2*x2?Up? zqtSkNNW=P!l0K2M;H@UikbA`@;VnHPf@)&tzhAu z`%3?jCb~^7Trotc9Il+qpq@C;h{zu|y(b^E=us&rF<{R=sU=#9RkA;Fid-IsfAFvn z!q93=4-Z&k_{RbdJT9ksaZ&P}53~xLJn`G_1!qTjd`w)Y6D~B4YtOtgYUoiHW zbf1uA2^UxtDuw4_IRDOv!mr)DrINz1fLws4vk}#4JxYdeMTg+sfU#0O`~pFY@Q!Qv z=u@$vu{{dG29OqdPx*OE_A%xbDOYC)P<`IE#UxiMQKooKQxxc;Ce{j>90fo?fp*44sMHm@^k_Z z`6g^Zk14=kJ(sA1VF><${2l4TSS$xOAvfJoc0T73Nx9z`>A<^NLpZxl8Ynak;p|{L zO(G1OA2>Tyg&YTKxvEJ3XNQ+ZRXBx4J+)p>flv(8j8ia^hIzQ1_Fw>K_ufYuMZL07 zy&&hplaihkU#Fg;Hbn;R%ebMD0RqrX)OhB@av}xx{e^G$%VjsR(JnU~I6+?6;hAq9 zsL;~PQV@Iu;$y>QyIcQ{#&Y_r>!kz5v*YiG_e4;*N|+>ClenRxa1}vgk7K9FezCPt zQ^gbV19$?5;Wl~>Z%G>Pr1(~juXr-~)n26qXw)5dCI2m3k%NtR^TUrC^)p_aI#)M^ zhnJQ}pxm7cU$en3?85f(Ck!TN1M=b&Sp_mBsk)|%2A#NR?ufT_m}kNm#7$`o>WXxb z7k(3u!5D??s;)B7Wsg*3=h5g&a!mA$P}9ip3TYfZ(ft%5od)5ac737H!A2Nov;orF)F>zIQ<7=2GrMzsQZEsp#A`gQUhgkfkFP{w`Xjc!E_p`v^gphfLyA zi3FYIS~!KYsOSA{^5C3BiQyWyfvZJ3KisBVojNfUTr=DCw_QjFny@Fxgx{YmJ4QLs zAvB4Oz~r0lD=F8Tb0o&X2N*(mEP2+$vPPT~N4V-!1Ng$D(M|TV>p%kpXV+Sv41tZf zcq{}rN<>6QuPhJX>=?T(GB~^C24_cxg^t2=T7LfF?6?aXYVg2f<#)6JWm~X9Hp905 zbv231h>g4$&qzSMskg9&&<&MbE~Ulc?%ty(076q9sVudF!P)VbbcPKjBzWLJb<-A# z9CQ%higP5K6XzKGN{GEAruVigF7_Ojd}Ot7g%J}2c3d!7?UV=PrrA*7%Sx5v(JIBK zI^)t=5Z#0c@Cw`SK3Jo8v<{1AynN>@Ij^LBbl_hyg&|EDyg{zP*%8#S+;8j|1!*af z9{a`Xp~)oaC=7ph?^XDJ@wMcH>2eyF03yQ=e*c4fF-ax2z#B3upY>1x&W)?x|D!?? z#V`a$0C*TSj&sSk-|2w^8)JF=EMmelxa%K1Rf@_+n@Oebx-YrmZ8;D`&)>Q*pDH-J zZUZZ6AIis2j>w5Vwe6vYIG8l%k+7GE-3Q5dh{?Dx|MCo%pc!~T#!Ac9Dv=@1qnEcB ztbM5|J&dM5cn$OqRYT!i!ya0p$Dn$s*Fh1Rni-N)l3RBhsIeirCpRJxaV-Kv7gs)| zr*$|cn9hg*4~qs>rT&=7!D{%A;1~hGe3B`~8Qku+5mI`b zd+(7dKnj4O51t@zj!7IkEZgwM4kRpG8@;)%3v!mi3M38#u`akINWfLn#(U=II36D} z#=+qQaGC?g1@G&d+$7hD!^LwE+Lt}9{cF1FRK9(ChJb{Gmc@q30bEBDRW{5I17VGkAY|Is<&1CTdUH;353vZ2xh=OO@0PUO>t- z95qJML{nk|z6`x>-&2DjnoWL(BlGvY340wxcW|}znx4WgY<%fjJqf{7(ISpFwr?e& zz_*W327pR))g{IHi>HQH?kF%@RLH-fL>@Zo9z8|D)gT=t3zPjZbi1B1c9JCgAooSA z-1MQ9a-i;xkb8@6dSa_bXJ-Dm2nKv)dvs*>A~o9|?$WtXk@u>>*%^*mUI=H0 zhV&ns+`dy8iocl7JnwLJ83qj4$fjOMwL&<%41>8tA*D739H-~GHrdGaEyJ2x6vEj> z9sw#g47U=S!Q=I08h)MM)Unt6Z>G&~io}#>u!Nr7$N|{|6>6h}C~8ximghWleW<%A zcrKKP!P)UQ%b1C-;=;=8fxh!9UOwMugNdu#pR+Bun*AW$)`fHc==5y%5FGOe&dOz9Rq5@ksD8xUVozGI#J?=;BUG8`d=NnP8a$qKf)=> zb38ht9jm;ct@h)`y>kDnYr~r3wdoe&e!`A>Gko8#ipodTssR^{)G6zTb0gl)I0GYI z1wF07UOTJ(h^2KyarSxxB8f*k36o%cTkSOKBvEq83&%TBcjPVMj^&Y3#dd<@)>PlG zYErCZq%)C{=r>fVs(MVZqnieQy{9QcEQ`40cZ~5cs#!X4!};LSxlq(#?`CRWL@C}N z;&x4LR9ERZCxcsrmz0D~z{~qtza(ly{4P~8sv*rtj#jMZ+1e+Avm*m7x=!y6%5KsW z97W6UH-Idw6}nLs`d!lW*GrOMD9ZAbvuR4xe85AE9sD? zG^Hs`X*xp+!9)r|IJ?rCcul{9qHE8klK+x)dd~dCgC{Lei*(ZZPu1pA9X~%5zx$c& zr|zU4j8p2_c(IcnJPn=nzJEn@s{Wp;Unec^`zO8RG&?meKh?pLo;{BgInZ{MC!J+_ z(u1cVDos6jD*9cOpQi9>PF+~iybzm*QMDiAPtCL8B$9|+NU8gEK^{I+IT>$&ep4>2 z(^jQYB82tw4{AEooH=D7%$0N1_oJ&$S~6a3(7{;Alb($qFSV5j-k#{fI1gRo(UH{4 z>nD{Pf4tdojg3oR{P!IzDSmpHQ)p}r#@3jV7iUydVb!&f`cEq#r6ebO#!pNi5mEF;ePyhVLQ#e^2;R#$H)pX?h@fuW%l({&22P>dYMw=ou3VA zh!u8>EHB{N&yM5Q#ZOgL7`8LIsf#dZPgqz65Z*mH7-zy+Q^FdSV;FIzHqkQ27OlE+ zBy3io&tBF%%4<}>XTO$PrxLcD2@3Yx22OSkx70IVP<`_z3AVd>reWNN< zHJN5vk8%uXG1rhPON~p#4rga<5l@VPD6n(e&$?WklleAb*01$hVX=LZn*9<(*zy^sseL)WWMCosW?CV7Za&!_Y0%^EJgdr6#^=TCzzi(=PN`%2OUto!M5W+eVhn{HM+-b5x#|bILuwE^Hdi=hsaQ@(#)6 z+IPL(TQxK!9=|(Pm0IPEtcJ*P&YE0fW<8`u`eUZ*zDpj{O1^$$0_EV=bpM?Xw9JEs zJ+eki4CzRrP5qT#w$!47*WcDc4wyFSeob6=)j9X(#R+L%(?x>gUc)B`j-$+G{v*m~ zZ0X^+d$p>>LGAKlaCY4XYYk=Yd4scSuXRMvy`mM3NREv`lTtf) z0mYFW}j3~$ycS!&q~ddqPPcEn_Hd-XGt0-CV$ zNx{uvQ@0ySuQU8Gty~%;{YO9)!yacWkZQSO!4>u%sRj7UA6Maf9uU(OtkAM%oo%f} zUmQX7!|v8f@mq(j$6K4uOfKyyJV4Uh{-dRic@IIImE`W9}epIU!Ida#15(aml`-nP7wcLH$ zgFzHYVb+X2vWcEA1kkeW9w3Y+@^s`nFf45)D2jBTnjbx)e zSUyVD)ZmdSE7g8j$M)sdvgg`$pzi2z86srDEuWkm&JLZ%JRIVIc)%r(J|i|F-*E?Vv3A>5gUW4@35F*Jw=wy}*K+z>w+pQUsbPC-pVRs%G!4n}_vb@eD|}Ux^k?aB$5*`(9y_&V(Pyg*9vIZgn4|vTSx(L zjdnk5>oVc;nrGx6-`gq>K)Q|Q;q?eyc&p!z2?FcjVJ)5hcE3~#f5+vN*}hBKzxP{N z;DH~7ym08S1c1W*@ROV%dQak(G{^u_<9SPyzx--A7q1FU2ch0GS7(W7@DxvkT(JR~ zaqy5>!W+jhup5lHY**z*V5 zq;RFC@u@dGYoez)hQD=kIJ>0qq7Y>OXZOBr41OZnWC&+RQ(dj=TALF#E+OwjD~Q=~ zI6L&Vb$7WZ+I(@5;t(cExP_B#dk7Z;g_-4Wb`J;@?dWe32mFWOw++|G05@@CZySGH zFTvqSv+apWr@mU~{rOia+<%G$Bt_yJNc&4OhYth_(DYKHZWP-Uc)Kag@+-A;SFx;BQJq7#j#KW@rIfy3Dd~m z|8JgvBd8GnLxr%NtpBiK5^eoNj+>!dhg$=PqPoFYI&-pTpc##cDwS9%qezs-p9x~C za-hdFg#Y&(<%~%S(PVA(eA}mTOqe}AgyYy1Ovk|J)k7=fKv7(r)D5@G=Mr!TJEVtb z;pEvGBcQ=t1w%>1*cd_JVvrD*PoJ-`A#Cm1Uz$fwfvI4ed%qK>aG(r(@s*^Um@&g! zRG++wAs8De9%&kR2k{W)rY{V;uo(=D6z>g-5ctqP=E+qJy-Ue88@EGp=siw~-d$0C zu21yjKtnh?tQ4an_P)DSLqBp5hqL3>xE}Io_y!a1TPR~gEok#aMM})s=sU>^zrIf> z8fTA3YEfen_N2S*EpihW08OHKTAOTecBGu7S2!a~g5ZSGV`K1&(F3F1^9*O_ZxZl6 zm?(C5MMCOIWW9f(vKvQPM9s*LFhxukPf8aY&JObd8aC1;#R9P;Riw4#gJeH+lXwqL9L^37 z!)-Ky{DWlW@-kILM#6=i`>C^xQ1wK$g#rm&P&82jaJT}uqXd98d> zmw)n^9Hn4APsr-vDUR}&BjPFP81~?gCI?PX{)Oh@SvmT)7i*g z@y-lFiBSY7HuL~vBcb3FP34rsS)$FCCnPY6wd|(K9e|5lkZSRpbI!`0u$O5B4-|_Y zeY`_v<{-5=al#U^C-9J&(m@K0nxY2diSV;%4=UJytb7x`o{dPu7@teXoo^pyqn_H! zK+EiLKDQ$shDAgg?)A#X>Tq@iN=70$yRp+GM0}RR*^vH z6W#1FR1c0BBjfepDv{u8gXTmBgh+W<`b@S&;2D0mzE*k z$A!dQHdr)!q4WoSGH%#^Kmc?ULu9Z8N5KdZ^}~%|2nP*r9NRo$pEVh9|;5##2N5Ley5NR@CECW>o-cjWUJ zDjJ5rV@OEI@;8;#fIEZlJ%@@%41%a?=p@|>BZ0YCFX0s{EQ@i?Uu?s$7+><<Ok7ImW8ROopn+K4*w zOE;;X@hO~lI6FGU5Ov}#=@L?-81jNYZU{FI)UX%fHa1;?hbS0VA!0_RxNq)7u0T$3 zRTH%nM%63t=>#7d8&VX%0*G5ElgExYf=bZlVtd=>Z;#6j&dxC>1p_!Y;C5f*HUqoC zhPWm(oU7VU7&w3*ME}uq-L9>C0uhB`7(Oc3%6!Y{d$fZmf#4f_#zGt0dnz<-xc}a* zCUGNn`j4wyl{*6pr!f__*EA+%jIY^csT>0tm`JQ}bT4`$Y$(G4(<5-3dDFo%->uCiBft6*DUq0w|j(81@h~@j@rUArd z*qocpaOOm&z0}SRp|pHbPBg_q1w!aNZ$_Dc;}zIv{2Way+W@%yU~S1G5h8l|t4121 zVPDgO{GGMS@Yg}K z%^ScDa-^MT2zIi~o@A|k&fx4q^e}&YpIUh>QpD1RA(UCBO}KGJ`LvL1gR}E}e?=Q; zV|6$?zbX+-hYqSLaX35s3}R-8Uzae)t$7;uH`A1)B!sgIw63MSHZXyrU=-7=50iC< z%?IMF98f6G)UI7vO2j6y2D~yOEwkA;QQza`eKwddB&&1VjWpr2XpG?;$uj)O3^Q}T z9KPxC|(VFz`m-ai8NB>UH{rF#q+LbL{wRpVaQ0M+)KW^4lI4Jd^=I2{6h~ zzZ_{QLXnDNL&f(a3@hzKfL(E1DX;TnHAHw;I_P*-F$}Ay+NiLDl?D4JttTw(09NsO zf~JPxa(<(#t6~RB?ZR^>uiP0DA^ru;OTqh!!*hA#kKq7 z)WhhYw<>D3IU(e~!{&mss?n_iY-1*%#)H@0tXi;!Mt-JH)E1pe=usO^rR%3U zUPn~LtCPXm1-+<_oEE>TM#*@!(ZcYPTpJUU|E9Lb%hxcC;A|+$^K3Y0M-lg;&PKh9 zc;Y=Ov5B$z8)J(&nZktVxTeR&js&&EF0bNqv|q28<`d}~CmS}e^yylTa+GHiYvV+H!e;)3HL2%aDGzkb};P?m+@S_uQ-De4g3D5ks7CDp2pU0W7{ z;Q5WBHpKU{;}ChV%cHwQf1_K(+ZOG_8xtp=oD69aoXrRH_IOG7oNY()4MHv3P?}0? z^-IF0(fI_}gaJ)8HqfwWa%=5Uk$oMS+i9YH?0B)^*CkBvi$WN&0M5?%P+|yU&Xd$? zYn>9d#7n#~kU-Z)O&+w#$XN!e=Cggp%xePxK)tEi!QG9S#MC6?0pkG2Il8gHjo5w9PF%2&@1W0!B zOdRfrq?7g6hc=kCYI()wjgoiWSNZN10m-!Js)cKBf1s6lQYnizbfaRh7Nu_cR4b8h z9~n%e_0KeWhn<74Mw8*&*(c+}naK_uR~F8#<&zRBcEtZCCxesN~hGnFK@G*z4C?zkw@W~ z3)J5n!@&zC{kE!_SMM6{jgMN+<-xT4_S*5!e;3+(Y5!7rl*kkqywm$1X~711^UOcBo|gw ziswY!>snjFh-Al13rrnL!15=|&=S3?n`lQsh0_G=qUqu$oh!?=M29wW#FqxtDapIF z*Am#5Hflxo!0}p#w&5Ld6{htXA!fd`A$k36TBE}L6EAArmplCqx2hx^Y*V47U$4C> zaa?CeYq$)g+;5EPK^eG&$~SBdaoB9l47II$UGulbPZuBv3R!9ZuP8vDQ37Xpd1JC; zAL%ga3dc%AJ-m6a)%K1Uh0fePJGtR)U0dryJV$ctqrsP!YQ2`Uaif;HcJ8abuYW_V zMlo7<*U}@{<=}yz>=cd+eVIB}dOm%=c;XC1r5&^Z*Zj(+w6_9&(Y=g%oWoXuTFmOv0&?v#rh2b)@7lo!_*|tK9?T)*&7Inui9a;LAR(7L~GanMrAvOjFyA2dyDux(B-Ewj8 z;g#aoJrC#-6n*v6IyGRN7IDsfM2p*2KB>RU9vAi~_KD*_gqZ8AZ;H7X_UB(|L1gB=!(?Q8YQ5xi z^r*nTxC*VR-4w<%EE@CVi^4kia!;^a&*AJIHaI&X-($}SK?b?tWiSZ}!vTasY&cP= zuB~`7aPD=d=;a1yhmPUPP?fLt2-D>KZ9-{*S7;;3v;8wk0j*fLO3UOqcx9O)5O$7< zey~kEguPh4!`Tt5sB_4j24`0(!9D(htQs4B?iFb)I>3c^z)yEcL-u|v3;*qyI!<&P zI!Qavte4@SS9ci*!=8Pr6Uh=RhfNZ%zWGk-J@#HfF8p**EUG6CGz#`h)=1B>INI57 ztk%D?(Lt;RE8F#@;F|tiC^MP!h}NOQBAD>tQXRSDPGKWprw#(J^%Gr7-w7BvKI;GJ zXI+kNqcg25k_UcL0nGpFZ?uC;{qBH-^4)$dpZ)%T3>iM-H=i`yM;1A@lqARYdOiqlE<{;G3M*NGA(*H+k7!> zAs!Uls$p`IDRX3{UHYpH{9atFn_}(k6O(a~M0+~UEr$N)sx!C zK}gY4o}$(wm4!p>onOdeH^$)XFjry^jX|J)E>L1vSt$oc_le*gjvY__ z_M4W~W6wyLB!C1KVIe*eOcEl*jRra^(1#I|lM5e}#2p*#mm|_%6q2OrU$eBD8v)@F zkPZ$Ab)qpi7aY(Z^W;;w7p|erEovL)P*!goXhcga8KQ$knoCL~N^B~#h59mhqEgXM zK9lHC12{~;fMXQEatTNz@89lMK7m7k$?y|#+iFj2QLG&O;LlMztyeC(orZ_nK zZ4{bqC`yz09mz)-<7ZjpzUv!t~2sQ#10r< z9>Uqt>zfBk1n+$m!r5(<=o!ih&Ti&;g|jQQ2M&&Qd|9dV2dN=~$DWl+ zykgk34=xdGCHhZzV|a^KrTm`?#4%K^)CTz6z3TvZaJ(v-c15{3?Ch#<4)oPcY8VPe zYI$`NahT+t0FRd(Gfm>wgS!zLOX1^sk5XbZ>K^%4Hk6+(6Z=tSyabjG$3{-6WEhT7 z!%sv&V19qAI8Wb6eF$S{8lHiDIEMGYOb{R9K(bx?OJ0~TRzu*y@P!LemxG&gpa!!R zFRCakO&&fXM0&L9?)&9vwtXtaLj1xM=pbVzQD;NL99RThM2&D*-+U_oC(?3a6r%u@ z=_oOL`nkgO@W~pppmqdvToU$1z6QZNl#*NEu#z^)Ce+~LNDanJ6@VV%B#y1$Al2kJ zZNN_v$}~VWB!aC5cOn4YgwD z=}GtLaz>pv#1T{Eh8&8No4&k3&XJp1MB@Kp-oD@DM4cd-qM}%(OU4Hi9A(h12qEu)g9*r7kEs=v?hqG(eSp~c# zb?W^|E4dHkc*O9$F%UY=*_#K+rH-8@7NMv}`T1Am)A@Vo7um?twNe$lHbGQyv>!;I z=sbE}-yA57p*wv?3xdA;V3{*qMGXi=jQ@}_Jwnj`lBvfRSk1rZNJH>|3_wp*3df6- z2y=r8ExPI*eWBjIu?AsWG3XBPuv zc#b1tv{A3vRh=5lTJ&&5X%k#qC0QOy)3J|KYQYK_6`DsHh#O@%31{Ic407uw5g0#1 z@M~o31Y6u|pV2BwFvlPnG@ott%%L)6D->>Vy_DVe`s?u@b0kUPahxQu!rN8GI!3wS_UOQ+C}9tI?;_la$_&nbEbEAXM%FfFG- zy;!_ac`^6p6uB@5<4-3OA@&*t@QDOf?#}J#GRjJnLRUBfHwfnR4sN5tu#R+wG?QQA z4M7-!y$o=W2#nHn-I^jiS4!ApQ1Wrug7hKMf5F)qqBcGPM!`}T3pZ#dJA$)&RT8;n zh~(>1##*8fQWqqaww2)E8@i!Jb`-DhnCKPlMMsDzgmcK}6(Cav8B~SH5Gb-kA5bBxrF_q!$&%}(TBtPF zI>#J!5Md28ur<{3fhEf8aVR(5E-#$gwF^!#HrFN?G;S?slISpwrt$2`K^eMrq<#$X^_#(_}zut{=2Cn4=raeR z%d^8tTBUXuy>SjvwjA!Pz+mM(i4fYJW$2DISA)5U5PQv8>LYi5vd%v0m1*y?9rsK# zIa&u36)5A60vbE`-i^A1l8x&Oyvy(9O?BD%>mbbyvd-o^jF^2@kkQtM+mwirgS)Df z*j$VApyiTC>#AoUCE@oYi|xY_niOI4EBqk)VyR6*D=}ruv^gFEOmk(hK00|-CHBf* zC2e1KG^Ne34Ki3ulM&r& zyum@=L*0(#>xP_R*nMR-tH~|b3rHC(X!+l)5IWLDlWhpCI%tS?#r8#2znn6W9wrRj zGQ&_P>sqhQfiw@ad&8U)MIDZp-&75Lir?Z6CyLq!R1)HMIgV2m09p)MN)T0!>lFj1 z^55Vp`|DRZAejHJ;qAi4&;UnKt5#JA6c*q2mPGf}y{rZmh$@Vrw_@O9 z@yjE)s;ID+3GNl4b=lcc2jhxeRr7Mg2J{AadEKS@5pl0N2$)~)2fc8-VYNMmc)e>*Opj=T^l3$#?MCO zb@!McyvxDaI7(XxZ6~z}&BV`o;dpoIAqA|6HCWuJQ6@YdbynO6^|J zCF7SzdKi?C39(*MgPALq7@Xbp7ZRO}u~_`>?58&7qzBV<{>cS_$eMOeOC(MI&8flM zRm-otqR~57mAsQ#{!T_&n$nb}G^Obbsln>Ck6rYKKm7CG{QbZF{r~sRfBO$iHB zl%_KzA=39~*f>~k9z94-Q<~D0rZoK}3ecD;?Hx{K>Gk!U5-CU0l%_PL=>ky<&dz;m z%6oc|&vHmT?x#x6034yLI(pdIk@ zrrx4f$eUNEx2P?O^D5X6ry|uj==)Vy8PzBmuQs)0bi^--|5j^H>|SNnl{~uSRQIii z6t&a48SjyLQN3`~op`7Gpf9QLj>nJ3xffmN)y50N_vs_!i<6b}xZeYl^fT zbXK#YIk_evpBY_fSY?S2iA|ieY9lH#kW8;O*VZd?ZAoZ5jSa;u-@bcX-s}X<$mH4Tsn5H1 zCRV%^Y`B1CriVV)~mOHeT_tiJGT4~b#T3oo|Nm;d~d0(TYVjr07y7bqP zhgOJVB@SoTT-U-?ZryD_vga_>!>xM`4JL}G_VGedwyoSp;+K}nh#Y|Gi5GO-m&q2| zdabs%NL3I$iv8(lT2PBlA`uun_Fnbqt@pHaaQ-qawOI71_&~T&^8+~e>YM%A5 zg`XQV6E538?cV-C#jt(!ZR_^rBde8a%y~p>tY<8c6VUqRkHl*E(+g_XDb!%r(nl(C z3X=Q2uYA-NcMqPRp3pb63SO{{ofd#i4H&1@uUJ~Y(Q*eU4eAI}*gn}QLZ@-TFWUlk zEO5v~LHOW02Tf3!b#DZb3YM*XPRo`Dj+c|gkD#yPrfdJ%O6)GM^4dtKIHwmEwumTh%D*?E?_9L#H7z?Ep~kTd97rp zJ8*32S}lc!8!+vbA+jZy!x5qdJ`@JhcvuRf_$45*J-JS`{q~z+sBm8BS?wmFa`bJr zmTt{6GH(Hzgm8AmLShnKXx>SnP&>Z};Ov@q6s+G%8>&dYblIU;+|*{qQ!~?-*Vw{{&LHg<8XGJ`)Oq=Z6lHF)K@{Mb%l<= znO}aD>J+z^-q1%p7p|6U9dW#}NqL{c*?qBFa4l_a3D(%9-t?@g+}7BkmuNqpC@*|g zlM%w%;apGyV&Rg<)P7tQ{d(F0r^DGTStG~6eqH;8GFvr>X2OlfECxHA-JWkWUV&*x zf0LH}XTE|xO(L%(dFf(^Y7v|rJI6yfyY{yVyO!Lr#~s2VIt`rNB7?KTlGkrgm+xPg zoV`#k@?Wx~fe46ffba&3@a(87f&adR$v@@_T3D@mP*5YSy30p!${C*8!3#xL&}(lg z%f{WKmW<)P{9279yS#sq@)Ej6zIp7p0Dy?5jE!)7c!p!gG-}!PrIefyweNc^c>hCV zLofSDKw|BBDj?w>;0Z&kXI@s8(CTLKoB;%$ddC+EX?UKFeIyjLecKKNJVb`ig9$^_L;?ILnO>!=7gaMGNZrYr@xJZ{1 zxG2nsm0>S|3&)B?xp0CZjNlNl6B4&oPwPU|n$#FBqufMA$}_;nG2!SDFv{BWygZdV zDV15SG|}Mf$V0I=#*$=|=vk>fvS?&r`!g4aMX>RrLWO$N)Sn083rOYAHo@7g(@2wz zoEjF9f7Nafb~rm+4};A+?vl7sYmcA~XGa&%Y!v$a5Y7%U;nwjrNZ;Y?Xb-9DbZeVG zo30CrUSFVuM9NEw<cRGPIB!KQ6g@PXJcS zNR${xRDjiJCKtk9lo=0;(;$Xnyq)?*AgdI47c_$6I@~b^k)(^HRX~MmtWEdN^hZqK?`9eq(e5o!jt^G?Hf17s1)}5mFzK zKZ3Jk2lFFt6OECGKch^&>Df`4J-NrrlL*6VhZ*F)0i4}x@f`myIJ?~eoZaxd6($K? zI4nXYK38ydhm!X{Ed8!K2dbpFxkfx}JHJr8L`h)aK||7mQEV`F_Tm8Q9Db4<5zbq5 zkzZ5EL$Y(CEc%ID7Ov8_HwX{#6Jb>*^%P>3IRZ*jr(UGA(vS%4MX4A<5}wg#x=&X7 z>`TcB)5RH77h>!mz}X#^?W}lG2?rV0&j;m#N$v5xY@}M0saLN=h}MoOecNy)eTW{G zj+qv`y&(I68#n|Fn3l;%|2adZjgnkktOt~6FB=&pWBFvVlJaaY0g0gGT*ZKO?jwOS zA#cT56Rof59N_IDufAjCzH!QLzGtwc-)lgCjMyPCYn^w;p~KQaY~}NgY0=Le;L$t8z|pO{6X!=YEfuh375lVZ!2w}suo=( zD$0<o4|RVRB^-NgsG3TX2tsJ&;B5{5ZXq`THPT1pG0q9NB!y+~EMvY_GZ`N6`gz%FP zK4hYD8HRf>w#QI=pKhO)gYyjDaTfT~8HR>eZn%hr_GvTxELSz{sFDof(N#B8#ywO{ zRpX}z0GH@w?@@BBl*cJhfT}PDYypuu$M8D?#wjepLjn@FyY^=3HZ7ziysF&?+2>9$ zHqYLG({ijEE5_=J4c?oK${XzLf`PEB&nWo{O}x25tiwy-H{bw@jesJ>#tGyY7CXA( zCP2i60~Ge>1EZ#hMWp1thU-};R!;zfy`-G*_P&LB`Ic{ZZ*cYc+v--q&WgfmOpROV ztDGb|(-$bYAcrSzka&}O`rB1k-yEBT<1-TUs@*=Vmu*uSvTX)Qmc1O$u{k1z_5np* zVv`cG3?eLHQ<@44Hq9TIQusJ zN(D_dmb#?!4WH0=d}a?Ca@#PaQH&25FMENK7=l@9<+Vu8QgPB}dKg$@mZ2tQ+fE~! z^&x0G+t0HJZQiOZ1F0)@C^pj>@1s+R)lgzD(6S6=(f0*scb&>R9|{bL(1ns^UrZ{s zPZm1-UBt1n5Q>l^y6-i?j2~}db_(+01*b$f`xOcxD9y#I%k6@hF#gwn^%>4k8(j*; z_I*uRq6x?qyUdY_9q%z3Z)L~6qFSFQgtIGX zcf8zix&$28M%Z!uvhNsQj@{(IQ@-P{RHY%3TeV-qq>4^ep;T2zyNYTHz^p<5x2Wa- zLM?{j76-p_oU5oM39G^H>%~%lr!D|_QzKSHU5kFJIvc^+c{jt$0~V#QqSmQKQ-g!y zeid&G&MvRbiGsE#8n@CZ$7eflJohFAd?UxNc#~aT~zX9fOS!U8YP2MVfko3 z(pza@tPN4~qO&Ejvr)t9RF3CPfdXFuvH2t@y1`n=U(f*2tuU%gFTEo)U zt}aPan$nb}G@T&{&hFwr{PExa_8iH7kOXIU;SuT6 zl%_PL>93FiG^P^;ZIA0Au00a2N%jD^#@~|E<0n0mrW&j})mdjWaPj&Y6*PhGSdPv^LsHvxFbG(fIt#K-~@JaukYX7f; zQsC@PKT)8}KHBFysizV)2SNx*Cp(o|+kbgd$HVSNztzshjypwX6XEolc*)dT)CxtF z*WE2@i{cz}7DW`n%Ef=9t7;amu9MN4i+GvnlvnOo=}26N)yv20^uO@}5^=2N`bj}M zt*NEfL03XQ<&78jY(kjtM896(s8wx?cL>y)sWnBtqwkS#Rc=Gj-Q z#YvlbSzvf{!MwtD>Yc7Kq&_d1Z-9qhGE(3?n}l0tB~_=v(|N}!pC3*!_M7^`V()dX zp|0s0=xrrCpLtqpe#hbLqFInG>s$lGi|$)b$gR(<%-bm*wo;FLR%WTOvCzKrUS?Q1 z>|EQeN^Qhpn;DvKe5hfAK1(#3-Rv?dHLSd7pB)FWtZP`WS|wYFba|uX%!eyK-l3(L zt-DvvLQhz)UfHA-Y_OH?J-9@R`L=(iB?luW3wQ}_XxdR+yW>vHz~8-B2ix}yrVaDk zsJYf`K$-S8(?0s_o|@l$2U|4sMxR6L+FxRy=XQ=48^WMZ^ValQ`?Pdpn{w|~;YeI1 zh9Q<&m)}qSU4*?YUM-$Xc|fZ>UVlr=tM8o`eA%2%t$0Gy(H~x=l^$C^5fqq^*?MRp zpk^B1q_yymtPwcCJ##g8{i$`Tr*`4&oV^JB<&9dOH+fDlbs1ZN&v(z(8rdt#wBYC2 zm$j(ovFF6|Oq*(cRTC`$+q^{rZDe0*Pp!We$^Brbz5=cI@MEc8yPj(EN1tk~*TC^w z5d7BrS}#XCh5GS^*1E`UZM`NXw{F)u<9=gQ16oa0s5&7Z6&gNS^|a`!OSXKh!dy~h zaCWy1m(Fi`S7#B#j$L8`(#f#}AcH3eb?xoQOV)^E?sqbp>sp$MSSto=UD?Mw zwF;RXtthJpDjJa+CQJ1+g8|7@>rs-(m7mTEowo_)dM z3N-lm39$)9d3lrcrq3uXOkTf13q6nirlrSd_7g8?Mf@#8q=GPd`QutNHhsRZ8x}t* zIZb;|@DMW=XhAM2ep7FW(7_tGkW22Ir8TyXKQE@g`JUF*4VoZXu6b5kyYw+tGH;oZ zkqamTv96Vr?C>vwKH2xZR{K4@KDlVMI634_t&G0q4lN2sfjBa5x|RcP+aWD%+e5CF z2=v0M;{22Av`&LEFTSoW*M$Scm~S2=Zw?y;XJ<*S;Ov?S{eUiDGc;qz=R(kc=L|vc zwz!GMo(R+ll@wa;rw^d!UOoB5FF*Q3d=_gQk?TJTG##3jXAsR$DuctmQ6uY}bro)n1M zu)D=BHewigK)$VAM1S^vtAi6}NQj3HCs#i$JOOz4&9~B`A8jAC=cbMZS09*jW@JP7 z%-rNfMU`+3C)lZ9n1dL0!}G5sUw>OtN9`_8Xk|A&7YNgIIR%W0xKS}g=%>H^CN2}N z$eYH`(AsUnGUoT}ODcvs;yr&pBzO@N2wUX{DvMfg->Go)(i>v^_Xh;4vBSW}P)c%J zxcTG@0eS^d5w{{(hkFDxKrwXm$gdJVO+uk}eJK~ve_XJJETy;SiIl!ohqJ@=W5)EF zFmPjU<&v$s3yWc~p>-r|sCeK$)Q^zQ6WwtI5{lt5sGgWYQ`viT` zv9BTxdB7iY1+aiM4j8A!>3D>lUuYbF_L3ZtMWW}}fA3L}1t~($p~?@w3*qdhoC417 zwKtWezV=oCXGh@2?EfWG?uPCY$Wd1W>JAh~K!HExCI^gH0x@l#{0`zfd_X*FLNGv4;o;}I)krN)e>i}%Bj1F*@QrZN)er*Nh&M2qxB~Oh9})ukh;)SC zcB3GWsezaWGjSmB_NG4K26|31PH6ddztSnr-oHrAz%S#JGwL1W(rKu{tktV3{(J?Y zqw>fRje|%h(E~bwH@v2+j0cBx?3i>EOU9mW>Qm`ByXea1EdpO*pU6*{ULypc0E0+R zh_{SZP)b~?!;Hc~{%(9%XHj}|ZvPKLVfkv05JPZ|?{1aHxowzW>wZ3{`hCqf^$@{u zwa6It#jX6IvD$-Lqxx(V!yV)0@lc46A!qr8!?G(iJI}f{IdO*kK6xniMuz_K1_cs- ze4J^Eg6Aw2>KY#QqC)WpHS%Xn%y0h}GJA^=D zotz7PnbCv8+5M?N^y8vJ9 zKmcdw(1j=}DHLh7!`Y!BU+$5ibr~Sr96K!lT!$^h3;}u_ku#;&STQ3@j2h1XlN~4v zZNd4H`XHtu6O*5Rom{j^Hyt!l5KR+jCI2m3k2^4mzcL59XkkT3nE;jPB>4pc%&VK| zVbf&^g$_~=QuGmb%iqB@Y#2L-FeLO0zgA?pZI}(5LIsfosVHj1C<)!gnLhinJSJww zL70g4FI%gpS8SyH@ET*laVHJwi;V$0Nhllsy1+0j$Ox#J3-!H(O_DC-GQ@xvhS6k0 z+z2l}?p}FbT+9U@A0-UDN-pm^<&_MM&_Xt>h(vqLG(}oeEopFebpNK_0Yv|$CCXLl zDISdxG(%2&1PV=BjS@3NVyqp(E7S^=*+c!_Bjx3Bg4;h+?m+V#&JKygd0Z9w7byvX zBT`}*BxU4u4rhnB+uxczcu*cHv+m*S<}VlD$j9;N_brss!b9><;wu|1pSM(eW+R}| zJa|PyK-;|Jy$>qErvRqw2;ctM4|MoMrJj%w24IEiTp&ftX(cUX@;MX8Fj&%CVX9&BV`%b%zhU^fxbee_KTzk`!E z^j6wL7e-H2_tA|R^JQy!f}iG~4utZ*JNM zh+GGA@P|JH5_kgV$&Jt=95 zoAtnmK{uWS1tQ;Z7&od#grn{5IBR4{vW77H6{tyDnXuQ96@%35_B{hku<_G1=Ee3f#V-BC4b+sBxlKg?$Hyfw77xoW z`{*3UQA9dLUs=z*qHF$#fNt#TG!N85d7mY{J9nOxC zFFYr48)V|B^~VcwO4v&z?g%F*&Qv2gGWK5W<04T2_=(44*r<>{S>sSVLat4LK*3-> zv4I4?d1t*V^D$;o_(e0ifNP*0N=}#|@{W{rP%@5;(Cxg|Qck$k(@^rb3yq=6RE6qN zTfT7&hmzMuF$tEkgISRQ;FbE0RtqUffx4JYaW15}2W`}Tew!OoXRGdNB&O{z=!)&F zCMw~Nxt;T~7YSREL=^+au2B+yIp$`lITCH8PB4m^$paXz;~cPhya9@hgXZki2kawJ zZ6%1_qv{+Kv9_tftd+|uuFRx+mFNUnC%W>9y(=WD%z9YeMyty0*^|!#5eS>TA1}0* z>CR2>uyTIKuXErpdspi-Lb42EF2`Q>xtZk{2%f)2_iM9TYV?g@$S6^=+;IMcpLI;I zJeyGBmlxQB&H{s9%dt1_Ik8VIUT~rr`VeCX&F3R`$S30D+i#X3vqgMJI8Ynq? zQdb6VB>Rq_m~9g|GHecpA7tO3=SIqz6~WoH2(C)F_F5L^1NKszUX~q0oGUSuwm_>* z5MHfbF`4RSh46QAj`?JggnfH1%LM8Ta|223+J&V=G|@Fg_H!4Xu&GN?gPmQa#*_co z-qrpzb%pV&Tl}J%?hn}aEoNJE(S@q^h160r=ZMo`44bFwLj zL1IFuLQ7!<84{3|LMLO$OJ8o^=?eo)G{$JuRl483r@fR~;X)J&KEM3ZJolXQ+;i_a z&;8x!T-pnp1s0!tNDEKfSgm*&rV9^8n|!Ts0H16Lrfds06MGNuA<`*x7dwh6Oc16;PJDbcB4;g@@C}5P zY#d;-66PK*j5@~`L~(@K;ju!|jy`5g4Id$22iI@mtI}t8YcDq7f3hyZUYFC*2`^sjW;sHEeMVxyIud|!m z2q6*^hO%;1)wcIPxVAd^+PV$b)_z7L5{X2Kl&R}#SHJc4s%5Xg^V%D$maiZZiA17A z%6`4_`;Q-e8cNFuZTew+X+|UxiNvYM{}ulG_tu4yHjO0=nJ zkw}~`l$Dj0wYId_IgT@1O#S^vgQ26nefDWIbeQ`GY!<84Z03kWB5^*D7trh1uR9!$ z{{DWwUhj6hywuV4>sUc*bt*y{agTXL3 zILQCoifoMAPH2`JA>vhYckrnj8Wlf^h+DZ*LzO8X6lLd-CMT z*zAJ!h&;5jvy%igaR9A^XxceWYwWGm_0)Fuq7X`IruiWd1WXXnKp=ojkcnC_7{n(w zp>DA88JjUaKd_FF|B`?v4xp0IN~OMMZSkK=57f$js#%<;dH3hWves^i8fu9kwqjDu z%*)C@JU36*Yi1qI%!{xf5nn)K6>cJ!!ZL#itGF3$u)K1jYZ$CSG(sexi3GEddsejl zvs6(lldENNm27{tEKeiLRxi$}`K77L>#&(7ohFXsTmtNNyYvZVUQVZTx?zCE9*+lo z#a2uT^o5S5_1GO9F|XJP!b^!b0t%o)sZ=74VfXa(T)up{qoacfUz7}n5w~y#AOTGr zKvDY4mN$zUka#Z1t@-eruCUGe>VeuN3XLqMW@W)2#$J=d#!WI$$Oq4yIdkO55k!te z4TX^P_4S=TefsFpqk6qwdL*DP1n}9jXPcXwp>EQ>;BxHPF`Z5)u`jg2MWNMd;nmjG zCee$qfDuPPkvXc>YL!Zrm6dhp&Yirxyz1&|$S6w{A3b_>@7_IJ5@TM}WMo{rbm_*88)$Io(4mVLFCy1K z5T87Gvb3}mw`dqeMMW1bTre8>e`63Wpv=alm71EGl9G~?l!Ob61T>*AV7837?edz= zMOi9joe<4M3QcvNcje)F*eF5yE~S3dZ6A2XqfpEs^aZ!cf`S5QjTBL{MoHnGJ$o7& z8YJeD5H*BNVPPR;7k7P$eTms_c6K(xTZ$JNpjl&MQ@8-U0$HAGx=8t0?L={S7oXU z!;=aqbPW-L7{Cox;)F6$gMoO%+8@C)Wd_Pb4GSi$lMtf$`T5ej!{Q0PSY0U;3M_-9 t^aV|CX=y>6WBrb+z~k{q?2E8a@jpfh^v&joRv7>Q002ovPDHLkV1ljU$65dY literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information/view.json b/com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information/view.json new file mode 100644 index 0000000..d2127d3 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Controller-Equipment/Information/view.json @@ -0,0 +1,4965 @@ +{ + "custom": {}, + "params": { + "tagProps": [ + "", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "params.tagProps": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 447, + "width": 917 + } + }, + "root": { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Spacer1" + }, + "position": { + "basis": "20px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "NameField" + }, + "position": { + "basis": "50px" + }, + "props": { + "text": "NAME" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Spacer" + }, + "position": { + "basis": "100px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "DeviceName" + }, + "position": { + "basis": "205px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-12pt" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "Name" + }, + "position": { + "basis": "35px" + }, + "props": { + "style": { + "classes": "PopUp-Styles/InfoLabel" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Spacer1" + }, + "position": { + "basis": "20px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "NameField" + }, + "position": { + "basis": "50px" + }, + "props": { + "text": "STATUS" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Spacer" + }, + "position": { + "basis": "100px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Priority" + }, + "position": { + "basis": "205px" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "expression": "{/root.custom.state}" + }, + "transforms": [ + { + "fallback": "State-Styles/State0", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "State-Styles/Background-Fill/State1" + }, + { + "input": 2, + "output": "State-Styles/Background-Fill/State2" + }, + { + "input": 3, + "output": "State-Styles/Background-Fill/State3" + }, + { + "input": 4, + "output": "State-Styles/Background-Fill/State4" + }, + { + "input": 5, + "output": "State-Styles/Background-Fill/State5" + }, + { + "input": 6, + "output": "State-Styles/Background-Fill/State6" + }, + { + "input": 0, + "output": "State-Styles/State0" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "props.text": { + "binding": { + "config": { + "expression": "{/root.custom.state}" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Aborted" + }, + { + "input": 2, + "output": "Stopped" + }, + { + "input": 3, + "output": "Process alarm" + }, + { + "input": 4, + "output": "Warning" + }, + { + "input": 5, + "output": "Running" + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "style": { + "textAlign": "left" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "Priority" + }, + "position": { + "basis": "35px" + }, + "props": { + "style": { + "classes": "PopUp-Styles/InfoLabel" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "NameField" + }, + "position": { + "basis": "82px" + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "Priority_0" + }, + "position": { + "basis": "35px" + }, + "props": { + "style": { + "classes": "PopUp-Styles/InfoLabel" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "100px", + "grow": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "Info_tab" + }, + "position": { + "tabIndex": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "custom": { + "delay": 2000 + }, + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\tnavigation.alarm_navigation.navigate_to_alarm(self, event)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "AlarmTable" + }, + "position": { + "basis": "623px", + "grow": 1 + }, + "propConfig": { + "custom.run_update": { + "binding": { + "config": { + "path": "view.params.tagProps[9]" + }, + "type": "property" + } + }, + "custom.update": { + "binding": { + "config": { + "expression": "now({this.custom.delay})" + }, + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": "\timport time\n\tfrom datetime import datetime\n\tstartTime \u003d datetime.now()\n\t\n\tdef convert(duration):\n\t\tsecs \u003d duration/1000\n\t\treturn time.strftime(\"%H:%M:%S\", time.gmtime(secs))\n\t\n\tdef empty_table():\n\t\treturn [[]]\n\n\talarms_data \u003d []\n\talarms_critical \u003d []\n\talarms_high \u003d []\n\talarms_medium \u003d []\n\talarms_low \u003d []\n\talarms_diagnostic \u003d []\n\talarm_temp_dict \u003d {}\n\tstyle_props_critical \u003d {\"classes\":\"Alarms-Styles/Critical\"}\n\tstyle_props_high \u003d {\"classes\":\"Alarms-Styles/High\"}\n\tstyle_props_medium \u003d {\"classes\":\"Alarms-Styles/Medium\"}\n\tstyle_props_low \u003d {\"classes\":\"Alarms-Styles/Low\"}\n\tstyle_props_diagnostic \u003d {\"classes\":\"Alarms-Styles/Diagnostic\"}\n\n\tif self.custom.run_update:\n\t\tif system.tag.exists(\"System/ActiveAlarms\"):\n\t\t\t\t\n\t\t\talarm_data \u003d system.tag.readBlocking([\"System/ActiveAlarms\"])\n\t\t\talarm_data \u003d alarm_data[0].value\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(alarm_data)\n\t\t\tdevice_name \u003d self.view.params.tagProps[0]\n\t\n\t\t\tif len(decode_alarm_data) \u003e 0:\n\t\n\t\t\t\tfor i in decode_alarm_data:\n\t\t\t\t\tif str(decode_alarm_data[i][\"DisplayPath\"]).startswith(device_name):\n\t\t\t\t\t\tif decode_alarm_data[i].get(\"Priority\") \u003d\u003d 4:\n\t\t\t\t\t\t\tstyle_class \u003d style_props_critical\n\t\t\t\t\t\t\tseverity \u003d \"4. Critical\"\n\t\t\t\t\t\t\tkey \u003d \"Critical\"\n\t\t\t\t\t\t\t\n\t\t\t\t\t\telif decode_alarm_data[i].get(\"Priority\") \u003d\u003d 3:\n\t\t\t\t\t\t\tstyle_class \u003d style_props_high\n\t\t\t\t\t\t\tseverity \u003d \"3. High\"\n\t\t\t\t\t\t\tkey \u003d \"High\"\n\t\t\t\t\t\t\t\n\t\t\t\t\t\telif decode_alarm_data[i].get(\"Priority\") \u003d\u003d 2:\n\t\t\t\t\t\t\tstyle_class \u003d style_props_medium\n\t\t\t\t\t\t\tseverity \u003d \"2. Medium\"\n\t\t\t\t\t\t\tkey \u003d \"Medium\"\n\t\t\t\t\t\t\t\n\t\t\t\t\t\telif decode_alarm_data[i].get(\"Priority\") \u003d\u003d 1:\n\t\t\t\t\t\t\tstyle_class \u003d style_props_low\n\t\t\t\t\t\t\tseverity \u003d \"1. Low\"\n\t\t\t\t\t\t\tkey \u003d \"Low\"\n\t\t\t\t\t\t\t\n\t\t\t\t\t\telif decode_alarm_data[i].get(\"Priority\") \u003d\u003d 0:\n\t\t\t\t\t\t\tstyle_class \u003d style_props_diagnostic\n\t\t\t\t\t\t\tseverity \u003d \"0. Warning\"\n\t\t\t\t\t\t\tkey \u003d \"Diagnostic\"\n\t\t\t\t\t\t\t\n\t\t\t\t\t\tduration \u003d decode_alarm_data[i].get(\"Duration\")\n\t\t\t\t\t\tconverted_time \u003d convert(duration)\n\t\t\t\t\t\tdisplay_path \u003d decode_alarm_data[i].get(\"DisplayPath\")\n\t\t\t\t\t\ttime_stamp \u003d decode_alarm_data[i].get(\"TimeStamp\")\n\t\t\t\t\t\tudt_path \u003d decode_alarm_data[i].get(\"UDT_tag\")\n\t\t\t\t\t\tvendor_id \u003d decode_alarm_data[i].get(\"AddInfo\")\n\t\t\t\t\t\tname \u003d decode_alarm_data[i].get(\"Name\")\n\t\t\t\t\t\talarm_id \u003d i\n\t\t\t\t\t\t\n\t\t\t\t\t\trow\u003d row_builder.build_row(DisplayPath \u003d display_path, Duration \u003d converted_time,\n\t\t\t\t\t\tSeverity \u003d severity, Timestamp \u003d time_stamp, VendorId \u003d vendor_id,\n\t\t\t\t\t\tName \u003d name, AlarmId \u003d alarm_id, StyleClass \u003d style_class)\n\t\t\t\t\t\t\n\t\t\t\t\t\tif alarm_temp_dict.get(udt_path,\"None\") \u003d\u003d \"None\":\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\talarm_temp_dict[udt_path]\u003d {}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif alarm_temp_dict.get(udt_path,{}).get(key,\"None\") \u003d\u003d \"None\":\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\talarm_temp_dict[udt_path][key]\u003d[]\n\t\t\t\t\t\t\n\t#\t\t\t\t\t\tsystem.perspective.print(alarm_temp_dict)\n\t\t\t\t\t\talarm_temp_dict[udt_path][key].append(row)\n\t\t\t\t\t\t\n\t\t\t\t\n\t\t\t\tfor i in alarm_temp_dict:\n\t#\t\t\t\t\tsystem.perspective.print(alarm_temp_dict[i].get(\"Critical\",\"None\"))\t\t\t\t\n\t\t\t\t\tif alarm_temp_dict[i].get(\"Critical\",\"None\") !\u003d \"None\":\n\t\t\t\t\t\talarms_critical +\u003d alarm_temp_dict[i].get(\"Critical\")\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\telif alarm_temp_dict[i].get(\"High\",\"None\") !\u003d \"None\":\n\t\t\t\t\t\talarms_high +\u003d alarm_temp_dict[i].get(\"High\")\n\t\t\t\t\t\n\t\t\t\t\telif alarm_temp_dict[i].get(\"Medium\",\"None\") !\u003d \"None\":\n\t\t\t\t\t\talarms_medium +\u003d alarm_temp_dict[i].get(\"Medium\")\n\t\t\t\t\t\n\t\t\t\t\telif alarm_temp_dict[i].get(\"Low\",\"None\") !\u003d \"None\":\n\t\t\t\t\t\talarms_low +\u003d alarm_temp_dict[i].get(\"Low\")\n\t\t\t\t\t\n\t\t\t\t\telif alarm_temp_dict[i].get(\"Diagnostic\",\"None\") !\u003d \"None\":\n\t\t\t\t\t\talarms_diagnostic +\u003d alarm_temp_dict[i].get(\"Diagnostic\")\n\t\t\t\t\t\t\n\t\t\t\talarms_data \u003d alarms_critical + alarms_high + alarms_medium + alarms_low + alarms_diagnostic\n\t#\t\t\t\tsystem.perspective.print(alarms_data)\n\t\t\t\tself.props.data \u003d alarms_data\n\t\t\t\t\t\n\t\t\t\t\n\t\telse:\n\t\t\tself.props.data \u003d empty_table()" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Name", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 100 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Duration", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 50 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Severity", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 50 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Timestamp", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "VendorId", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "AlarmId", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": false, + "width": "" + } + ], + "data": [ + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "9ffc0e5d-8cf1-4a0d-9521-594bd55387cd" + }, + "DisplayPath": { + "value": "PLC01_1510_11_49/OPC/inAlarms0/5_Chute not active" + }, + "Duration": { + "value": "00:06:59" + }, + "Name": { + "value": "5_Chute not active" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 11:54:32" + }, + "VendorId": { + "value": "\u003d01+1510.11.49" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "29a021f5-cd24-4cc3-bc8b-50ba99e5fb0a" + }, + "DisplayPath": { + "value": "PLC60_1220_44_01/OPC/inAlarms0/0_Photo eye blocked" + }, + "Duration": { + "value": "02:17:50" + }, + "Name": { + "value": "0_Photo eye blocked" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 09:43:40" + }, + "VendorId": { + "value": "\u003d60+1220.44.01-B206.0" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "f0b4bb7e-8a90-4a37-b2b1-1b40a8b22da9" + }, + "DisplayPath": { + "value": "PLC09_1010_51_02/OPC/inAlarms0/0_Photo eye blocked" + }, + "Duration": { + "value": "01:19:36" + }, + "Name": { + "value": "0_Photo eye blocked" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 10:41:55" + }, + "VendorId": { + "value": "\u003d09+1010.51.02-B811.6" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "31041a1d-0e60-49df-8343-4dc8fd71addc" + }, + "DisplayPath": { + "value": "PLC08_2050_15_09/OPC/inAlarms0/8_Slack chain detection" + }, + "Duration": { + "value": "12:06:12" + }, + "Name": { + "value": "8_Slack chain detection" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-11 23:55:18" + }, + "VendorId": { + "value": "\u003d08+2050.15.09" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "0af8e42f-3b41-4dd0-a5c9-31457343d138" + }, + "DisplayPath": { + "value": "PLC40_1300_01_01/OPC/inAlarms0/0_Error rate at update too high" + }, + "Duration": { + "value": "03:51:00" + }, + "Name": { + "value": "0_Error rate at update too high" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 08:10:30" + }, + "VendorId": { + "value": "\u003d40+1300.01.01-B602.2" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "279c06bb-fa62-452f-8cb6-7821e26db4b9" + }, + "DisplayPath": { + "value": "PLC02_1510_11_01/OPC/inAlarms0/5_Chute not active" + }, + "Duration": { + "value": "02:29:59" + }, + "Name": { + "value": "5_Chute not active" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-10 09:31:32" + }, + "VendorId": { + "value": "\u003d02+1510.11.01" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "e7fa9539-2805-4f6f-8906-3aa3ccbb5baa" + }, + "DisplayPath": { + "value": "PLC51_1211_91_02/OPC/inAlarms0/1_Local motor starter error" + }, + "Duration": { + "value": "00:05:26" + }, + "Name": { + "value": "1_Local motor starter error" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 11:56:04" + }, + "VendorId": { + "value": "\u003d51+1211.91.02-M1" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "cd60a658-cc9e-4c6c-a344-02f64cac30d3" + }, + "DisplayPath": { + "value": "PLC70/OPC/inAlarms0/23_Power supply contactor error" + }, + "Duration": { + "value": "02:29:59" + }, + "Name": { + "value": "23_Power supply contactor error" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-10 09:31:31" + }, + "VendorId": { + "value": "\u003d70+S01-KM003" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "e48406f1-f292-4e31-9eb6-16a04441b3aa" + }, + "DisplayPath": { + "value": "PLC71/OPC/inAlarms0/0_Profinet node fault" + }, + "Duration": { + "value": "02:29:59" + }, + "Name": { + "value": "0_Profinet node fault" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-10 09:31:32" + }, + "VendorId": { + "value": "\u003d71+PN212-A001" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "7187a1cd-c430-4dd4-bf8b-44edb5fe2206" + }, + "DisplayPath": { + "value": "PLC71/OPC/inAlarms0/2_ASI-Gateway error" + }, + "Duration": { + "value": "02:29:59" + }, + "Name": { + "value": "2_ASI-Gateway error" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-10 09:31:32" + }, + "VendorId": { + "value": "\u003d71+S01-A001" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "3f4afc70-4fd2-41b6-89e8-394644027469" + }, + "DisplayPath": { + "value": "PLC71/OPC/inAlarms0/4_ASI-Gateway error" + }, + "Duration": { + "value": "02:29:59" + }, + "Name": { + "value": "4_ASI-Gateway error" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-10 09:31:32" + }, + "VendorId": { + "value": "\u003d71+S01-A002" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "015c963c-eb92-4d86-b322-ef5ffaecd98d" + }, + "DisplayPath": { + "value": "PLC09_1010_23_33/OPC/inAlarms0/0_Photo eye blocked" + }, + "Duration": { + "value": "00:17:41" + }, + "Name": { + "value": "0_Photo eye blocked" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 11:43:49" + }, + "VendorId": { + "value": "\u003d09+1010.23.33-B222.0" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "e647c74c-a952-45bb-b18b-8e6c32fee8ef" + }, + "DisplayPath": { + "value": "PLC60_1220_44_05/OPC/inAlarms0/0_Photo eye blocked" + }, + "Duration": { + "value": "04:24:23" + }, + "Name": { + "value": "0_Photo eye blocked" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 07:37:08" + }, + "VendorId": { + "value": "\u003d60+1220.44.05-B206.4" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "0bc4bfed-efed-4310-ba28-e43fcf8df3e4" + }, + "DisplayPath": { + "value": "ARSAW1408/OPC/inAlarms2/6_Photo eye blocked" + }, + "Duration": { + "value": "00:04:06" + }, + "Name": { + "value": "6_Photo eye blocked" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 11:57:24" + }, + "VendorId": { + "value": "\u003dARSAW1408+05.22-B109.6" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "c62ab15f-7552-4ee8-bb3a-75ec1fb471ef" + }, + "DisplayPath": { + "value": "PLC1000_1100_06_91/OPC/inAlarms0/2_No-Read rate at reading system too high" + }, + "Duration": { + "value": "00:10:44" + }, + "Name": { + "value": "2_No-Read rate at reading system too high" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 11:50:46" + }, + "VendorId": { + "value": "\u003dP1000+1100.06.91.E01-U1" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "030d8d08-02a9-4dfa-a4a4-80d4300e9a1e" + }, + "DisplayPath": { + "value": "ARSAW1404/OPC/inAlarms2/2_Photo eye blocked" + }, + "Duration": { + "value": "00:06:24" + }, + "Name": { + "value": "2_Photo eye blocked" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 11:55:07" + }, + "VendorId": { + "value": "\u003dARSAW1404+05.13-B111.1" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "3a194b9f-8fdf-4b1e-b728-33174d7b3f04" + }, + "DisplayPath": { + "value": "ARSAW1404/OPC/inAlarms2/3_Photo eye blocked" + }, + "Duration": { + "value": "00:05:56" + }, + "Name": { + "value": "3_Photo eye blocked" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 11:55:34" + }, + "VendorId": { + "value": "\u003dARSAW1404+05.14-B111.2" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "47014921-2fe8-4c02-8658-27bf3d2bc0d3" + }, + "DisplayPath": { + "value": "PLC02_1510_11_14/OPC/inAlarms0/5_Chute not active" + }, + "Duration": { + "value": "00:11:34" + }, + "Name": { + "value": "5_Chute not active" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 11:49:56" + }, + "VendorId": { + "value": "\u003d02+1510.11.14" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "d53caa27-7164-446b-8673-3ce152946046" + }, + "DisplayPath": { + "value": "PLC1000_1100_06_01/OPC/inAlarms0/0_Error rate at update too high" + }, + "Duration": { + "value": "00:01:46" + }, + "Name": { + "value": "0_Error rate at update too high" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 11:59:44" + }, + "VendorId": { + "value": "\u003dP1000+1100.06.01-B202.2" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "29c088ad-f890-4e99-8452-45792542255d" + }, + "DisplayPath": { + "value": "PLC01_1510_11_32/OPC/inAlarms0/5_Chute not active" + }, + "Duration": { + "value": "00:13:37" + }, + "Name": { + "value": "5_Chute not active" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 11:47:53" + }, + "VendorId": { + "value": "\u003d01+1510.11.32" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "66d7fd3a-ade4-4d6b-98bd-f3e782ee94da" + }, + "DisplayPath": { + "value": "PLC01_1510_11_35/OPC/inAlarms0/5_Chute not active" + }, + "Duration": { + "value": "00:10:21" + }, + "Name": { + "value": "5_Chute not active" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 11:51:09" + }, + "VendorId": { + "value": "\u003d01+1510.11.35" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "43f91251-1782-49c3-b45a-0c70978778a1" + }, + "DisplayPath": { + "value": "PLC66_1220_63_40/OPC/inAlarms0/7_Photo eye blocked" + }, + "Duration": { + "value": "00:02:49" + }, + "Name": { + "value": "7_Photo eye blocked" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 11:58:41" + }, + "VendorId": { + "value": "\u003d66+1220.63.40-B205.4" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "d4c3e86d-5cab-47de-8562-48b4fc5c063b" + }, + "DisplayPath": { + "value": "ARSAW1501/OPC/inAlarms2/2_Photo eye blocked" + }, + "Duration": { + "value": "00:25:20" + }, + "Name": { + "value": "2_Photo eye blocked" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 11:36:10" + }, + "VendorId": { + "value": "\u003dARSAW1501+05.13-B111.1" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "a992380e-6a60-4388-9fc1-b76b052a3641" + }, + "DisplayPath": { + "value": "PLC02_1510_87_15/OPC/inAlarms0/5_Chute not active" + }, + "Duration": { + "value": "00:17:01" + }, + "Name": { + "value": "5_Chute not active" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 11:44:29" + }, + "VendorId": { + "value": "\u003d02+1510.87.15" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "4457c4eb-9a49-463b-ba28-362fda48ce12" + }, + "DisplayPath": { + "value": "PLC20_1200_22_01/OPC/inAlarms0/5_Chain over length detection" + }, + "Duration": { + "value": "04:43:25" + }, + "Name": { + "value": "5_Chain over length detection" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 07:18:05" + }, + "VendorId": { + "value": "\u003d20+1200.22.01" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "706a7319-3b58-4e57-ad89-d97f8aee67c1" + }, + "DisplayPath": { + "value": "PLC09_1010_13_31/OPC/inAlarms0/0_Photo eye blocked" + }, + "Duration": { + "value": "00:11:09" + }, + "Name": { + "value": "0_Photo eye blocked" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-12 11:50:21" + }, + "VendorId": { + "value": "\u003d09+1010.13.31-B122.6" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "AlarmId": { + "value": "70bbd7ad-80fb-4c24-9a95-9d93ab13c85f" + }, + "DisplayPath": { + "value": "PLC66_1220_64_07/OPC/inAlarms0/0_Photo eye blocked" + }, + "Duration": { + "value": "02:30:02" + }, + "Name": { + "value": "0_Photo eye blocked" + }, + "Severity": { + "value": "3. High" + }, + "Timestamp": { + "value": "2022-08-10 09:31:28" + }, + "VendorId": { + "value": "\u003d66+1220.64.07-B206.6" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Medium" + }, + "value": { + "AlarmId": { + "value": "645b753f-c602-4e63-a841-e54160a602ba" + }, + "DisplayPath": { + "value": "SLAM302/OPC/ActiveEvents_0/Both Printers 1 Label Stop" + }, + "Duration": { + "value": "01:41:34" + }, + "Name": { + "value": "Both Printers 1 Label Stop" + }, + "Severity": { + "value": "2. Medium" + }, + "Timestamp": { + "value": "2022-08-12 10:19:56" + }, + "VendorId": { + "value": "" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Medium" + }, + "value": { + "AlarmId": { + "value": "ddf12c1a-3faa-48c8-a3c9-62105eade741" + }, + "DisplayPath": { + "value": "SLAM305/OPC/ActiveEvents_1/Printer 2 Fault" + }, + "Duration": { + "value": "01:22:45" + }, + "Name": { + "value": "Printer 2 Fault" + }, + "Severity": { + "value": "2. Medium" + }, + "Timestamp": { + "value": "2022-08-12 10:38:45" + }, + "VendorId": { + "value": "" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Medium" + }, + "value": { + "AlarmId": { + "value": "27d184d3-66b7-4309-a045-b7830a662fc9" + }, + "DisplayPath": { + "value": "SLAM305/OPC/ActiveEvents_0/Printer 1 Fault" + }, + "Duration": { + "value": "01:22:45" + }, + "Name": { + "value": "Printer 1 Fault" + }, + "Severity": { + "value": "2. Medium" + }, + "Timestamp": { + "value": "2022-08-12 10:38:45" + }, + "VendorId": { + "value": "" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Medium" + }, + "value": { + "AlarmId": { + "value": "8017709f-b8b6-4d83-9d30-b4d858c5c522" + }, + "DisplayPath": { + "value": "PLC1000_1100_35_01/OPC/inAlarms0/2_Stop button pushed" + }, + "Duration": { + "value": "00:03:01" + }, + "Name": { + "value": "2_Stop button pushed" + }, + "Severity": { + "value": "2. Medium" + }, + "Timestamp": { + "value": "2022-08-12 11:58:29" + }, + "VendorId": { + "value": "\u003dP1000+1100.35.01.B01-KA2.11A-S521.2" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "563c8152-fde4-4616-b5e3-3cb1a004bb75" + }, + "DisplayPath": { + "value": "PLC09_1010_32_40/OPC/inAlarms0/6_Full 25%" + }, + "Duration": { + "value": "23:25:42" + }, + "Name": { + "value": "6_Full 25%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-11 12:35:48" + }, + "VendorId": { + "value": "\u003d09+1010.32.40-B304.6" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "78f1c489-0e24-423c-a2cb-7614d18c8e4b" + }, + "DisplayPath": { + "value": "PLC09_1010_32_40/OPC/inAlarms0/2_Full 75%" + }, + "Duration": { + "value": "12:00:57" + }, + "Name": { + "value": "2_Full 75%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 00:00:33" + }, + "VendorId": { + "value": "\u003d09+1010.32.40-B304.4" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "fbbb85b0-d18d-4d36-8168-94b0187b3809" + }, + "DisplayPath": { + "value": "PLC09_1010_32_40/OPC/inAlarms0/4_Full 50%" + }, + "Duration": { + "value": "02:29:58" + }, + "Name": { + "value": "4_Full 50%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-10 09:31:32" + }, + "VendorId": { + "value": "\u003d09+1010.32.40-B304.5" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "921e2af7-cd0a-481a-aa63-062881e93aa6" + }, + "DisplayPath": { + "value": "PLC09_1010_32_40/OPC/inAlarms0/0_Full 100%" + }, + "Duration": { + "value": "00:10:33" + }, + "Name": { + "value": "0_Full 100%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 11:50:57" + }, + "VendorId": { + "value": "\u003d09+1010.32.40-B304.2" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "14d1d1d8-0c28-4c96-95cb-4aeb5d326b0e" + }, + "DisplayPath": { + "value": "SLAM306/OPC/ActiveEvents_0/Upstream Not Running" + }, + "Duration": { + "value": "00:05:16" + }, + "Name": { + "value": "Upstream Not Running" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 11:56:14" + }, + "VendorId": { + "value": "" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "89bba546-f28d-489d-8a5d-908990fc0c2c" + }, + "DisplayPath": { + "value": "PLC09_1010_12_40/OPC/inAlarms0/6_Full 25%" + }, + "Duration": { + "value": "00:33:01" + }, + "Name": { + "value": "6_Full 25%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 11:28:29" + }, + "VendorId": { + "value": "\u003d09+1010.12.40-B104.6" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "c06c4c9a-693b-4e44-b28d-1cc883f46581" + }, + "DisplayPath": { + "value": "PLC09_1010_12_40/OPC/inAlarms0/4_Full 50%" + }, + "Duration": { + "value": "01:23:43" + }, + "Name": { + "value": "4_Full 50%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 10:37:48" + }, + "VendorId": { + "value": "\u003d09+1010.12.40-B104.5" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "33550149-53b7-4490-8d39-06c9cee5ce63" + }, + "DisplayPath": { + "value": "PLC09_1010_12_40/OPC/inAlarms0/2_Full 75%" + }, + "Duration": { + "value": "01:19:44" + }, + "Name": { + "value": "2_Full 75%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 10:41:47" + }, + "VendorId": { + "value": "\u003d09+1010.12.40-B104.4" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "15b4dc66-968b-4b13-9fdd-43e1e887e4b1" + }, + "DisplayPath": { + "value": "PLC09_1010_12_40/OPC/inAlarms0/0_Full 100%" + }, + "Duration": { + "value": "00:04:37" + }, + "Name": { + "value": "0_Full 100%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 11:56:53" + }, + "VendorId": { + "value": "\u003d09+1010.12.40-B104.2" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "5bf89243-965b-4049-a5b4-65e0cdffbf9a" + }, + "DisplayPath": { + "value": "PLC1000_1100_10_25/OPC/inAlarms0/0_Full 25%" + }, + "Duration": { + "value": "00:01:10" + }, + "Name": { + "value": "0_Full 25%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 12:00:20" + }, + "VendorId": { + "value": "\u003dP1000+1100.10.25-B323.1" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "63c21fc9-5b3a-4f3f-9076-90145af9d833" + }, + "DisplayPath": { + "value": "PLC1000_1100_32_13/OPC/inAlarms0/0_Full 75%" + }, + "Duration": { + "value": "00:00:38" + }, + "Name": { + "value": "0_Full 75%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 12:00:52" + }, + "VendorId": { + "value": "\u003dP1000+1100.32.13-B503.4" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "08756b9a-24cd-4f90-b7a2-98d0d74b873d" + }, + "DisplayPath": { + "value": "PLC1000_1100_04_25/OPC/inAlarms0/0_Full 25%" + }, + "Duration": { + "value": "00:02:00" + }, + "Name": { + "value": "0_Full 25%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 11:59:30" + }, + "VendorId": { + "value": "\u003dP1000+1100.04.25-B122.0" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "46ca2c01-03cd-47c2-9576-feb03e4ef9ca" + }, + "DisplayPath": { + "value": "PLC1000_1100_10_17/OPC/inAlarms0/0_Full 50%" + }, + "Duration": { + "value": "00:00:58" + }, + "Name": { + "value": "0_Full 50%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 12:00:32" + }, + "VendorId": { + "value": "\u003dP1000+1100.10.17-B321.1" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "349731d9-7024-41d8-8345-9438180bfafe" + }, + "DisplayPath": { + "value": "PLC1000_1100_04_17/OPC/inAlarms0/0_Full 50%" + }, + "Duration": { + "value": "00:01:34" + }, + "Name": { + "value": "0_Full 50%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 11:59:56" + }, + "VendorId": { + "value": "\u003dP1000+1100.04.17-B121.0" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "e21645ca-8629-4117-8f6c-ac980405c027" + }, + "DisplayPath": { + "value": "PLC1000_1100_23_30/OPC/inAlarms0/0_Full 25%" + }, + "Duration": { + "value": "00:25:44" + }, + "Name": { + "value": "0_Full 25%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 11:35:46" + }, + "VendorId": { + "value": "\u003dP1000+1100.23.30-B412.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "cb7576ba-218a-4630-98e2-cf8a99313f43" + }, + "DisplayPath": { + "value": "PLC09_3040_22_60/OPC/inAlarms0/2_Full 25%" + }, + "Duration": { + "value": "00:15:03" + }, + "Name": { + "value": "2_Full 25%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 11:46:27" + }, + "VendorId": { + "value": "\u003d09+3040.22.60-B721.4" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "b2802772-4aed-4722-b300-812843fd49d8" + }, + "DisplayPath": { + "value": "PLC1000_1100_33_10/OPC/inAlarms0/0_Full 50%" + }, + "Duration": { + "value": "00:00:38" + }, + "Name": { + "value": "0_Full 50%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 12:00:52" + }, + "VendorId": { + "value": "\u003dP1000+1100.33.10-B509.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "1fd3ac98-2636-4ba1-8ff5-2edef1b446f2" + }, + "DisplayPath": { + "value": "PLC09_2040_22_60/OPC/inAlarms0/0_Full 50%" + }, + "Duration": { + "value": "00:00:55" + }, + "Name": { + "value": "0_Full 50%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 12:00:35" + }, + "VendorId": { + "value": "\u003d09+2040.22.60-B621.2" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "f5303a9d-3b13-482b-a73d-0c31f8138ea5" + }, + "DisplayPath": { + "value": "PLC09_2040_22_60/OPC/inAlarms0/2_Full 25%" + }, + "Duration": { + "value": "03:19:12" + }, + "Name": { + "value": "2_Full 25%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 08:42:19" + }, + "VendorId": { + "value": "\u003d09+2040.22.60-B621.4" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "cb8ee399-0e56-48ad-b1df-2b9a3a7c4acf" + }, + "DisplayPath": { + "value": "PLC09_1010_22_40/OPC/inAlarms0/4_Full 50%" + }, + "Duration": { + "value": "00:31:56" + }, + "Name": { + "value": "4_Full 50%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 11:29:34" + }, + "VendorId": { + "value": "\u003d09+1010.22.40-B204.5" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "fc2ea1bd-3565-4c2e-b401-9c66dea60498" + }, + "DisplayPath": { + "value": "PLC09_1010_22_40/OPC/inAlarms0/0_Full 100%" + }, + "Duration": { + "value": "00:01:07" + }, + "Name": { + "value": "0_Full 100%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 12:00:23" + }, + "VendorId": { + "value": "\u003d09+1010.22.40-B204.2" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "714b2ff3-75d9-4980-9f5f-02ab18a1ec78" + }, + "DisplayPath": { + "value": "PLC09_1010_22_40/OPC/inAlarms0/6_Full 25%" + }, + "Duration": { + "value": "00:32:55" + }, + "Name": { + "value": "6_Full 25%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 11:28:35" + }, + "VendorId": { + "value": "\u003d09+1010.22.40-B204.6" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "f3a117e7-bd0c-4d71-8000-3e739f332484" + }, + "DisplayPath": { + "value": "PLC09_1010_22_40/OPC/inAlarms0/2_Full 75%" + }, + "Duration": { + "value": "00:07:37" + }, + "Name": { + "value": "2_Full 75%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 11:53:53" + }, + "VendorId": { + "value": "\u003d09+1010.22.40-B204.4" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "e2baa964-eb4c-4a92-933d-3b5e2d1664e0" + }, + "DisplayPath": { + "value": "PLC1000_1100_33_22/OPC/inAlarms0/0_Full 25%" + }, + "Duration": { + "value": "00:02:35" + }, + "Name": { + "value": "0_Full 25%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 11:58:55" + }, + "VendorId": { + "value": "\u003dP1000+1100.33.22-B512.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "3a380b2a-08f4-4fff-97f9-961e70d55736" + }, + "DisplayPath": { + "value": "PLC1000_1100_08_19/OPC/inAlarms0/0_Full 25%" + }, + "Duration": { + "value": "00:03:05" + }, + "Name": { + "value": "0_Full 25%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 11:58:25" + }, + "VendorId": { + "value": "\u003dP1000+1100.08.19-B305.5" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Low" + }, + "value": { + "AlarmId": { + "value": "8e868e64-edcb-405f-b8af-dfbb81344088" + }, + "DisplayPath": { + "value": "PLC1000_1100_08_13/OPC/inAlarms0/0_Full 50%" + }, + "Duration": { + "value": "00:03:01" + }, + "Name": { + "value": "0_Full 50%" + }, + "Severity": { + "value": "1. Low" + }, + "Timestamp": { + "value": "2022-08-12 11:58:29" + }, + "VendorId": { + "value": "\u003dP1000+1100.08.13-B304.1" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "854d4883-9957-40dc-8590-5bdf800cd9ec" + }, + "DisplayPath": { + "value": "PLC01_1510_11_45/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "01:03:05" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 10:58:25" + }, + "VendorId": { + "value": "\u003d01+1510.11.45-B211.7" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "4e0e235c-40b2-43e1-8df0-05acd23f42cc" + }, + "DisplayPath": { + "value": "PLC01_1510_11_44/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "02:26:44" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 09:34:46" + }, + "VendorId": { + "value": "\u003d01+1510.11.44-B211.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "7f19e592-3937-4b82-b1a0-080f18028e58" + }, + "DisplayPath": { + "value": "PLC01_1510_11_47/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:17:59" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:43:31" + }, + "VendorId": { + "value": "\u003d01+1510.11.47-B212.7" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "40d2a84f-674c-4e2e-b1f3-cda897a7edc5" + }, + "DisplayPath": { + "value": "FSC10_OFZ_1500_73_CH_1500_73_04/OPC/inAlarms0/3.Chute Full" + }, + "Duration": { + "value": "00:10:26" + }, + "Name": { + "value": "3.Chute Full" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:51:04" + }, + "VendorId": { + "value": "CH-1500.73.04" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "0454374e-7fbf-49d9-b1cc-7f639a953a8d" + }, + "DisplayPath": { + "value": "PLC01_1510_11_48/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:26:03" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:35:27" + }, + "VendorId": { + "value": "\u003d01+1510.11.48-B213.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "3dd7ef75-ab85-4614-a3ac-372003761dda" + }, + "DisplayPath": { + "value": "FSC10_OFZ_1500_73_CH_1500_73_01/OPC/inAlarms0/3.Chute Full" + }, + "Duration": { + "value": "00:13:42" + }, + "Name": { + "value": "3.Chute Full" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:47:48" + }, + "VendorId": { + "value": "CH-1500.73.01" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "d3da023c-ce0e-4cbc-8201-f3976d89e128" + }, + "DisplayPath": { + "value": "PLC02_1510_88_11/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:06:35" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:54:56" + }, + "VendorId": { + "value": "\u003d02+1510.88.11-B323.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "d45a6985-c242-4645-b3ac-ab34e5a2462b" + }, + "DisplayPath": { + "value": "PLC65_1220_53_40/OPC/inAlarms0/4_Full 50%" + }, + "Duration": { + "value": "00:04:48" + }, + "Name": { + "value": "4_Full 50%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:56:42" + }, + "VendorId": { + "value": "\u003d65+1220.53.40-B205.4" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "374d4319-4ae0-4111-8093-880f26803e23" + }, + "DisplayPath": { + "value": "PLC65_1220_53_40/OPC/inAlarms0/6_Full 25%" + }, + "Duration": { + "value": "01:40:44" + }, + "Name": { + "value": "6_Full 25%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 10:20:46" + }, + "VendorId": { + "value": "\u003d65+1220.53.40-B205.5" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "22bff280-17a1-4e40-bf84-a35fb602c8c7" + }, + "DisplayPath": { + "value": "PLC01_1510_11_41/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:34:06" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:27:24" + }, + "VendorId": { + "value": "\u003d01+1510.11.41-B209.7" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "7b1adf51-09b5-44ca-aadd-f883865350e5" + }, + "DisplayPath": { + "value": "FSC10_TRZ_1500_01_CAS_1500_01_382/OPC/inAlarms0/18.Item Blocked for Sorting" + }, + "Duration": { + "value": "01:27:29" + }, + "Name": { + "value": "18.Item Blocked for Sorting" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 10:34:01" + }, + "VendorId": { + "value": "CAS-1500.01.382" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "438cb2f7-4b48-468f-9e18-39a03b093f5c" + }, + "DisplayPath": { + "value": "PLC71_1260_73_40/OPC/inAlarms0/0_Full 100%" + }, + "Duration": { + "value": "02:29:59" + }, + "Name": { + "value": "0_Full 100%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 09:31:31" + }, + "VendorId": { + "value": "\u003d71+1260.73.40-B206.2" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "85680dc1-f7ba-4da9-9d60-ba600b049882" + }, + "DisplayPath": { + "value": "PLC01_1510_11_59/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:00:23" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:01:07" + }, + "VendorId": { + "value": "\u003d01+1510.11.59-B220.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "13e31396-f540-4b19-9d68-a55ba579e03b" + }, + "DisplayPath": { + "value": "FSC10_TRZ_1500_01_CAS_1500_01_138/OPC/inAlarms0/18.Item Blocked for Sorting" + }, + "Duration": { + "value": "00:00:02" + }, + "Name": { + "value": "18.Item Blocked for Sorting" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:01:28" + }, + "VendorId": { + "value": "CAS-1500.01.138" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "ea6d6012-5d3d-42e5-8396-f1f2b6a95476" + }, + "DisplayPath": { + "value": "FSC10_TRZ_1500_01_CAS_1500_01_255/OPC/inAlarms0/16.CAS automatic offline" + }, + "Duration": { + "value": "00:24:47" + }, + "Name": { + "value": "16.CAS automatic offline" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 11:36:43" + }, + "VendorId": { + "value": "CAS-1500.01.255" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "397c2848-56a9-4c5f-8fc9-830395c649e2" + }, + "DisplayPath": { + "value": "PLC01_1510_11_50/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:00:59" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:00:31" + }, + "VendorId": { + "value": "\u003d01+1510.11.50-B214.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "eae02a75-c090-4863-b71e-0966519e1a04" + }, + "DisplayPath": { + "value": "FSC10_TRZ_1500_01_CAS_1500_01_010/OPC/inAlarms0/18.Item Blocked for Sorting" + }, + "Duration": { + "value": "00:00:37" + }, + "Name": { + "value": "18.Item Blocked for Sorting" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:00:53" + }, + "VendorId": { + "value": "CAS-1500.01.010" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "cbb9023a-17f8-42c7-83d2-e433bb9ec8b7" + }, + "DisplayPath": { + "value": "PLC01_1510_11_51/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:55:15" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:06:16" + }, + "VendorId": { + "value": "\u003d01+1510.11.51-B214.7" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "43fc342e-6b83-410d-9bab-ee00e1be9bbe" + }, + "DisplayPath": { + "value": "FSC10_TRZ_1500_01_CAS_1500_01_493/OPC/inAlarms0/16.CAS automatic offline" + }, + "Duration": { + "value": "00:24:36" + }, + "Name": { + "value": "16.CAS automatic offline" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 11:36:55" + }, + "VendorId": { + "value": "CAS-1500.01.493" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "1b509e3c-efa5-4201-b23f-4b33f9d64c17" + }, + "DisplayPath": { + "value": "FSC10_TRZ_1500_01_CAS_1500_01_493/OPC/inAlarms0/18.Item Blocked for Sorting" + }, + "Duration": { + "value": "00:00:23" + }, + "Name": { + "value": "18.Item Blocked for Sorting" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:01:07" + }, + "VendorId": { + "value": "CAS-1500.01.493" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "6dd055ef-d8b3-4eb9-b7c6-cd3cdec1998a" + }, + "DisplayPath": { + "value": "FSC10_IFZ_1500_56_CH_1500_56_09/OPC/inAlarms0/1.Bin contains item" + }, + "Duration": { + "value": "00:04:00" + }, + "Name": { + "value": "1.Bin contains item" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:57:30" + }, + "VendorId": { + "value": "CH-1500.56.09" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "5e625e5b-8f9b-4608-91f1-f01fda8d3f66" + }, + "DisplayPath": { + "value": "PLC66_1220_26_20/OPC/inAlarms0/0_Full 25%" + }, + "Duration": { + "value": "00:00:18" + }, + "Name": { + "value": "0_Full 25%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:01:12" + }, + "VendorId": { + "value": "\u003d66+1220.26.20-B122.2" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "755fd504-7ed5-4583-a2ae-43c48a7cdc93" + }, + "DisplayPath": { + "value": "PLC03_1251_32_03/OPC/inAlarms0/0_Full 100%" + }, + "Duration": { + "value": "02:29:58" + }, + "Name": { + "value": "0_Full 100%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 09:31:32" + }, + "VendorId": { + "value": "\u003d03+1251.32.03-B204.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "4f86d055-66b7-4a68-b4c1-9cf704674418" + }, + "DisplayPath": { + "value": "FSC10_TRZ_1500_01_CAS_1500_01_206/OPC/inAlarms0/16.CAS automatic offline" + }, + "Duration": { + "value": "00:24:48" + }, + "Name": { + "value": "16.CAS automatic offline" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 11:36:42" + }, + "VendorId": { + "value": "CAS-1500.01.206" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "c297c3da-c8d3-4035-b734-b4aeb855a353" + }, + "DisplayPath": { + "value": "PLC64_1230_43_40/OPC/inAlarms0/6_Full 25%" + }, + "Duration": { + "value": "02:41:22" + }, + "Name": { + "value": "6_Full 25%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 09:20:08" + }, + "VendorId": { + "value": "\u003d64+1230.43.40-B205.5" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "670a4052-ee28-4124-9d96-8c679b19ee1b" + }, + "DisplayPath": { + "value": "PLC64_1230_43_40/OPC/inAlarms0/4_Full 50%" + }, + "Duration": { + "value": "00:03:07" + }, + "Name": { + "value": "4_Full 50%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:58:23" + }, + "VendorId": { + "value": "\u003d64+1230.43.40-B205.4" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "fa29dd21-fcd5-43b0-babd-4743e6f37226" + }, + "DisplayPath": { + "value": "PLC64_1230_43_40/OPC/inAlarms0/2_Full 75%" + }, + "Duration": { + "value": "02:41:00" + }, + "Name": { + "value": "2_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 09:20:30" + }, + "VendorId": { + "value": "\u003d64+1230.43.40-B204.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "bcf1f256-7cc7-46eb-95e1-425bf8b34dec" + }, + "DisplayPath": { + "value": "PLC64_1230_43_40/OPC/inAlarms0/0_Full 100%" + }, + "Duration": { + "value": "00:01:20" + }, + "Name": { + "value": "0_Full 100%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:00:10" + }, + "VendorId": { + "value": "\u003d64+1230.43.40-B204.2" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "9cbe00a0-c9f9-4167-85e4-8e71c015bc47" + }, + "DisplayPath": { + "value": "PLC01_1510_81_03/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "02:29:58" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 09:31:32" + }, + "VendorId": { + "value": "\u003d01+1510.81.03-B303.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "0b49a15e-5338-4fea-abb2-64694c6be89a" + }, + "DisplayPath": { + "value": "PLC01_1510_81_04/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:04:25" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:57:05" + }, + "VendorId": { + "value": "\u003d01+1510.81.04-B303.7" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "e4a40063-c29d-4d52-91bc-02f89b0db027" + }, + "DisplayPath": { + "value": "PLC01_1510_81_05/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:05:23" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:56:07" + }, + "VendorId": { + "value": "\u003d01+1510.81.05-B304.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "4f803ae4-b11a-414a-b540-1d26de70d332" + }, + "DisplayPath": { + "value": "PLC01_1510_81_05/OPC/inAlarms0/1_Full 100%" + }, + "Duration": { + "value": "00:00:31" + }, + "Name": { + "value": "1_Full 100%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:00:59" + }, + "VendorId": { + "value": "\u003d01+1510.81.05-B304.2" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "286b8c5f-08c7-490e-bc83-6e695e8a9cf8" + }, + "DisplayPath": { + "value": "PLC01_1510_81_01/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "23:49:59" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-11 12:11:31" + }, + "VendorId": { + "value": "\u003d01+1510.81.01-B302.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "3a586506-b523-493f-8979-3418052bb5fe" + }, + "DisplayPath": { + "value": "PLC01_1510_81_02/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "02:29:58" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 09:31:32" + }, + "VendorId": { + "value": "\u003d01+1510.81.02-B302.7" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "29742c35-ec12-4660-b080-d8a347e65f4f" + }, + "DisplayPath": { + "value": "PLC60_1220_43_40/OPC/inAlarms0/4_Full 50%" + }, + "Duration": { + "value": "12:30:12" + }, + "Name": { + "value": "4_Full 50%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-11 23:31:18" + }, + "VendorId": { + "value": "\u003d60+1220.43.40-B205.4" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "f08d921d-38cc-4356-b762-b031986cd4d3" + }, + "DisplayPath": { + "value": "PLC60_1220_43_40/OPC/inAlarms0/2_Full 75%" + }, + "Duration": { + "value": "03:02:44" + }, + "Name": { + "value": "2_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 08:58:46" + }, + "VendorId": { + "value": "\u003d60+1220.43.40-B204.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "da2bd9bf-2361-4f69-90db-ec1e432dfbd2" + }, + "DisplayPath": { + "value": "PLC60_1220_43_40/OPC/inAlarms0/0_Full 100%" + }, + "Duration": { + "value": "00:00:24" + }, + "Name": { + "value": "0_Full 100%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:01:06" + }, + "VendorId": { + "value": "\u003d60+1220.43.40-B204.2" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "e87e2a68-96ea-4ff5-b6db-09160dc7dbf2" + }, + "DisplayPath": { + "value": "PLC60_1220_43_40/OPC/inAlarms0/6_Full 25%" + }, + "Duration": { + "value": "12:41:17" + }, + "Name": { + "value": "6_Full 25%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-11 23:20:14" + }, + "VendorId": { + "value": "\u003d60+1220.43.40-B205.5" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "dff5603a-642d-4b5b-95fa-d4f87cf849a0" + }, + "DisplayPath": { + "value": "FSC10_OFZ_1500_73_CH_1500_73_18/OPC/inAlarms0/3.Chute Full" + }, + "Duration": { + "value": "00:07:05" + }, + "Name": { + "value": "3.Chute Full" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:54:25" + }, + "VendorId": { + "value": "CH-1500.73.18" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "94f23ca5-a383-4f4e-8b92-8b2b92d3364a" + }, + "DisplayPath": { + "value": "FSC10_TRZ_1500_01_CAS_1500_01_030/OPC/inAlarms0/18.Item Blocked for Sorting" + }, + "Duration": { + "value": "00:00:44" + }, + "Name": { + "value": "18.Item Blocked for Sorting" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:00:46" + }, + "VendorId": { + "value": "CAS-1500.01.030" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "4652cb60-2cb8-44a8-99cc-3ae1c0462099" + }, + "DisplayPath": { + "value": "FSC10_OFZ_1500_73_CH_1500_73_10/OPC/inAlarms0/3.Chute Full" + }, + "Duration": { + "value": "00:08:32" + }, + "Name": { + "value": "3.Chute Full" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:52:58" + }, + "VendorId": { + "value": "CH-1500.73.10" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "946a62fa-dfb6-416e-9960-f44a0721e1cd" + }, + "DisplayPath": { + "value": "FSC10_OFZ_1500_71_CH_1500_71_01/OPC/inAlarms0/3.Chute Full" + }, + "Duration": { + "value": "00:24:55" + }, + "Name": { + "value": "3.Chute Full" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 11:36:35" + }, + "VendorId": { + "value": "CH-1500.71.01" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "c00c25ea-e79e-4d73-b5f6-82c9d4a0b865" + }, + "DisplayPath": { + "value": "FSC10_OFZ_1500_40_AM1/Expressions/Quality/Tag quality error" + }, + "Duration": { + "value": "00:24:55" + }, + "Name": { + "value": "Tag quality error" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 11:36:35" + }, + "VendorId": { + "value": "\"One or more tags has bad quality.\"" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "8bc107e6-e1ca-4b63-9608-f1e17067b48f" + }, + "DisplayPath": { + "value": "M1000/Expressions/Quality/Tag quality error" + }, + "Duration": { + "value": "02:30:16" + }, + "Name": { + "value": "Tag quality error" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 09:31:14" + }, + "VendorId": { + "value": "\"One or more tags has bad quality.\"" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "f9b13207-66be-4d89-837b-c7468667c273" + }, + "DisplayPath": { + "value": "FSC10_OFZ_1500_79_CH_1500_79_15/OPC/inAlarms0/3.Chute Full" + }, + "Duration": { + "value": "00:17:07" + }, + "Name": { + "value": "3.Chute Full" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:44:23" + }, + "VendorId": { + "value": "CH-1500.79.15" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "00a1494e-b5bd-445a-89cc-9092f3eb1125" + }, + "DisplayPath": { + "value": "FSC10_TRZ_1500_01_CAS_1500_01_229/OPC/inAlarms0/18.Item Blocked for Sorting" + }, + "Duration": { + "value": "00:00:35" + }, + "Name": { + "value": "18.Item Blocked for Sorting" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:00:55" + }, + "VendorId": { + "value": "CAS-1500.01.229" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "a9d01ff6-e4c6-42ab-a317-57d5fa104d0a" + }, + "DisplayPath": { + "value": "FSC10_TRZ_1500_01_CAS_1500_01_503/OPC/inAlarms0/18.Item Blocked for Sorting" + }, + "Duration": { + "value": "00:00:07" + }, + "Name": { + "value": "18.Item Blocked for Sorting" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:01:23" + }, + "VendorId": { + "value": "CAS-1500.01.503" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "55a32ec8-90a8-494f-8635-f1bef05f68e9" + }, + "DisplayPath": { + "value": "FSC10_TRZ_1500_01_CAS_1500_01_224/OPC/inAlarms0/16.CAS automatic offline" + }, + "Duration": { + "value": "00:24:48" + }, + "Name": { + "value": "16.CAS automatic offline" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 11:36:42" + }, + "VendorId": { + "value": "CAS-1500.01.224" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "cbfadbdb-ac4a-40da-abbd-def9685097ed" + }, + "DisplayPath": { + "value": "PLC03_1251_50_15/OPC/inAlarms0/1_Plug not plugged" + }, + "Duration": { + "value": "02:30:02" + }, + "Name": { + "value": "1_Plug not plugged" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 09:31:28" + }, + "VendorId": { + "value": "\u003d03+1251.50.15-G1" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "ecfc9406-f3d3-4876-88bb-04390af3ceda" + }, + "DisplayPath": { + "value": "PLC03_1251_50_12/OPC/inAlarms0/1_Plug not plugged" + }, + "Duration": { + "value": "02:29:59" + }, + "Name": { + "value": "1_Plug not plugged" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 09:31:32" + }, + "VendorId": { + "value": "\u003d03+1251.50.12-G1" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "e7eb3c1b-3b7e-45d5-adeb-684e1674a078" + }, + "DisplayPath": { + "value": "FSC10_OFZ_1500_75_CH_1500_75_05/OPC/inAlarms0/3.Chute Full" + }, + "Duration": { + "value": "00:00:35" + }, + "Name": { + "value": "3.Chute Full" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:00:55" + }, + "VendorId": { + "value": "CH-1500.75.05" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "d149d26e-b48b-4d19-984f-b2219c80b591" + }, + "DisplayPath": { + "value": "PLC03_1251_50_09/OPC/inAlarms0/1_Plug not plugged" + }, + "Duration": { + "value": "02:29:59" + }, + "Name": { + "value": "1_Plug not plugged" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 09:31:32" + }, + "VendorId": { + "value": "\u003d03+1251.50.09-G1" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "7d24df29-18c5-44be-bba5-15a5ad3df72e" + }, + "DisplayPath": { + "value": "FSC10_OFZ_1500_71_CH_1500_71_14/OPC/inAlarms0/3.Chute Full" + }, + "Duration": { + "value": "00:11:41" + }, + "Name": { + "value": "3.Chute Full" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:49:50" + }, + "VendorId": { + "value": "CH-1500.71.14" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "990229a8-4019-4fa5-9785-04834affaea6" + }, + "DisplayPath": { + "value": "PLC66_1220_24_30/OPC/inAlarms0/4_Full 50%" + }, + "Duration": { + "value": "00:30:41" + }, + "Name": { + "value": "4_Full 50%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:30:49" + }, + "VendorId": { + "value": "\u003d66+1220.24.30-B119.0" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "fd270f76-7a6a-453a-b22d-10ed814270d5" + }, + "DisplayPath": { + "value": "PLC47_1210_08_01/OPC/inAlarms0/2_Area is not empty" + }, + "Duration": { + "value": "01:46:57" + }, + "Name": { + "value": "2_Area is not empty" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 10:14:33" + }, + "VendorId": { + "value": "\u003d47+1210.08.01-BE307.0" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "8df1dbd6-c1e1-42db-9698-fd89563916b1" + }, + "DisplayPath": { + "value": "PLC02_1510_11_30/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:00:31" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:00:59" + }, + "VendorId": { + "value": "\u003d02+1510.11.30-B220.7" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "53e2d15e-23bf-4a87-91b0-c1789a2d86aa" + }, + "DisplayPath": { + "value": "PLC25_1210_01_01/OPC/inAlarms0/2_Area is not empty" + }, + "Duration": { + "value": "04:12:43" + }, + "Name": { + "value": "2_Area is not empty" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 07:48:47" + }, + "VendorId": { + "value": "\u003d25+1210.01.01-BE307.0" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "7cbb5255-339e-463d-9917-aeb232fc2337" + }, + "DisplayPath": { + "value": "FSC10_IFZ_1500_54_CH_1500_54_09/OPC/inAlarms0/1.Bin contains item" + }, + "Duration": { + "value": "00:01:13" + }, + "Name": { + "value": "1.Bin contains item" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:00:17" + }, + "VendorId": { + "value": "CH-1500.54.09" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "891eda89-5a56-4da2-835d-00da69673cc6" + }, + "DisplayPath": { + "value": "FSC10_TRZ_1500_01_CAS_1500_01_450/OPC/inAlarms0/16.CAS automatic offline" + }, + "Duration": { + "value": "00:24:38" + }, + "Name": { + "value": "16.CAS automatic offline" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 11:36:52" + }, + "VendorId": { + "value": "CAS-1500.01.450" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "dfa68a57-ceb1-4c51-ad44-4d3e3768cde9" + }, + "DisplayPath": { + "value": "PLC70_1260_31_02/OPC/inAlarms0/1_Plug not plugged" + }, + "Duration": { + "value": "02:29:59" + }, + "Name": { + "value": "1_Plug not plugged" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 09:31:31" + }, + "VendorId": { + "value": "\u003d70+1260.31.02-G1" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "98aaaa33-9f9b-4685-83c4-ab226638dbd3" + }, + "DisplayPath": { + "value": "FSC10_IFZ_1500_60_BF_1500_60_01/OPC/inAlarms0/5.Speed difference" + }, + "Duration": { + "value": "00:00:01" + }, + "Name": { + "value": "5.Speed difference" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:01:30" + }, + "VendorId": { + "value": "BF-1500.60.01" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "9f44974d-29a8-4cda-8c05-1ac3c36bfa25" + }, + "DisplayPath": { + "value": "PLC08_1280_14_40/OPC/inAlarms0/2_Full 50%" + }, + "Duration": { + "value": "02:29:59" + }, + "Name": { + "value": "2_Full 50%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 09:31:31" + }, + "VendorId": { + "value": "\u003d08+1280.14.40-B219.5" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "bdee063d-e1e5-4900-bfed-550c8376f3e4" + }, + "DisplayPath": { + "value": "FSC10_TRZ_1500_01_CAS_1500_01_609/OPC/inAlarms0/16.CAS automatic offline" + }, + "Duration": { + "value": "00:24:32" + }, + "Name": { + "value": "16.CAS automatic offline" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 11:36:58" + }, + "VendorId": { + "value": "CAS-1500.01.609" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "2fd54271-08f9-41e5-b740-84b1532ab584" + }, + "DisplayPath": { + "value": "FSC10_TRZ_1500_01_CAS_1500_01_128/OPC/inAlarms0/18.Item Blocked for Sorting" + }, + "Duration": { + "value": "00:00:59" + }, + "Name": { + "value": "18.Item Blocked for Sorting" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:00:31" + }, + "VendorId": { + "value": "CAS-1500.01.128" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "133b5915-dcf7-4565-becb-9ced98576d96" + }, + "DisplayPath": { + "value": "FSC10_TRZ_1500_01_CAS_1500_01_128/OPC/inAlarms0/16.CAS automatic offline" + }, + "Duration": { + "value": "00:24:50" + }, + "Name": { + "value": "16.CAS automatic offline" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 11:36:40" + }, + "VendorId": { + "value": "CAS-1500.01.128" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "d6f2a2ce-d65b-4d7b-aaed-859ea44cebb0" + }, + "DisplayPath": { + "value": "FSC10_TRZ_1500_01_CAS_1500_01_487/OPC/inAlarms0/18.Item Blocked for Sorting" + }, + "Duration": { + "value": "00:06:01" + }, + "Name": { + "value": "18.Item Blocked for Sorting" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:55:29" + }, + "VendorId": { + "value": "CAS-1500.01.487" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "d30d38ae-95c6-40a2-8adb-d653932c90f4" + }, + "DisplayPath": { + "value": "FSC10_TRZ_1500_01_CAS_1500_01_488/OPC/inAlarms0/18.Item Blocked for Sorting" + }, + "Duration": { + "value": "00:06:00" + }, + "Name": { + "value": "18.Item Blocked for Sorting" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:55:30" + }, + "VendorId": { + "value": "CAS-1500.01.488" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "22a6a9e5-3f5d-45ea-8d9d-1023baaf380b" + }, + "DisplayPath": { + "value": "PLC02_1510_11_07/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:03:10" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:58:20" + }, + "VendorId": { + "value": "\u003d02+1510.11.07-B208.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "eba08435-1562-4299-9c1b-68b772151c1a" + }, + "DisplayPath": { + "value": "FSC10_OFZ_1500_78_CH_1500_78_05/OPC/inAlarms0/3.Chute Full" + }, + "Duration": { + "value": "00:02:44" + }, + "Name": { + "value": "3.Chute Full" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:58:46" + }, + "VendorId": { + "value": "CH-1500.78.05" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "295e057f-99ec-46b3-83d0-01f175608357" + }, + "DisplayPath": { + "value": "FSC10_ACZ_1500_57_BF_1500_57_02/OPC/inAlarms0/5.Speed difference" + }, + "Duration": { + "value": "00:04:40" + }, + "Name": { + "value": "5.Speed difference" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:56:51" + }, + "VendorId": { + "value": "BF-1500.57.02" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "051823b0-7e26-45f6-b05d-57c1919387a4" + }, + "DisplayPath": { + "value": "INBOUND/RECEIVE/Test_Tag/Expressions/Quality/Tag quality error" + }, + "Duration": { + "value": "02:30:15" + }, + "Name": { + "value": "Tag quality error" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 09:31:15" + }, + "VendorId": { + "value": "\"One or more tags has bad quality.\"" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "beddd156-0145-4827-9081-933c65b80b1b" + }, + "DisplayPath": { + "value": "PLC02_1510_11_10/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:00:15" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:01:15" + }, + "VendorId": { + "value": "\u003d02+1510.11.10-B209.7" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "2b4f72a0-f52b-46f4-a32e-a5b9ad2f6adb" + }, + "DisplayPath": { + "value": "PLC02_1510_11_15/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "01:08:02" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 10:53:28" + }, + "VendorId": { + "value": "\u003d02+1510.11.15-B212.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "9b95634f-1f6d-4c7f-8099-1abdaea31058" + }, + "DisplayPath": { + "value": "PLC03_1251_22_03/OPC/inAlarms0/0_Full 100%" + }, + "Duration": { + "value": "02:29:58" + }, + "Name": { + "value": "0_Full 100%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 09:31:32" + }, + "VendorId": { + "value": "\u003d03+1251.22.03-B202.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "c3f32389-61f0-4687-a00c-50b49015d028" + }, + "DisplayPath": { + "value": "FSC10_IFZ_1500_30_CH_1500_30_09/OPC/inAlarms0/1.Bin contains item" + }, + "Duration": { + "value": "00:19:55" + }, + "Name": { + "value": "1.Bin contains item" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:41:35" + }, + "VendorId": { + "value": "CH-1500.30.09" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "f8381bfa-7e1a-4850-b641-94087a4a5c35" + }, + "DisplayPath": { + "value": "PLC01_1510_82_14/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:00:15" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:01:15" + }, + "VendorId": { + "value": "\u003d01+1510.82.14-B324.7" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "45624aff-c8e3-4510-8d0a-4dcb7bf9ba13" + }, + "DisplayPath": { + "value": "PLC01_1510_11_34/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:00:27" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:01:03" + }, + "VendorId": { + "value": "\u003d01+1510.11.34-B206.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "07102021-c79e-4828-9475-28db828a2365" + }, + "DisplayPath": { + "value": "PLC02_1510_87_12/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:00:47" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 12:00:43" + }, + "VendorId": { + "value": "\u003d02+1510.87.12-B307.7" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "9604e5b3-14e0-400e-96e1-f22a70a91b00" + }, + "DisplayPath": { + "value": "FSC10_TRZ_1500_01_CAS_1500_01_352/OPC/inAlarms0/16.CAS automatic offline" + }, + "Duration": { + "value": "00:24:43" + }, + "Name": { + "value": "16.CAS automatic offline" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 11:36:47" + }, + "VendorId": { + "value": "CAS-1500.01.352" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "3ebfbb2a-a78a-4599-b3ff-c84058ed4525" + }, + "DisplayPath": { + "value": "PLC03_1251_50_06/OPC/inAlarms0/1_Plug not plugged" + }, + "Duration": { + "value": "02:29:59" + }, + "Name": { + "value": "1_Plug not plugged" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 09:31:32" + }, + "VendorId": { + "value": "\u003d03+1251.50.06-G1" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "3307a2c0-be8d-4f86-812a-13e4be1d9709" + }, + "DisplayPath": { + "value": "PLC02_1510_11_24/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:11:20" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:50:10" + }, + "VendorId": { + "value": "\u003d02+1510.11.24-B216.7" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "fb3dd482-20cc-4fbe-9451-4f3b90672994" + }, + "DisplayPath": { + "value": "PLC02_1510_87_06/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:02:42" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:58:48" + }, + "VendorId": { + "value": "\u003d02+1510.87.06-B304.7" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "6b78811d-b0c7-4d8a-9f36-9781a103f126" + }, + "DisplayPath": { + "value": "PLC02_1510_11_23/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "01:09:41" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 10:51:49" + }, + "VendorId": { + "value": "\u003d02+1510.11.23-B216.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "3b027050-6f4e-4ea7-9c66-43d9bbb8ab67" + }, + "DisplayPath": { + "value": "PLC02_1510_11_27/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:40:01" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:21:30" + }, + "VendorId": { + "value": "\u003d02+1510.11.27-B219.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "c3ec2aca-77d0-4bdc-88c4-21b65873182b" + }, + "DisplayPath": { + "value": "PLC02_1510_11_26/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:08:53" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:52:38" + }, + "VendorId": { + "value": "\u003d02+1510.11.26-B218.7" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "134ccefa-2375-4e82-92ea-50641d5cc51d" + }, + "DisplayPath": { + "value": "PLC01_1510_82_01/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "02:29:58" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-10 09:31:32" + }, + "VendorId": { + "value": "\u003d01+1510.82.01-B318.3" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "d50e3617-282b-48ce-aead-ecef5ae33d7a" + }, + "DisplayPath": { + "value": "PLC01_1510_82_02/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:07:11" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:54:19" + }, + "VendorId": { + "value": "\u003d01+1510.82.02-B318.7" + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "AlarmId": { + "value": "ec0a50f8-79e8-4233-b7ae-ebf6d00e7d10" + }, + "DisplayPath": { + "value": "PLC01_1510_82_03/OPC/inAlarms0/3_Full 75%" + }, + "Duration": { + "value": "00:47:03" + }, + "Name": { + "value": "3_Full 75%" + }, + "Severity": { + "value": "0. Warning" + }, + "Timestamp": { + "value": "2022-08-12 11:14:27" + }, + "VendorId": { + "value": "\u003d01+1510.82.03-B319.3" + } + } + } + ], + "resizeMode": "fixed", + "rows": { + "highlight": { + "color": "#FFFF47" + } + }, + "selection": { + "mode": "multiple interval" + }, + "virtualized": false + }, + "type": "ia.display.table" + } + ], + "meta": { + "name": "Active_tab" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "events": { + "component": { + "onRowDoubleClick": [ + { + "config": { + "script": "\trow \u003d event.value\n\tcustom_view \u003d row.get(\"path\",\"none\")\n\tif custom_view !\u003d \"None\":\n\t\tequipment_id \u003d custom_view.split(\"/\")[1]\n\t\turl_to_navigate \u003d \"/CustomView/%s/\" % (equipment_id,)\n\t\tsystem.perspective.navigate(page \u003d url_to_navigate)\n\t\tsystem.perspective.sendMessage(\"plc-to-display\", payload \u003d {\"device\":\"none\",\"show_controls\":False,\"area\":\"none\"}, scope \u003d \"page\")\n\t\tsystem.perspective.closePopup(id\u003d \"StatusPopUP\")\n\t" + }, + "scope": "G", + "type": "script" + }, + { + "config": { + "draggable": true, + "id": "W1H0Nole", + "modal": false, + "overlayDismiss": false, + "resizable": true, + "showCloseIcon": true, + "title": "InfoPopUp", + "type": "close", + "viewPath": "PopUp-Views/Controller-Equipment/Information", + "viewportBound": false + }, + "scope": "C", + "type": "popup" + } + ] + } + }, + "meta": { + "name": "Views_list" + }, + "position": { + "basis": "915px", + "grow": 1 + }, + "propConfig": { + "props.data": { + "binding": { + "config": { + "path": "/root.custom.views_data" + }, + "type": "property" + } + } + }, + "type": "ia.display.table" + } + ], + "meta": { + "name": "Views" + }, + "position": { + "tabIndex": 2 + }, + "type": "ia.container.flex" + } + ], + "custom": { + "views_data": [ + { + "path": "Custom-Views/Detail" + } + ] + }, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\tproject_info \u003d system.perspective.getProjectInfo()\n\tself.custom.views_data \u003d project_info\n\tviews \u003d project_info.get(\"views\")\n\tequipment_id \u003d self.view.params.tagProps[0]\n\tviews_data \u003d [i for i in views if i[\"path\"].startswith(\"Custom-Views/\"+ equipment_id)]\n\tself.custom.views_data \u003d views_data\n\t\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true + } + }, + "propConfig": { + "custom.active_alarms": { + "binding": { + "config": { + "expression": "{./Active_tab/AlarmTable.props.data}" + }, + "transforms": [ + { + "code": "\treturn len(value)", + "type": "script" + } + ], + "type": "expr" + } + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}" + }, + "tagPath": "{0}/Expressions/Status" + }, + "type": "tag" + } + } + }, + "props": { + "menuStyle": { + "fontWeight": "bold" + }, + "tabs": [ + "Alarms", + "Info", + "Views" + ] + }, + "type": "ia.container.tab" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Detail-View-Filter/resource.json b/com.inductiveautomation.perspective/views/PopUp-Views/Detail-View-Filter/resource.json new file mode 100644 index 0000000..0144c08 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Detail-View-Filter/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "ankikarw", + "timestamp": "2024-04-01T21:08:27Z" + }, + "lastModificationSignature": "b49deac362b22f0e5b53c700a611567596c21145e0430170672d4179aa6df5b4" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Detail-View-Filter/thumbnail.png b/com.inductiveautomation.perspective/views/PopUp-Views/Detail-View-Filter/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..c95f281afd9e5cbeaa2018172d362d2e393054f2 GIT binary patch literal 20055 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 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Detail-View-Filter/view.json b/com.inductiveautomation.perspective/views/PopUp-Views/Detail-View-Filter/view.json new file mode 100644 index 0000000..48deb28 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Detail-View-Filter/view.json @@ -0,0 +1,894 @@ +{ + "custom": { + "activityLogger": { + "alt_pageid": "home" + } + }, + "params": { + "viewFocus": "value" + }, + "propConfig": { + "custom.activityLogger": { + "persistent": true + }, + "custom.activityLogger.pageid": { + "binding": { + "config": { + "expression": "{page.props.path}" + }, + "transforms": [ + { + "code": "\tif value \u003d\u003d\u0027/\u0027 or value \u003d\u003d \u0027\u0027 or value \u003d\u003d None:\n\t\treturn self.custom.activityLogger.alt_pageid.lower()\n\telse:\n\t\treturn value[1:].lower()", + "type": "script" + } + ], + "type": "expr" + } + }, + "custom.activityLogger.start_time": { + "binding": { + "config": { + "expression": "now()" + }, + "type": "expr" + } + }, + "params.viewFocus": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 326, + "width": 400 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "36px", + "shrink": 0 + }, + "props": { + "style": { + "background-color": "#555555", + "fontWeight": "bold", + "textAlign": "center" + }, + "text": "Status Filters" + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "custom": { + "buttonid": "status_filters/all" + }, + "events": { + "component": { + "onActionPerformed": [ + { + "config": { + "script": "\tpayload \u003d {}\n\tif self.props.selected:\n\t\tvalue \u003d True\n\telse:\n\t\tvalue \u003d False\n\t\n\tpayload[\"data\"] \u003d value\n\t\n\tsystem.perspective.sendMessage(\"select-all-filters\", \n\t\t\t\t\t\t\t\t\tpayload \u003d payload, \n\t\t\t\t\t\t\t\t\tscope \u003d \"view\")" + }, + "scope": "G", + "type": "script" + }, + { + "config": { + "script": "\tif not self.props.selected:\n\t\tbuttonid \u003d self.custom.buttonid\n\t\tactivityLog.logger.callLogger(self.view, \u0027click\u0027, buttonid)" + }, + "scope": "G", + "type": "script" + } + ] + } + }, + "meta": { + "name": "Select-All", + "tooltip": { + "delay": 250 + } + }, + "position": { + "basis": "36px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "if ({session.custom.alarm_filter.show_map}\u003dTrue \u0026\u0026 {session.custom.view_in_focus}\u003d\u0027/MAP-Home\u0027, True, False)" + }, + "enabled": false, + "type": "expr" + } + }, + "props.selected": { + "binding": { + "config": { + "expression": "if({session.custom.alarm_filter.show_diagnostic} \u0026\u0026 \r\n{session.custom.alarm_filter.show_gateways} \u0026\u0026\r\n{session.custom.alarm_filter.show_low_alarm} \u0026\u0026\r\n{session.custom.alarm_filter.show_running} \u0026\u0026 \r\n{session.custom.alarm_filter.show_safety}, True, False)" + }, + "type": "expr" + } + } + }, + "props": { + "checkedIcon": { + "color": { + "disabled": "#FFFFFF", + "enabled": "#FFFFFF" + } + }, + "style": { + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": 12, + "fontWeight": "bold", + "marginLeft": 10, + "marginRight": 10 + }, + "text": "Select All" + }, + "type": "ia.input.checkbox" + }, + { + "custom": { + "buttonid": "status_filters/low_alarms" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tif not self.props.selected:\n\t\tbuttonid \u003d self.custom.buttonid\n\t\tactivityLog.logger.callLogger(self.view, \u0027click\u0027, buttonid)\n\t\tactivityLog.productMetrics.callLogger(self.view, \u0027click\u0027, buttonid)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Low Alarms", + "tooltip": { + "delay": 250 + } + }, + "position": { + "basis": "36px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "if ({session.custom.alarm_filter.show_map}\u003dTrue \u0026\u0026 {session.custom.view_in_focus}\u003d\u0027/MAP-Home\u0027, True, False)" + }, + "enabled": false, + "type": "expr" + } + }, + "props.selected": { + "binding": { + "config": { + "bidirectional": true, + "path": "session.custom.alarm_filter.show_low_alarm" + }, + "type": "property" + } + } + }, + "props": { + "checkedIcon": { + "color": { + "disabled": "#FFFFFF", + "enabled": "#FFFFFF" + } + }, + "style": { + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": 12, + "fontWeight": "bold", + "marginLeft": 10, + "marginRight": 10 + }, + "text": "Show Low Alarms" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "select-all-filters", + "pageScope": false, + "script": "\tdata \u003d payload[\"data\"]\n\tself.props.selected \u003d data\n\tsystem.perspective.print(data)", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.input.checkbox" + }, + { + "custom": { + "buttonid": "status_filters/diagnostic_alarms" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tif not self.props.selected:\n\t\tbuttonid \u003d self.custom.buttonid\n\t\tactivityLog.logger.callLogger(self.view, \u0027click\u0027, buttonid)\n\t\tactivityLog.productMetrics.callLogger(self.view, \u0027click\u0027, buttonid)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Diagnostic", + "tooltip": { + "delay": 250 + } + }, + "position": { + "basis": "36px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "if ({session.custom.alarm_filter.show_map}\u003dTrue \u0026\u0026 {session.custom.view_in_focus}\u003d\u0027/MAP-Home\u0027, True, False)" + }, + "enabled": false, + "type": "expr" + } + }, + "props.selected": { + "binding": { + "config": { + "bidirectional": true, + "path": "session.custom.alarm_filter.show_diagnostic" + }, + "type": "property" + } + } + }, + "props": { + "checkedIcon": { + "color": { + "disabled": "#FFFFFF", + "enabled": "#FFFFFF" + } + }, + "style": { + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": 12, + "fontWeight": "bold", + "marginLeft": 10, + "marginRight": 10 + }, + "text": "Show Diagnostic Alarms" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "select-all-filters", + "pageScope": false, + "script": "\tdata \u003d payload[\"data\"]\n\tself.props.selected \u003d data", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.input.checkbox" + }, + { + "custom": { + "buttonid": "status_filters/running_status" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tif not self.props.selected:\n\t\tbuttonid \u003d self.custom.buttonid\n\t\tactivityLog.logger.callLogger(self.view, \u0027click\u0027, buttonid)\n\t\tactivityLog.productMetrics.callLogger(self.view, \u0027click\u0027, buttonid)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Running", + "tooltip": { + "delay": 250 + } + }, + "position": { + "basis": "36px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "if ({session.custom.alarm_filter.show_map}\u003dTrue \u0026\u0026 {session.custom.view_in_focus}\u003d\u0027/MAP-Home\u0027, True, False)" + }, + "enabled": false, + "type": "expr" + } + }, + "props.selected": { + "binding": { + "config": { + "bidirectional": true, + "path": "session.custom.alarm_filter.show_running" + }, + "type": "property" + } + } + }, + "props": { + "checkedIcon": { + "color": { + "disabled": "#FFFFFF", + "enabled": "#FFFFFF" + } + }, + "style": { + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": 12, + "fontWeight": "bold", + "marginLeft": 10, + "marginRight": 10 + }, + "text": "Show Running Status" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "select-all-filters", + "pageScope": false, + "script": "\tdata \u003d payload[\"data\"]\n\tself.props.selected \u003d data", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.input.checkbox" + }, + { + "custom": { + "buttonid": "status_filters/estops_pullChords" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tif not self.props.selected:\n\t\tbuttonid \u003d self.custom.buttonid\n\t\tactivityLog.logger.callLogger(self.view, \u0027click\u0027, buttonid)\n\t\tactivityLog.productMetrics.callLogger(self.view, \u0027click\u0027, buttonid)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "E-Stops", + "tooltip": { + "delay": 250 + } + }, + "position": { + "basis": "36px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "if ({session.custom.alarm_filter.show_map}\u003dTrue \u0026\u0026 {session.custom.view_in_focus}\u003d\u0027/MAP-Home\u0027, True, False)" + }, + "enabled": false, + "type": "expr" + } + }, + "props.selected": { + "binding": { + "config": { + "bidirectional": true, + "path": "session.custom.alarm_filter.show_safety" + }, + "type": "property" + } + } + }, + "props": { + "checkedIcon": { + "color": { + "disabled": "#FFFFFF", + "enabled": "#FFFFFF" + } + }, + "style": { + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": 12, + "fontWeight": "bold", + "marginLeft": 10, + "marginRight": 10 + }, + "text": "Show E-Stops \u0026 Pull Chords" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "select-all-filters", + "pageScope": false, + "script": "\tdata \u003d payload[\"data\"]\n\tself.props.selected \u003d data", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.input.checkbox" + }, + { + "custom": { + "buttonid": "status_filters/gateways" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tif not self.props.selected:\n\t\tbuttonid \u003d self.custom.buttonid\n\t\tactivityLog.logger.callLogger(self.view, \u0027click\u0027, buttonid)\n\t\tactivityLog.productMetrics.callLogger(self.view, \u0027click\u0027, buttonid)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Show-Gateways", + "tooltip": { + "delay": 250 + } + }, + "position": { + "basis": "36px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "if ({session.custom.alarm_filter.show_map}\u003dTrue \u0026\u0026 {session.custom.view_in_focus}\u003d\u0027/MAP-Home\u0027, True, False)" + }, + "enabled": false, + "type": "expr" + } + }, + "props.selected": { + "binding": { + "config": { + "bidirectional": true, + "path": "session.custom.alarm_filter.show_gateways" + }, + "type": "property" + } + } + }, + "props": { + "checkedIcon": { + "color": { + "disabled": "#FFFFFF", + "enabled": "#FFFFFF" + } + }, + "style": { + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": 12, + "fontWeight": "bold", + "marginLeft": 10, + "marginRight": 10 + }, + "text": "Show Gateways" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "select-all-filters", + "pageScope": false, + "script": "\tdata \u003d payload[\"data\"]\n\tself.props.selected \u003d data", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.input.checkbox" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "grow": 1 + }, + "props": { + "direction": "column", + "justify": "space-between" + }, + "type": "ia.container.flex" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.closePopup(\u0027\u0027)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "basis": "30px", + "shrink": 0 + }, + "props": { + "box-shadow": "5px 5px 5px", + "style": { + "backgroundColor": "#555555", + "classes": "Background-Styles/Controller", + "marginBottom": 5, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 5 + }, + "text": "Close" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "Status" + }, + "position": { + "basis": "200px", + "shrink": 0 + }, + "props": { + "direction": "column", + "style": { + "borderColor": "#FFFFFF", + "borderStyle": "solid", + "borderWidth": 1 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "36px", + "shrink": 0 + }, + "props": { + "style": { + "background-color": "#555555", + "fontWeight": "bold", + "textAlign": "center" + }, + "text": "Accessibility" + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "custom": { + "buttonid": "accessibility/color_blind_icons" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tif self.props.selected:\n\t\tbuttonid \u003d self.custom.buttonid\n\t\tactivityLog.logger.callLogger(self.view, \u0027click\u0027, buttonid)\n\t\tactivityLog.productMetrics.callLogger(self.view, \u0027click\u0027, buttonid)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Alt Colours" + }, + "position": { + "basis": "36px" + }, + "propConfig": { + "props.selected": { + "binding": { + "config": { + "bidirectional": true, + "path": "session.custom.colours.colour_impaired" + }, + "type": "property" + } + } + }, + "props": { + "checkedIcon": { + "color": { + "disabled": "#FFFFFF", + "enabled": "#FFFFFF" + } + }, + "style": { + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": 12, + "fontWeight": "bold", + "marginLeft": 10, + "marginRight": 10 + }, + "text": "Colour-Blind Friendly Icons" + }, + "type": "ia.input.checkbox" + }, + { + "children": [ + { + "meta": { + "name": "Label_0" + }, + "props": { + "style": { + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": 12, + "fontWeight": "bold", + "marginLeft": 10, + "marginRight": 10 + }, + "text": "Magnification:" + }, + "type": "ia.display.label" + }, + { + "custom": { + "buttonid": "accessibility/magnify" + }, + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "80px", + "shrink": 0 + }, + "propConfig": { + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "session.custom.alarm_filter.magnificaiton" + }, + "type": "property" + }, + "onChange": { + "enabled": null, + "script": "\ttry:\n\t\tif previousValue.value !\u003d currentValue.value:\n\t\t\tactivityLog.productMetrics.callLogger(self.view, \u0027click\u0027, self.custom.buttonid)\n\texcept:\n\t\tpass" + } + } + }, + "props": { + "options": [ + { + "label": "x1", + "value": "x1" + }, + { + "label": "x2", + "value": "x2" + }, + { + "label": "x3", + "value": "x3" + }, + { + "label": "None", + "value": "None" + } + ], + "placeholder": { + "text": "" + }, + "style": { + "marginBottom": 3, + "marginTop": 3 + } + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "36px" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": 80 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "36px", + "shrink": 0 + }, + "props": { + "style": { + "background-color": "#555555", + "fontWeight": "bold", + "textAlign": "center" + }, + "text": "Home Card View" + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "custom": { + "buttonid": "status_filters/orderby" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tif self.props.selected:\n\t\tbuttonid \u003d self.custom.buttonid\n\t\tactivityLog.logger.callLogger(self.view, \u0027click\u0027, buttonid)\n\t\tactivityLog.productMetrics.callLogger(self.view, \u0027click\u0027, buttonid)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Order-By" + }, + "position": { + "basis": "36px" + }, + "propConfig": { + "props.selected": { + "binding": { + "config": { + "bidirectional": true, + "path": "session.custom.alarm_filter.orderby" + }, + "type": "property" + } + } + }, + "props": { + "checkedIcon": { + "color": { + "disabled": "#FFFFFF", + "enabled": "#FFFFFF" + } + }, + "style": { + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": 12, + "fontWeight": "bold", + "marginLeft": 10, + "marginRight": 10 + }, + "text": "Order Cards By Area" + }, + "type": "ia.input.checkbox" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "32px", + "display": false + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.viewFocus" + }, + "transforms": [ + { + "code": "#\tvalue \u003d value.split(\u0027/\u0027)\n#\tvalue \u003d value.pop()\n\n\treturn value", + "type": "script" + } + ], + "type": "property" + } + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": 65, + "grow": 1 + }, + "props": { + "direction": "column", + "justify": "space-between" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "Accessibility" + }, + "position": { + "basis": "200px", + "shrink": 0 + }, + "props": { + "direction": "column", + "style": { + "borderColor": "#FFFFFF", + "borderStyle": "solid", + "borderWidth": 1 + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "style": { + "classes": "Background-Styles/Controller" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Device/Information-Device/resource.json b/com.inductiveautomation.perspective/views/PopUp-Views/Device/Information-Device/resource.json new file mode 100644 index 0000000..0afb79a --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Device/Information-Device/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-03-04T08:53:36Z" + }, + "lastModificationSignature": "5171ce5fe999345055760312545ae6acbd6adeb940d62bd40dc53c7eace669da" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Device/Information-Device/thumbnail.png b/com.inductiveautomation.perspective/views/PopUp-Views/Device/Information-Device/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..748c252995237627be4109a08f5123a6f8a88922 GIT binary patch literal 2018 zcmV<82Oao{P)+LDwmLZ@A15kfXe z2!TWdr$kC*Ig%nvmTbLjJuJzRWyzB5IJPBQmK1xj!n&B-8Wf&*Sm9)9IX@ot;sVOeU|_ z`{>c5X0zE)l24|aH*Y?D`t;eeXVq$TQ%N$J820P+I#x|dKA9N#JL_IlM`Y-yUpACZ zociG3+S=OL*#R&{U6Xz)419QY*wWP5Sn1fSD}K-dn8jfr5I8tENG6kui;Ei@8;>79 zW}QgA+wErUz@ow7aHLYHk&%(%;bEMqQRBf$Q7`;pP9zeSE?rt*U!R(qnxCJao143R z`!-8OqT%x8%jA8rSTvi>kw^pwP8Il*r9Swlr>BF#;Mmw$I2Yq&112%jNFexkG;AoXuvzOa#PYF`LZ>dmQ|Je>56Z z*?;2H3qNx|`OP%X-0$=GK%UR%TdfvHm&>)Zv_u3D8B7Yy{dT*ZXi#(i$x>JRLSjh| zPBI&=;tc^coMMY3QY-%xsy_I2ZE7-}>PMrYbh7mS;#YbtrSMBFN%2>!)eWVM4H@yX zQrX|%Zy&bXhyT@%@)pyzYu6shq>+&ko?8F)`M>}2r@vA@le-BoG+1%aT zt!bZiV2H0g#EX4wYQ%eA;U;W6o0_O;G#a8Sn!M2UfTZvnOE3I@ESJmCXmo073fP50 zAruN_vsvhtN+pi@d_EiwudlCHDiz!!kqD2H*u`Rz)9LAH8m80fnznbau&~g1gF#5) zH3(;}OSPE@!n`0X#7=kw_$Pqu%TF#^Z6n-=9jQ zZr!>?1kjM4QHOiv|y|=eV-qY4%v8=AH9*12)h2L2E;0L7J?PkCS9*j9Po6TG$%gK94 zgP$>7Ucl(NRJ{UndSw3cs=R!B2|AxZQ5E4j`LbtyV-6 zILUPYGxrk;Vy0(tN375U-n6yZY@!oRi5rZ8kNh=-|HaZ3e@$Djk@PDoD|PKFkENw0 zDp}~U?!yK)M?!&1Yin!br$WpQO!H!#$2N9y97g_{!vA9Fg}?U2*FM4)Pj2G5PCWQ= z6wid>gC9|YL=*i<&)CVprSKa|AN)ocU*HH^H;g_;H{+#aB8A^rUIPE?A%)*qOf26- z%1WY*>c-yA{zsqu>Ia{``Qr<3pFRIwnTtvMXiFaLGXkWP3KgRZt!nv`;bfl zs!*g``Y9PD-GiT!Q7?giv*!=Hx}A12I{cLeqW<{xSGMA9uGq8R)IRkwzRlg<-tKU& zX^b0<#+LRz7=N*MAo>vw#vYVjy}IHToPxpNe>4RG0oKg3v$IyK6_7xE`0yd8Ua!|; zv4q3nOeRCk=;-L&+#KtPd-v{%4PS@D!6g=4Tv}UOYigUwxm=D@{M~MMxm+eJI&ZJ^ zO4Jp9O^bl0w&#oB?Q}Y4W@c{OxUsUbQmt06UcD+l?7=2b2#e+A<$OM$&1Q)Yr~{Qt zLqkLOv|6nzSFS`Nk#@U%{rdGpB0+C-9twpB9hTy1E*OaV&`VF!c3`T6-mp>Y5H zeV5BcZ+5#qpU)E|6B84icTyUVdf^uWp7`i*Y-}tVjqdO769ljaJoP{&r~Q6E)GL(= z{tq5JfHCobGi_H_S4*W5&GF=3_+WJ2Luo+zAE;F1mwDLxjsO4v07*qoM6N<$f|Xzo AGynhq literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Device/Information-Device/view.json b/com.inductiveautomation.perspective/views/PopUp-Views/Device/Information-Device/view.json new file mode 100644 index 0000000..d00b2ad --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Device/Information-Device/view.json @@ -0,0 +1,447 @@ +{ + "custom": {}, + "params": { + "tagProps": [ + "", + "", + "PLC", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "params.tagProps": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 148, + "width": 362 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "Spacer1" + }, + "position": { + "basis": "20px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "NameField" + }, + "position": { + "basis": "50px" + }, + "props": { + "text": "NAME" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Spacer" + }, + "position": { + "basis": "100px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "DeviceName" + }, + "position": { + "basis": "205px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "/root.custom.name" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-12pt" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "Name" + }, + "position": { + "basis": "35px" + }, + "props": { + "style": { + "classes": "PopUp-Styles/InfoLabel" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Spacer1" + }, + "position": { + "basis": "20px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "NameField" + }, + "position": { + "basis": "50px" + }, + "props": { + "text": "PRIORITY" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Spacer" + }, + "position": { + "basis": "100px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Priority" + }, + "position": { + "basis": "205px" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "expression": "{/root.custom.priority}" + }, + "transforms": [ + { + "fallback": "Alarms-Styles/NoAlarm", + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": "Alarms-Styles/Critical" + }, + { + "input": 3, + "output": "Alarms-Styles/High" + }, + { + "input": 2, + "output": "Alarms-Styles/Medium" + }, + { + "input": 1, + "output": "Alarms-Styles/Low" + }, + { + "input": 0, + "output": "Alarms-Styles/Diagnostic" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "props.text": { + "binding": { + "config": { + "path": "/root.custom.priority" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": "Critical" + }, + { + "input": 3, + "output": "High" + }, + { + "input": 2, + "output": "Medium" + }, + { + "input": 1, + "output": "Low" + }, + { + "input": 0, + "output": "Warning" + }, + { + "input": 5, + "output": "No active alarms" + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "style": { + "textAlign": "left" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "Priority" + }, + "position": { + "basis": "35px" + }, + "props": { + "style": { + "classes": "PopUp-Styles/InfoLabel" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Spacer1" + }, + "position": { + "basis": "20px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "NameField" + }, + "position": { + "basis": "50px" + }, + "props": { + "text": "TIMESTAMP" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Spacer" + }, + "position": { + "basis": "100px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "DeviceName" + }, + "position": { + "basis": "205px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "/root.custom.timestamp" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-12pt" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "EventTime" + }, + "position": { + "basis": "35px" + }, + "props": { + "style": { + "classes": "PopUp-Styles/InfoLabel" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Spacer1" + }, + "position": { + "basis": "20px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "NameField" + }, + "position": { + "basis": "50px" + }, + "props": { + "text": "DURATION" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Spacer" + }, + "position": { + "basis": "91px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Spacer_0" + }, + "position": { + "basis": "199px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "/root.custom.duration" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-12pt" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "EventTime_0" + }, + "position": { + "basis": "40px" + }, + "props": { + "style": { + "classes": "PopUp-Styles/InfoLabel" + } + }, + "type": "ia.container.flex" + } + ], + "custom": { + "delay": 2000, + "duration": "", + "enable": true, + "name": "", + "priority": "", + "timestamp": "" + }, + "meta": { + "name": "root" + }, + "propConfig": { + "custom.active_bit": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "1": "{view.params.tagProps[1]}" + }, + "tagPath": "{0}/Alarms/{1}.IsActive" + }, + "type": "tag" + } + }, + "custom.shelved_bit": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "1": "{view.params.tagProps[1]}" + }, + "tagPath": "{0}/Alarms/{1}.IsShelved" + }, + "type": "tag" + } + }, + "custom.update": { + "binding": { + "config": { + "expression": "now({this.custom.delay})" + }, + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": "\tif self.custom.enable:\n\t\t\n\t\timport time\n\t\t\n\t\tdef convert(millis):\n\t\t\tmillis \u003d int(millis)\n\t\t\tseconds\u003d(millis/1000)%60\n\t\t\tseconds \u003d int(seconds)\n\t\t\tminutes\u003d(millis/(1000*60))%60\n\t\t\tminutes \u003d int(minutes)\n\t\t\thours\u003d(millis/(1000*60*60))\n\t\t\treturn(\"%d:%d:%d\" % (hours, minutes, seconds))\n\t\t\n\t\tdef update_custom_properties(name, timestamp, duration, priority):\n\t\t\tself.custom.name \u003d name\n\t\t\tself.custom.timestamp \u003d timestamp\n\t\t\tself.custom.duration \u003d duration\n\t\t\tself.custom.priority \u003d priority\n\t\t\n\t\tdef get_alarms():\n\t\t\talarm_dict \u003d system.tag.readBlocking(\"System/ActiveAlarms\")\n\t\t\talarms_decoded \u003d system.util.jsonDecode(alarm_dict[0].value)\n\t\t\treturn alarms_decoded\n\t\t\t\n\t\tdef get_tag_config():\n\t\t\tname \u003d\"\"\n\t\t\tpath \u003d self.view.params.tagProps[0]\n\t\t\tif system.tag.exists(path) and path !\u003d \"\":\n\t\t\t\ttag_config \u003d system.tag.getConfiguration(path)[0]\n\t\t\t\talarms \u003d tag_config.get(\"alarms\")\n\t\t\t\tfor alarm in alarms:\n\t\t\t\t\tif alarm.get(\"name\") \u003d\u003d self.view.params.tagProps[1]:\n\t\t\t\t\t\tname \u003d alarm.get(\"AdditionalInfo\")\n\t\t\t\t\t\tbreak\n\t\t\t\ttimestamp \u003d \"N/A\"\n\t\t\t\tduration \u003d \"N/A\"\n\t\t\t\tpriority \u003d 5\n\t\t\t\tupdate_custom_properties(name, timestamp, duration, priority)\n\t\t\t\t\t\n\t\tdef get_active_alarm():\n\t\t\ttagPath \u003d self.view.params.tagProps[0]\n\t\t\tprops_alarm_name \u003d str(self.view.params.tagProps[1])\n\t\t\ttag_display_path \u003d tagPath + \"/\" + props_alarm_name\n\t\t\talarms \u003d get_alarms()\n\t\t\tfor i in alarms:\n\t\t\t\tdisplaypath \u003d alarms[i].get(\"DisplayPath\")\n\t\t\t\talarm_name \u003d alarms[i].get(\"Name\")\n\t\t\t\tsystem.perspective.print(displaypath)\n\t\t\t\tif tag_display_path \u003d\u003d displaypath:\n\t\t\t\t\tname \u003d alarms[i].get(\"AddInfo\")\n\t\t\t\t\ttimestamp \u003d alarms[i].get(\"TimeStamp\")\n\t\t\t\t\tduration \u003d alarms[i].get(\"Duration\")\n\t\t\t\t\tduration \u003d convert(duration)\n\t\t\t\t\tpriority \u003d alarms[i].get(\"Priority\")\n\t\t\t\t\tupdate_custom_properties(name, timestamp, duration, priority)\n\t\t\t\t\tbreak\n\t\t\t\t\t\n\t\tif self.custom.active_bit and not self.custom.shelved_bit:\n\t\t\tget_active_alarm()\n\t\t\t\n\t\telse:\n\t\t\talarms \u003d get_tag_config()" + } + } + }, + "props": { + "direction": "column", + "style": { + "borderRadius": "10x", + "borderStyle": "solid", + "classes": "PopUp-Styles/Information-Device" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/EditItem/resource.json b/com.inductiveautomation.perspective/views/PopUp-Views/EditItem/resource.json new file mode 100644 index 0000000..bbc3a18 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/EditItem/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "dmamani", + "timestamp": "2024-01-23T18:10:43Z" + }, + "lastModificationSignature": "1b96542d60ef0dde6c1268ffafddbbde56f196c33fe7d4c32d616e0e835b8165" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/EditItem/thumbnail.png b/com.inductiveautomation.perspective/views/PopUp-Views/EditItem/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..e9a8b4b90bbd6013a6c21aac0daabfe9f738d4c3 GIT binary patch literal 13173 zcmeIZRa6{7*Y8b$;4tXm?he7--3gN5lHl&{K1c`}ECE7r3m)8EhTyKj9R?ZX49|1E z%XfV@=klGkX05L7o~rJuy{mrp-+N*;)fF(&NYLQm;4qaGWwqhp-W0;Vawtf!Gg2{O z_Hb}KqDrz-IzA>RxwqcB^WDGBvVzV3ab`AHRer19g?6as^m$oi7r6QV)kTg#gjXt| zr3)ot3DJB*pz}rZ4EONIS}Qhgdp2&057}U>ii72d2sDQkm3le$s{daf1X^+9GAZQ$ zz5RAK8d?>2CT>{v0=yMsDoWL+*Db|;qs&~SqqV+50(d=8(xm{h|M${IW24%#@#n*> zL#%9fYu7Sh~q$}?2>6tc4 z#}1^eH(-wkqC1Sv!|I#vR7lItW{pQ8_wb`#Sy{~|l+y9=BLX;aQhkbMy=F)WP(x!& z0f&g;&^PpLZJ!gWC0zYfmp>Hr?)h7QR*|j zt`KI*-8p(P$0Wsecdm#aF)-x#H~-jVBMsdQ@^*&Am)^a0Z%T_p523FGS?AXW?>)$4 zA_@(XRhV3x?sjP%CX+LHDlTSaOa3KB ztm&c_tapEvnOum)fP($vG&r%kEqmo1W=g<9?h1%g#)v+hi5pSGLZ2X!cO#~M<>>R0 z5lXnLLwTgM_6n(IoJ|#}b*N!WiVsQn}Q=H>f(#Uok92B&bx8<{!MTxH? zS^fUzmoO4KK%6lD5|v|2otn0bFt_gZr)ezq@f8wH+~5xJ=tz+H9q%fPHTS>x21xHDi3=i z(GgItUBf`$bbbSSu1^D)@iT;$&Sq6its!4ys04+MzG!QPqt82ULUKi#U0s1nQX*zt zS(|os5>2wNgUqMPuTOX{M4MoMX>Dyy#0G@6$fJX1k;-T3UXbY0Y(4xk+2!wz%J%Hs zlfO%8gWg$NGqxmx9YV(;yZ?Pp_i-!?uOj+I);)+agq-MDS*7u0k2SOo5;~s-o&Ue4 zw98eHs;!)sY7T2u$5oe=G++G1@1#FLs}rDn7HSHB*~YDY+Ty1Wz48n~R>e+)kL*C# zDnoJ8=XM+4&pD2}-qZ)T1!=!`S3C5Bc^;;nl}5`C^`xCwSz6Qh^$}c*zfT6&87%5P z_InjQtIE@k=@B-!v{Xh-D~mx}W(M4bl)D=mC1Cy$SAMxjo)~e*m$1PP=YFr`v{JmaEg z|6`VTr~R;k=6c6JVcJf_HZ4y~5yLH;LW;$6h{3?wm=^AYLq>A|@*#~GND@|wz%H~FbWh|e9 zQDCN&QO#1@jF3bb9FbKo*>*F>@Kg5|e)5!NWc`i&yyPdV&omtGu(2i>WMvs?Sy@TJ z=7t-GgfZ8JABPlUBj+LPF(Ns!g$D}Qzxxq{6A1ioDdh(?@%#ECdU|K!054phtgL8g zhVYQW#a80wS$iNwG)FdQSbcKcf5#aPBjdz>yO=r0ph#h^h&F9ZfmMIXM)&NOLeqyj z&cEI5u`&2Vl`Jk1k=Q4w^u`fsXx@Q)32UO#SDk$ts{ zizXQZ!=GebZBS9Z7nyoR|5;FHMDK-^;L=ohRpUFI9O5n;??zGDl;>Z6A6|%H7RaeF z8~gBAaCH_maf*cxBvVis#b;<;!pS8KuLTKcWn_d$g$C(R3P=4;4DzT?x6F%zq{TUx@%T9#tm@sA}`QDb}a1yJqf(p1u zpO)z)k&w9>#MS&Ee|CRLls`PGz4d$vg6(mW+dcgLsabF?v~Ak%+C!h3u@$LM#_?`< zGB|ea;H^i~OhLgf)RTnWDM6tjzLtBMf)w?o2= zn^`gz+3!io!LGicsE#qgo};h;B(%9kYO&0f4{x?CuATabAz(-az&yD%D4Pc$nA z;q;SRFr)@z1Qy~6;+&u-7@((QBa0^ZA%0HZ7}&i+;kT((Dpc58!Ts}Tg<_ryWw%nF0};XkJr}ZF&}77nODdV9EVL=?vJa)d@aP`2@2~H}C*l6oDk6>QbeM_8B7&%5D!5HJ=@r|7JhD+?;g?x30G z{MnlpS5mg0dCFKxT+f=kYdCFKX)Mvfv(#4hn6ouRyfLbZcsxJrN~)P<#-0(Fs+?qX zE%B7yaW`z=N!xSLRR5v4-)zl?pv!;OCHBfxE3rA1RFFYHn@*|W6eZ>3WBj2n(!(x@ zRSZR%q8iZ#+-)h!;gS5dl;t{T?n%^ECeWs@ROca5yNu&$FhDK`5%{&&*BdU?sgF_g zMYs3cnSNxfY~;zt&FZgxBj4^Zj+i2aY;Dc%b*3aKFAx6?{fKKG9Ayl| zoG}oKFQ5eV({NVv$5LGY7Q*8T4;05r`(|{Ir5jal;@y^obL*GXNWx9xyQv<2_prc^ z(WRQ)6lj1(FXKepeE`#WJ{CEbo?7~>R$>g`3|%r6%k(N09!gMKsxf1dj6u6K?wPLj zPDKoC1=67xOR{{S3VNA)apS}_@&DZI8U|D4pe{63;+A^~v(SDy&Gulfa zU#DwASM%Uf=F?y>cD}L|{xg;LXAuMK)FiolO5jJx$dwxF(}*MIdehR`$d!sV`8~zK zLXdG;E9BcR!b8rcr?%tKNpToj1hxbrFTaUhjIOV1GGLdOrxn|~nr-z_3H=l*Z&}Uw zc20l3Fjf0O=2irSb~w!#@A-jat^9^a7Iv=iMg)x(Hg8;KkG?LVWz86`rMUmO0IiHl z4rGkztk3Sg$|W!CI^Wc$kxKM@{QP<>Qu*=uswZ52h8QfOPxSY* zd{@cNP!2vdTncyM>)PpDvXj;cpegt%F-YZTz;dYMS>(b4dY59ed|ZbR8;g35vuS3$ zHt0l;p%48a)(FrPPk(UzSjU(rn!fw)K1)n>K1uhFDH=_ZV@C`qHY|FP4*9E2@a|LP z>e)ol`ql5W+R7J=*N!?Vixbg{17C3K=V$Mfwj$cPzSn}OeH~MiOTTn=-w|^Ydi6105N5jw#Pf(jY zb-EJ%5aow>(BQ(Kx$*CmL0Xyf><9bFgkv(lm1k|28SiL#N{{5}@+_uaT{|T+ml{yt zmu&hwXVZtDxowq~AAXYe6;1hz>j@Aw*c~T|L@cAfM@jW!%J4c$f8Zh6Jl%x3DFe4x zohVkyEWxQ;D}ztWyE^k1l!8u-C()ApNM?-!7kq3d%>XVkCQ0UsFyhjq|wxSUg zhIZG1hhXN%$mBfrYfQk8mP0`!nJuu`LPAxZ)F*Ors<0u<-5bmjCmVTNH?lB`_pZNM z-WIcre!<=cy$>dBA8*7UFxGvZ*WKm4w($9Z$q(YmxyIS2B#|}$2;?v_lC-iy zby{l$HMVH6dDT^)b8H;eX zYiTP&w-eB&=v%53h#WlZ1HJTha9xVG47V&1ObzdDQ7Pe==<1pkA!6dh+inTnzBqM3 zkMB)ro&S=T9O{489^UKvW@=xJ^Klpr=Hu&CWo^HLFd)3Ffc=_evPlL_%cFj?IQsb6!wjv*cyqF5l7&?jtnd{A&DpUqmEipz4ikW1h5&8C)2= zch~GsDW3qeUz6-Kv@D1d*#efgp*lw2C_?w5)C3o1!KE@EkguyL50NE%#9#jC0nF#A(p zuRZT~a3yV7qQ)ewf->Vh$PzRpSKBiC`v&rVe}>OxFUBS(i{D0gPc)*~P1?B@Q?)2G z(_d8Re#gMzubyx2LV{U@j2+NMGB2Nn{WTD=&cX`+poLtG=dYk|8yxLlOO(ZLF|h}} zeMpY7KGGt;9+D)hb!CcOrFIXfujhc9$NO(pA^OyGWwQ0gNnant>-kc9oc-y5dkQY1 z)D&R-d3hrr7KrfYc+HzT5S5g`=bnW5 zjE9U0Wt$rm5o`DKI=j|X)clCcy|mzYZ=`%DKcWhwDM^??M6x(jO32C$($Let<<1Y~ zI!fR&WItaZrmHHVaSf*Pij1V8=OaMX>UOC;+}Jt3fdY+>We zf8ndyTd|w{v+t%d^qN1`vT~t8w{bO>n_|ALsR}x2TWWlQ|C)l;)jN(9t^|1b;o=*B zOe3>FNEA0yuhXY+f^(a_GwViS*hu|J1AB!H=zxwA_M!*);NZ0IJu`l0Mi$ZGs`oSm z&S7~At!@}YV0~4P=~?3I_HECkGbu#wtY1&Vb~pFQne%m*?xlO+Y2dKdhDzF3VV)9R z_$ZpFUK~ERsMXQvnu3r+Ms_@yO`bm+>sHCbKeC7A;^h{WV!$4pR^+u5(Zt_U@Z%?m zNE6Y;QuW%`>Z5uChoxq%YudxO2W?UV*xptRnUU|>kDZL1JRiLOLrbJv%joZcr`u|3 zyyej3Xm9DEMTCPuOh>(oTk1e7D#<|$1GkB_0`%_Zg@{Ncak(Dj!~96F+FZ95NvnE1 zSgSrix!QTDS!!mLX(D&GW2V5d)UAQf^+}-jmiUVQl2yB`QKJ)7wYkMmm%Jp2SvpzD8#02xZo-^5@fVe@oVcIb@ z%>0(px3urwGY?6-rtXo;ZqZZ$!mJ5CXL7=DH5I0-F4*qPRvrC^Khre?TL{fea$T5xQc(wj~9R@9Lnt27W;YE z+inCSW5Fblw*XFUazRc`}G;iW+GSrL+2i8~y zVb6Z4D7s&KUBg?OgA+MdJra4&wO%tvhC^hADXp(zVd>msUY-TD-W0_eCknGud;yo> zK)OLnDf<^H4r71h@B}`a?`;XSr|)=kPjF7idWN>hJp_PTOYKl5ksw5wI?xb0Nbagn z%zqt&RvP6V{F@;@osd@4m$D@}mZ`j2;i48kesa8!`L^C@d)q$TMw};pctYJnW4%AJ zRC(oI7C+zuF81Qv{O7GO-SYX#DgaKm5;o=7(G4Ikx3J3m-U19-?+2 zRtEM{TqECbs3RU1e7WO)iuyco+a;0ptSnP*lm7dt72it433g}dnwEF)9z{BVpT7c*O)qIbP03jciq0y&JkhJU-Yy$pZX zBFG3i>|SBB* zxD)GfQu<^RWT!V{7&N6@)f&)gm^+~Ju+1B$D6b8SgG-WHRtD6T0N-(jE<=2Q^Ll{ie)zwbBZW?stKhOwxb)XTZ zXdIYKT=w(-kIersv$NO+HkFr?uB@!|l^bn6dbaj^HSv*K3oi#q?wa$kxe~F8_muAqTSM*A zpz?PNn06e`n zA-;AaHOSQp*f-1t1uNHF+ehnT7V3 zWGw$Z7|#L2$U#LjZCNx%h0qF{1V3b84QI>)ziVe7@q396j;3!6+GWJ-ES^H*?v|{% zcu%8WPp=4~FC*HQWFNRt^JGOeiA359XmVOw!p{xO2st_`#yvr_%io)S`q7K!t2ZCM z{Y4SOj?GyiyW6i{Aju8s34{OH7bR`)HrP>v|LJF(CfiU%Qj-Wwi~Jym?F)^F?LbS; zO^eGc!M3TSP#m6+*^DK-yZ4EeoS|ajAh`E!L4kOL_j`f@E8hCXtkjYVa~~}eq{L^> zSO1`c5+xQf^r%&bLK{y6(=(DPA{0N=Q^drH$7~PQ;gGhFuSxkQ2h&hOX`8y4!cszE zI_r96*~)+k#x-yEMWz1c4o+mG`+G%YRGG;g-rw)yxPx6uZt!{q^-ZHUj62S+G33ws z-s%ug^dwe_50QQ75+RJP85||G{#C3=o)Mehg1pZm8ivRIB)IGguOK4N?al&NLuJnV zMkIAyrFm`qO-k8A)NgMu8T)JeaLf7+K30mil|1{-s!{62K)=o71^BEhKtbsl?nDwF zRsJ=vp9p&L*ZGL&Q+e6QB6GiAqza&NSKl&#oMY|>hbo0Br{Lq2Ep{s_J8mB3zNht- z{`_X5>#=caF%M3XKTxe8?f9EV8WOBsi-1jUB0J^5iINW(>|<0sBIp_GCXxZoO_}6> z*n*8=ZhPITnf7-Il;81}>wv!-j2{|WOFfgGw%s!wlgW%4Nf@C@n|Mf z?BD-H=_U9`Qtjj+X)uZCho!KcX8K4{JUFP;@xnBLF+tn2jxjocl0!-%?Ip)*P!M(z zWlDzx_1DVMi4EmBxI5^4VT1^H=CiiIi#>^}9AXp&K?MhPqGD7FLSGO?r6T z*C9r6jut2F?ahkyU2$MIMQ*`~%i^py#m3oIZhV*x$4A7qtPNf&h~yY;d|>#IDN~K% zgDMiDLQ&zLHjF^L3~m8!_}l?Nv0WB;Z7mc58kWzUscEnp0U40TxB5l%Fy!i6G3&`# z>m7}P-~MJ zj0OXQgnB=<>24g7b_$XPTC%=cgYw9MVH|Z5c2$Nt!L<+pe#ic)owu^c{#!Tm>k;bp z#q)Nul!;Sujjt3fK#~uvPTVprhp14%zKwY7GHLauf%HA|~J z#@9?-T)4ghDCM-wsS_#1Vm5wAx(1$n_W;G5r(O9XQe))6D(OI2V zt8xNcRG-v!*f}`1t|ld3^d41%o-n=#Tyl#)UDxr=KYK|)$AVr4DFY(_;&*Vt59gKv z&-=+M&kuiK#@V@EmY$w2i9#L06iX&QnI{I5y_5-3cwqQQ9oNf6^U5l(Ecw5M|LueS zw{}q0-`{^T4>PxENfm3!So4mC)*Cpb92%Ot;_LzO zX6*RJMo*TGDlq;XA-M9fb(Wp+SsI%L7me8gpX?fHl%<-N*5|J~8y#Q@159rfC^K3W ztLY6EprN6u@rUZ|^Z7M5x5RF6jlTI@yCm^b4JkapsZp77hJ%afnkxpoE{3Zv?u)Co z{TCA-T!mhQ{Mm!u5Lht8rPjc#;ZL{m%=`n==FTw9G47@r?k(|82%8>`2}c1rsCkfT ziLVkJqkJU;{3%MV%0B$#%wN*@QR*Eukc~#QK-V8KY5PGtZsJ-`Zxm%1WL9~FtvMKD zQkMo7F49mMvH^+YS{X`L`hN$!EY-l`01w8c!rE(bMd;{5qr=^IeRO3>^3r=1p`M^5 zloBqV*0_%;6DThmnzHipX06d`5#gBreZGnz5~5B*BbF~%=29gvFdUQp4Wz4?)-ea zf4B~uHp?`-+rGJI^)ipH22>Q}X(1XaW}=u;YAHB}W)urNdLwrSw~DA%nYal$-*ACy zmCSE;7fE1&aAytOpewj2Xx7DCxkR|34~dgW9xnBELJE01li0`b(^IrhI;oZwrEkA2 zD&YM7ETBGzQE;nDi`6er+g?Q3RK-SRNG9OzRp4SuB8*gJcIkmBEdNW(C@a1oR;3xd z92Zk)E4VxxB{|7nl9MMZ^N}w~0b1kkkLc&`Y*A7{=7@JyG8Bu;L&@C=&UE=*1+dJ$ zA<7X?0-wG+R-G6e@)02sj?!{xK{jmjDlBg@jxR+O+m%xsVejud0FsT5NRCyJ7hqZ+ z$HWh=u6KkV#=Xz{Mj|saS2@JNA>-)Cj1)bwxmt? z^L=_H(C`Xnm||FahFqvkf_HVvPAO#FwV9&^25To@^cM)&A4tYR)@%_lmMytOM8YLc z%3~By2Nop73?3emfpz57_Tk(!0x^dJJk7j;z!rjpW;a{J``!D@vm=>5ndYTx44F5u z=&4e7f_q9$$Ab!)C{M^AOL`(9Z-RtkH&?GsTw&$D`-n`T6IWnelk7@|H|AjC-p1ic zwqhb`M2b9eHmkM5e?0*FE(YAK=iqa)w~*|Dp~7RGoR<@Rf3_Q zg3BBY-dW&svvlX?Hjc)u?hHL%)8eH|Gjs95ukFT)QMDQLS;xVVC(U0ci99&?7(psP zb?8DG<$pNkVueD${AR%>womZ|ZlqjtFF;?_t-X!S};C>Q>n5_iEw$72`d;Rdz!zFA22 zAS3)WK~>8{9w@eoQr}EdT@G-(VJAAa?*&#XUSnaHpPi1Q#8%2V+rPu`BgZhHoxUQS zS~rN^JYdbFs0g`j{B(WmQSfxkq*v^AW!$>4dkCLvV(`W~s(TB5o&0%WvlWwK z&18XjB(UG1+ib4atftGlmD0L1TmNJ(|kAl;_6CCsywA*|77HrA4~=fc%*&(L>fn6Y`;Sbl(-Mo#l|2ptc!BDV z7v-LXNB&s^KP#GOw;MUVGo+G8q8(BDwfoN2w&~~04}1%G&Yxrxsrp5>Hv_Y2HdeMm zP4&u7EmboeGr!~vSWYcW4ICSk-+Xe`_%lc+&2}-Rg%8Bvh{$|<@0Yc+J2$QER_YAR zt{Kk%O!>Y3(H};=O^od5O_a-nR0*SOOHG|;yRPiFtexHmPsD1Mf$3?kFjWi&zBe~F znC3F;N5jU($4E%$R>#d#wXrPAjPXcxvwls=wDOda}Gh@9uc`zv!QgnOs6g2B5I-wB`}In{4lxFjO@qOI zV=MgGm{nC(FxxG)C^LeEuwU^RCYZy@Tkl>oJ6SmXTPT}*iFr-Q>~PQ(&c%AY|7%%X zT-<-|FFib6ZT*otP5H;U^QrOp;Yb|5ESgG-bt&zqdr2WDpQaq;kQ z2nnMjA|hZ3hqa29Uk4Zxv`CH~E`lwcSGsP>Gr%j0ptdY5{5j8p9}p-l?1>-3^&Ubp zI*?MtAB&5NFOC;^ME$N&Oam?=3zRLt4A3Mfk!14@yx0*9pIt!Mc|ET;=D`hj^FvmT zbiYwwAYxx(si05Y{<|Xt_XwsIflN%55xo4i@kfJCYH1yLt-*T?iTVv7D!Xob=<@mK z!rWOJOkFk^VA0WJ3Y!8~EArz$z&?TsmY(KaLzt`_!>ii`$7L&CLxcxqu^K3E< z%a(cGFh(t8)W{29#z@s8`P)PwKkY2{G61_W9jr<$|8n;_0unx^dPGVfTne#=%bU)f zTkiOv+DDPehoj)6|1`OFV}894-V1iO3BdcVT#l3X>=;@sOB9&Gl{{j)>U^6~Ykww| z@Y33Z`a-rAqu;UB@ly8x{gCd$LCvOu?IzutpS60_{If**$oI~m=lea*6~62UhwBa zf|Kk%VixPmF8;fgiogeK&u`rkYMUu-GDObBjc(Fcr>0CAUZ5WYG(7qejeM?seVC-K zz4C*OuI=K<^Ya0^xXYvs8!H^3Q#)hy-@-|W-a6~9ltD;M&wJ=dE92x2-n}@E`Q28m z=u7uDC&jX<-1(3$VmRM!$$l#fW$?p6u@B8@va|+AFa$B_Bw<*Jj$A3QeT?gC)k`+Y zw}mC*K5lawC-8gS8bt=pAZdzaZhLgEWR~(x5WXtCMy^9r0 z?@9cR3AN(NCw2JH^dqZ(R>(hFqTDg_c{t`?YY|Tv`3j$NNYXQyl(%s@P4y0|IRBR? zkP?=%&et;dB`X&c+Z3FnvDT9KZ^sXF$v&+xBp!SPb^e4w2%?kxCp(wep!_^ zHs?lDW_7uJ(s1eMB)O@)u_@t@nIH0PSugDX=CndXA2;j+0v=URX>E}%DQTD*|6y$n zI6sGo(Qnh3&5eEeNj%!Y@c8}`t||aRbTaO~-wEXg0;{R&eNn^FJG=WLk7CMl6jm3} z7hFBiax>Pt7iPV=U7xYC{+(`Kw!cL0Y?(Z=cw!r8P*`j|oM|ozzm2916ch`l3@5U1{}8MupP%?HXJCc;(=^6lw2r$|5cG&A zcc)sv?7@WD(CZ9>ig)+S!2R9^6gpob*`Zs48}Ix@?{}~+-C55!zppEN3}Rk;I{qe# z;Qx__R_UO;@ui^{t8q*`;2ivYGpK^{rNeE~jp*sBJ810X;yo|_n8n>1V`iSAG-OO> zqb>>CwE&qK^Y$Fv9=+iI7>|=A?IE=n~ ze2QMs6$}CNy^KvQ&^)qCZuU-!OIdBhui^1b?-cO-#~arhI*BWTqZBSegMou*h3z$@d;k12J^v`=tzvj&m^rio zZp7LzeS>G2>(z~VHQ&D}6A{r&PEG<3+wa?q3~nKmVsg_8|BVxR6xPb=GYS#4e&-5*nDQCe^-s`@mV^L1MSu61ck>0LB2Q1If zMmLA*W>B=iDGl2mP0&kp^um|v&BnlIsQ3g80jP1)7y zgAEXWjnA7=;ht#lVTs(-)Z2K=>$R9Rwvbg zI-NIev{vg?k>M4TxS8On4Jt*cN8D<(>br09)GTJ(KO^LQh4%{y@B4e7_d!2=f5#JQ zW@hHcBckT!=GNBMHZ8TZwCFBkR1`k`M?rysfdK&lo}Ql9wB+mSOX9k#8PXA;8K4%} zd3kvyCMFgX6jWALmX(!dWMqg$B7s2Q?d=Vwy00-Iw$lVAA0Hp^Dk&+ENF?-OEiW&3 zbaX^VM|*g9umLEmX~L4=7#0>bG&Dr;$z(E=%bJ>+y1Kf-!NJYVO$681*Go%F*#MNi zG=UOjF*rCFeGPehy1cv`5oUq1mnMWlNnANRJd9hEP9P2n z3JM7c0cC&#ZdX^=!otGs?d_eNowT$xv?&IGvXmx>Aal`hfO2kb4!3Y62m)3@LV{c_ zN4{eL$Rgv>#=7UbXwY9adu;AzCN8*HLa&q$C-d=xyzlJ8hagDkO%J_GHo}>A< zh%qrvf=*vwpEkAsqKSA?QWDmS#bO3~5qoKpqS@5cq{&=DEj2Y2@sW`ccXxM9rV}rt z7oo^vJyWM6_R`GF%>}j2&Q9(62x_shu_&5VRaGFXiKA}D$H&977^JvNKP2Ko(ru=u zrnI{Xz@ck9Iy$VOR=yi8Ah*(OKlt`diU0vPX-Nk9g#l?jD- zf7a6UKd6Sq#l^s+R4S3eD5l6_I1xpYT!0;jlOZ3o5wPm+Vpy@4rvJfMUQtm2dxF=* z#6(e1QCwUc?1}1$QK`PZ9@$ME;qZ>C%2bXMv6`m;!L*c_nTgSdRtsd;*4D^xaS+-R zW>V6i7|d}Z3V(_py9H86d0b$g@9yrFN~KFnOLDm!sa;)N4XdIZksQ~3)8L{oZG6Id zg@%Tr;h-;(o+A>8$nQyr03x31zQB;E+S*$CBO*t&92^|%?Ci8}b=NT`Dkmq0;-oL- z=jZb{=}A;xUY;&sPXAjRO?`@^sZVh<^(l^~KE=`0r#PDW6l-bn`N#P9sKkF3Avb*0 zt@_ck$C&dDBC43y9tIa{X&w@f$5$gG;uC(_;%Pzr=Tn1;g*4SPUNW<^wKOsR*v;(& zt8;2pyz>{Y3Iy)vXHMb9*wpf(m8q?Ri<7<0%g?JGpE9=e^zyoDeO7xbLyLVhk+ArF z_x8j-y}BfkKBVc5>laR1huzrT*_KM@pD5%)(^o(JzK^D#jEQG=Y5MC_hZ82w^N&{s z@AfP$KhE+o$NQT4U{JA@=G#Ay@6X;YppLyE*`sUXJ!*TFrM*QIb$sY|y8Gt!=*lko z(b#Jgb!&KKr2Q+`qDGolH2=`JPSfLEHz*ZN)h>n>YiZt@*u7tuNKtS8qIh~U!Sz<} zBiX%T70o&N&bOkts-K>UdrnZ)H}}N74W+JMHq+}5BV6n*zii?96u=f@J^z002ovPDHLkV1j|E?NoyLd3`3^8fY|O0IXd)d2GWnWG{6^#pqdv?hW|HtXSe>YbKiv(2kVJ!0rwZ1yugWkK2Ckug^honnjAXPL%1(MVj~&vdTa}fl}E+@%^N}FRSy(;NFsUOMmwMApnJ0wr2hS}>-|&L?FK7Af@j0; zImPEXcAH@-JeFqg`F8W$kS|Oe>U5c#pv=O>*?IPJ zqTIIyD7IHTYlb=+|At0V^ms^UXA23uC5;=c^x_&EK!%qWLq%DL8MSj5fr&a?rn^oV z)F=6THG9_zczvXkj8yyeFE5a%UAk%`5&ka3EP&44nYwMr>X4VA6aE-`lh2b|FN$SB zIMD|{x4iGBFAKvGF{!ulzxUB>nqEJ`qy4`o`n}}Qv2%IHdfMcLH*L~ccppm3Z48H;MVOm@Xim`(^%ZiK;a2VOLZ&}u-f^* zG1%Z4F?AGqb+^z2m7A~F{b@0jcq4o;oMSDT04bz9#t2S**M zsaIjO(vGz^-z=vYf{X!yM@vB+RhB7)sc{UcCbR-eK1oYo8`v!?#swo8hz;p=^n9z9 z0-~!dX0aEdO*u_MI&$1Ze*gE8MNlA`ti%S_8KN9f;y9uV5*&@EqWzoEcXw4n&OOFE zzYVEljwXafRE1zGtp_ubL;8yw1iE>yJ`};zl9v0|(1DHNY-%-0mq5p^L9g>kw7l4s zO;T=!72jVWZBqjk)h#lPUA^UXOEZCmn;}7U4~k>Mzm;A-EUfutEjcH7{+TR48i-qU zCS|?4ce+~jm8$G~dQ<25icqJ62lF;OeJcv9wYoAkU+#Oy(s)mwPWk^*4>x}L7`i1$ z)kgaO^K$9bCc_(qtut9}8hgd+M$b;Gy|UwooHpJaF+hjfg4={qDZ5P9F7OS(2TT61 z;GGH4nrLZMQ$0p<{asy7%TGKqK%*jktMzfqip?r~C5|4yD_Dy*TQjhedvlUF2D|x` zn!Kjj@hPCr%5s>pIbK`GM7Vj)uR+fv)O09f_4sX%q36Ax?KFc$PHb~z(5fTV7>EAS zW;C0~bkfNGiP`#MBQo*)U>}crcPY?vvk-Myh8R1lAYL3UO<}G$@x5%J)3d;x8AGbL zEDj-VRAYX=(~fgBS0J$06>=UP(S4Tcv;ERD;4JsbEgN{DUv_YGuO`n(4hm;9_Bm&; zoIUZ1T7Pt+QsV4#bZqzR+3x}0)NN!2S}sde4C9EN>ZMbP4p|@7;3;wTC_1))7wQJS zM-P;UUd3PQ=+|*6EkvmZY<_rf>d`iL=On{y0zQQ+mG(OF?>r|K?i42WgR6r#-Yq^| zKloe>3R+(M_1+DSjVth35L|Bsl2#+RD4}e3s+`8&BJb zvN4TJqz;%;-5^LELAm@hi0oX)5JWh}zRC1ZSsUuBMO!IBbo8@8E*aDx>u`A`cgbn1pP zgvzV`b?uEz8<~btLm|Q}e)jw?lxY8AcB5(&zO=K^`DpG6QmZE!M(lt8YYaz_c}K2y zN-jU^c|Mbz4dJRKeYz_`628oKkA(u~{`vfV~m&VNci(Z)%>+)>dEQ+gX^ zyYyjjyKDi4j%)jO{?Wz9(8US;k&6t}_D&ueBsMj|nRg%O*98e~25`eVFK4E+;qX7=8}>`6!7n6C12V5`DjswmZ5oq9 zi1@}e7w>3{h90)qUmBrxB+PJ_FlmCzbTR2qIcPUR%n1(FFVtszI8X~Vc;m#LP2XBU zHXYbs#Fe2f`mrmYh2=uGSsRNL;S$6+hWH3(4SyX1k}F&qNl|ee1eju*wL0ykTzw7Zq`3P=AdrWj3-W$%;C7U%b zlp&-VI=A`UEZcy~N^?KlmMnR127KDWG!POn72KIRs)$QdTMoTRg z%T{UZy;hv)|8batDG#4-)h32!)c+Hg^Js@uV8aJ2bTuVy3D*M7Bbtp~G-{)T`^BCY z&to{*y~AEvawo0t9;G>6zh0gn({j9DpKm!uYg#Y1rk2dYuodO7YYkt7k188RF?jK8 zCdF^rL=)ZiWbh&vwI?@!$61MSA?>o(bmG50EcPf?RdNe6=LWyryEPEzw?5yjj@8Jc zVv}h(|GStFg(Z)D4Sqf{Rbq;0ZQ1a1C^ZJX^VT_ zO;Sts)o*^Urmq$VNkSVC7bOdZ@=xwzZ9Y&auK>R?@q z(iKqBzxi_0Qa^1+7K>U5|Fr%_9@8?k-LlOakEN2&EY6+hLw7H?J=8TlFMef%-&(gL zS}!L=$KuTO@@8W7QFvQ!YJ#pSG{u3WTO!|YlBW4Oj$4e z&IgIXjkBuJ`qmi?aNdIl_R>sEHhS(MS!3R`lkliV)FkkF{=zp#h=QN5Rka?(Gd2L% z05W(Wr?=)YtKxb+uRHuL_;K}uDpvJl<1w_1$&#PffASozjU42;r6)1G6U-`DH2eV% zc3fopSF>uIy~?}|`qV*p+xTo!&djiKbAjH@c^$))YvJ<&0;Sq=sEPlHw!L;voHWWm z1hw@!(*0bxzRrO1$2a|ss_|mqTg=& zlOH#4CA%V4Q>+m@36}TwQ>`F#48FPa?s;720f{EsNa%JGAJjW~DsU$IkDk6Es9+#S z6*vO5c^Mc-Tcs_)_Q)#zeT}lg&(=n&uT%=x7!lI?rq2GZPQ(W}DoE+umla!# zFr*zff4Zy#SABSb2=*M{Cwl8bHh)(qMJ#s|vo-%2QT8Szn9V-UsMObVP*5tL;qn)B zkUacb*k1JnS6@zDIsh4Ik2h?iIChf4RzXQqk&CW_I`C?m!M43n@1lOf>0t7AW=d3c za&r*_iz!JuQ?ZyCBnZ{oL_x{^gK6Hlm+XbiTz_e*^7zGgbjhA}s(_i-E`Y{UU4;cf zwM0d{lP=?JdPVG|FLp7vJ0$D;(jjG1X_fE~=qt?XzRlj!m-9$e*kNI2jA>K1dUz46 zf;ocVOVM?n#S{50l5Y0}duK%v>!bv) z$}8JrMuEZmQ~&e6oaBe~V_hRxnR_F2^;WvIlhnIix^G7Kls^nt8lYp_+yhy%%%8BE ze)p9j{z&ECOSFo{^%%iKWA`6;qAI$k(88e=2LezmH5WS=)#h{13LgK*``JHURPa}^7AKBmU*2YDW@~bZ$nIg0?HRn{Hp?-e-s{7cT}^Pc1!&! z%umP9Cgjrs4xFD&B;+SFc%ZKkZ-U{W0O$RZ#0LoCqTOlF>&r!;|LdVBT*xWF&)hQh zpCqq2<_%3&PT?kz<4E=VU(!B6XmMsIX=`CW1YP?gkI0wKvbXZ1ohfpF_(rn^Un!l` zw4(|AxEv-RC9OD-Klc%!$lCD}QzZ+5XQ~5Awry%Dj|n2+#j6acb3tFpY0&yJ*>6=jKnb$+3fvu41Ih^yIWBvfY`EY5GZeX>`ZF{8 z9Y7y!HaLf*>4|0r8{_|te}W4-L8HDDQ zk4UmI;lget+{noL6^=u2)YwUsd{;%V6_!&cejn!>TBDy%55y9Sd==?7Uww zLD$OdZBUzdqu`w)P(cciKk}pPTkbQ_L>v|8#4&?QnjhKkJmjd`T!Ja2k&nhIh)jXx z`_llRO`I#M(hi-nZ_4fuN+I zogOszBz8salWoE%K!kTFG^SD)%PEa^dF7aWL8`TbNL-YwO&7`A!Wx*#DTZDOthm>u zVi(dDbhP20G9saCkl1ViksbV~9WCXl+`lG!(0h zR99N~SCTbm)%zZ!8F#hxfTR2qdH9MR`ZxLFeod3M;MP`d&mlAu&{mzz`nIi{hVA}e zSshRJqrOSd^@+)^3FqCBnr?&%cZdM?%;*==i!UV?dwW3~4OTg}>d-d(Bqjd~BFQ6! zt$Qqe&Rfl~4%mKfp+=IM0nsM+*4-m>L@+~1lg&yCEn(G%^=%_Q|Q zm0mCQbq~H3!}idsg_Ezbmy40zHaD?!FP@)|Ma&k{{d3zo2;s<#Dx^?EuTf1ZrZP|#}i7)ESr^VVB^<|BG>r?-NE>8FRseLuq$q`G4Ifo zx7y~(uF`D)i{JVNtB#*}@lwU62|HIykugi}+GFa*G|5V&iTCXX{wvV^vs;0^hFb7lw>0N*`2l zTHWnt-bDNT6U_@YND?qZ-O4!4VtLuDeO*Mh65aY>g|#(|ID0KVE=J_(g3z_u{h7)DL5l4kM~0? z)d(NUwq((F0pY;s#W+rW0+8beDBc|GWtjBVHuV^s|V&yid#BM zkt}-BZdt)t0iI^ZFFU8)v$YwcV(~tEk*!D19TwF;p&t+=Y28bVxh5AWy3Yeoh=&=* z37^l0snY_`PCa+YaU(H9;}hPg$D*^HBE0<*k2>tAB-m9T6#6F&U7Eg+dz)$@%IC?2 zJ|V`1V+{%4F1g<`RwELJM#9C-cXa_%i2L5<)7xMG!NEW0qHMitabmR{W!`ZuKgpBe zpR90rno<*uFwQ?z^bg(NXsB-L#G5%0;sm-6+f_b6b_s)wgUE*%@bD1m4RRPBK>23+ zHZbp)TvVdRlH&SM<9x5cG_EK9&foFsSl0FNu_cX0?6e8|XY=w|(Pi@aY^`pq5HmF& z_3O%Wqo8VZRqkr}+)f&9j~Gty-kH!v3Y`-6^V#2@mZ5UQ`+Vtk?_(ogD-scgAyEnl zgR%LZ2&gVt>wO`_Li~Kd8J`d=+qF}>Lb8a^xh_}$RCEtL1RSzhP&kz?6%9`qTN(HN z@>v{cvx`L3hZ<70{SC!!z&=U#MXJ2%M-?&~dbp&R!22~N+cua|7Ni`xM!eEwGuR>( z@o934H(e)ptN}dE#XqN8>Jn_g!@m-8zth4Q=k(I0^5i}sX&Ltu!rU8h zHinj#-{CtjUbo#qKGXy=Fn-2>uqvnJT zaV(*TB5)KX4Z9pK194{Cc9MITV$TKZF5;pS?FkT#{WIo=+2>g#xX^fU_ce^T7mA8$ z&(#5GB}IW5s8Z~bY`SlkiT!IU0{rV^zst4bF?sGzJ| z@9W0LoxFAh8VNkr+gUMwY8<8zay@SqbBl$fXb_fjv?WP7{?MM^5Ze(7_E+WWX3rFQzo7_ z`>mt8OrBB~7Mct;`acUtLdo;=f8MIj$qXl%v`$Pelpd6-@LGcGBeY{UHy`)#D;;g5 z9u}TAKOmguDr_$P4D3SAP}tP{8N~nMuoTRn!!fwa(NFOTt9>;b@`fEr_fTz;+{9}7 z*W6!aay#zU-ff3TKCLkTZ-9>c(scAGzZor{hy_E4TDMsDd{#ko80rznMfN;Q1H@@V zo@$-hpp2rCFJk61+{8Z^_OwWMSa_K{F0`2B&VSg5M+IdpZUK?##!#=LR=kv_S&gZ zp`<3?vv|YbZB6jyG0FZSJx!;5=w1@MA+1#diN1DPg-uD2iNw!e#`S5I-yUlA==Mz1 zMhWYHZS)XhoU#k$HpU{#O5y2zKT}C(Il#4gTFqgm6>{ZZv5;lsWZ%n8bEK&do3j#R z@p)~PtZpD$X&{6hZQ$1CF-Z6dV%l`g$2|aDK%A(!T{nk#*JW@-<0B{w31f$Dqy8)VPS@PoDS8-v&PrJt--Vmu-H+l_RyM~kXLZF1SL^obnZI*O|p~Z-(qB>*Y zvL?;AhqFpS!@naM!mA9rY)SK0D#>j`XbAVgyl%Vv`h9wZLGe8-)pBF(8WdyG7R403 zsE|u^zh0rq;I7hWlA(Z?4^G}vu2t4$7}pvr|1NQq;W_zG!5j3mOS}@MvsgBm*poQs zzREqqEvkViK6$xpke~a&Lj)rGDD5`=u&5ne9aoV6K%=5!4nT>;5bIQpFviX?5jt;E zsS-&4d#|gN%YTavCNq*7;h*#imr$Dv3;f}}Em?k2ChI|?WPA#RaET<*=@`#&&P#WR zfB7X+!3j&hrHQ*cgi>fkie?MO`Y&_a<#c+DCdNaFQz@HK_ThL_=rY&XxA+gXvqWaw zZr5nA7e$g+gz>~I!pqTDdCNfB7BEWWFlF@9_r;LQEt^gLO7?p<@WZ8t6buUmPtQ*C z{w~amimx!dhX673{KC29ctD{z*(+Jlh0q`NI6G7$?i1;{}WTfD8_C@R4)T>@KBY*K&_Oneufz z+DkV|zp|=;|F9s|%PvGVzN^RaBK}Zvx7H9T5)u}JWF{P=R<6~19KVu5){61+Zeuj& zwQXSJE+wqfjA2xVQhy8L4XPRbOuYM~P!af9oZ7yFb zJ&4`y(k{lhe=icSo)qbu6`=gNHR`gw*=QIJ=t=+f29nTz2p`%fp0AQ944m7gfX4cbl)9jKY#p5OzBZyUS&*=cM9O8p=Qc z?N`SVhS%j8NZ7(5S_wf%cq*=Hpm~mK=>kW-b!{8l7xBD=x!JuB^5PqF__17do;6C( z`Y*G^*y*bQcE1ea-tDUB?qTD%!9F(ELX=8l0p28ey_7}7jV}hv| zRR&*08nzCtnXf&riFL*+s1`KVZmQi$akT}~a4M`8W*07L?%6O7{Z`_N;IL9m?guBJ zj^~Yj-kDIPqG}*SA!E{{p3TRw2rXDQg+TukH!YPPK+&y5aG*GTqWpHYwg;>Aw zaRuS{M-klXB0DS`T)9lRZWr*m2=L_Vje>XIT4QHake!7tNw!>2t^8nEOmt^&TluJI zWb=Z73KfwdB-vqUp;F7ZC{Cnw+U-Nh-RL{cKQx?dcwwW^SbKor?&vH|va>_HkbOC4 zN4}8u?WIvxlqzLW#!du3KI!e&$^3D3poXXG(t4z8~K2^bjKJ%x(tmR72};N`Hrd5-pEdosZTUWlE=jGdi#K zSW9dD{M)vOZ?_U!E@q-LbClYyeFk(|?oES%Ab#AnkW!opUvBn~5av&Bo69G^%Y`}T z$1$UJ=Io60=fxk==gLXUv~#j2AbD^|U%04ZhBzZZlzy6$Wl6U9g7_V)@rza^djhX~ z>(#LQ0@a_+VBz$PR{LNdI9tXR? zxrw&}A33St*>w8K`fjEg-AuKzQP8H|D_w}q~b}U!@+!s95?eZI~SYFSf=5m2GFRPpOs-sA<^JORt+Y{?(PbUWkElw zUE{=v++<7pUDSoTsee7u`{nJQv@cGw9SFmt8Oimf}_t+Ro~}iO@~#jX^F`T zz1NIuFdQnWW3$m@j64Y?wVmP!?RAOPd9wtF>Ow=m(Jd_CdVQO4ydJTLb+w<%m*S30 z+svwx7MvUPaFCuCZ08vJGC-h~Y(S7T5x8|Z{k?O_Y*0fm)1VDl$#MA0)ahOCE)pB) zqh0G1f(8`ui6*5c4mGCnLsAHl_GSQ)FO4#-9|CW49=m(pU5u&_%VCAY2Flc`|D=Ss zNX&zOY7x&|@APaDcKYknM4n~AFww6e_E4!y8+#eJVcE|Pe2hJdUR z-FIji+PFC%+GfT#Vsq{qiuXy(bEd%7u_MP1Cr2S&<0olB=hNfPnwDnZ?ubVQ5lN5} zFyJApbXYTfS``{g`@HH#ooi|^gTWHt5APB(eq z?$@!$VOmaV%}jhp8_~m6uJb6|yvUl3)y5pAg@Ju^kcq@w`?uKA;297fZvKqXDMo2{ zxwKf7L%Ju9<3wl*5sDGz0Cn4}o|F`MCJiDlzGQAoXF6cCf0HpJJxKy!-CjHF`QAh8 z`ogK`DUjam9oMn@Adk|N@-n!3aBuI*6nt1v7b285Xk#H&W69&1{y{lv4LjMFp3{Ir z{zRx8iyC|C-{CH0vDYaZLyM?F);yNzF4I)VUu4Y!1(mJtXJE_Nx_GEZ>Z1*duJ}Mw z3G&7|_=W2IV$R_GL@g|tJQeA_D3jzQwCy2}aT(yN!kSq$o!m%2o|=X7iz&`Bg2{;& zmeE>V^#Nx*E2)D`+Q_b6%r2dDVtovQe5xY4l~k>3K%@HNk~BF*$#E3_^i|iR+Q`ba zQZkw=Q`e_tQtVP}Q!PT+rk%t*8~URbCoY%K3220dPufADtM7g45>(;ZXUl)F?nR8^a9e7_FKk*Oece{1Dr&`#9VhUa{F3dET^5KZ26}xI!?dk3isGmbXamN*h^&qcc?^! z(?}zGY{i5qiyyTR4_SxI)e7C8X>6;9u3z9dyug=tb&C_Lgl4%<-_Q+tP87i9v|)d4 zw>dvsZca}-ylPA@z4kjZ%~I=8cvF%Fay%3PE^q!9n6>+UUz=7~r&f@0OHPSh4;xll zh9#9GLr-JdPT!QJ>LwlFGRJiUybI(g${2>b`AkhQ^@v4k4>yL(N)GS&Vw1E7@q-dA zrtI{Gr&0w&E^2kGgP$>p_+Mp~K2BqKo1l3;i-=0gEjnE=$2|rU#fA+h>&8nWa2dw! zV1UMP`0Zcr{Roe#8gZW5=fHC{?os2vi6)J&gStUq+xOa?#Jg%}-Pqd;-Byx7J!BBy zsDOEjqWaBJl>{d@ck>2`W#rZ)WPw@?_paB{ z@w;Wx?C7M$(+&w2P?P0%pWE$ez1J1%>`vGQGO#k#XSda&%~lvEBs`0lcDT)|898+b z)z4uBfPt(qqWn|FE3R|maiG1yBb$oi0|l|RV(F7Ghs%2*(Q;F7QRvea-sg|kJBh!F zzO)=8(;say=h*yRkc?6;ixqb8;dWnKsEp@}Q@DIm16&Dl!Hh#lBU42g$$BJ&$XIjr zC~(;UcP4xS9du;Rd8{EX2ChN=d|pAt7$OE9V;z|JgxinryiU5Q386It{Wtf2%ci{p z>BtP%w2k8J5xs$z(@R&)h`<^-%X#-dbwemJ*?*p}zu69@1zo;>$)y|eNN6_8wdrOA zw*G1>Y71-&_HAm76qabU<%Zzv0Vi_C2D1!r{@DCcMJ#{vz@bFKMFb4Ua5o(>>GGtK zo}!+j<)59=;v&@Dp-T!;MydfL{K^^-lKob$S;|UAdvB1W_I5P((Sc>TJ1oTCq$xbL zQvE|>(|WBYu4A8}_j4VYH8{K7VuurHb{a!yytUWj3}m8RB(ai0lI&#UYb3Fo#sslW zRFSehHh=0?5^SF!w=z%LDqI}ij(kMx>|_q6RIyDQQA0dG1z|N`j9~g90U30K)6gI9 zYi6Ty&OhS?oAE8M0Xq8&r}YAAY}x9*@iqImW_)|K$)vQ~`;wV20Z5ngMz^LwCVxM{ zGseash^UX|jgYQR&pqlw5Q2;rirQ}qv;=AcjcG%(U{`hD(adrHQ!j2`=6u zrgWaOa2-144UJdxJ{J1RaoqZK@0S~0_Brv2RXyu^8LxczE$$7^;N~OyN$7Pn^vW#d zr%zC1_-@5(6>*C79ni>D3IQnhCV^<>@$dU_zhIUfBLmxI%q$2-754toGd~&mvpCr> z(P9NLVB>1RmMu^ZFUTq}n6If0r+(FNJg#9PFU#Q3)}W^>g{dfG`a|8nCrYm0{%$G! z6c)H|0i1|$o$L9Of5iNRDMi~k?gmN0JA-gP06%W@)0a(WTfg_s2YBd zV7txA?9Dv!@v2)aPw%Jui1b%BOc)@l4EMQ7WBnp}IJ#BNF#io-lvlb*uLs3&0h8N9 z2(t?^7Zkb9l4~}bY<1}8lA}~bLEQmW@Y6ZIa^t&`GV|rw#@y|Ul7afdron<~4M~JF z9V?zY3Ji3>y7)aWnyvqVoo9^rJt8mfuyqU{e^MW6v@(?$s=%=r9qLA-+uWDH5RGo+ z*YuGsrFY3HCBN%Ex!8m=(}@-_0GVadNd81QYJohP$Mpa14j-veA(NT;29CG3Y@X@_ zkw0Y#{z`ReBK)(8{{V{Y(^|6h`QqMT;!|p!jr~huZQ+*KH*l&k{5G(Mi*zD#sOH82 zGT8hwuAyRRWV6(qFnH@|Z)p&SOS!lI$)9?L&y&&2nq(mq*~jj^G-rtD4zq(;esN+F zGmLOhAYVn7lq5A;E#{cL^%vN}8Q?7%wGY(-r^%O1mR5k?XcG z2JL4a%8#)Q@0)$X_(9_MLm$EAP`-kfI9+b$NKgJome_zik34cdtO|Q;J|I>Ic&bE9 zxh**i`diIQe&Ze7QE#O4?`1lBYx>XLZVmeC`GKvYTVO%&tGY54rqm(UW8CcDSfon% zfR#B&#?TL!+m_4l(s*XiB)W3|2C3!&yA7TqhGCFp&_lwlsK~a zF6UrFH98_$p0^ZGYGsE8vXs(BtT_EA4-8zJ%jEko-Z8CW*|dLmK5V3$b}!UT>@ir-@ zXzO?v3$v;4et)`aOXBqH&O}=S0?q5h_=7v;KlTiPBG++Wra`vHST@JGPvoaOQT6V8 zv%(876@}%h1gG~zqD&SrV-Yz%{5)CbwxCjDyX?S+aMznE(E)vF!4F^ig&g#5lNw;F z%oCjs&#l|bq1^eK)!dVv?rJ>g@JK)jT$EH3r2zwxg`XZF)cZKLtZ%^ESB>Q+z9~$m z4CQ~+9UQ9xkrqnk&`P}QD(%%hj--JLr+EjM@~&e~S~e?CAgPV44C$u+Ro-Ry5|5R- zw4P2&lwTk2uD%RQz+u3cbyv3#@wNj68y%b#!@!Jp8EaRRQDW{U(}efl#f=E=l=47q zd5nv=IAhk6u;um-av}WIxJhGQ<}cxmE@J&}f6Qb|nXKJNeZj5afX>4f!6Jy!BG4O@ z>vmnyC1~-tn(C8cJI=|@>Ih#VR!NLm4sOla8%7DIyhH-Vie7>DgB|60~>xjC3atA+3 z!9Uz((?!}i*P04DebADc%T$e)N0rOV#pcZ+mW5S|2f9s{iBl^=bU1&F8YUIMJ=u$9K5(n>fh><2RBPju%uBMwfgYHv+I2 z0FjulnQW4ZBfOOiFXUXngXjr$LjXAUPXzZA6_%9~>%yK4?G|xKbhmU@yQKLQeTGDG z7}n7{9``qS^`g9DqRi+TIQNAJmoDh%6Elpr`zx;B<(rk^L#WLQjy;hT5P=|kqXg?n%vs73b$;xlcJ{` zp!`a)oo?fU+4nZiHNJPi*vLHI7z+~%!jLG>#%<=vJC!pBai6#B9w_G`~`ACFr~~l5x!rN!c=^5+Tz| zaewwNm|6YDb*nq1Ci}|wYoBXp#}ujU!3Q<-UH%+Gz9-^4jqAF)_er1h52Nn*{wq-e z2;#WWJNIirxKa(~bQXlFe5$`1`Px+rd3|)H4uw5UC=E0AYk)P?BEqS8Po2Dz`5+N! zp{N2m*KDJj_$940nM|R;&YC-Uc+T?NgyFaK$fIh9jc?zpDvH?CyS~0t zCsQs25Sm%Uk{)WX@Q0xCvmr8#(!22TVm&L2BXebHA@Q)=Dy#NSj@^-M%*cdO*>~AEA$K!@HMwK|Kr5}Br zEomlxWm-7v8NQ3CAe-D}=7=m=gdZiw0ngX57V`GVWLc;sDe=N37(C}x!JWPmO}&nN zh(8+hA_}+pkYk7E0Azs46MKGDd&v-$ldpOaY8cj&U$W>VF} z1PB63dWVbBYU-7d9hOK9;PN9%x;HzpQw{+lPPVRg^8wgt=}Ms);tTz6lV3L@~pz-z+KHrtw}skR7jeQq|}CyzTSGbcb)FB%snbLG>}1Z006ZuM4zX!HGD`HGb2py zbITE~Im+pq25n|Kdd~KW)TXdgv!cusms5=Z#~7NBJ>{;;1r_0YQ@~-qJ&3kU@1RIM zv&c;M{jWqkh668yU0viVKt_$r2eO?$EMagJ`WqM_5z##RApMUjrng}?^5yz<23-24(!3ji0q z5_0eCMf#%(hKl-hM>eEUpiX=X@{eE9w^*-)7XqvQp9r-fK{WHb+^`Ee( zzZs`Lb{+<(<+9s8f02gaRuU8xIGE)IcbABgUt+qVGG(x)vS#>`xB52NsxA8T7&V75 zNG$S{qEERkBGL_`>vH73C*1yg7O<_P=a7o_i=NAxLaHSU4@T9E(!#sgc+nQt7TuO7 zOyM*0gN~4ta*Eees!=6}C5MFlpfd)^9iej4cDw^krt|jGfNO(Hc7yW3Kf(9TYZXGK z96O=3c&}n?J8_|S!Ry>R(_?hbqV*WouIoK}2_+E{`$~A6FRVL#^Y2Z9g?3hgWI9*r zPQ|!)3NYWlxSD-2EG^@qEerAeX?zpc7W|NeUnwuvir?jb%Ry=>ATYo!b@JJAw=WRh zr>)qB#}VdK9`Y`I@MA9C&}`ak(JwGUtKf!@r9xkCA3^RD22=zme@7m`yT}Dp!kpsc za5;kS8pQ`&0DAlYT<_mOavpXf`gKpR!_}PM1#$h>f^J zG@U_{k&hGXe0SI3sW}Z(otu$9kfBK0F*z|e*MZGj)~~N6q!(HRdz{R`ClIzuhu^*( zUMc6?+!?O%5}zQW^^6|Ur5Yr=(4*mx91l6xDhTOH0r-6C-D8M18_B2E2}Vx2h~gy(w5nYq$NU}kL% z5`?YosjI9OxXgS&PSOv}HV5JEvZr1{ZFxhXS?=gXsw9K5Jg%L5^xIdxpak(s^=dBqQ0thh~@ z!v*u98RFH2t(&v=)axHtOfz}8ksOsg82x*OP0;U3m!CVuDktxP1MpB?-6WrS%2Pu<}p64j!H7Q?#R;x zrIch)=gu6HI67LJc4+Ae9mdZ7R!C|#<5-MzcM_WX^1*;_F`)vQQPSlJxoEF<@}fPYT?<3k{fR5S%Cqc5g>GMhY|My zh&89HOm4;~-u1GsK^Dfr3G9UXi)Bo%*IHfQW3P)sL{J0a@Hi$HOe4hiG#3|=s_bir z)!q)cbVNxfhaX*|aI_Z@6gLKUBo%$8|X-)hV<8$S&SguByfF`tBo!;dyr7MCOSk~Lqn zkJ1zmSOz4heY4yy+$oLcSL$FIz?zVdAz>h9aZvjbmH`} zFz|Ct3R>UNbfS`DA|mTh#8Za^P`zDELgx92I%(l=%G;sC!GWqqMMPmuDd;64SAJf} xh4lV4TGwZ_kL+j@{+|JWf{g0t>Q83h{|ACC0)_wp literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-popup-view/view.json b/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-popup-view/view.json new file mode 100644 index 0000000..1a47bff --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-popup-view/view.json @@ -0,0 +1,954 @@ +{ + "custom": { + "data": "value" + }, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\tproject_info \u003d system.perspective.getProjectInfo()\n\tviews \u003d project_info.get(\u0027views\u0027,[])\n\tfilter_criterion \u003d \"Symbol-Views\"\n\tfilter_criterion2 \u003d \"Symbol-Library-Views\"\n\tfilter_criterion3 \u003d \"Controller-Views\"\n\tfilter_criterion4 \u003d \"Device-Views\"\n\tfiltered_views \u003d [\n\t\tview for view in views \n\t\t\t\n\t\tif filter_criterion in view.get(\u0027path\u0027,\u0027\u0027) \n\t\tand not filter_criterion2 in view.get(\u0027path\u0027,\u0027\u0027) \n\t\tand not filter_criterion3 in view.get(\u0027path\u0027,\u0027\u0027)\n\t\tand not filter_criterion4 in view.get(\u0027path\u0027,\u0027\u0027)\n\t\t]\n\tjson_structure \u003d []\n\tfor view in filtered_views:\n\t\t\n\t\tif \u0027Test\u0027 not in view[\u0027path\u0027]:\n\t\t\tinstance \u003d {\n\t\t\t\t\"instanceStyle\": {\n\t\t\t\t\t\"classes\": \"\"\n\t\t\t\t},\n\t\t\t\t\"instancePosition\": {},\n\t\t\t\t\"Path\": view.get(\u0027path\u0027,\u0027\u0027),\n\t\t\t\t\"forceRunning\":3,\n\t\t\t\t\"forceFault\": None,\n\t\t\t\t\"has_state\":True\n\t\t\t}\n\t\t\tjson_structure.append(instance)\n\t\t\n\tjson_result \u003d system.util.jsonEncode(json_structure)\n\tself.params.Dataset \u003d filtered_views\n\tself.params.FilteredViews \u003d json_structure\n\tself.session.custom.alarm_filter.show_running \u003d True\n\tself.session.custom.alarm_filter.show_safety \u003d True\n\tself.session.custom.alarm_filter.show_diagnostic \u003d True\n\tself.session.custom.alarm_filter.show_gateways \u003d True\n\tself.session.custom.alarm_filter.show_low_alarm \u003d True\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": { + "Dataset": [ + { + "path": "Symbol-Views/Equipment-Views/ARSAW" + }, + { + "path": "Symbol-Views/Equipment-Views/AUS" + }, + { + "path": "Symbol-Views/Equipment-Views/Camera" + }, + { + "path": "Symbol-Views/Equipment-Views/CognexCamera" + }, + { + "path": "Symbol-Views/Equipment-Views/ControlCabinet" + }, + { + "path": "Symbol-Views/Equipment-Views/Estop" + }, + { + "path": "Symbol-Views/Equipment-Views/GoodsLift" + }, + { + "path": "Symbol-Views/Equipment-Views/JAM" + }, + { + "path": "Symbol-Views/Equipment-Views/Light_Curtain" + }, + { + "path": "Symbol-Views/Equipment-Views/Main_Panel" + }, + { + "path": "Symbol-Views/Equipment-Views/Network" + }, + { + "path": "Symbol-Views/Equipment-Views/Pointer" + }, + { + "path": "Symbol-Views/Equipment-Views/PressureSwitch" + }, + { + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + { + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + { + "path": "Symbol-Views/Equipment-Views/PullChord_Line" + }, + { + "path": "Symbol-Views/Equipment-Views/PullChord_Line_Vertical" + }, + { + "path": "Symbol-Views/Equipment-Views/RFID" + }, + { + "path": "Symbol-Views/Equipment-Views/Robot" + }, + { + "path": "Symbol-Views/Equipment-Views/SLAMs" + }, + { + "path": "Symbol-Views/Equipment-Views/SafetyGate" + }, + { + "path": "Symbol-Views/Equipment-Views/Stacker_Destacker" + }, + { + "path": "Symbol-Views/Equipment-Views/Status" + }, + { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered_NS" + }, + { + "path": "Symbol-Views/Equipment-Views/Status_NS" + }, + { + "path": "Symbol-Views/Equipment-Views/THEA" + }, + { + "path": "Symbol-Views/Equipment-Views/Test" + } + ], + "FilteredViews": [ + { + "Path": "Symbol-Views/Equipment-Views/ARSAW", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/AUS", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Camera", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/CognexCamera", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/ControlCabinet", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Estop", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/GoodsLift", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/JAM", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Light_Curtain", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Main_Panel", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Network", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Pointer", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/PressureSwitch", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/PullChord", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/PullChord_End", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/PullChord_Line", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/PullChord_Line_Vertical", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/RFID", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Robot", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/SLAMs", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/SafetyGate", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Stacker_Destacker", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Status", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/StatusNonPowered", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/StatusNonPowered_NS", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Status_NS", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/THEA", + "forceFault": null, + "forceRunning": 3, + "has_state": true, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + } + ] + }, + "propConfig": { + "custom.data": { + "persistent": true + }, + "params.Dataset": { + "paramDirection": "output" + }, + "params.FilteredViews": { + "paramDirection": "output" + } + }, + "props": { + "defaultSize": { + "height": 309, + "width": 378 + }, + "theme": "dark" + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "Table" + }, + "propConfig": { + "props.data[1].Color.style.backgroundColor": { + "binding": { + "config": { + "path": "session.custom.colours.state0" + }, + "type": "property" + } + }, + "props.data[2].Color.style.backgroundColor": { + "binding": { + "config": { + "path": "session.custom.colours.state5" + }, + "type": "property" + } + }, + "props.data[2].Color.style.color": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired}\u003d true, \u0027#000000\u0027,\u0027#FFFFFF\u0027) " + }, + "type": "expr" + } + }, + "props.data[4].Color.style.backgroundColor": { + "binding": { + "config": { + "path": "session.custom.colours.state5" + }, + "type": "property" + } + }, + "props.data[4].Color.style.color": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired}\u003d true, \u0027#000000\u0027,\u0027#FFFFFF\u0027) " + }, + "type": "expr" + } + }, + "props.data[5].Color.style.backgroundColor": { + "binding": { + "config": { + "path": "session.custom.colours.state4" + }, + "type": "property" + } + }, + "props.data[6].Color.style.backgroundColor": { + "binding": { + "config": { + "path": "session.custom.colours.state3" + }, + "type": "property" + } + }, + "props.data[7].Color.style.backgroundColor": { + "binding": { + "config": { + "path": "session.custom.colours.state2" + }, + "type": "property" + } + }, + "props.data[8].Color.style.backgroundColor": { + "binding": { + "config": { + "path": "session.custom.colours.state1" + }, + "type": "property" + } + } + }, + "props": { + "cells": { + "style": { + "paddingLeft": 5 + } + }, + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Color", + "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": "center", + "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": false, + "strictWidth": true, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 85 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Description", + "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": "center", + "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": false, + "strictWidth": false, + "style": { + "borderLeftStyle": "solid", + "borderLeftWidth": 1, + "borderRightStyle": "solid", + "borderRightWidth": 1, + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 100 + } + ], + "data": [ + { + "Color": { + "align": "center", + "justify": "left", + "style": { + "backgroundColor": "", + "borderBottomStyle": "solid", + "borderBottomWidth": 1, + "borderLeftStyle": "hidden", + "borderRightStyle": "hidden", + "classes": "", + "font-weight": "bold" + }, + "value": "State" + }, + "Description": { + "align": "center", + "editable": false, + "justify": "left", + "style": { + "backgroundColor": "", + "borderBottomStyle": "solid", + "borderBottomWidth": 1, + "borderLeftStyle": "hidden", + "classes": "some-class", + "font-weight": "bold" + }, + "value": "Description" + } + }, + { + "Color": { + "align": "center", + "justify": "left", + "style": { + "classes": "", + "color": "#000000" + }, + "value": "Stopped" + }, + "Description": "MHE is stopped (State2)" + }, + { + "Color": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "value": "Running" + }, + "Description": "MHE is running (State 3)" + }, + { + "Color": { + "align": "center", + "justify": "left", + "style": { + "backgroundColor": "", + "borderBottomStyle": "solid", + "borderBottomWidth": 1, + "borderLeftStyle": "hidden", + "borderRightStyle": "hidden", + "borderTopStyle": "solid", + "borderTopWidth": 1, + "classes": "", + "font-weight": "bold" + }, + "value": "Priority" + }, + "Description": { + "align": "center", + "editable": false, + "justify": "left", + "style": { + "backgroundColor": "", + "borderBottomStyle": "solid", + "borderBottomWidth": 1, + "borderLeftStyle": "hidden", + "borderTopStyle": "solid", + "borderTopWidth": 1, + "classes": "", + "font-weight": "bold" + }, + "value": "Description" + } + }, + { + "Color": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "value": "Healthy" + }, + "Description": "Healthy, no active alarms" + }, + { + "Color": { + "align": "center", + "justify": "left", + "style": { + "classes": "", + "color": "#000000" + }, + "value": "Diagnostic" + }, + "Description": "Diagnostic Information" + }, + { + "Color": { + "align": "center", + "borderLeftColor": "white", + "justify": "left", + "style": { + "classes": "", + "color": "#000000" + }, + "value": "Low" + }, + "Description": "Running at reduced capacity", + "Status": "Low" + }, + { + "Color": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "value": "Medium" + }, + "Description": "Controlled Stop" + }, + { + "Color": { + "align": "center", + "justify": "left", + "style": { + "classes": "some-class" + }, + "value": "High" + }, + "Description": "Uncontrolled Stop" + } + ], + "dragOrderable": false, + "enableHeader": false, + "headerStyle": { + "backgroundColor": "#2B2B2B", + "color": "#FFFFFF", + "textIndent": "0px" + }, + "pager": { + "bottom": false + }, + "rows": { + "highlight": { + "color": "#FFFFFF", + "enabled": false + }, + "style": { + "classes": "Background-Styles/Controller" + } + }, + "selection": { + "enableRowSelection": false, + "style": { + "fontWeight": "bold" + } + } + }, + "type": "ia.display.table" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "EmbeddedView" + }, + "position": { + "basis": "320px" + }, + "propConfig": { + "props.params.Dataset": { + "binding": { + "config": { + "path": "view.params.Dataset" + }, + "type": "property" + } + }, + "props.params.FilteredViews": { + "binding": { + "config": { + "path": "view.params.FilteredViews" + }, + "type": "property" + } + } + }, + "props": { + "path": "PopUp-Views/Legend_Popup/Legend-table" + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "FlexContainer_6" + }, + "position": { + "basis": "800px", + "grow": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "tabIndex": 1 + }, + "props": { + "direction": "column", + "style": { + "overflow": "visible" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "TabContainer" + }, + "position": { + "basis": "1377px" + }, + "propConfig": { + "props.tabs[0]": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired}\u003dTrue, \u0027Alt Color\u0027, \u0027Color\u0027)" + }, + "type": "expr" + } + } + }, + "props": { + "menuStyle": { + "fontWeight": "bold" + }, + "style": { + "classes": "Background-Styles/Controller" + }, + "tabs": [ + null, + "Icons" + ] + }, + "type": "ia.container.tab" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "backgroundColor": "#3B3B3B", + "opacity": 1 + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-row/resource.json b/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-row/resource.json new file mode 100644 index 0000000..fba9106 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-row/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-24T18:53:16Z" + }, + "lastModificationSignature": "a7dd552ea8649910f6c690743b6db82e3d233bac51fad9869d7e20d981f3bc01" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-row/thumbnail.png b/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-row/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e10986101619322cc2c2b46145951ba66a02c2 GIT binary patch literal 761 zcmV<_a8cQ|tJTFQ#jzkXTnq_jg^I>LLAa^aDPBb>Yje7+mgeaL>-d?Q}^v1y7Wg$?6>P=iEucK*49>ZbabG-y5Vk4eU(qa$9I z#UxpUpn}IjA*e?>;z_b{xy%w$YRZ)a+}qpZWF>KF?(FQ0Q+5S| zG8vf7W|q@tv+?`R&JN$`NlL1>x3^rWCl!JU)J7pF^_sGvH#aw!nwsMDv{)?2=ku7J zp2o(;21}Vrr7$!!gu%f<*zI;+CqYA@kPuX$8VW(@=jT~6l5=Zo3r3?6-QC@soRpY! zV<$l=F{$rdUS39LXD4E@826&|ok&oDnkWQaSy|x(Jw86h$jAr_+SAj6-rim;EiGYq rco^H;+xJI2^`Zv{2jYkqJR1K2mMI$b%E;uh00000NkvXXu0mjf*t~B> literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-row/view.json b/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-row/view.json new file mode 100644 index 0000000..855523d --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-row/view.json @@ -0,0 +1,204 @@ +{ + "custom": {}, + "params": { + "Name": "", + "Path": "", + "forceFault": null, + "forceRunning": null + }, + "propConfig": { + "params.Name": { + "binding": { + "config": { + "path": "view.params.Path" + }, + "transforms": [ + { + "code": "\tstring \u003d value \n\tparts \u003d string.split(\"/\")\n\td \u003d parts[-1]\n\treturn d\n\treturn value", + "type": "script" + } + ], + "type": "property" + }, + "paramDirection": "inout", + "persistent": true + }, + "params.Path": { + "paramDirection": "inout", + "persistent": true + }, + "params.forceFault": { + "paramDirection": "inout", + "persistent": true + }, + "params.forceRunning": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 44, + "width": 357 + } + }, + "root": { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "EmbeddedView" + }, + "position": { + "basis": 35 + }, + "propConfig": { + "props.params.forceFaultStatus": { + "binding": { + "config": { + "path": "view.params.forceFault" + }, + "type": "property" + } + }, + "props.params.forceRunningStatus": { + "binding": { + "config": { + "path": "view.params.forceRunning" + }, + "type": "property" + } + }, + "props.params.tagProps[0]": { + "binding": { + "config": { + "path": "view.params.Name" + }, + "type": "property" + } + }, + "props.path": { + "binding": { + "config": { + "path": "view.params.Path" + }, + "type": "property" + } + } + }, + "props": { + "params": { + "directionLeft": false, + "tagProps": [ + null, + "", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "style": { + "overflow": "hidden", + "pointerEvents": "None" + } + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "88px", + "shrink": 0 + }, + "props": { + "style": { + "overflow": "hidden", + "paddingLeft": 5 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "50px", + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.Name" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "overflow": "hidden" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "props": { + "style": { + "paddingLeft": 5 + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "45px", + "shrink": 0 + }, + "props": { + "style": { + "backgroundColor": "#3B3B3B", + "borderColor": "#CAC3C3", + "borderStyle": "solid", + "borderWidth": 1, + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-table/resource.json b/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-table/resource.json new file mode 100644 index 0000000..5da1bf0 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-table/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-24T18:53:16Z" + }, + "lastModificationSignature": "db906e8aff94cfb46ecaedaee7a5ffab45244f15cf2fadaaca60b78cbf915175" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-table/thumbnail.png b/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-table/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa1e22110dfce0cd14021b61af275cf0dfcda7 GIT binary patch literal 11570 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 Sk%0F?zmb<#k*bt13;91!-SO!F literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-table/view.json b/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-table/view.json new file mode 100644 index 0000000..00c9572 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Legend_Popup/Legend-table/view.json @@ -0,0 +1,387 @@ +{ + "custom": {}, + "params": { + "Dataset": [ + { + "path": "Symbol-Views/Device-Views/Estop" + }, + { + "path": "Symbol-Views/Equipment-Views/ARSAW" + }, + { + "path": "Symbol-Views/Equipment-Views/AUS" + }, + { + "path": "Symbol-Views/Equipment-Views/Camera" + }, + { + "path": "Symbol-Views/Equipment-Views/ControlCabinet" + }, + { + "path": "Symbol-Views/Equipment-Views/Estop" + }, + { + "path": "Symbol-Views/Equipment-Views/GoodsLift" + }, + { + "path": "Symbol-Views/Equipment-Views/JAM" + }, + { + "path": "Symbol-Views/Equipment-Views/Light_Curtain" + }, + { + "path": "Symbol-Views/Equipment-Views/Main_Panel" + }, + { + "path": "Symbol-Views/Equipment-Views/Network" + }, + { + "path": "Symbol-Views/Equipment-Views/Pointer" + }, + { + "path": "Symbol-Views/Equipment-Views/PressureSwitch" + }, + { + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + { + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + { + "path": "Symbol-Views/Equipment-Views/PullChord_Line" + }, + { + "path": "Symbol-Views/Equipment-Views/PullChord_Line_Vertical" + }, + { + "path": "Symbol-Views/Equipment-Views/RFID" + }, + { + "path": "Symbol-Views/Equipment-Views/Robot" + }, + { + "path": "Symbol-Views/Equipment-Views/SLAMs" + }, + { + "path": "Symbol-Views/Equipment-Views/SafetyGate" + }, + { + "path": "Symbol-Views/Equipment-Views/Stacker_Destacker" + }, + { + "path": "Symbol-Views/Equipment-Views/Status" + }, + { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered_NS" + }, + { + "path": "Symbol-Views/Equipment-Views/Status_NS" + }, + { + "path": "Symbol-Views/Equipment-Views/THEA" + }, + { + "path": "Symbol-Views/Equipment-Views/Test" + } + ], + "FilteredViews": [ + { + "Path": "Symbol-Views/Equipment-Views/ARSAW", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/AUS", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Camera", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/ControlCabinet", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Estop", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/GoodsLift", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/JAM", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Light_Curtain", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Main_Panel", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Network", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Pointer", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/PressureSwitch", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/PullChord", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/PullChord_End", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/PullChord_Line", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/PullChord_Line_Vertical", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/RFID", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Robot", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/SLAMs", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/SafetyGate", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Stacker_Destacker", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Status", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/StatusNonPowered", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/StatusNonPowered_NS", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Status_NS", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/THEA", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Test", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + } + ] + }, + "propConfig": { + "params.Dataset": { + "paramDirection": "input" + }, + "params.FilteredViews": { + "paramDirection": "input" + } + }, + "props": { + "defaultSize": { + "height": 324, + "width": 386 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "FlexRepeater" + }, + "position": { + "basis": "320px" + }, + "propConfig": { + "props.instances": { + "binding": { + "config": { + "path": "view.params.FilteredViews" + }, + "type": "property" + } + } + }, + "props": { + "direction": "column", + "path": "PopUp-Views/Legend_Popup/Legend-row", + "style": { + "classes": "Background-Styles/Controller" + } + }, + "type": "ia.display.flex-repeater" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup-Entry/resource.json b/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup-Entry/resource.json new file mode 100644 index 0000000..ad4deac --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup-Entry/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-05-07T17:12:34Z" + }, + "lastModificationSignature": "842030a943da01e7d61c38fb8456ebd4a01be66ecc3c69733ecd3aa2ed852754" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup-Entry/thumbnail.png b/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup-Entry/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..c71a51c7e093e288155f2d10f0067bc9b66961d7 GIT binary patch literal 479 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y^4(>d6Hq-CI6C{SRTr;B4qMcmsfyM3J!85#ng zHMNLwm0fVrgTe~DWM4fAX>fV literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup-Entry/view.json b/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup-Entry/view.json new file mode 100644 index 0000000..6070270 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup-Entry/view.json @@ -0,0 +1,522 @@ +{ + "custom": {}, + "params": { + "body": "", + "link1": "", + "link1title": "", + "link2": "", + "link2title": "", + "priority": "", + "title": "" + }, + "propConfig": { + "params.body": { + "paramDirection": "inout", + "persistent": true + }, + "params.link1": { + "paramDirection": "inout", + "persistent": true + }, + "params.link1title": { + "paramDirection": "inout", + "persistent": true + }, + "params.link2": { + "paramDirection": "inout", + "persistent": true + }, + "params.link2title": { + "paramDirection": "inout", + "persistent": true + }, + "params.priority": { + "paramDirection": "inout", + "persistent": true + }, + "params.title": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 227, + "width": 600 + } + }, + "root": { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "title" + }, + "position": { + "basis": "50px", + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "{this.props.text}" + }, + "transforms": [ + { + "fallback": true, + "inputType": "scalar", + "mappings": [ + { + "input": "", + "output": false + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "expr" + } + }, + "props.style.color": { + "binding": { + "config": { + "path": "view.params.state" + }, + "enabled": false, + "transforms": [ + { + "fallback": "var(--info)", + "inputType": "scalar", + "mappings": [ + { + "input": "info", + "output": "var(--info)" + }, + { + "input": "success", + "output": "var(--success)" + }, + { + "input": "error", + "output": "var(--error)" + }, + { + "input": "warning", + "output": "var(--warning)" + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + } + }, + "props.text": { + "binding": { + "config": { + "path": "view.params.title" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Alerts/alertTitle", + "color": "#FFFFFF", + "marginLeft": 5 + }, + "textStyle": { + "paddingLeft": 5, + "paddingRight": 5 + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "TopRow" + }, + "position": { + "basis": "40px" + }, + "props": { + "style": { + "backgroundColor": "#555555" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Body-Label" + }, + "position": { + "basis": "80px", + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.body" + }, + "type": "property" + } + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "BodyRow" + }, + "position": { + "basis": "90px", + "grow": 1 + }, + "props": { + "style": { + "marginBottom": 2.5, + "marginLeft": 10, + "marginRight": 5, + "marginTop": 5 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tlink \u003d self.view.params.link1\n\t\n\tsystem.perspective.navigate(url\u003dlink, newTab\u003dTrue)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Icon", + "tooltip": { + "enabled": true + } + }, + "position": { + "basis": "30px" + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "path": "view.params.link1" + }, + "type": "property" + } + } + }, + "props": { + "path": "material/open_in_new", + "style": { + "marginLeft": 10, + "marginRight": 10 + } + }, + "type": "ia.display.icon" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tlink \u003d self.view.params.link1\n\t\n\tsystem.perspective.navigate(url\u003dlink, newTab\u003dTrue)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Link1-Label", + "tooltip": { + "enabled": true + } + }, + "position": { + "basis": "50px", + "grow": 1 + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "path": "view.params.link1" + }, + "type": "property" + } + }, + "props.text": { + "binding": { + "config": { + "path": "view.params.link1title" + }, + "type": "property" + } + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "URL1Row" + }, + "position": { + "basis": "40px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "view.params.link1title" + }, + "transforms": [ + { + "code": "\tif len(value)\u003e0:\n\t\tvalue \u003d True\n\telse:\n\t\tvalue \u003d False\n\treturn value", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "style": { + "backgroundColor": "#555555", + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tlink \u003d self.view.params.link2\n\t\n\tsystem.perspective.navigate(url\u003dlink, newTab\u003dTrue)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Icon", + "tooltip": { + "enabled": true + } + }, + "position": { + "basis": "30px" + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "path": "view.params.link2" + }, + "type": "property" + } + } + }, + "props": { + "path": "material/open_in_new", + "style": { + "marginLeft": 10, + "marginRight": 10 + } + }, + "type": "ia.display.icon" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tlink \u003d self.view.params.link2\n\t\n\tsystem.perspective.navigate(url\u003dlink, newTab\u003dTrue)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Link2-Label", + "tooltip": { + "enabled": true + } + }, + "position": { + "basis": "50px", + "grow": 1 + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "path": "view.params.link2" + }, + "type": "property" + } + }, + "props.text": { + "binding": { + "config": { + "path": "view.params.link2title" + }, + "type": "property" + } + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "URL2Row" + }, + "position": { + "basis": "40px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "view.params.link2title" + }, + "transforms": [ + { + "code": "\tif len(value)\u003e0:\n\t\tvalue \u003d True\n\telse:\n\t\tvalue \u003d False\n\treturn value", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "style": { + "backgroundColor": "#555555" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "content" + }, + "position": { + "basis": "500px", + "grow": 1 + }, + "props": { + "direction": "column", + "style": { + "classes": "Utilities/m-r-16" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "body" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "props": { + "alignItems": "flex-start", + "justify": "center", + "style": { + "boxSizing": "content-box", + "classes": "Background-Styles/Controller" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "propConfig": { + "props.style.borderLeftColor": { + "binding": { + "config": { + "path": "view.params.priority" + }, + "transforms": [ + { + "fallback": "state5", + "inputType": "scalar", + "mappings": [ + { + "input": "Healthy", + "output": "state5" + }, + { + "input": "Diagnostic", + "output": "state4" + }, + { + "input": "Low", + "output": "state3" + }, + { + "input": "Medium", + "output": "state2" + }, + { + "input": "High", + "output": "state1" + } + ], + "outputType": "scalar", + "type": "map" + }, + { + "code": "\tprefix \u003d self.session.custom.colours[value]\n\treturn prefix", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "style": { + "borderBottomStyle": "none", + "borderLeftStyle": "solid", + "borderLeftWidth": 5, + "borderRightStyle": "none", + "borderTopStyle": "none", + "classes": "Background-Styles/Controller" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup/resource.json b/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup/resource.json new file mode 100644 index 0000000..2bfcf2e --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-05-07T17:12:34Z" + }, + "lastModificationSignature": "21a7104c5ac7b817c409b16b3d2bfbe874d91c78277aef5b51ff6c3c5f3374bb" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup/thumbnail.png b/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..75a039373c8456e3b7218231f8b7f115dc8209c0 GIT binary patch literal 1035 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!A9Jt)N&79D3m6!fFL}B+hE&A8y=9#(lE~0@ z@uz>*wY^8YlNYy2GQ^~Th|r_T|Rf3|M9PP z_ab8END8KB*ZaSYy?dk9D9^sWI-xcK_~hqDtq(Gp z-7ER~@!pQI=l3GcJa^|~G&@=H@z2h~>sKd(*jsMh`xY$V@!@!&g7bz3o`XzAEZipq gbVfN8hrthK6-!>`wSnB`z)a5I>FVdQ&MBb@08lYp4gdfE literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup/view.json b/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup/view.json new file mode 100644 index 0000000..e539819 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Popup/view.json @@ -0,0 +1,176 @@ +{ + "custom": { + "activityLogger": { + "alt_pageid": "notifyToolPopup", + "start_time": { + "$": [ + "ts", + 192, + 1715013953223 + ], + "$ts": 1715013953223 + } + } + }, + "events": { + "system": { + "onShutdown": { + "config": { + "script": "\tactivityLog.productMetrics.callLogger(self, \u0027page\u0027)" + }, + "scope": "G", + "type": "script" + }, + "onStartup": { + "config": { + "script": "\tself.custom.activityLogger.start_time \u003d system.date.now()" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": { + "entryCount": "", + "instances": [] + }, + "propConfig": { + "custom.activityLogger": { + "persistent": true + }, + "custom.activityLogger.pageid": { + "binding": { + "config": { + "path": "page.props.path" + }, + "transforms": [ + { + "code": " if value \u003d\u003d\u0027/\u0027 or value \u003d\u003d \u0027\u0027 or value \u003d\u003d None:\n return self.custom.activityLogger.alt_pageid.lower()\n else:\n return value[1:].lower()\n\treturn value", + "type": "script" + } + ], + "type": "property" + } + }, + "params.entryCount": { + "paramDirection": "input", + "persistent": true + }, + "params.instances": { + "paramDirection": "input", + "persistent": true + }, + "props.defaultSize.height": { + "binding": { + "config": { + "path": "view.params.entryCount" + }, + "transforms": [ + { + "fallback": 475, + "inputType": "range", + "mappings": [ + { + "input": { + "max": 1, + "min": 0 + }, + "output": 227 + }, + { + "input": { + "max": 2, + "min": 2 + }, + "output": 456 + }, + { + "input": { + "max": 99, + "min": 3 + }, + "output": 475 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + } + }, + "props.defaultSize.width": { + "binding": { + "config": { + "path": "view.params.entryCount" + }, + "transforms": [ + { + "fallback": 620, + "inputType": "range", + "mappings": [ + { + "input": { + "max": 2, + "min": 0 + }, + "output": 600 + }, + { + "input": { + "max": 99, + "min": 3 + }, + "output": 620 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "defaultSize": {} + }, + "root": { + "children": [ + { + "meta": { + "name": "FlexRepeater" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.instances": { + "binding": { + "config": { + "path": "view.params.instances" + }, + "type": "property" + } + } + }, + "props": { + "direction": "column", + "path": "PopUp-Views/Notify-Tool/Notify-Popup-Entry" + }, + "type": "ia.display.flex-repeater" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "classes": "Background-Styles/Controller" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Submit-Popup/resource.json b/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Submit-Popup/resource.json new file mode 100644 index 0000000..0bdf247 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Submit-Popup/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-05-07T17:12:34Z" + }, + "lastModificationSignature": "7196ed6d8dfeeb06b5ea15c8f7a6d8e724abbf1059f2edfaf8fb3e1ef710ed8b" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Submit-Popup/thumbnail.png b/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Submit-Popup/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..6588049dae3a13d4fe5f9654f3d495d21800a38a GIT binary patch literal 639 zcmeAS@N?(olHy`uVBq!ia0y~yU{nIKCvva>$@J-4Z!$12xp}%chE&A8y=K_uvU79{F_h!1jfooipU_4eCi*X#DPN8EWOz3^?B^|jYuZ{(OU zbpPVL*mL1wfyDC5nKJ$E4X$gS>CSSUC1^GO{Nu9Sy{DfVt-G#$KGkKh6y1>R(!OS!UjO^#e*R949yhCkQJksJl4$bu`Qo oV6;?ZDsp0ZGAc0`gXA~k&l!8=zhsxc046L3Pgg&ebxsLQ0JG-QYybcN literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Submit-Popup/view.json b/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Submit-Popup/view.json new file mode 100644 index 0000000..7497e54 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Notify-Tool/Notify-Submit-Popup/view.json @@ -0,0 +1,396 @@ +{ + "custom": {}, + "params": { + "body": "", + "link1": "", + "link1title": "", + "link2": "", + "link2title": "", + "title": "" + }, + "propConfig": { + "params.body": { + "paramDirection": "inout", + "persistent": true + }, + "params.link1": { + "paramDirection": "inout", + "persistent": true + }, + "params.link1title": { + "paramDirection": "inout", + "persistent": true + }, + "params.link2": { + "paramDirection": "inout", + "persistent": true + }, + "params.link2title": { + "paramDirection": "inout", + "persistent": true + }, + "params.title": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 310, + "width": 600 + } + }, + "root": { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "title" + }, + "position": { + "basis": "50px", + "grow": 1, + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "{this.props.text}" + }, + "transforms": [ + { + "fallback": true, + "inputType": "scalar", + "mappings": [ + { + "input": "", + "output": false + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "expr" + } + }, + "props.style.color": { + "binding": { + "config": { + "path": "view.params.state" + }, + "enabled": false, + "transforms": [ + { + "fallback": "var(--info)", + "inputType": "scalar", + "mappings": [ + { + "input": "info", + "output": "var(--info)" + }, + { + "input": "success", + "output": "var(--success)" + }, + { + "input": "error", + "output": "var(--error)" + }, + { + "input": "warning", + "output": "var(--warning)" + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + } + }, + "props.text": { + "binding": { + "config": { + "path": "view.params.title" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Alerts/alertTitle", + "color": "#FFFFFF" + }, + "textStyle": { + "paddingLeft": 5, + "paddingRight": 5 + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "TopRow" + }, + "position": { + "basis": "40px", + "display": false + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Body-TextArea" + }, + "position": { + "basis": "160px", + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.body" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "borderStyle": "solid", + "fontFamily": "Arial" + } + }, + "type": "ia.input.text-area" + } + ], + "meta": { + "name": "BodyRow" + }, + "position": { + "basis": "300px", + "grow": 1 + }, + "props": { + "style": { + "marginBottom": 2.5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "URL1TextField" + }, + "position": { + "basis": "32px", + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.link1" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "borderStyle": "solid", + "marginBottom": 2.5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 2.5 + } + }, + "type": "ia.input.text-field" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tlink \u003d self.view.params.link1\n\t\n\tsystem.perspective.navigate(url\u003dlink, newTab\u003dTrue)\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "basis": "120px" + }, + "props": { + "image": { + "icon": { + "path": "material/open_in_new" + } + }, + "style": { + "backgroundColor": "#555555", + "classes": "Background-Styles/Controller", + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 10, + "marginTop": 5 + }, + "text": "Open" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "URL1Row" + }, + "position": { + "basis": "40px", + "display": false + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "URL2TextField" + }, + "position": { + "basis": "32px", + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.link2" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "borderStyle": "solid", + "marginBottom": 2.5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 2.5 + } + }, + "type": "ia.input.text-field" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tlink \u003d self.view.params.link2\n\t\n\tsystem.perspective.navigate(url\u003dlink, newTab\u003dTrue)\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "basis": "120px" + }, + "props": { + "image": { + "icon": { + "path": "material/open_in_new" + } + }, + "style": { + "backgroundColor": "#555555", + "classes": "Background-Styles/Controller", + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 10, + "marginTop": 5 + }, + "text": "Open" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "URL2Row" + }, + "position": { + "basis": "40px", + "display": false + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "content" + }, + "position": { + "basis": "600px", + "grow": 1 + }, + "props": { + "direction": "column", + "style": { + "classes": "Utilities/m-r-16" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "body" + }, + "position": { + "basis": "600px", + "grow": 1 + }, + "props": { + "alignItems": "flex-start", + "justify": "center", + "style": { + "boxSizing": "content-box", + "classes": "Utilities/p-16" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "classes": "Background-Styles/Controller" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Permissions Error/resource.json b/com.inductiveautomation.perspective/views/PopUp-Views/Permissions Error/resource.json new file mode 100644 index 0000000..7a9d9ee --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Permissions Error/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-03-31T15:25:39Z" + }, + "lastModificationSignature": "dbb9d1be00fc17ec677230a2f5090b9789fc54e0455b10065c77293172e7e524" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Permissions Error/thumbnail.png b/com.inductiveautomation.perspective/views/PopUp-Views/Permissions Error/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..40f5bd30c1ae07955a459b3670fcaa7d9a986b3e GIT binary patch literal 2423 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 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Permissions Error/view.json b/com.inductiveautomation.perspective/views/PopUp-Views/Permissions Error/view.json new file mode 100644 index 0000000..b25c166 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Permissions Error/view.json @@ -0,0 +1,46 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 54, + "width": 400 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "49px" + }, + "props": { + "color": "#FF4747", + "path": "material/not_interested" + }, + "type": "ia.display.icon" + }, + { + "custom": { + "key": "value" + }, + "meta": { + "name": "Label" + }, + "position": { + "basis": "337px" + }, + "props": { + "text": "User does not have the required role." + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "root" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/S3/Audit/Log_Viewer/resource.json b/com.inductiveautomation.perspective/views/PopUp-Views/S3/Audit/Log_Viewer/resource.json new file mode 100644 index 0000000..fceebeb --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/S3/Audit/Log_Viewer/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "de0f2e8a3d7e7961e058e7792dae6772ad05918341af7721abcfa18bb0894a93" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/S3/Audit/Log_Viewer/thumbnail.png b/com.inductiveautomation.perspective/views/PopUp-Views/S3/Audit/Log_Viewer/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..739748b3e27350fd5c1c561bc944ccdfa228775f GIT binary patch literal 4696 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 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/S3/Audit/Log_Viewer/view.json b/com.inductiveautomation.perspective/views/PopUp-Views/S3/Audit/Log_Viewer/view.json new file mode 100644 index 0000000..3ade6ba --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/S3/Audit/Log_Viewer/view.json @@ -0,0 +1,239 @@ +{ + "custom": { + "api_region_name": "na", + "loading": false, + "query_params": { + "copy_option": null, + "destination_bucket": null, + "destination_site": null, + "destination_view": null, + "end_time": null, + "error_occurred": null, + "operation": null, + "source_bucket": null, + "source_site": null, + "source_view": null, + "start_time": null, + "username": "" + }, + "raw_data": [] + }, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\tquery_params \u003d self.params.query_params\n\tself.custom.query_params \u003d query_params\n\tsystem.perspective.sendMessage(\u0027refresh_audit_table_data\u0027, scope\u003d\u0027view\u0027)\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": { + "query_params": { + "copy_option": null, + "destination_bucket": null, + "destination_site": null, + "destination_view": null, + "end_time": null, + "error_occurred": null, + "operation": null, + "source_bucket": null, + "source_site": null, + "source_view": null, + "start_time": null, + "username": "" + } + }, + "propConfig": { + "custom.api_region_name": { + "binding": { + "config": { + "path": "session.custom.aws.prefix" + }, + "type": "property" + }, + "persistent": true + }, + "custom.loading": { + "persistent": true + }, + "custom.query_params": { + "persistent": true + }, + "custom.raw_data": { + "persistent": true + }, + "params.query_params": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "width": 1200 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Query Params" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "props.params.params.query_params": { + "binding": { + "config": { + "path": "view.custom.query_params" + }, + "type": "property" + } + } + }, + "props": { + "params": { + "open_expanded": false, + "params": {}, + "path": "Objects/Templates/S3/Audit/Query_Options", + "show_box_shadow_on_expanded": true, + "title": "Query Params", + "useDefaultHeight": false, + "useDefaultWidth": false + }, + "path": "Framework/Card/Card_Collapsible_Transparent" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "Log Table" + }, + "position": { + "basis": "100%" + }, + "propConfig": { + "props.params.table_data": { + "binding": { + "config": { + "path": "view.custom.raw_data" + }, + "type": "property" + } + }, + "props.params.title": { + "binding": { + "config": { + "expression": "\u0027SCADA S3 Audit Logs - \u0027+\r\nif({view.custom.loading}, \u0027Loading...\u0027, stringFormat(\u0027%d Record(s)\u0027, len({view.custom.raw_data})))" + }, + "type": "expr" + } + } + }, + "props": { + "params": { + "NavigationSettings": { + "BaseUrl": "/singleMP/main", + "Column": "mp_name", + "Enabled": false + }, + "SelectedRow": [], + "filters": [], + "header_order": [ + "timestamp", + "username", + "operation", + { + "field": "destination_bucket", + "visible": true + }, + "destination_site", + "destination_view", + { + "field": "destination_object_key", + "visible": false + }, + { + "field": "destination_version_id", + "visible": false + }, + "expires", + { + "field": "source_bucket", + "visible": true + }, + "source_site", + "source_view", + { + "field": "source_object_key", + "visible": false + }, + { + "field": "source_version_id", + "visible": false + }, + { + "field": "response", + "visible": false + }, + "error_occurred", + { + "field": "error_message", + "visible": true + }, + { + "field": "audit_id", + "visible": false + }, + { + "field": "copy_option", + "visible": false + }, + { + "field": "ttl", + "visible": false + } + ] + }, + "path": "Objects/Templates/S3/Audit/Log_Table" + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "scripts": { + "customMethods": [ + { + "name": "refresh_audit_table_data", + "params": [], + "script": "\t# refresh the audit table query\n\tfrom helper.helper import sanitize_tree\n\tfrom AWS.s3 import S3Manager\n\t\n\tself.view.custom.loading \u003d True\n\tapi_stage \u003d \u0027prod\u0027\n\tusername \u003d self.session.props.auth.user.userName\n\tapi_region_name \u003d self.view.custom.api_region_name\n\ts3m \u003d S3Manager(api_stage, api_region_name, username)\n\t\n\tparams \u003d sanitize_tree(self.view.custom.query_params)\n\tresp \u003d s3m.query_audit_table(return_items_only\u003dTrue, **params)\n\t# sort records in descending order by timestamp (newest first)\n\tself.view.custom.raw_data \u003d sorted(resp, key\u003dlambda d: d[\u0027timestamp\u0027], reverse\u003dTrue)\n\tself.view.custom.loading \u003d False\n\t" + } + ], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "audit_table_query_params_changed", + "pageScope": false, + "script": "\t# update the `view.custom.query_params` object from received payload\n\tfrom helper.helper import sanitize_tree\n\td \u003d sanitize_tree(payload)\n\tdct \u003d sanitize_tree(self.view.custom.query_params)\n\tdct.update(d)\n\tself.view.custom.query_params \u003d dct\n\t", + "sessionScope": true, + "viewScope": true + }, + { + "messageType": "refresh_audit_table_data", + "pageScope": false, + "script": "\t# implement your handler here\n\tself.refresh_audit_table_data()\n\t", + "sessionScope": true, + "viewScope": true + } + ] + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/S3/Versions/Log_Viewer/resource.json b/com.inductiveautomation.perspective/views/PopUp-Views/S3/Versions/Log_Viewer/resource.json new file mode 100644 index 0000000..36d0b50 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/S3/Versions/Log_Viewer/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "lastModificationSignature": "5d46e7aa866039d4e16c72fb58a3c31a33014bca5a4bf642a8af9b0c87cb73f6" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/S3/Versions/Log_Viewer/thumbnail.png b/com.inductiveautomation.perspective/views/PopUp-Views/S3/Versions/Log_Viewer/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..bfde93313f1f18a0f3bfa0fb8913adecfdd8d8e4 GIT binary patch literal 6160 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�QP`C7Xn9o!Q*}u`rp4yjmn+nUz;Fy4!p- z^%DOS>Nz7QC)nV7room|sxG73&C1QGf2;X3FDi=Oa)l}P675UK-~R5mn4=-22Y=O4 zGS1j;&Bs9K67TY>e5T4jW}Nj}>fy>X%tfiAV=ltjjGT1jIcwoHpGl#`W=M^d6Anbd z^p>f(7bdAL5SK=ltAdyl!E<8MsixV}H*QR1CL(?l&akenWhh??{rG@eKI83twk*y# zvSX#j>R4D33E{HMW~6hS)bw^A(TL;n$UmI6<3#>K2II^GXWu7dm7aysddr44)m%~H zn-LD_ocd-7`BG2LGCa!C-^9e_cJB`kW2b<48rGFfw=jx<`};@E^i^YOc5dl=_?i-j zR&LJ!gv@+-6cTcjKcMa_&lDAw`IeN5uq6bA2jwrNW+5Mig{gzVUOt!?QmDD(N%z5kmxEY&2>r&-NPag3QAQ@Jr zLVe+IZ0C|4gIg(o51L8dZDe+zHn1OtMS?4k8|jNaE;cX|Kd(u03vsV{bFMp&i-5zodBmgF3dPyWJ?XMj zQ&XI*A_2*LtKHP~eq>1Vk)l5xR&(l8m Zd)#a7pjs;6_@^H*F)-7wy!|ltzX8J-YRv!u literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/S3/Versions/Log_Viewer/view.json b/com.inductiveautomation.perspective/views/PopUp-Views/S3/Versions/Log_Viewer/view.json new file mode 100644 index 0000000..2a7d0d3 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/S3/Versions/Log_Viewer/view.json @@ -0,0 +1,238 @@ +{ + "custom": { + "api_region_name": "na", + "loading": false, + "operation_options": [ + { + "label": "Copy Single", + "value": "copy_single" + }, + { + "label": "Upload", + "value": "upload" + }, + { + "label": "Delete", + "value": "delete" + }, + { + "label": "Add New Site", + "value": "add_new_site" + } + ], + "query_params": { + "bucket": null, + "object_key": null, + "site": null, + "view": null + }, + "raw_data": [] + }, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\tquery_params \u003d self.params.query_params\n\tself.custom.query_params \u003d query_params\n\tif query_params.get(\u0027bucket\u0027, None) and query_params.get(\u0027site\u0027, None) and query_params.get(\u0027view\u0027, None):\n\t\tsystem.perspective.sendMessage(\u0027refresh_version_table_data\u0027, scope\u003d\u0027view\u0027)\n\telse:\n\t\tself.custom.raw_data \u003d []\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": { + "query_params": { + "bucket": null, + "object_key": null, + "site": null, + "view": null + } + }, + "propConfig": { + "custom.api_region_name": { + "binding": { + "config": { + "path": "session.custom.aws.prefix" + }, + "type": "property" + }, + "persistent": true + }, + "custom.loading": { + "persistent": true + }, + "custom.operation_options": { + "binding": { + "config": { + "expression": "1" + }, + "transforms": [ + { + "code": "\tfrom AWS.s3 import OPERATION_MAP\n\treturn [{\u0027value\u0027:k, \u0027label\u0027:k.replace(\u0027_\u0027,\u0027 \u0027).title()} \n\t\t\tfor k,v in OPERATION_MAP.iteritems()\n\t\t\tif v.get(\u0027method\u0027, \u0027\u0027) in (\u0027PUT\u0027, \u0027POST\u0027, \u0027DELETE\u0027)\n\t\t\tand k not in (\u0027query_audit_table\u0027, )]", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "custom.query_params": { + "persistent": true + }, + "custom.raw_data": { + "persistent": true + }, + "params.query_params": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "width": 1200 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Query Params" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "props.params.params.query_params": { + "binding": { + "config": { + "path": "view.custom.query_params" + }, + "type": "property" + } + } + }, + "props": { + "params": { + "open_expanded": false, + "params": {}, + "path": "Objects/Templates/S3/Versions/Query_Options", + "show_box_shadow_on_expanded": true, + "title": "Query Params", + "useDefaultHeight": false, + "useDefaultWidth": false + }, + "path": "Framework/Card/Card_Collapsible_Transparent" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "Log Table" + }, + "position": { + "basis": "100%" + }, + "propConfig": { + "props.params.table_data": { + "binding": { + "config": { + "path": "view.custom.raw_data" + }, + "type": "property" + } + }, + "props.params.title": { + "binding": { + "config": { + "expression": "if(!isNull({view.custom.query_params.site})\u0026\u0026!isNull({view.custom.query_params.view}),\r\n\treplace(stringFormat(\u0027%s Version History - \u0027,\r\n\t\t{view.custom.query_params.object_key}),\r\n\t\t\u0027SCADA/\u0027,\u0027\u0027)+\r\n\tif({view.custom.loading}, \u0027Loading...\u0027, stringFormat(\u0027%d Record(s)\u0027, len({view.custom.raw_data}))),\r\n\t\u0027Select View to view version history\u0027)" + }, + "type": "expr" + } + } + }, + "props": { + "params": { + "NavigationSettings": { + "BaseUrl": "/singleMP/main", + "Column": "mp_name", + "Enabled": false + }, + "SelectedRow": [], + "filters": [], + "header_order": [ + { + "field": "VersionId", + "title": "VERSION ID", + "visible": true + }, + { + "field": "LastModified", + "title": "LAST MODIFIED", + "visible": true + }, + { + "field": "Size", + "title": "SIZE (Bytes)", + "visible": true + }, + { + "field": "IsLatest", + "title": "IS LATEST?", + "visible": true + }, + { + "field": "Key", + "title": "OBJECT KEY", + "visible": true + }, + { + "field": "StorageClass", + "title": "STORAGE CLASS", + "visible": false + }, + { + "field": "ETag", + "title": "ETAG", + "visible": false + } + ] + }, + "path": "Objects/Templates/S3/Versions/Log_Table" + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "scripts": { + "customMethods": [ + { + "name": "refresh_version_table_data", + "params": [], + "script": "\tquery_params \u003d self.view.custom.query_params\n\tif query_params.bucket and query_params.site and query_params.view:\n\t\t# refresh the audit table query\n\t\tfrom AWS.s3 import S3Manager\n\t\t\n\t\tself.view.custom.loading \u003d True\n\t\tapi_stage \u003d \u0027prod\u0027\n\t\tusername \u003d self.session.props.auth.user.userName\n\t\tapi_region_name \u003d self.view.custom.api_region_name\n\t\ts3m \u003d S3Manager(api_stage, api_region_name, username)\n\t\t\n\t\tbucket \u003d self.view.custom.query_params.bucket\n\t\tobj_key \u003d self.view.custom.query_params.object_key\n\t\tresp \u003d s3m.list_object_versions(bucket, obj_key)\n\t\tself.view.custom.raw_data \u003d resp\n\t\tself.view.custom.loading \u003d False\n\telse:\n\t\tself.view.custom.raw_data \u003d []\n\t" + } + ], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "list_versions_query_params_changed", + "pageScope": false, + "script": "\t# update the `view.custom.query_params` object from received payload\n\tfrom helper.helper import sanitize_tree\n\td \u003d sanitize_tree(payload)\n\tdct \u003d sanitize_tree(self.view.custom.query_params)\n\tdct.update(d)\n\tself.view.custom.query_params \u003d dct\n\tif dct.get(\u0027bucket\u0027,None) and dct.get(\u0027site\u0027,None) and dct.get(\u0027view\u0027,None):\n\t\tself.refresh_version_table_data()\n\telse:\n\t\tself.view.custom.raw_data \u003d []\n\t", + "sessionScope": true, + "viewScope": true + }, + { + "messageType": "refresh_version_table_data", + "pageScope": false, + "script": "\t# implement your handler here\n\tself.refresh_version_table_data()\n\t", + "sessionScope": true, + "viewScope": true + } + ] + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Search/resource.json b/com.inductiveautomation.perspective/views/PopUp-Views/Search/resource.json new file mode 100644 index 0000000..5abc060 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Search/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "ankikarw", + "timestamp": "2024-04-01T21:09:43Z" + }, + "lastModificationSignature": "784a33c75ca0b03f25394bb67de37d3c93196d7415c424cc51592df62adb7fd3" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Search/thumbnail.png b/com.inductiveautomation.perspective/views/PopUp-Views/Search/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..39882b59634bf0fe1be3b2291e5ad681438bc881 GIT binary patch literal 3619 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 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/Search/view.json b/com.inductiveautomation.perspective/views/PopUp-Views/Search/view.json new file mode 100644 index 0000000..fd0f4f0 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/Search/view.json @@ -0,0 +1,371 @@ +{ + "custom": { + "activityLogger": { + "alt_pageid": "search", + "buttonid": "search", + "start_time": { + "$": [ + "ts", + 192, + 1710275608985 + ], + "$ts": 1710275608985 + } + } + }, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\tbuttonid \u003d self.custom.activityLogger.buttonid\n\tself.custom.activityLogger.start_time \u003d system.date.now()\n\tactivityLog.productMetrics.callLogger(self, \u0027click\u0027, buttonid)\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": {}, + "propConfig": { + "custom.activityLogger": { + "persistent": true + }, + "custom.activityLogger.pageid": { + "binding": { + "config": { + "expression": "{page.props.path}" + }, + "transforms": [ + { + "code": "\tif value \u003d\u003d\u0027/\u0027 or value \u003d\u003d \u0027\u0027 or value \u003d\u003d None:\n\t\treturn self.custom.activityLogger.alt_pageid.lower()\n\telse:\n\t\treturn value[1:].lower()", + "type": "script" + } + ], + "type": "expr" + } + } + }, + "props": { + "defaultSize": { + "height": 294, + "width": 500 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "77px" + }, + "props": { + "style": { + "backgroundColor": "#555555", + "color": "#FFFFFF", + "fontWeight": "bold", + "textIndent": "15px" + }, + "text": "Search" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "30px" + }, + "props": { + "color": "#FFFFFF", + "path": "material/search" + }, + "type": "ia.display.icon" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "45px" + }, + "props": { + "style": { + "backgroundColor": "#555555" + } + }, + "type": "ia.container.flex" + }, + { + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\trow \u003d event.value\n\tsource_id \u003d row.get(\"SourceId\") \n\tconfig.project_config.source_id_lookup(self, source_id)\n\tsystem.perspective.closePopup(id \u003d \"Search\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Table" + }, + "position": { + "basis": "294px" + }, + "props": { + "cells": { + "style": { + "textIndent": "15px" + } + }, + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "SourceId", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": false, + "sort": "none", + "sortable": false, + "strictWidth": false, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 200 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Page", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + } + ], + "data": { + "$": [ + "ds", + 192, + 1710275544545 + ], + "$columns": [ + { + "data": [], + "name": "SourceId", + "type": "String" + }, + { + "data": [], + "name": "Page", + "type": "String" + } + ] + }, + "filter": { + "enabled": true, + "style": { + "backgroundColor": "#2B2B2B", + "color": "#FFFFFF" + } + }, + "headerStyle": { + "backgroundColor": "#2B2B2B", + "color": "#FFFFFF", + "textIndent": "15px" + }, + "pager": { + "style": { + "backgroundColor": "#2B2B2B", + "color": "#FFFFFF", + "fontWeight": "bold" + } + }, + "rows": { + "highlight": { + "color": "#FFFFFF" + }, + "style": { + "classes": "Background-Styles/Controller" + } + }, + "virtualized": false + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "search-devices", + "pageScope": true, + "script": "\tself.props.data \u003d payload.get(\"dataset\")", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.display.table" + } + ], + "events": { + "system": { + "onStartup": { + "config": { + "script": "\tids \u003d config.project_config.global_project_page_ids\n\tdata \u003d []\n\tfor k,v in ids.items():\n\t items \u003d [str(k),str(v)]\n\t data.append(items)\n\theader \u003d [\"SourceId\", \"Page\"]\n\tdataset \u003d system.dataset.toDataSet(header, data)\n\tself.getChild(\"Table\").props.data \u003d dataset" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/UserInfo/resource.json b/com.inductiveautomation.perspective/views/PopUp-Views/UserInfo/resource.json new file mode 100644 index 0000000..6fa8788 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/UserInfo/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-03-31T15:17:07Z" + }, + "lastModificationSignature": "74b8cadcd9f38ec29b6043e00c2cb1981e47ffb86b860a774834c97a444a8991" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/UserInfo/thumbnail.png b/com.inductiveautomation.perspective/views/PopUp-Views/UserInfo/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..7665d12542d33fce29ab44f63608465f65509288 GIT binary patch literal 1462 zcmeAS@N?(olHy`uVBq!ia0vp^-9TK-!2~4LcctB7U|_BFba4!+hw4RN?EMk@Tk?nXhwhW_96oWX z>2P`WJ6&2l;fscf?Z7fmJ7whN`r58y7U@2^Eq(#tm*i>5FI!96Ds1)v!N!dfJybr3 zu$#@+72$fg^3#FU`%UEL99#_q^?P`4163}%sKF-dcYlBV|DT_qPuGvPtN9_&>2jdp z$%%=botz#Iq+%rb+C|U5dGqGbp{Ax3%V}O5hkI8Re0p-S{QbSex;a**S`s|pzI~f# zUH4c zJ$trll~&C9W#YGsSGE|m8@yB4c>As2^3N|XFIQGpo?#1gQR~^`{qnwQ!YzHW)@`0_ zJ-2S%+Ma(uN=Ix#+|Ht>H#euxsGQ>r@)6VH` z9#by_XU2zCr=jf3hr}yHEn8*S**yZ zMLew{hgWTTDsn0DieAF2J#{zdi@%X*-J~I`xTfc-g%-c}on(jn9RIhnJU>oH>8~af*r5QBRws zx9>jxytk)v^X(VG8r?zME5i-@+WBOoA|f_K=*%!-W@c_UDETL(xcKu@@98mm;&H#e zybMlERP-}5HNAS}iio(ledQ;X&pE%}_BlmPiF$GU*}RjbrKNt$FK3we`TEB0so1!E z`}RG1{`~vQ>LDV#*26F+GbvVef0dRYUNjf8r?=B zhjQOOIM{49`|a!N>nkfOpP!#^F2VEt-CgE0zy!QLet%q4RMq2Sy?_4vnK)5U##)B2 z|M+L11+wO{V4p`_F57x6y!&K|l&tL0>p|)1>9w`B+1c9rO7&uPJSf|}@WzD;7cO0D zdavTMDZ!wl`)rzVOWB>i=|CTZdFU_Hy?3S2Ywbs&*{gTFJwC(XdBF0R!PC{xWt~$(6990m&wu~` literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/PopUp-Views/UserInfo/view.json b/com.inductiveautomation.perspective/views/PopUp-Views/UserInfo/view.json new file mode 100644 index 0000000..9a95243 --- /dev/null +++ b/com.inductiveautomation.perspective/views/PopUp-Views/UserInfo/view.json @@ -0,0 +1,138 @@ +{ + "custom": {}, + "params": { + "Message": { + "acceptPB": "value", + "cancelPB": "value", + "iconPath": "value", + "labelText": "value", + "okFunc": "value" + } + }, + "propConfig": { + "params.Message": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 251, + "width": 299 + } + }, + "root": { + "children": [ + { + "custom": { + "iD": "value" + }, + "meta": { + "name": "Button", + "visible": false + }, + "position": { + "height": 34, + "width": 80, + "x": 22, + "y": 203 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.Message.acceptPB" + }, + "type": "property" + } + } + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Button_0" + }, + "position": { + "height": 34, + "width": 80, + "x": 177, + "y": 203 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "if({this.props.text} \u003d \"hide\",false, true)" + }, + "type": "expr" + } + }, + "props.text": { + "binding": { + "config": { + "path": "view.params.Message.cancelPB" + }, + "type": "property" + } + } + }, + "props": { + "primary": false + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "height": 146, + "width": 251, + "x": 22, + "y": 40 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.Message.labelText" + }, + "type": "property" + } + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Icon" + }, + "position": { + "height": 30, + "width": 30, + "x": 132.5, + "y": 10 + }, + "propConfig": { + "props.path": { + "binding": { + "config": { + "path": "view.params.Message.iconPath" + }, + "type": "property" + } + } + }, + "props": { + "color": "#EE5B5B" + }, + "type": "ia.display.icon" + } + ], + "meta": { + "name": "root" + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/State-Views/State-Table/resource.json b/com.inductiveautomation.perspective/views/State-Views/State-Table/resource.json new file mode 100644 index 0000000..31467cf --- /dev/null +++ b/com.inductiveautomation.perspective/views/State-Views/State-Table/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-05-25T15:07:31Z" + }, + "lastModificationSignature": "69262600045d70be5f9f4f51bf6b16951f1fc7e6b72694a70ef31f9db5a57a82" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/State-Views/State-Table/thumbnail.png b/com.inductiveautomation.perspective/views/State-Views/State-Table/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..1d8f5b71396d4e54329b9e1dbb7e6731bd289500 GIT binary patch literal 5441 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 Bp<@65 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/State-Views/State-Table/view.json b/com.inductiveautomation.perspective/views/State-Views/State-Table/view.json new file mode 100644 index 0000000..5c8a4fc --- /dev/null +++ b/com.inductiveautomation.perspective/views/State-Views/State-Table/view.json @@ -0,0 +1,376 @@ +{ + "custom": {}, + "params": {}, + "props": {}, + "root": { + "children": [ + { + "custom": { + "delay": 2000, + "duration_filter": "value", + "run_update": true, + "source_id_filter": "value", + "state_filter": "value", + "time_from_filter": "value", + "time_to_filter": "value" + }, + "events": { + "component": { + "onRowClick": { + "config": { + "script": "\trow \u003d event.value\n\tmhe_id \u003d row.get(\"SourceId\")\n\tnavigation.amzl_navigation.navigate_to_alarm(self, mhe_id)\n\tsystem.perspective.alterDock(\"Docked-South\", { \"handleIcon\": \"material/play_arrow\" } )\n#\tsystem.perspective.openDock(\"Docked-South\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Table" + }, + "position": { + "basis": "400px" + }, + "propConfig": { + "custom.update": { + "binding": { + "config": { + "expression": "now({this.custom.delay})" + }, + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": "\t\n empty_row \u003d row_builder.build_row(\n Duration \u003d \"\",\n Timestamp \u003d \"\",\n Source \u003d \"\")\n no_filter \u003d False\n \n if self.custom.run_update and system.tag.exists(\"System/state_messages\"):\n \n tags_to_read \u003d system.tag.readBlocking([\"System/state_messages\",\"Configuration/DetailedViews\"])\n decode_state_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n detailed_view_decoded \u003d system.util.jsonDecode(tags_to_read[1].value)\n if len(decode_state_data) \u003e 0:\n \n state_data \u003d state.state_tables.get_state_table(decode_state_data)\t\t\n self.props.data \u003d state_data\n else:\n self.props.data \u003d [empty_row]\n else:\n self.props.data \u003d [empty_row]" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "SourceId", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Duration", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "TimeStamp", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "State", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "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": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + } + ], + "data": [ + { + "style": null, + "value": { + "Duration": { + "value": "" + }, + "Source": { + "value": "" + }, + "Timestamp": { + "value": "" + } + } + } + ], + "headerStyle": { + "classes": "Background-Styles/Controller" + }, + "pager": { + "activePage": 4, + "bottom": false + }, + "selection": { + "data": [ + { + "style": null, + "value": { + "Duration": { + "value": "" + }, + "Source": { + "value": "" + }, + "Timestamp": { + "value": "" + } + } + } + ], + "selectedColumn": "SourceId", + "selectedRow": 0 + } + }, + "type": "ia.display.table" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControl/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControl/resource.json new file mode 100644 index 0000000..2bf87f0 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControl/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-07-03T14:31:43Z" + }, + "lastModificationSignature": "109e8535cc6b3fd0cd1cc7e8601b26765e6bb00a938f99792355ffa8f26dbd9d" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControl/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControl/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..7fdedb5a7ff42e6b2501d08eee73d428c17c32c6 GIT binary patch literal 5247 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 D3nM)> literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlActions/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlActions/view.json new file mode 100644 index 0000000..ef23621 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlActions/view.json @@ -0,0 +1,431 @@ +{ + "custom": {}, + "params": { + "value": { + "tagProps": [ + "", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + } + }, + "propConfig": { + "params.value": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 50, + "width": 300 + } + }, + "root": { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\ttags_to_read \u003d system.tag.readBlocking([\"Configuration/FC\"])\n\twhid \u003d tags_to_read[0].value\n\tid \u003d self.view.params.value.tagProps[0]\n\tcommandTarget\u003dstr(id)+\"/0\"#PLC01/0 --\u003etarget is the plc\n\tcommandParams\u003d\"\"\n\tif whid\u003d\u003d\"MAN2\" or whid\u003d\u003d\"BRS1\" or whid\u003d\u003d\"MAD6\":\n\t\tcommandTarget\u003d\"databridge/0\"\n\t\tcommandParams\u003d\"PLC\u003d\"+str(id)#this tells the target to data bridge\n\taction \u003d 1\n\tparameters\u003d{\"commandTarget\":commandTarget,\n\t\t\t\t\"commandCode\":1,\n\t\t\t\t\"commandTimestamp\":system.date.toMillis(system.date.now()),\n\t\t\t\t\"commandParams\":commandParams}\n\tCommands.button_commands.send_request(whid, action, parameters)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Start", + "tooltip": { + "enabled": true, + "location": "top-left" + } + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({this.props.enabled},\u0027Start \u0027 + {view.params.value.tagProps[0]},\"Re-Authentication Required - Press \u0027Enable Controls\u0027 button and re-enter password\")" + }, + "type": "expr" + } + }, + "props.enabled": { + "binding": { + "config": { + "expression": "{session.custom.command_auth.enabled} \u0026\u0026 {parent.custom.has_role}" + }, + "type": "expr" + } + }, + "props.image.icon.color": { + "binding": { + "config": { + "expression": "if({this.props.enabled},\u0027#4A4A4A\u0027,\u0027#979797\u0027)" + }, + "type": "expr" + } + }, + "props.style.borderStyle": { + "binding": { + "config": { + "expression": "if({this.props.enabled},\u0027solid\u0027,\u0027none\u0027)" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "height": 32, + "icon": { + "path": "material/not_started" + }, + "position": "top", + "width": 32 + }, + "style": { + "backgroundColor": "#D4D4D4", + "borderColor": "#4A4A4A", + "borderWidth": 2, + "classes": "\n", + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5 + }, + "text": "", + "textStyle": { + "fontSize": 12, + "fontWeight": "bold", + "textAlign": "center" + } + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\ttags_to_read \u003d system.tag.readBlocking([\"Configuration/FC\"])\n\twhid \u003d tags_to_read[0].value\n\tid \u003d self.view.params.value.tagProps[0]\n\tcommandTarget\u003dstr(id)+\"/0\"#PLC01/0 --\u003etarget is the plc\n\tcommandParams\u003d\"\"\n\tif whid\u003d\u003d\"MAN2\" or whid\u003d\u003d\"BRS1\" or whid\u003d\u003d\"MAD6\":\n\t\tcommandTarget\u003d\"databridge/0\"\n\t\tcommandParams\u003d\"PLC\u003d\"+str(id)#this tells the target to data bridge\n\taction \u003d 3\n\tparameters\u003d{\"commandTarget\":commandTarget,\n\t\t\t\t\"commandCode\":3,\n\t\t\t\t\"commandTimestamp\":system.date.toMillis(system.date.now()),\n\t\t\t\t\"commandParams\":commandParams}\n\tCommands.button_commands.send_request(whid, action, parameters)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Reset", + "tooltip": { + "enabled": true, + "location": "top-left" + } + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({this.props.enabled},\u0027Reset \u0027 + {view.params.value.tagProps[0]},\"Re-Authentication Required - Press \u0027Enable Controls\u0027 button and re-enter password\") " + }, + "type": "expr" + } + }, + "props.enabled": { + "binding": { + "config": { + "expression": "{session.custom.command_auth.enabled} \u0026\u0026 {parent.custom.has_role}" + }, + "type": "expr" + } + }, + "props.image.icon.color": { + "binding": { + "config": { + "expression": "if({this.props.enabled},\u0027#4A4A4A\u0027,\u0027#979797\u0027)" + }, + "type": "expr" + } + }, + "props.style.borderStyle": { + "binding": { + "config": { + "expression": "if({this.props.enabled},\u0027solid\u0027,\u0027none\u0027)" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "height": 32, + "icon": { + "path": "material/refresh" + }, + "position": "top", + "width": 32 + }, + "style": { + "backgroundColor": "#D4D4D4", + "borderColor": "#4A4A4A", + "borderWidth": 2, + "classes": "\n", + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5 + }, + "text": "", + "textStyle": { + "fontSize": 12, + "fontWeight": "bold", + "textAlign": "center" + } + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "JAM_Reset", + "tooltip": { + "enabled": true, + "location": "top-left" + } + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({this.props.enabled},\u0027Jam Reset \u0027 + {view.params.value.tagProps[0]},\"Re-Authentication Required - Press \u0027Enable Controls\u0027 button and re-enter password\")" + }, + "type": "expr" + } + }, + "props.enabled": { + "binding": { + "config": { + "expression": "{session.custom.command_auth.enabled} \u0026\u0026 {parent.custom.has_role}" + }, + "type": "expr" + } + }, + "props.image.icon.color": { + "binding": { + "config": { + "expression": "if({this.props.enabled},\u0027#4A4A4A\u0027,\u0027#979797\u0027)" + }, + "type": "expr" + } + }, + "props.style.borderStyle": { + "binding": { + "config": { + "expression": "if({this.props.enabled},\u0027solid\u0027,\u0027none\u0027)" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "height": 32, + "icon": { + "path": "material/sync_problem" + }, + "position": "top", + "width": 32 + }, + "style": { + "backgroundColor": "#D4D4D4", + "borderColor": "#4A4A4A", + "borderWidth": 2, + "classes": "\n", + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5 + }, + "text": "", + "textStyle": { + "fontSize": 12, + "fontWeight": "bold", + "textAlign": "center" + } + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\ttags_to_read \u003d system.tag.readBlocking([\"Configuration/FC\"])\n\twhid \u003d tags_to_read[0].value\n\tid \u003d self.view.params.value.tagProps[0]\n\tcommandTarget\u003dstr(id)+\"/0\"#PLC01/0 --\u003etarget is the plc\n\tcommandParams\u003d\"\"\n\tif whid\u003d\u003d\"MAN2\" or whid\u003d\u003d\"BRS1\" or whid\u003d\u003d\"MAD6\":\n\t\tcommandTarget\u003d\"databridge/0\"\n\t\tcommandParams\u003d\"PLC\u003d\"+str(id)#this tells the target to data bridge\n\taction \u003d 2\n\tparameters\u003d{\"commandTarget\":commandTarget,\n\t\t\t\t\"commandCode\":2,\n\t\t\t\t\"commandTimestamp\":system.date.toMillis(system.date.now()),\n\t\t\t\t\"commandParams\":commandParams}\n\tCommands.button_commands.send_request(whid, action, parameters)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Stop", + "tooltip": { + "enabled": true, + "location": "top-left" + } + }, + "position": { + "basis": "80px" + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({this.props.enabled},\u0027Stop \u0027 + {view.params.value.tagProps[0]},\"Re-Authentication Required - Press \u0027Enable Controls\u0027 button and re-enter password\") " + }, + "type": "expr" + } + }, + "props.enabled": { + "binding": { + "config": { + "expression": "{session.custom.command_auth.enabled} \u0026\u0026 {parent.custom.has_role}" + }, + "type": "expr" + } + }, + "props.image.icon.color": { + "binding": { + "config": { + "expression": "if({this.props.enabled},\u0027#4A4A4A\u0027,\u0027#979797\u0027)" + }, + "type": "expr" + } + }, + "props.style.borderStyle": { + "binding": { + "config": { + "expression": "if({this.props.enabled},\u0027solid\u0027,\u0027none\u0027)" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "height": 32, + "icon": { + "path": "material/stop_circle" + }, + "position": "top", + "width": 32 + }, + "style": { + "backgroundColor": "#D4D4D4", + "borderColor": "#4A4A4A", + "borderWidth": 2, + "classes": "\n", + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5 + }, + "text": "", + "textStyle": { + "fontSize": 12, + "fontWeight": "bold", + "textAlign": "center" + } + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "root" + }, + "propConfig": { + "custom.has_role": { + "binding": { + "config": { + "expression": "{session.custom.fc}" + }, + "transforms": [ + { + "code": "\trme_role \u003d value +\"-rme-c2c-all\"\n\troles \u003d (self.session.props.auth.user.roles)\n\tif (rme_role.lower() in roles \n\tor rme_role.upper() in roles \n\tor \"eurme-ignition-admins\" in roles):\n\t\treturn True\n\telse:\n\t\treturn False", + "type": "script" + } + ], + "type": "expr" + } + }, + "custom.status": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "if(isNull({value}), 0, {value})", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + } + } + }, + "props": { + "justify": "center" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlAlarms/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlAlarms/resource.json new file mode 100644 index 0000000..b2e38c9 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlAlarms/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-07-03T14:31:43Z" + }, + "lastModificationSignature": "467f7ec7ceda1379e989bf4e45f6544160299c54a308dcfc57bd909b82c6e7c2" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlAlarms/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlAlarms/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..f9f3846449883d9841e4aca5b0971c8361712947 GIT binary patch literal 1360 zcmV-W1+V&vP)I5m_>l?GzPQSY&Ild zj0pyuu!m4VAu1HYQd-&sf>KZ+2`GUuw#PHQ_l^x_l(cwUBqI5H7?1Dxp6{OXoqNw2 z2iW~M_6VR4_;LK;5(&dF_+hhQHk;>TH1?K3X25oLcQIhfhCb;w5f6RPYXB>d;wa&! zz>bm$k+{rLA~{Hs#O-#Rgn-=eC$6g#4SGyr49Ega*(e^Ti^2v0ZmB`~Brkyz&(SXJNJofTe!kPypxfUMyg~l?m?DguLcEV|A zavts?7L$@6lu-v*jM|cb9dOLxYl8D_o z*SG7kl7DDN5!|I){Z9aqK!&|sjARAJ3FDH}vcjX-g*W7^u!!Q~+$-1Q1yZ)gGTo*U z<{3tP6luXy9-XRznT&5Fhg}|g{Gw4V$}81oh~*N_na{tB$daZsKYRv~9#u#0utyOo zQiGdTWk$YI%S~k88yv4xq@Vrln>tfnWE5xq*Rjyxm}L-HhxZ(Ak=jc|v8C3{N1fj% zWJXDNy7{ z(#6rCp^6G!Lu;>65~gT<*qq0e>V|z33GO65+({(94n=yhsn6h4+?~-%15cgi7qd@) zc#^g01SdC>@a^v;t_moS8_%k1vWmrQ0f(JiVN4apmo-##`QrIUW6_s*D|VkmGL~>d zirO}3kVu|2>GwWEt?^z{oqA+uF+C|LG9>&`XzE~(vBCV~c#omXG{o$bK*t?HY(0?{ z6!rI5N-}Hibr}qu!xQ~xkx0}zy0pIfbFxq<;fsw!3k)ed3kEArCX?x`Q_mI#gn|S~ z>Fq5CIcX^qtF5EGwJ|CqC>G zWt|J;uHhsoj0{A=5X-PxBh&Yi&NnSO#ap^NSY`3;`jS+UI7!#i2L}n%LXZT_oOf_g z<`2N>goZuqI(?Rx@aXPb?IJR2qY64j#GtBr;y`yt^*pd;K%@BUdIgMIwW;3*niodd zMuBR0Y)F#>?@6$Cq}o;VjOy;(o$UYcw&dBQQcbIiagWz$3eWc>*TT_vH!a4X6w%?P zfELkp-!G52G3)O3K!wAO?7#CLhdpBY13&&1M-jJoisZ-ffnTKe0Dh6)1N;NTP39LE S9k_=800001&yWv literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlAlarms/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlAlarms/view.json new file mode 100644 index 0000000..c03ab77 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlAlarms/view.json @@ -0,0 +1,367 @@ +{ + "custom": { + "counts": { + "Critical": 0, + "Diagnostic": 0, + "High": 0, + "Low": 0, + "Medium": 0, + "Total": 0 + } + }, + "params": { + "value": { + "tagProps": [ + "", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + } + }, + "propConfig": { + "custom.counts": { + "binding": { + "config": { + "struct": { + "PLC": "{view.params.value.tagProps[0]}", + "device_count": "tag(\u0027[\u0027+ {session.custom.fc} +\u0027_SCADA_TAG_PROVIDER]System/device_count\u0027)" + }, + "waitOnAll": true + }, + "transforms": [ + { + "code": "\tcount_dict \u003d system.util.jsonDecode(value.device_count)\n\tvalues \u003d count_dict.get(value.PLC)\n\tif values !\u003d None:\n\t\tvalues[\u0027Total\u0027] \u003d values[\u0027Critical\u0027] + values[\u0027High\u0027] + values[\u0027Medium\u0027] + values[\u0027Low\u0027] + values[\u0027Diagnostic\u0027]\n\t\treturn values\n\telse:\n\t\treturn {\"Critical\":0,\"High\":0,\"Medium\":0,\"Low\":0,\"Diagnostic\":0, \"Total\":0}", + "type": "script" + } + ], + "type": "expr-struct" + }, + "persistent": true + }, + "params.value": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 50, + "width": 300 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-12pt", + "textAlign": "center" + }, + "text": "High" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-12pt", + "textAlign": "center" + }, + "text": "Med" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-12pt", + "textAlign": "center" + }, + "text": "Low" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_3" + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-12pt", + "textAlign": "center" + }, + "text": "Diag" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_4" + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-12pt", + "textAlign": "center" + }, + "text": "Total" + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "25px" + }, + "props": { + "justify": "space-between" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "32px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.custom.counts.High" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-12pt", + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "32px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.custom.counts.Medium" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-12pt", + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "basis": "32px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.custom.counts.Low" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-12pt", + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_3" + }, + "position": { + "basis": "32px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.custom.counts.Diagnostic" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-12pt", + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_4" + }, + "position": { + "basis": "32px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.custom.counts.Total" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Text-Styles/Ariel-Bold-12pt", + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "basis": "25px" + }, + "props": { + "justify": "space-between" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "propConfig": { + "custom.has_role": { + "binding": { + "config": { + "expression": "{session.custom.fc}" + }, + "transforms": [ + { + "code": "\trme_role \u003d value +\"-rme-all\"\n\troles \u003d (self.session.props.auth.user.roles)\n\tif (rme_role.lower() in roles \n\tor rme_role.upper() in roles):\n\t\treturn True\n\telse:\n\t\treturn False", + "type": "script" + } + ], + "type": "expr" + } + }, + "custom.status": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "if(isNull({value}), 0, {value})", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + } + } + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlStatus/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlStatus/resource.json new file mode 100644 index 0000000..8cf2faa --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlStatus/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "hrtste", + "timestamp": "2023-07-10T13:53:10Z" + }, + "lastModificationSignature": "604429b2c9763ce01cf379a55e79df5ef605b3944f6f10d8e88e0e8e10398180" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlStatus/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlStatus/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..72d1c1699a8a634e0ced9cfb52563d04c564a88b GIT binary patch literal 698 zcmV;r0!96aP)q3rS5|EdWRU+S# z6r$ABBR3ESL%|_S)B+c<72g{CHfVjY9wm}0X?gE{ulaLxldEYnzG;@sbK$u&+ z-Sk}b#7eP=UlWPv#P0nr7NF7DX!>fZR4T%wz_1L?i;+bwr`5ak)}%F14CqCDuo#>T z&raV?`wG4;Z&&Ii<;uHG)2G@?*)wZ*{QoF5^~goyVEo5;`X%kiIx^)9HcjYv=sa_d z%~UVe??3EwISz|w@E8t~2a`W1v8CW6%!Fr7QYY{Mu%G-z|8?QonRjB|95EOE6dJ?^ zv`TV;QHN4f59y?Z@Pe2Z@r(Nle*F4UNg56f8{I~e&y+9c*(@6=MRpQ9=zHjay}sU- zPc7JI;-ko1Fn3RP#xKTpPkW-2(AYHnfqtwRTB1(S)ow=xN=-fFP8tXd;B|sNwiaFM z^Y@|GVLgsh$1Bo`MY3S)U>UaK+wDt6d;sg+>Fr#P gt!udI-$e@f3qw5XpPFxR&;S4c07*qoM6N<$f;tmJkpKVy literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlStatus/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlStatus/view.json new file mode 100644 index 0000000..1e5a023 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/CommandControlStatus/view.json @@ -0,0 +1,249 @@ +{ + "custom": {}, + "params": { + "value": { + "tagProps": [ + "", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + } + }, + "propConfig": { + "params.value": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 50, + "width": 300 + } + }, + "root": { + "children": [ + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tnavigation.navigate_to_page.detailed_view(self, self.view.params.value.tagProps[0],self.view.params.value.tagProps[0], self.view.params.value.tagProps[3])" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Label" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "custom.status": { + "binding": { + "config": { + "path": "/root.custom.status" + }, + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "this.custom.status" + }, + "transforms": [ + { + "fallback": "State-Styles/State0", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "State-Styles/Background-Fill/State1" + }, + { + "input": 2, + "output": "State-Styles/Background-Fill/State2" + }, + { + "input": 3, + "output": "State-Styles/Background-Fill/State3" + }, + { + "input": 4, + "output": "State-Styles/Background-Fill/State4" + }, + { + "input": 5, + "output": "State-Styles/Background-Fill/State5" + }, + { + "input": 6, + "output": "State-Styles/Background-Fill/State6" + }, + { + "input": 0, + "output": "State-Styles/State0" + } + ], + "outputType": "style-list", + "type": "map" + }, + { + "expression": "if({session.custom.colours.colour_impaired},{value}+\u0027_Alt\u0027,{value})", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.text": { + "binding": { + "config": { + "path": "this.custom.status" + }, + "transforms": [ + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 5, + "output": "HEALTHY" + }, + { + "input": 4, + "output": "DIAGNOSTIC" + }, + { + "input": 3, + "output": "PROCESS DEGRADED" + }, + { + "input": 2, + "output": "STOPPED" + }, + { + "input": 1, + "output": "FAULTED" + }, + { + "input": 6, + "output": null + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "style": { + "borderColor": "#555555", + "borderStyle": "none", + "cursor": "pointer", + "marginBottom": 8, + "marginTop": 8 + }, + "textStyle": { + "fontSize": 12, + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "root" + }, + "propConfig": { + "custom.has_role": { + "binding": { + "config": { + "expression": "{session.custom.fc}" + }, + "transforms": [ + { + "code": "\trme_role \u003d value +\"-rme-all\"\n\troles \u003d (self.session.props.auth.user.roles)\n\tif (rme_role.lower() in roles \n\tor rme_role.upper() in roles):\n\t\treturn True\n\telse:\n\t\treturn False", + "type": "script" + } + ], + "type": "expr" + } + }, + "custom.status": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.value.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "if(isNull({value}), 0, {value})", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + } + }, + "custom.tag_path_to_lookup": { + "binding": { + "config": { + "expression": " \"[\\\"\" + {view.params.value.tagProps[0]} + \"\\\"]\"" + }, + "type": "expr" + } + } + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControlCabinet/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControlCabinet/resource.json new file mode 100644 index 0000000..fdba397 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControlCabinet/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "whealja@amazon.co.uk", + "timestamp": "2022-08-24T09:52:18Z" + }, + "lastModificationSignature": "e5327eea9c46bd28be37b64dc573d805ff93914918e20315096394deacfb1b83" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControlCabinet/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControlCabinet/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..b14d22edced0b479b1524166e529894d8a64a6e7 GIT binary patch literal 2073 zcmV+!2RP)9Z8q=~9%aXMswiZhwEsBda zQlv<2_Bc)xr%2k2<0;y-Nt{d{`r3!ikLX99P$X#*2puebPqi@^fOXzqT`Sl9K1~?lZixvC=A2kDI9~I&1N-I^7%XrKvSVmh(@E5Byk)!XUgpC zEC#WJh@EDkXomFhU4 z6pO_U9XbRGE?l^9=FFMi-d@;)I54>V)Yxej@WyZz4j>$SJ|Fynhdn(#@a_Eh^H_YE zraL=3Q>hdd87y>ncVD@3<<6ZuAnWSYt6<^a!Gq9Y1|8Y4eF}=Z!U96z;>C-%ZrwV2 z_AH_ui+tk5i9jH5;J^Vmh8O`IWV0ZaE|+U%Wd#&~EI8lQ)dgNaANnl`gyOES01rn; zN3r1j{r!jwaDf!KeEBjKnPu7G;bAz5ei+NLjNAcDh!^BeC={Y73Uq)J5QIQz9{pWq z7g&G;So!_?_hWB!I-T${olawGIC=6U_B=Rw`0(L#=gwiZ1wlamA3b{X^y$;ru3f{* zBQ(fU{3{ZP{J+Km1PPCw9|r+^Kt^B-Ajjmw!h$G@XyPnDUd+$W7tL@$2*6=-M&e(1 ziY7WS2s)cbe<#^_7Btm3FLknvs1`~kL&1ugWdd5|ict#GDwV2vuxf^0g43`vIEn>Da_TT=0#^FwN~+|-P#XT;S%W+Qq=JOSPt*8wQDPuDx@zTpmXD_}wP zdS=oBSBJ=_0G?yHB$H(MSf=Wg*P?@?%J25-zx{=F;Fq@HS9-_K*`dM2bO3;YCOTWp ztb#F}e6oY-A0#YzL@`Yu2qM4>0>|-eDuvUFU7#n@f9Cf7SoS&j@{%AGgo0`dWc(Jz zTt1!608r30JM95RmJ7UIQM*2^v+#`wrtmzEa~p>rX6XfjBlXF@b9W?o@q!eYh`s91aHp0ryTQxGV&NK~Mn8n>TOT!GhYk=Q~-T6EP+g7D_H@Ez&n6hQsMx z?#*G|QR*yU*}(z{I>bLnM|8N|?n0q3IXQXb#tj(5`I(s+hbh)>4QYYratcG;+?oZl zH8Nmffe+>GdJ0c&JLmWWV;o>s2w?&44VVHhu3x_n3P1-~KvEzzz{1eb5PI-Fk|d#t zjIeW#k!=$FAObxej|YhWw~-Wh6LLCW6WKi$zR8Hk zHf02|9a{i=CZ{9lKxj-&O=0mViXtgMjBR7#tr@{E#t{|?j|&g&*d4Lj-QC?-fB1$; z1+yq{I-P?90}hJn>+L0Zt9 zO*%bZYHHf$ayJ@dgT$_B2MgbNQr1~8z7Z1^_E}stiLYzK`r!u!73MW3xlEgxMe%>Y)M03W*7N5<%cyM>|vmdEH`~K6Yx4gWP zVp)r8ghttt1*8AXs>!GwW3OvR%WqRnFz+@mm&>3a^U?SI<{nwTx0+&@wD{(=%0j&L zHdSYVj?FuSM;vxX?-W<636g|}unBBVy0^OekGTKu-akBj{+!Lptu|Idl6kG9cJ1Bz z`vUp6fO~Z!$w$S?jEvfGI6potdnRSKLv~Ntgo2AoglMV!Kwo~$gc+Pltu|I-n#u(I z%m_tT*!L1OSGx^jLRR2l-8sAS|cJF@I^>_GOPd9SK9EGo=<77 z#tIvhvOyK>0>+;%KAX{>dGu#cjOpxyg6UpN7GL_xFWQuR#vKUL)i3GF8eMr(2V-Cz zzjWy_UHS`t7pm*Y+Lv~NDX-DxF90a5PpwCF9j^TkE_|3-BHC+d00000NkvXXu0mjf DUz^y~ literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControlCabinet/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControlCabinet/view.json new file mode 100644 index 0000000..2aa006e --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControlCabinet/view.json @@ -0,0 +1,273 @@ +{ + "custom": {}, + "params": { + "Display": "value", + "status": null, + "tagProps": [ + "F01", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "params.Display": { + "paramDirection": "input", + "persistent": true + }, + "params.status": { + "binding": { + "config": { + "path": "/root/FlexContainer_1/PLC_Status.props.status" + }, + "type": "property" + }, + "paramDirection": "output", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 110, + "width": 200 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Filler" + }, + "position": { + "basis": "5px", + "shrink": 0 + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "basis": "32px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.tagProps[3]" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "fontFamily": "Helvetica", + "fontSize": 15, + "fontStyle": "italic", + "fontWeight": "bold", + "textAlign": "center", + "textTransform": "uppercase" + } + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "meta": { + "name": "Filler" + }, + "position": { + "basis": "5px", + "grow": 1 + }, + "type": "ia.display.label" + }, + { + "events": { + "dom": { + "onDoubleClick": { + "config": { + "script": "\tnavigation.navigate_to_page.detailed_view(self, self.view.params.tagProps[0],self.view.params.tagProps[0], self.view.params.tagProps[3])" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "PLC_Status" + }, + "position": { + "basis": "150px" + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "path": "view.params.Display" + }, + "type": "property" + } + }, + "props.status": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}" + }, + "tagPath": "{0}/Expressions/Status" + }, + "type": "tag" + }, + "onChange": { + "enabled": null, + "script": "\tpayload \u003d {}\n\tpayload[\"status\"] \u003d self.props.status\n\tsystem.perspective.sendMessage(\"update-controller-status\", payload \u003d payload, scope \u003d \"view\")" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "this.props.status" + }, + "transforms": [ + { + "fallback": "State-Styles/State0", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "State-Styles/Background-Fill/State1" + }, + { + "input": 2, + "output": "State-Styles/Background-Fill/State2" + }, + { + "input": 3, + "output": "State-Styles/Background-Fill/State3" + }, + { + "input": 4, + "output": "State-Styles/Background-Fill/State4" + }, + { + "input": 5, + "output": "State-Styles/Background-Fill/State5" + }, + { + "input": 6, + "output": "State-Styles/Background-Fill/State6" + }, + { + "input": 0, + "output": "State-Styles/State0" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "property" + } + }, + "props.text": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "alignItems": "center", + "borderBottomLeftRadius": 5, + "borderBottomRightRadius": 5, + "borderStyle": "solid", + "borderStyleTop": "groove", + "borderTopLeftRadius": 5, + "borderTopRightRadius": 5, + "borderWidth": "0.5px", + "fontFamily": "Arial", + "fontSize": "22px", + "fontWeight": "bolder" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Filler_0" + }, + "position": { + "basis": "5px", + "grow": 1 + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "basis": "40px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "1px", + "shrink": 0 + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "root" + }, + "propConfig": { + "custom.pageId": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}" + }, + "tagPath": "{0}/Parameters.PageId" + }, + "type": "tag" + } + } + }, + "props": { + "direction": "column", + "style": { + "backgroundColor": "#AAAAAA", + "borderColor": "#A6A3A3", + "borderStyle": "ridge" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControllerStatus/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControllerStatus/resource.json new file mode 100644 index 0000000..fa67a50 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControllerStatus/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-08-22T08:42:25Z" + }, + "lastModificationSignature": "50d6c09c2b96eafcd70b5393a5430b7187d339ed5a25761f64d7b68d9727a6b4" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControllerStatus/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Controller-Views/ControllerStatus/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..da58939effff334d761d767aed6801b57f837618 GIT binary patch literal 7911 zcmVdq3PSH|N}Q?~@$Il4D6OQ7k#O#0F9lE7~rwi{410_riwCPD+$SioF2r zAP9g3?7gd5mWw3IvfL8q$@3(ioZOiO3kcD15ve2b;P(u{DeuhA&TnV-eFuY?BY*z$ zpa1cXfBgOLf3K*h5R1hu7K(8G*fAQkQ)EEv0j(qpscPf?Y z-FM$jOG}GRjN!#bdIX~AJ5pI$dEvr^$XMWy6a}HkEYYciFET0ibUYt`){c*lKX>k2 zTwEOZOi4)rjlZ3GBqt{)LKq^2loU^hCMBN-G?9|P|4rfnZx_!e!?d`#BvJ}sl$4l| zNJ>c~=uA#ZjE_&e2(K7bWDNTZ@Wv#ONTsEvtE;Pb@80d}>jUr9#KgpHYL9?$WCqZ8 zIpSPPL7~lN&E;c>iAfTvjE~aKpT7X|q$DL|G5IjfYL!Vi38WN>Qm@M9oKH$hxsb}s zQCW=YtP3eA=Tl?U9vncw0Tc#*;X`}1a_w0mr(yHJ+^5TDk+{2+AQcKYpi5)R_$G6iI!d5w!p=$Kl)H$L1On0s`0k)28MFRXVL=o1p(Pb5j#)*tGW%!HIQ z3V50F42vHwY0=Yh+2)PqIq`eRB~5|Pzy5YHaQ$L@TxxnoL}g;wAAm6yyjIC&yw*%#8PhR6YrdQTHttOLE%%+|BX)=^bD z3FG0P&SYk0rat|CO-M+( zs9nVA9ft6H~rZgPBRc(|vwJTob?zJGLeer9%IsV1MpR@fHT*VfkNjJZgD zP4n!`^vuF)z+FwgkaRJ1$Cip=f02=q0rX+eM;|_X_%YC1@7@JN@#yF%(4@di_x<5^)#3d%5znGGgbRm;WPCpMaB$G&) zGz6h$#Kk876E?EU81@~2Ind>R_6rmxU~_UfoOj=Sx1gZlZ-4t62!f<&UQ-EbBVUc- z;8s+4erYod0;v}-TmXHO2w%JatlW!{vmP-V9K!7kwBNY6IMD0B@C$k>Ahn{RBFrlX z_R3%G(j)z8yMi%y&@MeaBLg_t!9dezWPp)0F)1kxj>9;XnnH@X!{O4-rvL{$N7$0w zG`1+_4w*Z`v|mZA9gVp|=8o{CO1eZ5bBD|wk%)vGCL`t!nL7g4G_lz+cgP&UYYc}D zFu{@X3ES@L!e#%xw#+sg@;3@@;gwCxXz9AG2v!7H1EBXk;y;cOg7Q50w4 zD1tJWOq9Wh7C5L{JqxrFb1dI})gbuRd43t79 zLxJ!E!)7y41Y8Bj@y*)dI6|X=LQn>%923@oLPg=Fz_l?}`@MbcIXa&*v)Jiy6c;;GUEl0~d(pDur0A)@fvbr)-r*Cd$$13(6}htY#e!zwbg-23vET zL#0sgaJt-R(TVvSxvsLR%4*VJbOvZ43`1pFQ(1|V&*fk^3q1W8Phc!^R8^I0I;$!x^YlUr#?Et;mX{XW91fSu>2Q^}3M>MQc@Wg@;uVY! z7)lo?t@pnAY_!#xDKXAZO{r0QU~Zwit9c~Y1^NTdM4`Z!4@W$e2$ja(Jsceb*c=?8 zvg&#RzUC{JYTKrI+g*0+)Z{>B>P355V5Fu@XQ|%U*l4J-T)H$pKU`OOtufHwVJ>V4 z4f~49u8yyH4LO!jXtqe2ff!sJgFX30-amc)fs9GEcLmz*^&_K;E!S*)fzi&AqSW-v zYLB6Kb zPem{;;8kBVF*{jST;1R9sc|+>&$x^7v=V`-zo)CJs&I5>&Sufb3Q8u&$F+>~OgbYg z?V{3b9q1}bPfufUxY4(~ABf}?48jbAt(af`z~9}ww0@(htzpPJSgbD|9_cT&+b1Um z7_qEaxmC~*MW9VL(tbwijOa-3Jg~iWn^U!4-Xr%$tJsh zZn)7|S>EUFm>V4~vh460@C_OGB#N@AbFklL>u7h_8rp(WOY>LEHU5DBFutdp9NuFG={`a3(?+xpwx*RGZ_$XQIIH8?dh zHMiz=8fE&1rFl<*MVl?Mcze6Id6gHGOpJ}IQOGNJ!eD21jE znyK+no>toznykH4IyAO54m)*OnHjpg%QItv!tzTGKl{Spd6`2^XIP5ILw*@gJv2U2 zSJ^i|?=G;Yg}A!6tGlLVa~zgQ#Et#Iso^G<(<$R%25V_3P!80*18Ti!y@`ck2!i5J zQvo_5)HZ<@34IKxf`g#Z{ouXarm) zU#M~vmsOURs019!j@~4oBXka5;3%mqaahNLNX$@w%C|gbFO?HccoR)RD zZ|sUyPo}U8dLxfT6R3>_P?lV~tv9iOnvJsbW@kmYQ!UBP&$o!V45mP=)9cs_M5)!O zRQe)Ead}Dkr7N8?A-_hzHrrf4Z?fowKry$v$}7r>l|nvGDAua8aSV&T*L}iXcFv}$ zwTTGtCWR3K+nEj;k#-KWVZyctLRdS%&VXhKu*)!L^8iEQDLV(`#%Vxzpdvtv017Rz zZy-Ym!q~EN=)e$Ru~j;?NW{aS9R=+i3`#`XIpBhzWN67SnRGfGntOyis3XwkEs>c?qbyN6Zy$d46zSf<MiT)PWQsfba_m2mCx36cQdF7LI{pM5>UG7l7>H62jSuEHLuv3mt@e zidSMa7X^L|!bA}yyu6A=M_6nYiXu49LJ|6AB#nl^Z}Ff!1IJ-53e2^S)WV+1;sH|6 zOr1Hoe)5gAH=d6>xpwl6^*2tez5eRz(Ua?MzP5VwwYA?JTm9{CR(=EAv9;rGuAe-* z`pU7j6K@i!$5uCEezWq*D=Yu`%IeXhtH)kjJAPvA_^YeOUR{0l*y@S5)=$2=^2+OL zCqT)t{HHFuziv0L1W97KrlPvqq>}3NmXcDJ!&TzQH?mNUMsMWvaILAJq{QWLx@^`W zqgu^lGQ}#LQoxtUbyd|>MpZ6z|ELA;2{5E^i@AW*Qwyhlzxey-=H6O(^WEim)&~8| z!kd{J^z@Zv@&-qKTduyNpsl?B`r;pGH+baLKOSE=nYNBl*WykroI-DirME=FTRGwz z2(nI1UpWU#V60Q{4UD|@$D<3U7&ir^mG|CQc5t~2x>f08lLL^mp_ix;oYBQ8vS(=U zdvf$9J7f9O={4ThfBom`XT|?-_TTFtuZBL&d1d~1#s=&9liQzs70Oym8hNtZbTj?T zI)3kq;Y*)*K6uiE+_ByNW+P+y&Et!p{OBw0yNm3vY!1$(ab#V?vt8G#3-ZkfIn!9w z7jzeq5=qwTw#kss+g+bUN;27f!6pNVEgv77P?58&o`CoARnO2w$F(xENhjcQw%64@ zBmPTyJ(_k?^6^*ex|?|D%f)MVZN4Y#<@c2MP4?T1$8$ewng4QZ=8K^VOaEE+Xln4& z?AI4x|MlE|@E!zb9##I&>HpRKcy{y?r|zT5PrvXd%)eFp#jQX6CLEa$C?v_6M_O|{Owe;cA z(&yK%em1iHxK?~ylD2kA`q|{hz_UuNnAL3 za_Q7_=aqQF0<9-op|7l}E-)xD1QF+G)pDUotk9~mGc(dTe7RneBNQn?5U9)iY(+^$ zrPZiL>2#^u4D=?GT88acZ;j-2^^F%nZ&KWrD{jk#H@Mh(+VAFm{nk=4YXiwz%M#s| zD(@)i>u1ldk&d5I*VAdxK9AQ3RyydLvV8A z10(NdBZme?pQ!iEt!RfJE|#9gI)(Cy|IG7#|=d!7MPCu$g72gs|k(4&E@AR#EO{v>F!16HH@d{wPWsIyO)F47=A8dydF**5s5^242KTzoE3fyhYm4b z4<};d@Zm&EZ#tZa@p?G%gS-+mhPx&OpN@&)g~bo@N~hBq3`Tf~S{NV*BBSMEcp{0-~mAp36g%G*Y5P@h@W$BJ`>@-9wD%kwq4eC`nFhP?56yd zKPoYNiJe^k?Geo@XdoJmR$gBI|i&I||w%OO_T!Ce|KCj7dPj)DxkD)rwO(YyjMnasO)?*jhn>+Apd&wu`z z0PuidMMcGjAASe~qOxEZCJ@TB8WqN5f_B#A*(*yO5{bxUbrn19E?03;fm*53>9ksr zfQ7OI8m-n~)EAeQSCp5iB|;1XPX#8^XjLLUgUQ!vbs|0v_h-Z~p-83G$N+nCt)Z;E zvczuTa)o-cS;&X)g>1E6uNLBh+>(lFd!CksGvH$rLlm!|2OtPyGMVn*zpvG5A3S*Q z*T4QX%q#GKpiZX)Nk*d)h;5I1pzqQt6lZJb>j%qxYO2!JwiNQ$yZh!Qh6;?9*;{wI zny;1ARQZR3?SZids~nfx#wP-!<72JOb!M|gB>@#+QV?F~))!0t-FD!^UYuW@|W;93_KtRA_3nZ3l<(cA=n%ilg^QO`n(g< ze!D?d?+;xn)Lh7FTa?)b|EFt@S2@N+`fl zgf25Uy@2fjkCdYe4viP8;X(~usOj?#PEPvrl#=GbP*ZJ9Q~RK&`8u22HKg;taHFWWs4tN(|P~k$#jT^^eZ2&y5YZKn*iE#9-mmc`!5+M_h%Orp z2EYIQ`@cm11VLnEXJruzD2B0h20hSYGBQCQ)eD7urP)?l=E@ba5e5@zOJX69BM|9y z8YTl3=4!O+?64kGS_br{QZ*Pn1!99v%gD^2u{b)d#cU`jDKB?gt@$P`2d8CbF;yC! zB~LFB@VUGkL!Mc!R7wOwl}aHN$u&wLPb@2~tajw-Kxm>~oq9X|0R+~zr(Lu2+HkShnq0>=fLYs+zSO&<15xa3Sp=}hibDlypuVH}p zqY(gYH%0(>!ZA_(HH^*afvp(>_U78eotPaD6y1^8o|lLe+f3S$+>VU!!a(H5_LM~o zVeHK-YjZb24q(wh0EatCLPX2O@IvATc?|<}2RKVa4586!F}%R|5nfrl#=sa}8vHn~ zF}#e3@p?EB!Mf0qpEU^#E+m$y zT%ge8hy^qXg-)DC2pi7pw)*bFM>cbg)KF;E zE14KeTjc5*8n3<9Xf^9{rBb0-tkB4G<^q??UTAeX3r&2^PhA(m=CEm0y1jV7Q);DV zkp*f)Wo4;ank$xNi_}V`AXh2XirM(HQyc!iQjzbPoc3I~TJPy>GnUv?TD2y>s7SBj z<6K8srK8X&;KAeQqBH+2fRPi&xxCy4chAa1ms%q;7nj?OssekNuctmYM^R*RXw}l) zys}Y*p$!CXWS z)!=FKE`+Yu_0O-&EKH3yx<~pvbsc>^cl%)L<<{DkdhlfR%=QL@BSH7z*f{tL+RZsM z1p6t&T9{X>v!@|XNy-xS4UAkXul9tN2RgcjL-SJ;!OqTBF}4qf?1gz%<-0tssi z0q=14a9h5;@N#?qjd_26sH?r!9hwN(j7-|jN|Rp*Hit_iXQ(ZOt(SE2qI!RG2~ zkw9R~TdT~?@0*yP4D{{YUvm&zvv1JdcFh}XZFV=7U%EWtYwW+)q|VXS4-A4kct%A8 zhHb-5=;{^9GjsdOBK5 z&3P?#1(r5}@rf%7O#I+Us@A^=+QM=~>^v#M+(CY72!*e|D{5 zyT49Mxv$qZxLaFoEp2Xh@A&Za>hhp(y4~d}9~kPen{XQPjEx7ch0v&ZuJZmStKQKP z>}kBx)YaZ_y|1(OT3hGT>il%T|F7P!N~JVgBq_Pnw0>i)yVa2+l1PLSnMw&ajeTZd zI7_CKN^?b0nM|yZ3wV5`w$M?eWASj4v#ivbFH@*xe6hw*P*&>FXk|*JB3B|&$ibgN zBI1WnFZv09i{Atym8-nmVb+Or)D_hg3NDMM(5Pg5g;FgR!c}w8nSL3z-mev?W=1U+Ke4_+2SqZ!EG|^Z7h30?!Hqn#Sg-&Cd>?v_K7p!2~J{p&Ze{E1!k4;ObNw z9aaE-YfGn4sh}~Sb`EqMLf`qhOyF2}-x_#?GKE5cY7E@b2HYw9ZuprSc?UcCFg&*z z-X5LM^aLWU-C@_M6`=mlPHGr{T9g4xL#SZHfyZit=3^iT+>aDxJk2Y7&4xb-;3$-& zzopr05hBti~s-t literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/DeviceStatus_old/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/DeviceStatus_old/view.json new file mode 100644 index 0000000..4e694c2 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/DeviceStatus_old/view.json @@ -0,0 +1,262 @@ +{ + "custom": {}, + "params": { + "tagProps": [ + "\"\"", + 1, + "", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + }, + "params.tagProps[0]": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps[1]": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps[2]": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps[3]": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps[4]": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps[5]": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps[6]": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps[7]": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps[8]": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps[9]": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 40, + "width": 40 + }, + "styles": "value" + }, + "root": { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "264px" + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "if({parent.custom.state}\u003d1||{parent.custom.covert_mode}||{parent.custom.isMatch}\u003e0,true,false)" + }, + "type": "expr" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "{parent.custom.ref_state}" + }, + "overlayOptOut": true, + "transforms": [ + { + "fallback": "EmergencyStop-Styles/EstopDeactivated", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "State-Styles/State1" + }, + { + "input": 2, + "output": "State-Styles/State2" + }, + { + "input": 3, + "output": "State-Styles/State3" + }, + { + "input": 4, + "output": "State-Styles/State4" + }, + { + "input": 5, + "output": "State-Styles/State5" + }, + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "path": "material/location_on" + }, + "type": "ia.display.icon" + } + ], + "events": { + "dom": { + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"DevicePopUP\", \"PopUp-Views/Device/Information-Device\", params \u003d{\"tagProps\":tagProps},resizable \u003d 1)\n\tsystem.perspective.print(tagProps)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root" + }, + "propConfig": { + "custom.alarmId": { + "binding": { + "config": { + "path": "session.custom.deviceSearchId" + }, + "type": "property" + } + }, + "custom.bit_position": { + "binding": { + "config": { + "path": "view.params.tagProps[1]" + }, + "type": "property" + } + }, + "custom.bit_value": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}" + }, + "tagPath": "{0}" + }, + "type": "tag" + } + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "session.custom.covert" + }, + "type": "property" + } + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({this.custom.alarmId} \u003d {this.custom.search_path},1,0)" + }, + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": "\tif currentValue.value \u003d\u003d 1:\n\t\tself.session.custom.searchId \u003d \"\"" + } + }, + "custom.priority": { + "binding": { + "config": { + "expression": "{view.params.tagProps[0]}" + }, + "transforms": [ + { + "code": "\tif \"AlarmCritical\" in value:\n\t\treturn 1\n\telif \"AlarmHigh\" in value:\n\t\treturn 1\n\telif \"AlarmMedium\" in value:\n\t\treturn 2\n\telif \"AlarmLow\" in value:\n\t\treturn 3\n\telif \"AlarmInfo\" in value:\n\t\treturn 4\n\telse:\n\t\treturn 5", + "type": "script" + } + ], + "type": "expr" + } + }, + "custom.ref_state": { + "binding": { + "config": { + "expression": "if({this.custom.state}\u003d1 \u0026\u0026 {this.custom.isMatch} \u003d 1,{this.custom.priority}+100,\nif({this.custom.state}\u003d1 \u0026\u0026 {this.custom.isMatch} \u003d 0,{this.custom.priority},\nif({this.custom.state}\u003d0 \u0026\u0026 {this.custom.isMatch} \u003d 1,{this.custom.priority}+100,5)))\n\n" + }, + "type": "expr" + } + }, + "custom.search_path": { + "binding": { + "config": { + "expression": "{view.params.tagProps[0]}+\"/\"+{view.params.tagProps[1]}" + }, + "type": "expr" + } + }, + "custom.state": { + "binding": { + "config": { + "expression": "getBit({this.custom.bit_value},{this.custom.bit_position})" + }, + "type": "expr" + } + } + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/Estop/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/Estop/resource.json new file mode 100644 index 0000000..d7a577f --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/Estop/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-02-21T17:18:20Z" + }, + "lastModificationSignature": "e61a352416c49ad59f6fdc4d2b3ab7bcce23bc50bd435f37d817c1fb02ea617f" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/Estop/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/Estop/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..6e09c62ef42cedefdf13bb6d168297d5b4f5a48c GIT binary patch literal 76 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ihzopr05hBti~s-t literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/Estop/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/Estop/view.json new file mode 100644 index 0000000..82ad1aa --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Device-Views/Estop/view.json @@ -0,0 +1,227 @@ +{ + "custom": {}, + "params": { + "tagProps": [ + "", + "", + "", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + }, + "params.tagProps[0]": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps[1]": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps[2]": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps[3]": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps[4]": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps[5]": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps[6]": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps[7]": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps[8]": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps[9]": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 40, + "width": 40 + }, + "styles": "value" + }, + "root": { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "264px" + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "if({parent.custom.state}\u003d1||{parent.custom.covert_mode}||{parent.custom.isMatch}\u003e0,true,false)" + }, + "type": "expr" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "{parent.custom.ref_state}" + }, + "overlayOptOut": true, + "transforms": [ + { + "fallback": "EmergencyStop-Styles/EstopDeactivated", + "inputType": "scalar", + "mappings": [ + { + "input": 0, + "output": "EmergencyStop-Styles/EstopDeactivated" + }, + { + "input": 1, + "output": "EmergencyStop-Styles/EstopActivated" + }, + { + "input": 101, + "output": "EmergencyStop-Styles/EstopActivated101" + }, + { + "input": 100, + "output": "EmergencyStop-Styles/EstopDeactivated100" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "path": "material/lens" + }, + "type": "ia.display.icon" + } + ], + "custom": { + "status": "value" + }, + "events": { + "dom": { + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"DevicePopUP\", \"PopUp-Views/Device/Information-Device\", params \u003d{\"tagProps\":tagProps},resizable \u003d 1)\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root" + }, + "propConfig": { + "custom.alarm_active": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "1": "{view.params.tagProps[1]}" + }, + "tagPath": "{0}/Alarms/{1}.IsActive" + }, + "type": "tag" + } + }, + "custom.alarm_shelved": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "1": "{view.params.tagProps[1]}" + }, + "tagPath": "{0}/Alarms/{1}.IsShelved" + }, + "type": "tag" + } + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "session.custom.covert" + }, + "type": "property" + } + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({session.custom.deviceSearchId} \u003d {this.custom.search_path},1,0)" + }, + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": "\tif currentValue.value \u003d\u003d 1:\n\t\tself.print(self.custom.search_path)\n\t\tself.session.custom.searchId \u003d \"\"" + }, + "persistent": false + }, + "custom.ref_state": { + "binding": { + "config": { + "expression": "if({this.custom.state}\u003d1 \u0026\u0026 {this.custom.isMatch}\u003d1,101,\nif({this.custom.state}\u003d1 \u0026\u0026 {this.custom.isMatch}\u003d0,1,\nif({this.custom.state}\u003d0 \u0026\u0026 {this.custom.isMatch}\u003d1,100,0)))" + }, + "type": "expr" + } + }, + "custom.search_path": { + "binding": { + "config": { + "expression": "{view.params.tagProps[0]}+\"/\"+{view.params.tagProps[1]}" + }, + "type": "expr" + } + }, + "custom.state": { + "binding": { + "config": { + "expression": "if({this.custom.alarm_shelved}\u003dTrue,0,\nif({this.custom.alarm_active}\u003dTrue,1,0))" + }, + "type": "expr" + } + } + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ARSAW/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ARSAW/resource.json new file mode 100644 index 0000000..b3f91cf --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ARSAW/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-24T18:54:32Z" + }, + "lastModificationSignature": "17a70fb4569e236f5764bcd5fc2d75cff0c4223bdc6f8367e74d4a2b420eec59" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ARSAW/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ARSAW/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..f718d6b14262ee1317a24edbd14d25e7ca9b2fd8 GIT binary patch literal 1508 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 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Camera/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Camera/view.json new file mode 100644 index 0000000..14a2b6c --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Camera/view.json @@ -0,0 +1,727 @@ +{ + "custom": { + "alarm_message": null, + "covert_mode": true, + "disconnected": false, + "display_icon": true, + "error": false, + "isMatch": 0, + "plc": "value", + "priority": 0, + "priority_string": "No active alarms", + "running_status": 4, + "searchId": "value", + "state": 5, + "state_string": "Unknown", + "tag_path_to_lookup": "[\"value\"]" + }, + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.alarm_message": { + "persistent": true + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t0, {session.custom.alarm_filter.show_running},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_low_alarm},\r\n\t\t4, {session.custom.alarm_filter.show_diagnostic},\r\n\t\t5, {session.custom.alarm_filter.show_running},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.disconnected": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}", + "plc": "{view.custom.plc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{plc}/DCN" + }, + "transforms": [ + { + "expression": "if(isNull({value}), False, {value})", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.display_icon": { + "binding": { + "config": { + "expression": "{this.custom.covert_mode}//||{this.custom.isMatch}\u003e0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "0 \u003c {value} \u0026\u0026 {value} \u003c 5", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({view.params.tagProps[0]}\u003d\"value\",0,\nif({this.custom.searchId}\u003d{view.params.tagProps[0]},100,0))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.plc": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "transforms": [ + { + "expression": "split({value}, \"/\")[0]", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "fallback": 0, + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": 4 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 4, + "output": 1 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority_string": { + "binding": { + "config": { + "expression": "case({view.custom.state},\r\n1, \"High\",\r\n2, \"Medium\",\r\n3, \"Low\",\r\n4, \"Diagnostic\",\r\n5, \"No active alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.running_status": { + "binding": { + "config": { + "expression": "coalesce(try(jsonGet(jsonGet({session.custom.state_messages},{this.custom.tag_path_to_lookup}),\"state\"),null),{view.params.forceRunningStatus},4)" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.searchId": { + "binding": { + "config": { + "path": "session.custom.searchId" + }, + "type": "property" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceFaultStatus},0)", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.state_string": { + "binding": { + "config": { + "expression": "case({view.custom.running_status},\r\n1, \"Faulted\",\r\n2, \"Stopped\",\r\n3, \"Running\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.tag_path_to_lookup": { + "binding": { + "config": { + "expression": "\"[\\\"\" + {view.params.tagProps[0]} + \"\\\"]\"" + }, + "type": "expr" + }, + "persistent": true + }, + "params.directionLeft": { + "paramDirection": "input", + "persistent": true + }, + "params.forceFaultStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.forceRunningStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 25, + "width": 40 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Camera" + }, + "position": { + "height": 1, + "width": 1, + "x": 0.0015, + "y": 0.0004 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "!{view.params.directionLeft}" + }, + "type": "expr" + } + }, + "props.elements[0].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "d": "M 0,0 H 39 V 24 H 0 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "M 34,17 26,12 34,7 Z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "M 9.7399998,7 H 25 V 17 H 9.7399998 Z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m 5,7 h 3 v 5 H 5 Z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + } + ], + "style": {}, + "viewBox": "-0.5 -0.5 40 25" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "Camera_Left" + }, + "position": { + "height": 1, + "width": 1, + "x": 0.0015, + "y": 0.0004 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "{view.params.directionLeft}" + }, + "type": "expr" + } + }, + "props.elements[0].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "d": "M 0,0 H 39 V 24 H 0 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m 31,7 h 3 v 5 h -3 z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "M 13.74,7 H 29 V 17 H 13.74 Z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m 5.556602,17 8,-5 -8,-5 z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + } + ], + "style": {}, + "viewBox": "-0.5 -0.5 40 25" + }, + "type": "ia.shapes.svg" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.openDock(\u0027Docked-East\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})" + }, + "scope": "G", + "type": "script" + }, + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"StatusPopUP\", \"PopUp-Views/Controller-Equipment/Information\", params \u003d{\"tagProps\":tagProps})\n\t" + }, + "enabled": false, + "scope": "G", + "type": "script" + }, + "onMouseEnter": { + "config": { + "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true, + "location": "top-left", + "style": {} + } + }, + "propConfig": { + "meta.tooltip.style.backgroundColor": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.style.classes": { + "binding": { + "config": { + "expression": "{view.custom.priority}" + }, + "transforms": [ + { + "fallback": "Alarms-Styles/NoAlarm", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 2, + "output": "Alarms-Styles/Low" + }, + { + "input": 3, + "output": "Alarms-Styles/Medium" + }, + { + "input": 4, + "output": "Alarms-Styles/High" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "meta.tooltip.style.color": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired},\r\n\t\u0027#000000\u0027,\r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#000000\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#FFFFFF\u0027,\r\n\t\t\t5,\u0027#FFFFFF\u0027,\r\n\t\t\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({view.custom.disconnected} \u003d False,\n\tif(isNull({view.custom.alarm_message}),\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string},\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Alarm: \" + {view.custom.alarm_message} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string}),\n\"Source Id: \" +{view.params.tagProps[0]} + \", Priority: Unknown, State: Unknown\")" + }, + "type": "expr" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "Disconnects/Device-Connected", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "Disconnects/Device-Disconnected" + }, + { + "input": false, + "output": "Disconnects/Device-Connected" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "aspectRatio": "40:25", + "mode": "percent", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/CognexCamera/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/CognexCamera/resource.json new file mode 100644 index 0000000..d100892 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/CognexCamera/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-24T18:54:32Z" + }, + "lastModificationSignature": "05c05854aae590a0ccbe36411d973667f65e8f75dfa800df84701aeccd06f2b1" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/CognexCamera/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/CognexCamera/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..67faf6d3a335dc0f64aa41f49ce0397f7cc91e80 GIT binary patch literal 81 zcmeAS@N?(olHy`uVBq!ia0vp^AT|>R8<0#)^t}M2Bs^UlLn`8u6Sxz9pEsD?XprW? dER@cX%)le4=n%YMWhGDzgQu&X%Q~loCIEb)5^ewh literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/CognexCamera/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/CognexCamera/view.json new file mode 100644 index 0000000..14a2b6c --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/CognexCamera/view.json @@ -0,0 +1,727 @@ +{ + "custom": { + "alarm_message": null, + "covert_mode": true, + "disconnected": false, + "display_icon": true, + "error": false, + "isMatch": 0, + "plc": "value", + "priority": 0, + "priority_string": "No active alarms", + "running_status": 4, + "searchId": "value", + "state": 5, + "state_string": "Unknown", + "tag_path_to_lookup": "[\"value\"]" + }, + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.alarm_message": { + "persistent": true + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t0, {session.custom.alarm_filter.show_running},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_low_alarm},\r\n\t\t4, {session.custom.alarm_filter.show_diagnostic},\r\n\t\t5, {session.custom.alarm_filter.show_running},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.disconnected": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}", + "plc": "{view.custom.plc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{plc}/DCN" + }, + "transforms": [ + { + "expression": "if(isNull({value}), False, {value})", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.display_icon": { + "binding": { + "config": { + "expression": "{this.custom.covert_mode}//||{this.custom.isMatch}\u003e0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "0 \u003c {value} \u0026\u0026 {value} \u003c 5", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({view.params.tagProps[0]}\u003d\"value\",0,\nif({this.custom.searchId}\u003d{view.params.tagProps[0]},100,0))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.plc": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "transforms": [ + { + "expression": "split({value}, \"/\")[0]", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "fallback": 0, + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": 4 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 4, + "output": 1 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority_string": { + "binding": { + "config": { + "expression": "case({view.custom.state},\r\n1, \"High\",\r\n2, \"Medium\",\r\n3, \"Low\",\r\n4, \"Diagnostic\",\r\n5, \"No active alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.running_status": { + "binding": { + "config": { + "expression": "coalesce(try(jsonGet(jsonGet({session.custom.state_messages},{this.custom.tag_path_to_lookup}),\"state\"),null),{view.params.forceRunningStatus},4)" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.searchId": { + "binding": { + "config": { + "path": "session.custom.searchId" + }, + "type": "property" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceFaultStatus},0)", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.state_string": { + "binding": { + "config": { + "expression": "case({view.custom.running_status},\r\n1, \"Faulted\",\r\n2, \"Stopped\",\r\n3, \"Running\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.tag_path_to_lookup": { + "binding": { + "config": { + "expression": "\"[\\\"\" + {view.params.tagProps[0]} + \"\\\"]\"" + }, + "type": "expr" + }, + "persistent": true + }, + "params.directionLeft": { + "paramDirection": "input", + "persistent": true + }, + "params.forceFaultStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.forceRunningStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 25, + "width": 40 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Camera" + }, + "position": { + "height": 1, + "width": 1, + "x": 0.0015, + "y": 0.0004 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "!{view.params.directionLeft}" + }, + "type": "expr" + } + }, + "props.elements[0].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "d": "M 0,0 H 39 V 24 H 0 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "M 34,17 26,12 34,7 Z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "M 9.7399998,7 H 25 V 17 H 9.7399998 Z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m 5,7 h 3 v 5 H 5 Z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + } + ], + "style": {}, + "viewBox": "-0.5 -0.5 40 25" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "Camera_Left" + }, + "position": { + "height": 1, + "width": 1, + "x": 0.0015, + "y": 0.0004 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "{view.params.directionLeft}" + }, + "type": "expr" + } + }, + "props.elements[0].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "d": "M 0,0 H 39 V 24 H 0 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m 31,7 h 3 v 5 h -3 z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "M 13.74,7 H 29 V 17 H 13.74 Z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m 5.556602,17 8,-5 -8,-5 z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + } + ], + "style": {}, + "viewBox": "-0.5 -0.5 40 25" + }, + "type": "ia.shapes.svg" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.openDock(\u0027Docked-East\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})" + }, + "scope": "G", + "type": "script" + }, + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"StatusPopUP\", \"PopUp-Views/Controller-Equipment/Information\", params \u003d{\"tagProps\":tagProps})\n\t" + }, + "enabled": false, + "scope": "G", + "type": "script" + }, + "onMouseEnter": { + "config": { + "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true, + "location": "top-left", + "style": {} + } + }, + "propConfig": { + "meta.tooltip.style.backgroundColor": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.style.classes": { + "binding": { + "config": { + "expression": "{view.custom.priority}" + }, + "transforms": [ + { + "fallback": "Alarms-Styles/NoAlarm", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 2, + "output": "Alarms-Styles/Low" + }, + { + "input": 3, + "output": "Alarms-Styles/Medium" + }, + { + "input": 4, + "output": "Alarms-Styles/High" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "meta.tooltip.style.color": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired},\r\n\t\u0027#000000\u0027,\r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#000000\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#FFFFFF\u0027,\r\n\t\t\t5,\u0027#FFFFFF\u0027,\r\n\t\t\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({view.custom.disconnected} \u003d False,\n\tif(isNull({view.custom.alarm_message}),\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string},\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Alarm: \" + {view.custom.alarm_message} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string}),\n\"Source Id: \" +{view.params.tagProps[0]} + \", Priority: Unknown, State: Unknown\")" + }, + "type": "expr" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "Disconnects/Device-Connected", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "Disconnects/Device-Disconnected" + }, + { + "input": false, + "output": "Disconnects/Device-Connected" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "aspectRatio": "40:25", + "mode": "percent", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ControlCabinet/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ControlCabinet/resource.json new file mode 100644 index 0000000..3a1b636 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ControlCabinet/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-24T18:54:32Z" + }, + "lastModificationSignature": "a4846f973618cb5367365a666cd66c4731a8fe9982fd49195072d091c4d45859" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ControlCabinet/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ControlCabinet/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..25364625a5f121b23500ee566f8cd551431f3dfb GIT binary patch literal 473 zcmV;~0Ve*5P)3Wx8P8}fL>-G3f^AHh5w}66u3GqmN;9SiSnwA*bo z8Vz(h9hA#uB$A2YZX($T#JPYnpeK6vMd3k{2n2Gl6iB43*=!=8&qEcX8nG+DZ>VPA zOJ=DF3*_M7+U<5xsZ@|mB}X+GsyU^aKGnSVqVUjZf`IXwLZJX2@lKk?G>Eo<4lqtc8mr&6u*B( P00000NkvXXu0mjf@f6ze literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ControlCabinet/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ControlCabinet/view.json new file mode 100644 index 0000000..c0e179f --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/ControlCabinet/view.json @@ -0,0 +1,551 @@ +{ + "custom": { + "alarm_message": null, + "covert_mode": true, + "disconnected": false, + "display_icon": true, + "error": false, + "isMatch": 0, + "plc": "value", + "priority": 0, + "priority_string": "No active alarms", + "running_status": 0, + "searchId": "value", + "state": 5, + "state_string": "Unknown" + }, + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.alarm_message": { + "persistent": true + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t0, {session.custom.alarm_filter.show_gateways},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_low_alarm}||{session.custom.alarm_filter.show_gateways},\r\n\t\t4, {session.custom.alarm_filter.show_diagnostic}||{session.custom.alarm_filter.show_gateways},\r\n\t\t5, {session.custom.alarm_filter.show_gateways},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.disconnected": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}", + "plc": "{view.custom.plc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{plc}/DCN" + }, + "transforms": [ + { + "expression": "if(isNull({value}), False, {value})", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.display_icon": { + "binding": { + "config": { + "expression": "{this.custom.covert_mode}//||{this.custom.isMatch}\u003e0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "0 \u003c {value} \u0026\u0026 {value} \u003c 5", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({view.params.tagProps[0]}\u003d\"value\",0,\nif({this.custom.searchId}\u003d{view.params.tagProps[0]},100,0))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.plc": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "transforms": [ + { + "expression": "split({value}, \"/\")[0]", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "fallback": 0, + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": 4 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 4, + "output": 1 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority_string": { + "binding": { + "config": { + "expression": "case({view.custom.state},\r\n1, \"High\",\r\n2, \"Medium\",\r\n3, \"Low\",\r\n4, \"Diagnostic\",\r\n5, \"No active alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.running_status": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/STATE" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceRunningStatus},0)", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.searchId": { + "binding": { + "config": { + "path": "session.custom.searchId" + }, + "type": "property" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceFaultStatus},0)", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.state_string": { + "binding": { + "config": { + "expression": "case({view.custom.running_status},\r\n1, \"Faulted\",\r\n2, \"Stopped\",\r\n3, \"Running\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "params.forceFaultStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.forceRunningStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.has_state": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 47, + "width": 68 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "ControlCabinet" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "props.elements[0].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "d": "M 0 40 L 0 0 L 61 40 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#4c4c4c", + "width": 4 + }, + "transform": "rotate(-180,30.5,20)", + "type": "path" + }, + { + "d": "M 0 40 L 0 0 L 61 40 Z", + "fill": { + "paint": "#4C4C4C" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 4 + }, + "type": "path" + } + ], + "preserveAspectRatio": "none", + "style": {}, + "viewBox": "-0.5 -0.5 62 41" + }, + "type": "ia.shapes.svg" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.openDock(\u0027Docked-East\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})" + }, + "scope": "G", + "type": "script" + }, + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"StatusPopUP\", \"PopUp-Views/Controller-Equipment/Information\", params \u003d{\"tagProps\":tagProps})\n\t" + }, + "enabled": false, + "scope": "G", + "type": "script" + }, + "onMouseEnter": { + "config": { + "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true, + "location": "top-left", + "style": {} + } + }, + "propConfig": { + "meta.tooltip.style.backgroundColor": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.style.classes": { + "binding": { + "config": { + "expression": "{view.custom.priority}" + }, + "transforms": [ + { + "fallback": "Alarms-Styles/NoAlarm", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 2, + "output": "Alarms-Styles/Low" + }, + { + "input": 3, + "output": "Alarms-Styles/Medium" + }, + { + "input": 4, + "output": "Alarms-Styles/High" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "meta.tooltip.style.color": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired},\r\n\t\u0027#000000\u0027,\r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#000000\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#FFFFFF\u0027,\r\n\t\t\t5,\u0027#FFFFFF\u0027,\r\n\t\t\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({view.custom.disconnected} \u003d False,\n\tif(isNull({view.custom.alarm_message}),\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string},\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Alarm: \" + {view.custom.alarm_message} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string}),\n\"Source Id: \" +{view.params.tagProps[0]} + \", Priority: Unknown, State: Unknown\")" + }, + "type": "expr" + } + }, + "meta.visible": { + "binding": { + "config": { + "path": "view.custom.display_icon" + }, + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "Disconnects/Device-Connected", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "Disconnects/Device-Disconnected" + }, + { + "input": false, + "output": "Disconnects/Device-Connected" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "aspectRatio": "68:47", + "mode": "percent", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Estop/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Estop/resource.json new file mode 100644 index 0000000..8919e90 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Estop/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-24T18:54:32Z" + }, + "lastModificationSignature": "e949d5a7bb5ce75a53742f6c15b7979087dbb689582de3aafcc4704b0a7a98e3" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Estop/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Estop/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..f32fa3bbe8fb9654399ca8486a6aec457cc374de GIT binary patch literal 81 zcmeAS@N?(olHy`uVBq!ia0vp^Od!m`1|*BN@u~nR2~QWtkczlu4-bzY_b*)dFrU$7 eP1M#`_6$LJT+(|lPALbfVeoYIb6Mw<&;$U_#uhUG literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Estop/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Estop/view.json new file mode 100644 index 0000000..9c7decd --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Estop/view.json @@ -0,0 +1,525 @@ +{ + "custom": { + "alarm_message": null, + "covert_mode": true, + "disconnected": false, + "display_icon": true, + "error": false, + "isMatch": 0, + "plc": "value", + "priority": 0, + "priority_string": "No active alarms", + "searchId": "value", + "state": 5 + }, + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.alarm_message": { + "persistent": true + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "this.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t0, {session.custom.alarm_filter.show_safety},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_safety},\r\n\t\t4, {session.custom.alarm_filter.show_safety},\r\n\t\t5, {session.custom.alarm_filter.show_safety},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.disconnected": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}", + "plc": "{view.custom.plc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{plc}/DCN" + }, + "transforms": [ + { + "expression": "if(isNull({value}), False, {value})", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.display_icon": { + "binding": { + "config": { + "expression": "{this.custom.covert_mode}||{this.custom.isMatch}\u003e0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "0 \u003c {value} \u0026\u0026 {value} \u003c 5", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({view.params.tagProps[0]}\u003d\"value\",0,\nif({this.custom.searchId}\u003d{view.params.tagProps[0]},100,0))\n" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.plc": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "transforms": [ + { + "expression": "split({value}, \"/\")[0]", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "fallback": 0, + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": 4 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 4, + "output": 1 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority_string": { + "binding": { + "config": { + "expression": "case({view.custom.state},\r\n1, \"High\",\r\n2, \"Medium\",\r\n3, \"Low\",\r\n4, \"Diagnostic\",\r\n5, \"No active alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.searchId": { + "binding": { + "config": { + "path": "session.custom.searchId" + }, + "type": "property" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceFaultStatus},0)", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "params.forceFaultStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.forceRunningStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 25, + "width": 25 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Estop", + "tooltip": { + "style": { + "fontSize": 16 + } + } + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "props.elements[0].fill.paint": { + "binding": { + "config": { + "expression": "\u0027#AAAAAA\u0027" + }, + "transforms": [ + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "expr" + } + }, + "props.elements[1].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state1},\r\n3,{session.custom.colours.state1},\r\n4,{session.custom.colours.state1},\r\n{session.custom.colours.state5}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "d": "M 0,0 H 20 V 20 H 0 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1.5 + }, + "type": "path" + }, + { + "d": "m 17,10.5 a 7,7 0 0 1 -7,7 7,7 0 0 1 -7,-7 7,7 0 0 1 7,-7 7,7 0 0 1 7,7 z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + } + ], + "style": {}, + "viewBox": "0 0 20 20" + }, + "type": "ia.shapes.svg" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.openDock(\u0027Docked-East\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})" + }, + "scope": "G", + "type": "script" + }, + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"StatusPopUP\", \"PopUp-Views/Controller-Equipment/Information\", params \u003d{\"tagProps\":tagProps})\n\t" + }, + "enabled": false, + "scope": "G", + "type": "script" + }, + "onMouseEnter": { + "config": { + "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true, + "location": "top-left", + "style": {} + } + }, + "propConfig": { + "meta.tooltip.style.backgroundColor": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.style.classes": { + "binding": { + "config": { + "expression": "{view.custom.priority}" + }, + "transforms": [ + { + "fallback": "Alarms-Styles/NoAlarm", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 2, + "output": "Alarms-Styles/Low" + }, + { + "input": 3, + "output": "Alarms-Styles/Medium" + }, + { + "input": 4, + "output": "Alarms-Styles/High" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "meta.tooltip.style.color": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired},\r\n\t\u0027#000000\u0027,\r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#000000\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#FFFFFF\u0027,\r\n\t\t\t5,\u0027#FFFFFF\u0027,\r\n\t\t\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({view.custom.disconnected} \u003d False,\n\tif(isNull({view.custom.alarm_message}),\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Priority: \" + {view.custom.priority_string},\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Alarm: \" + {view.custom.alarm_message} +\n\t\", Priority: \" + {view.custom.priority_string}),\n\"Source Id: \" +{view.params.tagProps[0]} + \", Priority: Unknown, State: Unknown\")" + }, + "type": "expr" + } + }, + "meta.visible": { + "binding": { + "config": { + "path": "view.custom.display_icon" + }, + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "Disconnects/Device-Connected", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "Disconnects/Device-Disconnected" + }, + { + "input": false, + "output": "Disconnects/Device-Connected" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "aspectRatio": "1:1", + "mode": "percent", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/GoodsLift/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/GoodsLift/resource.json new file mode 100644 index 0000000..cbcd7cc --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/GoodsLift/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-24T18:54:32Z" + }, + "lastModificationSignature": "1435fe6375e679351a81033e23eecea8c8c61f1dba121ca430c0de7f01a22c45" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/GoodsLift/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/GoodsLift/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..6abef4ed0509676dd73a802a0bb216d375e37676 GIT binary patch literal 1768 zcmVP)v6o7vV8Xz=DqhS-7)Z_y3D60K1&$s)s!;p)@0Z5LM(OD2kS9-`$kV4!<>AAJ^6J$qId$rk-MhMt z0GvE|Qs&H=BY{9bGBY#f-o1O;=gyrwx|jzK9;iD24(#sTyJgFkE%N&H>!2aR0s@BF z`JrgTh7EG$$PooVxj`|Z{l`jJ&fw%7pn>SCPcI?=p+ngBHOm*y#0hEJy>8t)%>?egCQ|?{ z&#@|!Dcc$f&bGX{xmi}MSRtD?Z`O3fea6u`g)yWc`f#!&CnswTWhMN2_`0w819T3WkrmiGiS-zzLEl;g*b>qK5FGPtIu zCMhp3mqUjR>G4HdR#v9b&NctNgl8sw{PFd#*G{GWC#amKJ>qZ ztbrwM{s5M<3S!TmJ<`z7pdGxN*3t+q*LJ~z1$u&P-@aXo0p~ON zrlqB6KxJfP=rus}qyOyLvn44hX^IsC)MEVl`}@_&{kGNs@f85$;^K6I7cX9@Pce>m z@#4jrZf@Vc9V`mW@94`I7FShOrPuf_{pde`{(KD_<_Q8?nL||J6J+p60GY%p5F*ne zlnDSNvYEu9)1sF#jK$};28@36XWTSE3dNC;5go`uO~|{!`~cZHu1z7W0h%sz6&uSK z#-f937C=Axdjev;j~_p3A;5~fd~YUz+(YcRiwUr=uTRs9U-ZTT$U#powfx9<3=k9G z&6_u+rlv+6{eM}ot*uQL%o$B>*V@`DFJHdY^F3-nl+@SP`=*y@0f|PcZq8ZDZ;KW! z3cim-4M<_Y0nT>J1dz#=ELo!Y%)lsAQ&Lib*W^f26tEEk()r4jD|$+}p`rz30s|uf z-?(u@_40ZH4v^4$zlbxqYlB6CUy+Eb(us2NGB$ZB~g=nu{>4K(xppf`SRtmY}qmu{&O!>g%lAW zAAE4^P=!J$KqjZyvtO0c8eFFMJLtJs#UAB-lKK?=b7I*9~O{m zns*V7BR-Y+ZAB-if1C|K+w5z<;p1sh63`^gcZMh`Jx{r$z6U{L|7f} zKw-c;2;0KS5&lOi*57nkKsgVL;Cr!IkuBu2SEx@Ohy@c?MOZb9VsUoQPtZ&2{OHL& zbhwY(DW5*<^^h%kWP*kX+<{_3e}V&$qM{=8L93!HvYqox0kqE_ zLqkJqMFykH4d;YJIbZ}$e0;nXzKn5CWB@jffW+tc!sWJ_Q~m*^quQ8t#=7SK0000< KMNUMnLSTaKnP*P` literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/GoodsLift/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/GoodsLift/view.json new file mode 100644 index 0000000..6331de9 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/GoodsLift/view.json @@ -0,0 +1,627 @@ +{ + "custom": { + "FillColour": "value", + "alarm_message": null, + "covert_mode": true, + "disconnected": false, + "display_icon": true, + "error": false, + "isMatch": 0, + "plc": "value", + "priority": 0, + "priority_string": "No active alarms", + "running": false, + "running_status": 0, + "searchId": "value", + "show_error": false, + "show_running": true, + "state": 5, + "state_string": "Unknown" + }, + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.FillColour": { + "persistent": true + }, + "custom.alarm_message": { + "persistent": true + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t0, {session.custom.alarm_filter.show_running},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_low_alarm} || {session.custom.alarm_filter.show_running},\r\n\t\t4, {session.custom.alarm_filter.show_diagnostic} || {session.custom.alarm_filter.show_running},\r\n\t\t5, {session.custom.alarm_filter.show_running},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.disconnected": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}", + "plc": "{view.custom.plc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{plc}/DCN" + }, + "transforms": [ + { + "expression": "if(isNull({value}), False, {value})", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.display_icon": { + "binding": { + "config": { + "expression": "{this.custom.covert_mode}//||{this.custom.isMatch}\u003e0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "0 \u003c {value} \u0026\u0026 {value} \u003c 5", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({view.params.tagProps[0]}\u003d\"value\",0,\nif({this.custom.searchId}\u003d{view.params.tagProps[0]},100,0))\n" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.plc": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "transforms": [ + { + "expression": "split({value}, \"/\")[0]", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "fallback": 0, + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": 4 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 4, + "output": 1 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority_string": { + "binding": { + "config": { + "expression": "case({view.custom.state},\r\n1, \"High\",\r\n2, \"Medium\",\r\n3, \"Low\",\r\n4, \"Diagnostic\",\r\n5, \"No active alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.running": { + "binding": { + "config": { + "expression": "{view.custom.running_status} \u003d 3" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.running_status": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/STATE" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceRunningStatus},0)", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.searchId": { + "binding": { + "config": { + "path": "session.custom.searchId" + }, + "type": "property" + }, + "persistent": true + }, + "custom.show_error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_low_alarm},\r\n\t\t4, {session.custom.alarm_filter.show_diagnostic},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.show_running": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t1, False,\r\n\t\t2, False,\r\n\t\t{session.custom.alarm_filter.show_running}\r\n\t\t)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceFaultStatus},0)", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.state_string": { + "binding": { + "config": { + "expression": "case({view.custom.running_status},\r\n1, \"Faulted\",\r\n2, \"Stopped\",\r\n3, \"Running\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "params.forceFaultStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.forceRunningStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 100, + "width": 100 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Goods_Lift" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "props.elements[1].elements[0].elements[0].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,if({view.custom.running},{session.custom.colours.state5},{session.custom.colours.state0}),\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "id": "defs2", + "name": "defs2", + "type": "defs" + }, + { + "elements": [ + { + "elements": [ + { + "cx": "69.035934", + "cy": "129.08073", + "fill": {}, + "id": "path509", + "name": "path509", + "rx": "9.5693493", + "ry": "9.4979048", + "stroke": { + "dasharray": "none", + "linejoin": "round", + "paint": "#000000", + "width": 0.5 + }, + "style": { + "paintOrder": "stroke fill markers" + }, + "type": "ellipse" + }, + { + "d": "m 67.713019,128.18115 1.322917,-0.66146 1.322917,0.66146 v -3.06917 h -2.645834 z m -1.322916,3.54542 v -1.05833 h 2.645833 v 1.05833 z m -1.322918,2.11667 q -0.3175,0 -0.555625,-0.23812 -0.238125,-0.23813 -0.238125,-0.55563 v -7.93751 q 0,-0.3175 0.238125,-0.55562 0.238125,-0.23813 0.555625,-0.23813 h 7.937499 q 0.3175,0 0.55563,0.23813 0.23812,0.23812 0.23812,0.55562 v 7.93751 q 0,0.3175 -0.23812,0.55563 -0.23813,0.23812 -0.55563,0.23812 z m 0,-8.73126 v 7.93751 z m 0,7.93751 h 7.937499 v -7.93751 h -1.852081 v 4.3524 l -2.116667,-1.05834 -2.116666,1.05834 v -4.3524 h -1.852085 z", + "id": "path132", + "name": "path132", + "stroke": { + "dasharray": "none", + "width": 0 + }, + "type": "path" + }, + { + "d": "m 66.429788,123.74768 -0.568854,-0.56885 3.175,-3.175 3.175,3.16177 -0.568855,0.56885 -2.606145,-2.60614 z", + "id": "path2154", + "name": "path2154", + "stroke": { + "width": 0.264583 + }, + "type": "path" + }, + { + "d": "m 71.642074,134.41379 0.56886,0.56885 -3.175,3.175 -3.175,-3.16177 0.56885,-0.56885 2.60615,2.60614 z", + "id": "path2154-5", + "name": "path2154-5", + "stroke": { + "width": 0.264583 + }, + "type": "path" + } + ], + "id": "g2552", + "name": "g2552", + "type": "group" + } + ], + "id": "layer1", + "name": "layer1", + "transform": "translate(-58.814035,-118.93028)", + "type": "group" + } + ], + "style": {}, + "viewBox": "0 0 20.443798 20.300909" + }, + "type": "ia.shapes.svg" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.openDock(\u0027Docked-East\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})" + }, + "scope": "G", + "type": "script" + }, + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"StatusPopUP\", \"PopUp-Views/Controller-Equipment/Information\", params \u003d{\"tagProps\":tagProps})\n\t" + }, + "enabled": false, + "scope": "G", + "type": "script" + }, + "onMouseEnter": { + "config": { + "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true, + "location": "top-left", + "style": {} + } + }, + "propConfig": { + "meta.tooltip.style.backgroundColor": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.style.classes": { + "binding": { + "config": { + "expression": "{view.custom.priority}" + }, + "transforms": [ + { + "fallback": "Alarms-Styles/NoAlarm", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 2, + "output": "Alarms-Styles/Low" + }, + { + "input": 3, + "output": "Alarms-Styles/Medium" + }, + { + "input": 4, + "output": "Alarms-Styles/High" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "meta.tooltip.style.color": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired},\r\n\t\u0027#000000\u0027,\r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#000000\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#FFFFFF\u0027,\r\n\t\t\t5,\u0027#FFFFFF\u0027,\r\n\t\t\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({view.custom.disconnected} \u003d False,\n\tif(isNull({view.custom.alarm_message}),\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string},\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Alarm: \" + {view.custom.alarm_message} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string}),\n\"Source Id: \" +{view.params.tagProps[0]} + \", Priority: Unknown, State: Unknown\")" + }, + "type": "expr" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "Disconnects/Device-Connected", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "Disconnects/Device-Disconnected" + }, + { + "input": false, + "output": "Disconnects/Device-Connected" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "aspectRatio": "1:1", + "mode": "percent", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/JAM/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/JAM/resource.json new file mode 100644 index 0000000..8a812f9 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/JAM/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-08-01T07:52:07Z" + }, + "lastModificationSignature": "c49cb5db74f2e34614dd236f4b0306b6b55d998a425b7dd56ac5cd36b29fac9d" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/JAM/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/JAM/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..9ace1ccbfaa12c30d7fa3a87d7c61ce0a3dcd578 GIT binary patch literal 74 zcmeAS@N?(olHy`uVBq!ia0vp^Od!m`1|*BN@u~nRK~ERQkcznEA75WzuNO#bFl6ZU W;NQBIAua?c$>8bg=d#Wzp$PyWmJ##- literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/JAM/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/JAM/view.json new file mode 100644 index 0000000..fd3376e --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/JAM/view.json @@ -0,0 +1,76 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 24, + "width": 24 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "troubleshoot_white_24dp" + }, + "position": { + "height": 1, + "width": 1 + }, + "props": { + "elements": [ + { + "elements": [ + { + "fill": { + "paint": "transparent" + }, + "height": "24", + "name": "rect", + "type": "rect", + "width": "24" + } + ], + "name": "group", + "type": "group" + }, + { + "elements": [ + { + "elements": [ + { + "d": "M22,20.59l-4.69-4.69C18.37,14.55,19,12.85,19,11c0-4.42-3.58-8-8-8c-4.08,0-7.44,3.05-7.93,7h2.02C5.57,7.17,8.03,5,11,5 c3.31,0,6,2.69,6,6s-2.69,6-6,6c-2.42,0-4.5-1.44-5.45-3.5H3.4C4.45,16.69,7.46,19,11,19c1.85,0,3.55-0.63,4.9-1.69L20.59,22 L22,20.59z", + "name": "path", + "type": "path" + }, + { + "name": "polygon", + "points": "8.43,9.69 9.65,15 11.29,15 12.55,11.22 13.5,13.5 15.5,13.5 15.5,12 14.5,12 13.25,9 11.71,9 10.59,12.37 9.35,7 7.7,7 6.45,11 1,11 1,12.5 7.55,12.5", + "type": "polygon" + } + ], + "name": "group", + "type": "group" + } + ], + "name": "group", + "type": "group" + } + ], + "fill": { + "paint": "#FFFFFF" + }, + "viewBox": "0 0 24 24" + }, + "type": "ia.shapes.svg" + } + ], + "meta": { + "name": "root" + }, + "props": { + "mode": "percent" + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Kobukuro/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Kobukuro/resource.json new file mode 100644 index 0000000..48ce4a1 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Kobukuro/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "hrtste", + "timestamp": "2024-04-16T08:26:22Z" + }, + "lastModificationSignature": "5b429796b30bdd69c32e9fb638d65e343f7ff3ce4ec839b995d2eabc8a1ff206" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Kobukuro/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Kobukuro/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..474f8d618efb29b0d541fc509badf0ac616cd6b0 GIT binary patch literal 2318 zcmV+p3Gw!cP)a;wtn7#7>({UL z;ll?%M*m*Ccwt2)<-u>xA3l5-dg7lybbS8&*-A@G<7~tLcj1pptE?!iejpx1B0p!GiT1Up+kpSuU@?zbY5PbJ$v>n0E$PD0AOhX zAW>m=xPiZS@7_7E(W6IOmo8mw;lhP>`0!yne*C!0kt0X!;K74-pjr+cI^@DR*TT;s zn>TN^2@@t*@7}$g^*eX&1VFLp0P7QWBX{1qb<5crH*TEo{KSb94rt%LeYSV+UOys* zg@p-4_jwipJUR{>IN21Tj`rROD`w(*IM$>gm&`ZPlt()}~FH z+5rmO^XJb!&N4GIoi!Bw7sj+cECMFIoGWY+0+d??ZtmQWQTot%#tF~S+c7D-4lqMve810bCOfGmJ+cBi<5IRLb8-`>xcEn8+id-n8h zLR=wSPm~~%Xv}gA;8Ukgb@tih;>C-tUAuPf1vbO84p4D-`}S??*s-H8M1kUtbC?)B zc(8-))Txt$1elB~1YqSy1RaDyQc{x3`t|EQHtE~ks{wHJ>eV)V`t*R_aLNOE{`~pw zX1PRcATYdh=T48Y9Xob3SXifIL+~6uo}q%Uhyf1QzIye_di3aFyLRnzCS+Iu*$w4^ z1VNEDz!62TKzm{XxQGO*Plz={x(F%a7m^UX7Nf`V2i;^L*%W3k43fBje#(hrMDC}g zkbz7mv?;uyqlDkOMsh7(y3}JC78S#6mhd4Nok0PdHf@>*DLV+eP9h)#^{iR5g6Fu- zIRJ@Im|>$ZGi1mRFGKw1Ncquy${3Y^m=6QQQ^X%@u^Xdnym|A+7g49gOcWs3a4owh zM%Z1LL24f0DHZ4-zNl{)R(wGK46_y?W&w_C6;=XCs4(cpVDIVErw&jxsxCnRy8{5v zhXEoOCg_Qw#*G{Mb1)2$rcImrxX(HOZQs7#?M4Bzp4LZ!cYr_Lyy@dN8I&mg!r(BL zl9J->3`Hmp15^uS_-x+1xwC<5n>1gjb>LY6sSRM*27`t(IO)Q#zT^5B6d(Ywm{LJPz+@C4RRMq) zn=@yQ-@_>Dk-7jXQ7Bst2B?fh86aQ=5OQf4Ab?2*O3jrkR~#7bqVDlNjE?#MqKDEI zxHvmABcY46V_3nJ7$=!1)(jTxG|V9DuV26Jb0mW(pi)y)y@XMQco9NxZCNav=ww(9 zk_2T@21PYBj1G{Uo$bs~=}}1Aqx}(IfI|m$u(-I`u3fuk=gyt;iHF*GtI^f5xuwY)`-1C0FjtReO$x~55{g%!M`P zKE2oCE|?+cmFZ#8N22I;32UODlqB4befsptzwbSH^2FmoU!wp>5(prPLVtu6;!Z;W z9R*ja?P1{G2mrM~5rkKLn}vgR$7$aj{zysD7BcCCgBPG5`P)$}zyM=?Z%HsExUBJgHwJv^PS6TBBv7*di&IkXWw_uK`f5ru0x^aD|3Uz@QYMD&}EuBo6fu7H~hJ+RC%A#AYeb ogbi%MB>kK6rJ)1H(J7mM0kkU1S!nHpfdBvi07*qoM6N<$g7ZOE6951J literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Kobukuro/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Kobukuro/view.json new file mode 100644 index 0000000..459bb13 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Kobukuro/view.json @@ -0,0 +1,1021 @@ +{ + "custom": { + "FillColour": "value", + "alarm_message": null, + "covert_mode": true, + "disconnected": false, + "display_icon": true, + "error": false, + "isMatch": 0, + "plc": "value", + "priority": 0, + "priority_string": "No active alarms", + "running": false, + "running_status": 0, + "searchId": "PLC01", + "show_error": false, + "show_running": true, + "state": 5, + "state_string": "Unknown" + }, + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.FillColour": { + "persistent": true + }, + "custom.alarm_message": { + "persistent": true + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t0, {session.custom.alarm_filter.show_running},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_low_alarm} || {session.custom.alarm_filter.show_running},\r\n\t\t4, {session.custom.alarm_filter.show_diagnostic} || {session.custom.alarm_filter.show_running},\r\n\t\t5, {session.custom.alarm_filter.show_running},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.disconnected": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}", + "plc": "{view.custom.plc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{plc}/DCN" + }, + "transforms": [ + { + "expression": "if(isNull({value}), False, {value})", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.display_icon": { + "binding": { + "config": { + "expression": "{this.custom.covert_mode}//||{this.custom.isMatch}\u003e0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "0 \u003c {value} \u0026\u0026 {value} \u003c 5", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({view.params.tagProps[0]}\u003d\"value\",0,\nif({this.custom.searchId}\u003d{view.params.tagProps[0]},100,0))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.plc": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "transforms": [ + { + "expression": "split({value}, \"/\")[0]", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "fallback": 0, + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": 4 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 4, + "output": 1 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority_string": { + "binding": { + "config": { + "expression": "case({view.custom.state},\r\n1, \"High\",\r\n2, \"Medium\",\r\n3, \"Low\",\r\n4, \"Diagnostic\",\r\n5, \"No active alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.running": { + "binding": { + "config": { + "expression": "{view.custom.running_status} \u003d 3" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.running_status": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/STATE" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceRunningStatus},0)", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.searchId": { + "binding": { + "config": { + "path": "session.custom.searchId" + }, + "type": "property" + }, + "persistent": true + }, + "custom.show_error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_low_alarm},\r\n\t\t4, {session.custom.alarm_filter.show_diagnostic},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.show_running": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t1, False,\r\n\t\t2, False,\r\n\t\t{session.custom.alarm_filter.show_running}\r\n\t\t)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceFaultStatus},0)", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.state_string": { + "binding": { + "config": { + "expression": "case({view.custom.running_status},\r\n1, \"Faulted\",\r\n2, \"Stopped\",\r\n3, \"Running\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "params.forceFaultStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.forceRunningStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 100, + "width": 100 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "KPS_Symbol" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "props.elements[10].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,if({view.custom.running},{session.custom.colours.state5},{session.custom.colours.state0}),\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[11].elements[0].elements[0].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,if({view.custom.running},{session.custom.colours.state5},{session.custom.colours.state0}),\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[11].elements[1].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,if({view.custom.running},{session.custom.colours.state5},{session.custom.colours.state0}),\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[11].elements[2].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,if({view.custom.running},{session.custom.colours.state5},{session.custom.colours.state0}),\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[1].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,if({view.custom.running},{session.custom.colours.state5},{session.custom.colours.state0}),\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[4].elements[0].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,if({view.custom.running},{session.custom.colours.state5},{session.custom.colours.state0}),\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[4].elements[1].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,if({view.custom.running},{session.custom.colours.state5},{session.custom.colours.state0}),\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[5].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,if({view.custom.running},{session.custom.colours.state5},{session.custom.colours.state0}),\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[6].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,if({view.custom.running},{session.custom.colours.state5},{session.custom.colours.state0}),\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\n{view.custom.state} + 100 + {view.custom.isMatch},\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "id": "defs2", + "name": "defs2", + "type": "defs" + }, + { + "d": "M 2.5706316,14.829176 A 8.6886292,8.8029537 0 0 1 3.7045976,2.4348857 8.6886292,8.8029537 0 0 1 15.938255,3.5801235 8.6886292,8.8029537 0 0 1 14.811492,15.975088 8.6886292,8.8029537 0 0 1 2.5771713,14.837148", + "fill": {}, + "id": "path392", + "name": "path392", + "stroke": { + "dasharray": "none", + "miterlimit": "4", + "paint": "#000000", + "width": "0.301" + }, + "type": "path" + }, + { + "d": "m 9.5390129,4.6864138 v 4.054911", + "fill": { + "paint": "#ffffff" + }, + "id": "path5019", + "name": "path5019", + "stroke": { + "width": "0.995" + }, + "style": { + "InkscapeStroke": "none", + "color": "#000000" + }, + "type": "path" + }, + { + "d": "M 9.4725388,4.3208071 V 10.203752", + "fill": { + "paint": "#ffffff" + }, + "id": "path5287", + "name": "path5287", + "stroke": { + "width": "0.264583" + }, + "style": { + "InkscapeStroke": "none", + "color": "#000000" + }, + "type": "path" + }, + { + "elements": [ + { + "d": "m 3.5355633,13.180222 a 1.7980549,1.7980549 0 0 1 0.2346668,-2.531606 1.7980549,1.7980549 0 0 1 2.5316754,0.233921 1.7980549,1.7980549 0 0 1 -0.2331762,2.531744 1.7980549,1.7980549 0 0 1 -2.5318126,-0.23243", + "fill": { + "opacity": "1" + }, + "id": "path5410", + "name": "path5410", + "stroke": { + "dasharray": "none", + "linecap": "butt", + "miterlimit": "4", + "opacity": "1", + "paint": "#000000", + "width": "0.264583" + }, + "type": "path" + }, + { + "d": "m 4.4777183,12.373384 a 0.50880533,0.50880533 0 0 1 0.066405,-0.716383 0.50880533,0.50880533 0 0 1 0.7164019,0.06619 0.50880533,0.50880533 0 0 1 -0.065983,0.716422 0.50880533,0.50880533 0 0 1 -0.7164408,-0.06577", + "fill": { + "opacity": "1" + }, + "id": "path5410-5", + "name": "path5410-5", + "stroke": { + "dasharray": "none", + "linecap": "butt", + "miterlimit": "4", + "opacity": "1", + "paint": "#000000", + "width": "0.264583" + }, + "type": "path" + } + ], + "id": "g5618", + "name": "g5618", + "transform": "translate(-0.53179165,0.03323698)", + "type": "group" + }, + { + "d": "M 4.2949151,5.1775781 A 0.50880533,0.50880533 0 0 1 4.3613201,4.4611957 0.50880533,0.50880533 0 0 1 5.0777219,4.5273898 0.50880533,0.50880533 0 0 1 5.0117388,5.2438111 0.50880533,0.50880533 0 0 1 4.2952981,5.1780389", + "fill": { + "opacity": "1" + }, + "id": "path5410-5-0", + "name": "path5410-5-0", + "stroke": { + "dasharray": "none", + "linecap": "butt", + "miterlimit": "4", + "opacity": "1", + "paint": "#000000", + "width": "0.264583" + }, + "type": "path" + }, + { + "d": "m 12.182905,4.9268147 a 0.81870443,0.81870443 0 0 1 0.106851,-1.1527109 0.81870443,0.81870443 0 0 1 1.152742,0.106511 0.81870443,0.81870443 0 0 1 -0.106172,1.1527735 0.81870443,0.81870443 0 0 1 -1.152804,-0.1058322", + "fill": { + "opacity": "1" + }, + "id": "path5410-5-0-4", + "name": "path5410-5-0-4", + "stroke": { + "dasharray": "none", + "linecap": "butt", + "miterlimit": "4", + "opacity": "1", + "paint": "#000000", + "width": "0.264583" + }, + "type": "path" + }, + { + "d": "M 6.1038118,11.509128 4.1664144,4.9099388", + "fill": { + "opacity": "1", + "paint": "#ffffff" + }, + "id": "path5480", + "name": "path5480", + "stroke": { + "dasharray": "none", + "linecap": "butt", + "miterlimit": "4", + "opacity": "1", + "paint": "#000000", + "width": "0.226268" + }, + "type": "path" + }, + { + "d": "M 15.295408,12.27744 13.587526,4.1416262", + "fill": { + "opacity": "1", + "paint": "#ffffff" + }, + "id": "path5480-7", + "name": "path5480-7", + "stroke": { + "dasharray": "none", + "linecap": "butt", + "miterlimit": "4", + "opacity": "1", + "paint": "#000000", + "width": "0.235884" + }, + "type": "path" + }, + { + "d": "M 4.754402,4.3462292 12.628538,3.5974087", + "fill": { + "opacity": "1", + "paint": "#ffffff" + }, + "id": "path5482", + "name": "path5482", + "stroke": { + "dasharray": "none", + "linecap": "butt", + "miterlimit": "4", + "opacity": "1", + "paint": "#000000", + "width": "0.271714" + }, + "type": "path" + }, + { + "fill": { + "opacity": 1 + }, + "height": "0.96387237", + "id": "rect5506", + "name": "rect5506", + "stroke": { + "dasharray": "none", + "linecap": "butt", + "miterlimit": "4", + "opacity": "1", + "paint": "#000000", + "width": "0.264583" + }, + "transform": "rotate(-17.383769)", + "type": "rect", + "width": "9.3728275", + "x": "1.5237854", + "y": "16.281492" + }, + { + "elements": [ + { + "elements": [ + { + "fill": { + "opacity": "1" + }, + "height": "4.0549111", + "id": "rect5508", + "name": "rect5508", + "stroke": { + "dasharray": "none", + "linecap": "butt", + "miterlimit": "4", + "opacity": "1", + "paint": "#000000", + "width": "0.264583" + }, + "type": "rect", + "width": "4.9855466", + "x": "6.6806326", + "y": "6.6806326" + }, + { + "elements": [ + { + "fill": { + "opacity": "1", + "paint": "#000000" + }, + "id": "tspan5562", + "name": "tspan5562", + "stroke": { + "dasharray": "none", + "width": "0.128701" + }, + "text": "K", + "type": "tspan", + "x": "7.4878073", + "y": "10.346892" + } + ], + "fill": { + "opacity": "1", + "paint": "#000000" + }, + "id": "text5564", + "name": "text5564", + "stroke": { + "dasharray": "none", + "linecap": "butt", + "miterlimit": "4", + "opacity": "1", + "paint": "#000000", + "width": "0.128701" + }, + "style": { + "fontSize": "3.94435px" + }, + "transform": "scale(1.029236,0.97159447)", + "type": "text", + "x": "7.4878073", + "y": "10.346892" + } + ], + "id": "g5623", + "name": "g5623", + "transform": "translate(0.26589582,0.03323698)", + "type": "group" + }, + { + "fill": { + "opacity": "1" + }, + "height": "0.69797659", + "id": "rect5625", + "name": "rect5625", + "stroke": { + "dasharray": "none", + "linecap": "butt", + "miterlimit": "4", + "opacity": "1", + "paint": "#000000", + "width": "0.264583" + }, + "type": "rect", + "width": "4.9855466", + "x": "6.9465284", + "y": "6.0158935" + }, + { + "fill": { + "opacity": "1" + }, + "height": "0.69797659", + "id": "rect5625-3", + "name": "rect5625-3", + "stroke": { + "dasharray": "none", + "linecap": "butt", + "miterlimit": "4", + "opacity": "1", + "paint": "#000000", + "width": "0.264583" + }, + "type": "rect", + "width": "4.9855466", + "x": "6.9465284", + "y": "10.718925" + } + ], + "id": "g5655", + "name": "g5655", + "type": "group" + } + ], + "style": {}, + "viewBox": "0 0 18.520832 18.520834" + }, + "type": "ia.shapes.svg" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.openDock(\u0027Docked-East\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})" + }, + "scope": "G", + "type": "script" + }, + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"StatusPopUP\", \"PopUp-Views/Controller-Equipment/Information\", params \u003d{\"tagProps\":tagProps})\n\t" + }, + "enabled": false, + "scope": "G", + "type": "script" + }, + "onMouseEnter": { + "config": { + "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true, + "location": "top-left", + "style": {} + } + }, + "propConfig": { + "meta.tooltip.style.backgroundColor": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.style.classes": { + "binding": { + "config": { + "expression": "{view.custom.priority}" + }, + "transforms": [ + { + "fallback": "Alarms-Styles/NoAlarm", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 2, + "output": "Alarms-Styles/Low" + }, + { + "input": 3, + "output": "Alarms-Styles/Medium" + }, + { + "input": 4, + "output": "Alarms-Styles/High" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "meta.tooltip.style.color": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired},\r\n\t\u0027#000000\u0027,\r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#000000\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#FFFFFF\u0027,\r\n\t\t\t5,\u0027#FFFFFF\u0027,\r\n\t\t\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({view.custom.disconnected} \u003d False,\n\tif(isNull({view.custom.alarm_message}),\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string},\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Alarm: \" + {view.custom.alarm_message} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string}),\n\"Source Id: \" +{view.params.tagProps[0]} + \", Priority: Unknown, State: Unknown\")" + }, + "type": "expr" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "Disconnects/Device-Connected", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "Disconnects/Device-Disconnected" + }, + { + "input": false, + "output": "Disconnects/Device-Connected" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "aspectRatio": "1:1", + "mode": "percent", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Lift/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Lift/resource.json new file mode 100644 index 0000000..c7e6435 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Lift/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "hrtste", + "timestamp": "2024-04-16T08:26:26Z" + }, + "lastModificationSignature": "eba12a3de66eaf32e03589e56e998e806c8c3d42febd9a5b29d25bbc072d2de3" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Lift/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Lift/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..d0564db6712e38824e9486338ef4c08692d00d35 GIT binary patch literal 1375 zcmV-l1)%zgP)y?>yf#g2iHm zn#^Vk?2?2BgOiwAT!(0PVf?QZym#YstQtko@kMtp?zDdgad!{eEekfbcLFLw38e-& zy|e+N#SWcl!$&oZ__C)L!(-3zPGL13j!eKLIj;9i@mh&a?2@i8c6vJxNfp?Y30uoZuQoRzU;dYpz=nt z^kxaVS2mCHN_o9clmY`t=M3zjkH(fTw`$~TfA4tvnjzV2xKCNk0QF`& z*2t~wCMUJFW#w_%`*;=;OPhR6=lt16R=)S!90anEnh4JAbl{i4acGv;VYS&|60O)a z@0=2yqiYX_XV^YnK=xU7Bn*r^gFx<6)BV9IJY;ZphBr_-wu@Vn4%AGXty_~$+<0O} zaHN(!&iEr@dt9`y! zUiWq1?D0N<0$)vfCaYxUZ?h=wvBt)9z;vi0x^~|63+xl9j;+09VxMx2lSK(Z@jxb@ zVQ+Q7zTj}}!R5X>2_~Bp;%hgy*&v`ycgiRVS^^}q(_7J(_V%t$LjEUrQFgl>Km7Xi zxOo0wK(7B#{s-sRD+gp?r}@X?dv)K-EKDrlMjKKy^Ad-HLLi5 zS(9Qfu5QED&hBxN?3_xH%LF8MlISp- z&8V%dMOauE1VNw}tjGHw-$v1=U$HswpX1r?sAuvrW1}+Tyfna*?(FaHM`B_k2cyrT zq9O=S#^;%P|K?yuHjGmIQ6Hp+PCfJIp;?r$%1=d;>QbNpPsZBH$_jFFayVFYbTo>K zi_zKHiLS1$qZp*YbA9`0ilEq|7@TL*1~qie@+NOfRQUsCL2~E*{yvB6>+3^ALaPI($c~uD8Xc1 zMv^!j4i2Z&>5!hD&f!v1Q_;}Sz}-n;WH}k`TtHGF%Zv=Su&{vS^FfFMDXQ(Emx0p*w*8X7`)csPQCgHc*q%Hh5*bdT(I6%!2BD#$sHv&pnd&Xvxq$wZ87d(M2M5sW z^+-xeLQqf;%F4=ohC35b{>gXIPC^|*hRn#w;0ckRpU>eM8yh_U-X;$~l0Th9Zu-^L z)f_G>E6eMII7?>&Uev{M+zkv2aJZC|6y8&n5A{W=fW9V)9CrqT0SO5Syrk6C)ty^} zy^$&)$(J%iu}4Qo@D5*vmlUhx0t21e%izf5!D{;5tv)}x<@o12?_ hgo=xc^SF5+^e?=oo4qNYA-wbr=g!IasNB?3d!b%^GfMA9QHXiiG4Ky)r-JX56c9h$W;6t;!2 zbb;`d+zQA4xDhUX>sIxnu!rxXg!f6#g(+cUAF(o=F&DOonkGS$?vLAheEBdT@)~bk ZJ^?U0Y)@p4^#K3?002ovPDHLkV1k<=Sh)ZI literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Main_Panel/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Main_Panel/view.json new file mode 100644 index 0000000..5a387ea --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Main_Panel/view.json @@ -0,0 +1,522 @@ +{ + "custom": { + "alarm_message": null, + "covert_mode": true, + "disconnected": false, + "display_icon": true, + "error": false, + "isMatch": 0, + "plc": "value", + "priority": 0, + "priority_string": "No active alarms", + "running_status": 0, + "searchId": "value", + "state": 5, + "state_string": "Unknown" + }, + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.alarm_message": { + "persistent": true + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t0, {session.custom.alarm_filter.show_running},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_low_alarm},\r\n\t\t4, {session.custom.alarm_filter.show_diagnostic},\r\n\t\t5, {session.custom.alarm_filter.show_running},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.disconnected": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}", + "plc": "{view.custom.plc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{plc}/DCN" + }, + "transforms": [ + { + "expression": "if(isNull({value}), False, {value})", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.display_icon": { + "binding": { + "config": { + "expression": "{this.custom.covert_mode}//||{this.custom.isMatch}\u003e0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "0 \u003c {value} \u0026\u0026 {value} \u003c 5", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({view.params.tagProps[0]}\u003d\"value\",0,\nif({this.custom.searchId}\u003d{view.params.tagProps[0]},100,0))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.plc": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "transforms": [ + { + "expression": "split({value}, \"/\")[0]", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "fallback": 0, + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": 4 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 4, + "output": 1 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority_string": { + "binding": { + "config": { + "expression": "case({view.custom.state},\r\n1, \"High\",\r\n2, \"Medium\",\r\n3, \"Low\",\r\n4, \"Diagnostic\",\r\n5, \"No active alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.running_status": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/STATE" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceRunningStatus},0)", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.searchId": { + "binding": { + "config": { + "path": "session.custom.searchId" + }, + "type": "property" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceFaultStatus},0)", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.state_string": { + "binding": { + "config": { + "expression": "case({view.custom.running_status},\r\n1, \"Faulted\",\r\n2, \"Stopped\",\r\n3, \"Running\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "params.forceFaultStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.forceRunningStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.has_state": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 40, + "width": 30 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Icon_0" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "props.style.backgroundColor": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours}[\"state\"+{value}] \u003d null, \r\n{session.custom.colours}[\"Fallback\"],\r\n{session.custom.colours}[\"state\"+{value}])", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "color": "#000000", + "path": "material/offline_bolt", + "style": { + "borderColor": "#000000", + "borderStyle": "solid", + "borderWidth": "2px" + } + }, + "type": "ia.display.icon" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.openDock(\u0027Docked-East\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})" + }, + "scope": "G", + "type": "script" + }, + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"StatusPopUP\", \"PopUp-Views/Controller-Equipment/Information\", params \u003d{\"tagProps\":tagProps})\n\t" + }, + "enabled": false, + "scope": "G", + "type": "script" + }, + "onMouseEnter": { + "config": { + "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true, + "location": "top-left", + "style": {} + } + }, + "propConfig": { + "meta.tooltip.style.backgroundColor": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.style.classes": { + "binding": { + "config": { + "expression": "{view.custom.priority}" + }, + "transforms": [ + { + "fallback": "Alarms-Styles/NoAlarm", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 2, + "output": "Alarms-Styles/Low" + }, + { + "input": 3, + "output": "Alarms-Styles/Medium" + }, + { + "input": 4, + "output": "Alarms-Styles/High" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "meta.tooltip.style.color": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired},\r\n\t\u0027#000000\u0027,\r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#000000\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#FFFFFF\u0027,\r\n\t\t\t5,\u0027#FFFFFF\u0027,\r\n\t\t\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({view.custom.disconnected} \u003d False,\n\tif(isNull({view.custom.alarm_message}),\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string},\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Alarm: \" + {view.custom.alarm_message} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string}),\n\"Source Id: \" +{view.params.tagProps[0]} + \", Priority: Unknown, State: Unknown\")" + }, + "type": "expr" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "Disconnects/Device-Connected", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "Disconnects/Device-Disconnected" + }, + { + "input": false, + "output": "Disconnects/Device-Connected" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "aspectRatio": "40:60", + "mode": "percent", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Network/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Network/resource.json new file mode 100644 index 0000000..1c2f7fe --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Network/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-24T18:54:32Z" + }, + "lastModificationSignature": "2c29dd6ee8ccedcef288e97284e0820867d8585eb4477f0135d3881344b154cc" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Network/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Network/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..529c16e8f83c8d694a68b47475132b07696ef4a6 GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^AT|>R8<0#)^t}M2v^`xMLn`8ufAF(hl9u{sd^Yt^ ySGpa`${+vdJF3M$vp+1!cIO6Hhor3$g6uvW4Vl*~Hu+Vm*NM#w?(oQL&3ABn(kW~w%K%r5=gvcUoW$j8g3M~;@Xweuj z(HPg(Y781phyp4<8pO)JNZEoY2tqsUte@w+H?O?TyqV6ljojqxo4$MRx!*nK+;h)) z0@Svhcfw|~^$P9n?PzUn?S#!{$Ih!PU2e7402e(i7E9-twzf7{tyV8tY6vFx&IJdY z4jT>j9^elwoQW|!o6}*(mLu1Zcc=v$5B!1B!1s1|jZWj7o|MB~nH+w1~hDJk#Jp~cJ65@qD5E=U+UONi0 z{4B)Ea}di;K)ieyVooDOQU%1&7oi^%19SXnl;o|!iDS)Oh$^O+2nGU0Yuq|$*YDPD zM_lwsh)3ceo~?p-{Ui)!fT6;TazI~7D0ZWS!2O%u{aXOB@h(LAJ_yrdghmX*(#-id z)_hc2!{Km9+6;)Gq;?|6?a+_=@l5b;W6j$EG8}6op@pH2Ei}nDoX!w~#t*B57?b#Om`fY*lH?YtbG; zl4p@D5yBcxuE1d95Z?q@bKI_8y@tf-DDsm`gp|3Yow6XW1^No^jq6zni@wt)$mG~b z|Gse(iKB?z=w%3D^-BW!P;36cW@o?lB*&*!@;mamSyP{b7_k^3ib;FqXT1Qg=SfiU zyTbL^lFx;dxer3V)my;-0WESr9sB|M2Ooug^*Qo6XWt%%V4*gxM6$z*u^i_n?~)xg zH;4nFoNRaK@Cl`#E#oP}6Q0`Jv%6Xf!iG|3@MdMFE)NjwIz>)z8JR*Vi!b8B}B|Th}Z@6O!p1$k6TPZ`M5mK-{Dhhui=vqNPBT~cRFa2 z#$aFIjj&b*#mb9MBP&eWOm4Ep8~mR89|(n5&?wLIrwEy#9F)^$rBDQ~l&_p%g0Vs{ zVhlv)_YiNpnDFFC~ycCj|Z$%_n~= zV3`4o)k5_pNY$4qCPAtpI8E;hAJi96HbUf{fBPni8!w>$W+(k`gPu1Z3_^+T@-@-4A}>WzFCk}8^!mQ#(eDvAtiE%MbFEWuo=Te&pk>Z{iT(;K9WIK0w{ z$Qnx7YR@A*cQ3}g2Sii>{mX6g1_C8ma~UY1qB@G|RxS;>2QC*;Mkb`vlo!eAY$4hl9mxethsEZ(iX$>&$ zB+b>F!i1_*NG;ok6e2mR_6(BA+>`45lE((BK`y>Id*+H?q&CW7rnje<4_cl>GUfQH zvzU>+8{swlj*x2$&Igr1{c6TshzS+magb9kCEfRh+%_WP>|9hwiyHD-4oP~wJdfvl%2c2btlLhR#*o?WL_tMx6aCKz#~+FaoZLo`73SB= zCX|v=8;n&pB=2>>P-O3_?ZMu8@Rg zU7+xDjB>Y=gcI7}{+x4iy0!4Du4ZGCuG6?lj88*Mua)OX@-^f#lw`Ht(k^|-5$WI1 zZQ_#E&c2keL|!;DQ8tS&L{d>da3sXipXGUOKh_o6U?^1i6u;;GxJ*h;qUCv>vee*w zkUuJN+q5AIV%UOvW@Zhp`4b}hBJK1NJ^euG=Z*0^PiI$y``2FYI?orFAlJbhZcZNm z9S;vMLYH+Bx=ox_lam&?WIqfP-H}res9dFJQa*LOvM?1QewFxx?D~iZ~hGrg${&%#VNTa4mN1_H57vC;wf+K8+6L1c*n&10X0FTcyDd9Al4KG zk+c>1%KJ=GO;CMcjvi@((KrOUMc+bKa{o;IA2Q2qFV$00I{*Lx07*qoM6N<$f-UP| A3IG5A literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PPI/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PPI/view.json new file mode 100644 index 0000000..4e75888 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PPI/view.json @@ -0,0 +1,656 @@ +{ + "custom": { + "FillColour": "value", + "alarm_message": null, + "covert_mode": true, + "disconnected": false, + "display_icon": true, + "error": false, + "isMatch": 0, + "plc": "value", + "priority": 0, + "priority_string": "No active alarms", + "running": false, + "running_status": 0, + "searchId": "value", + "show_error": false, + "show_running": true, + "state": 5, + "state_string": "Unknown" + }, + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.FillColour": { + "persistent": true + }, + "custom.alarm_message": { + "persistent": true + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t0, {session.custom.alarm_filter.show_running},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_low_alarm} || {session.custom.alarm_filter.show_running},\r\n\t\t4, {session.custom.alarm_filter.show_diagnostic} || {session.custom.alarm_filter.show_running},\r\n\t\t5, {session.custom.alarm_filter.show_running},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.disconnected": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}", + "plc": "{view.custom.plc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{plc}/DCN" + }, + "transforms": [ + { + "expression": "if(isNull({value}), False, {value})", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.display_icon": { + "binding": { + "config": { + "expression": "{this.custom.covert_mode}//||{this.custom.isMatch}\u003e0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "0 \u003c {value} \u0026\u0026 {value} \u003c 5", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({view.params.tagProps[0]}\u003d\"value\",0,\nif({this.custom.searchId}\u003d{view.params.tagProps[0]},100,0))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.plc": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "transforms": [ + { + "expression": "split({value}, \"/\")[0]", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "fallback": 0, + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": 4 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 4, + "output": 1 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority_string": { + "binding": { + "config": { + "expression": "case({view.custom.state},\r\n1, \"High\",\r\n2, \"Medium\",\r\n3, \"Low\",\r\n4, \"Diagnostic\",\r\n5, \"No active alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.running": { + "binding": { + "config": { + "expression": "{view.custom.running_status} \u003d 3" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.running_status": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/STATE" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceRunningStatus},0)", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.searchId": { + "binding": { + "config": { + "path": "session.custom.searchId" + }, + "type": "property" + }, + "persistent": true + }, + "custom.show_error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_low_alarm},\r\n\t\t4, {session.custom.alarm_filter.show_diagnostic},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.show_running": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t1, False,\r\n\t\t2, False,\r\n\t\t{session.custom.alarm_filter.show_running}\r\n\t\t)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceFaultStatus},0)", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.state_string": { + "binding": { + "config": { + "expression": "case({view.custom.running_status},\r\n1, \"Faulted\",\r\n2, \"Stopped\",\r\n3, \"Running\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "params.forceFaultStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.forceRunningStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 100, + "width": 100 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "PPI" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "props.elements[1].elements[0].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "id": "defs1", + "name": "defs1", + "type": "defs" + }, + { + "elements": [ + { + "cx": "6.6145835", + "cy": "6.6145835", + "fill": {}, + "id": "path1", + "name": "path1", + "r": "6.019948", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.264583" + }, + "type": "circle" + }, + { + "d": "m 2.1166666,8.5242134 h 3.175", + "fill": { + "paint": "transparent" + }, + "id": "path2", + "name": "path2", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.264583" + }, + "type": "path" + }, + { + "d": "M 7.9374999,8.5242134 H 11.112492", + "fill": { + "paint": "transparent" + }, + "id": "path3", + "name": "path3", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.264583" + }, + "type": "path" + }, + { + "d": "M 5.1593748,4.183724 V 8.4170573", + "fill": { + "paint": "transparent" + }, + "id": "path5", + "name": "path5", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.264583" + }, + "type": "path" + }, + { + "d": "m 8.2020833,4.1405926 h -3.175", + "fill": { + "paint": "transparent" + }, + "id": "path6", + "name": "path6", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.264583" + }, + "type": "path" + }, + { + "d": "M 8.0697914,4.183724 V 8.4170573", + "fill": { + "paint": "transparent" + }, + "id": "path7", + "name": "path7", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.264583" + }, + "type": "path" + } + ], + "id": "layer1", + "name": "layer1", + "type": "group" + } + ], + "style": {}, + "viewBox": "0 0 13.229166 13.229167" + }, + "type": "ia.shapes.svg" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.openDock(\u0027Docked-East\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})" + }, + "scope": "G", + "type": "script" + }, + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"StatusPopUP\", \"PopUp-Views/Controller-Equipment/Information\", params \u003d{\"tagProps\":tagProps})\n\t" + }, + "enabled": false, + "scope": "G", + "type": "script" + }, + "onMouseEnter": { + "config": { + "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true, + "location": "top-left", + "style": {} + } + }, + "propConfig": { + "meta.tooltip.style.backgroundColor": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.style.classes": { + "binding": { + "config": { + "expression": "{view.custom.priority}" + }, + "transforms": [ + { + "fallback": "Alarms-Styles/NoAlarm", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 2, + "output": "Alarms-Styles/Low" + }, + { + "input": 3, + "output": "Alarms-Styles/Medium" + }, + { + "input": 4, + "output": "Alarms-Styles/High" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "meta.tooltip.style.color": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired},\r\n\t\u0027#000000\u0027,\r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#000000\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#FFFFFF\u0027,\r\n\t\t\t5,\u0027#FFFFFF\u0027,\r\n\t\t\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({view.custom.disconnected} \u003d False,\n\tif(isNull({view.custom.alarm_message}),\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string},\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Alarm: \" + {view.custom.alarm_message} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string}),\n\"Source Id: \" +{view.params.tagProps[0]} + \", Priority: Unknown, State: Unknown\")" + }, + "type": "expr" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "Disconnects/Device-Connected", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "Disconnects/Device-Disconnected" + }, + { + "input": false, + "output": "Disconnects/Device-Connected" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "aspectRatio": "1:1", + "mode": "percent", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Photocell2_Lift/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Photocell2_Lift/resource.json new file mode 100644 index 0000000..441c6d2 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Photocell2_Lift/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "rolfed", + "timestamp": "2024-04-02T15:29:53Z" + }, + "lastModificationSignature": "6322d531d5293a0d585b6691d01bbc43d93af0791f9dbdbe68c2babeeed9d8d4" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Photocell2_Lift/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Photocell2_Lift/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..0a39122aa7538bf5891357ee34fcd08f1fe1fe73 GIT binary patch literal 1194 zcmV;b1XcTqP)j9y5L=rY%6+#)*T;xb?cy%D5+`?mdip7Ztv*3v>h__*LCzfkD; z_`T0_dd^cQ5C|YuG)=?E$OwjphQ#kWl5IS8cz75-pD$)^6N>)BR52$t8w+0Ry^60s zKZ^sNW;l1%p>|6(YM$SS7ppemwc4%N^ZIstbmCp~eElVE_1_$)3OS$O?~hq0X+fTZ zBgZWm0)DvIgZ(Zi%50@ry!3HU?h~L#UIy8mAbTfh!!f~opvrbo>26T|bD;Z6uykb! zsy3~|$q$a<=8ZpZ6Xp4n7BthzEi5>H`V-inS_A8%0?=cxf@&^+8g4+@52%L{a1gL~ zbWq*Tpp74b^6bbfSb?U7di?SGZ-!;q5S_B15qcwPm%i_jVzf|*J=+0t_CxIelmlYn zw*YeaL2vrv;}W<7P}(EH;(@5{3TV|%H;| zCCfqU4?}VNE5$5r;mE>bGM6S7pB!!MLBvnXK0}svT?Z9zM&Sdw=sNqUluRhda@_g{ z2C%+DL~Y44B8}If9u@;RO>%*$N+m$bj!03f*aB2_3Y4`N?e6CIfG zDBA6UW@_8^iUT#bQf%08JU>Ed^|b3qOiN3Zx)@ewiudoB^CAm0?c z_v{s=ptYS)JI&NiFlZ(jpV}`zI|pUqGN_*aA{}NiwI(vXB6@l-hz<5~aecibZwPq^ zM|YkL%mU!*PnVH>-*Q-*|AD17n3)?Q6L7J~?dU-d=%KB~HP$jmqQ~(5({&wBm)k(q zXGA#^x%{I$&K4ZKU#|R!d-6rGx%)4pI+-i!WmxdSnU6sWRzT%*FO#2KKIBL1z!c9@ z7VOy90(y9hQIlmXy_#|1b3w|qaj}uY!?R#R{VPx_TahJ>7gap9>ItNcEX!(6gC2bW zRJL6dqt~EtVe0nB^i6~mtbM5(w8jnMNu45s&4JY6@$QHm(HJ=^~J`s$*L*2bz%zEOkjSo9~>M+S63IhyN$>N#eF~iOZilo7D2|WFU`hc z$;vU)CdjZ5U!{ruIW!s5Dwql81=D3-FkR*a(`8;TUFN*t|HA#V)uZQGaR2}S07*qo IM6N<$g2b&l8vp;mU|&-1;P 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 Xh&vVKLqz)Q00000NkvXXu0mjflICa% literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Pointer/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Pointer/view.json new file mode 100644 index 0000000..b35c404 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Pointer/view.json @@ -0,0 +1,571 @@ +{ + "custom": { + "alarm_message": null, + "covert_mode": true, + "display_icon": true, + "error": false, + "isMatch": 0, + "priority": 0, + "priority_string": "No active alarms", + "running": false, + "searchId": "value", + "show_error": false, + "show_running": true, + "state": 5, + "state_string": "Unknown", + "visible_status": false + }, + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.alarm_message": { + "persistent": true + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t0, {session.custom.alarm_filter.show_running},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_low_alarm} || {session.custom.alarm_filter.show_running},\r\n\t\t4, {session.custom.alarm_filter.show_diagnostic} || {session.custom.alarm_filter.show_running},\r\n\t\t5, {session.custom.alarm_filter.show_running},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.display_icon": { + "binding": { + "config": { + "expression": "{this.custom.covert_mode}||{this.custom.isMatch}\u003e0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "0 \u003c {value} \u0026\u0026 {value} \u003c 5", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({view.params.tagProps[0]}\u003d\"value\",0,\nif({this.custom.searchId}\u003d{view.params.tagProps[0]},100,0))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "fallback": 0, + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": 4 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 4, + "output": 1 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority_string": { + "binding": { + "config": { + "expression": "case({view.custom.state},\r\n1, \"High\",\r\n2, \"Medium\",\r\n3, \"Low\",\r\n4, \"Diagnostic\",\r\n5, \"No active alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.running": { + "binding": { + "config": { + "expression": "{view.custom.running_status} \u003d 3" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.running_status": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/STATE" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceRunningStatus},0)", + "type": "expression" + } + ], + "type": "tag" + } + }, + "custom.searchId": { + "binding": { + "config": { + "path": "session.custom.searchId" + }, + "type": "property" + }, + "persistent": true + }, + "custom.show_error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_low_alarm} || {view.custom.isMatch}\u003e0,\r\n\t\t4, {session.custom.alarm_filter.show_diagnostic} || {view.custom.isMatch}\u003e0,\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.show_running": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t1, False,\r\n\t\t2, False,\r\n\t\t{session.custom.alarm_filter.show_running}\r\n\t\t)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceFaultStatus},0)", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.state_string": { + "binding": { + "config": { + "expression": "case({view.custom.running_status},\r\n1, \"Faulted\",\r\n2, \"Stopped\",\r\n3, \"Running\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.visible_status": { + "binding": { + "config": { + "expression": "{view.custom.state} !\u003d 5" + }, + "type": "expr" + }, + "persistent": true + }, + "params.forceFaultStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.forceRunningStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 79, + "width": 49 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "pointer_symbol_3" + }, + "propConfig": { + "props.elements[1].elements[0].elements[0].elements[1].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours}[\"state\"+{value}] \u003d null, \n{session.custom.colours}[\"Fallback\"],\n{session.custom.colours}[\"state\"+{value}])", + "type": "expression" + } + ], + "type": "property" + } + } + }, + "props": { + "elements": [ + { + "id": "defs2", + "name": "defs2", + "type": "defs" + }, + { + "elements": [ + { + "elements": [ + { + "elements": [ + { + "d": "m 10.648338,6.5392075 c 0,2.2076808 -1.7019291,4.4141715 -3.90961,4.4141715 -2.2076807,0 -4.0851094,-2.2064908 -4.0851094,-4.4141715 -1e-7,-2.2076807 1.7896788,-3.9973596 3.9973595,-3.9973596 2.2076809,-2e-7 3.9973599,1.7896787 3.9973599,3.9973596 z", + "fill": { + "opacity": "1", + "paint": "transparent" + }, + "id": "path7858", + "name": "path7858", + "stroke": { + "dasharray": "none", + "opacity": "1", + "paint": "#000000", + "width": "0.523875" + }, + "style": { + "color": "#000000" + }, + "type": "path" + }, + { + "d": "m 6.6503906,0.5703125 c -3.2732983,0 -5.96874998,2.6954516 -5.96874998,5.96875 0,3.2732984 6.23199968,11.0143705 6.23199968,11.0143705 0,0 5.7055007,-7.7410721 5.7055007,-11.0143705 0,-3.2732984 -2.695452,-5.96875 -5.9687504,-5.96875 z m 0,3.9433594 c 1.1420587,0 2.0253907,0.883332 2.0253907,2.0253906 0,1.1420586 -0.883332,2.0253906 -2.0253907,2.0253906 C 5.508332,8.5644531 4.625,7.6811211 4.625,6.5390625 4.625,5.3970039 5.508332,4.5136719 6.6503906,4.5136719 Z", + "fill": { + "opacity": "1" + }, + "id": "path7860", + "name": "path7860", + "stroke": { + "dasharray": "none", + "opacity": "1", + "paint": "#000000", + "width": "0.523875" + }, + "style": { + "color": "#000000" + }, + "type": "path" + } + ], + "fill": { + "opacity": "1", + "paint": "transparent" + }, + "id": "path7854", + "name": "path7854", + "stroke": { + "dasharray": "none", + "opacity": "1", + "paint": "#000000", + "width": "0.523875" + }, + "type": "group" + } + ], + "id": "path4106", + "name": "path4106", + "type": "group" + } + ], + "id": "layer1", + "name": "layer1", + "type": "group" + } + ], + "viewBox": "0 0 13.229166 18.520834" + }, + "type": "ia.shapes.svg" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.openDock(\u0027Docked-East\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})" + }, + "scope": "G", + "type": "script" + }, + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"StatusPopUP\", \"PopUp-Views/Controller-Equipment/Information\", params \u003d{\"tagProps\":tagProps})\n\t" + }, + "enabled": false, + "scope": "G", + "type": "script" + }, + "onMouseEnter": { + "config": { + "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true, + "location": "top-left", + "style": {} + } + }, + "propConfig": { + "meta.tooltip.style.backgroundColor": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.Fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.style.classes": { + "binding": { + "config": { + "expression": "{view.custom.priority}" + }, + "transforms": [ + { + "fallback": "Alarms-Styles/NoAlarm", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 2, + "output": "Alarms-Styles/Low" + }, + { + "input": 3, + "output": "Alarms-Styles/Medium" + }, + { + "input": 4, + "output": "Alarms-Styles/High" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "meta.tooltip.style.color": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired},\r\n\t\u0027#000000\u0027,\r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#000000\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#FFFFFF\u0027,\r\n\t\t\t5,\u0027#FFFFFF\u0027,\r\n\t\t\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if(isNull({view.custom.alarm_message}),\n\"Source Id: \" + {view.params.tagProps[0]} + \n\", Priority: \" + {view.custom.priority_string} + \n\", State: \" + {view.custom.state_string},\n\"Source Id: \" + {view.params.tagProps[0]} + \n\", Alarm: \" + {view.custom.alarm_message} +\n\", Priority: \" + {view.custom.priority_string} + \n\", State: \" + {view.custom.state_string})" + }, + "type": "expr" + } + }, + "meta.visible": { + "binding": { + "config": { + "path": "view.custom.display_icon" + }, + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "justify": "center", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PressureSwitch/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PressureSwitch/resource.json new file mode 100644 index 0000000..39fefe2 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PressureSwitch/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-24T18:54:32Z" + }, + "lastModificationSignature": "9146c180d45dd6e766cfe3d4456c7ebf3cd7ecdde7e22c2a2cb601d9e4247b91" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PressureSwitch/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PressureSwitch/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d6bcfc43381afae68b4df02644f189f6cd4c42 GIT binary patch literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^Od!m`1|*BN@u~nRQBN1gkcznEgc-*_%uh5HXzonr a`Oj#c&vu+4wb}!yfWgz%&t;ucLK6U5D-yE+ literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PressureSwitch/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PressureSwitch/view.json new file mode 100644 index 0000000..f28613d --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PressureSwitch/view.json @@ -0,0 +1,648 @@ +{ + "custom": { + "alarm_message": null, + "covert_mode": true, + "disconnected": false, + "display_icon": true, + "error": false, + "isMatch": 0, + "plc": "value", + "priority": 0, + "priority_string": "No active alarms", + "running_status": 0, + "searchId": "value", + "state": 5, + "state_string": "Unknown" + }, + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.alarm_message": { + "persistent": true + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t0, {session.custom.alarm_filter.show_running},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_low_alarm},\r\n\t\t4, {session.custom.alarm_filter.show_diagnostic},\r\n\t\t5, {session.custom.alarm_filter.show_running},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.disconnected": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}", + "plc": "{view.custom.plc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{plc}/DCN" + }, + "transforms": [ + { + "expression": "if(isNull({value}), False, {value})", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.display_icon": { + "binding": { + "config": { + "expression": "{this.custom.covert_mode}//||{this.custom.isMatch}\u003e0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "0 \u003c {value} \u0026\u0026 {value} \u003c 5", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({view.params.tagProps[0]}\u003d\"value\",0,\nif({this.custom.searchId}\u003d{view.params.tagProps[0]},100,0))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.plc": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "transforms": [ + { + "expression": "split({value}, \"/\")[0]", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "fallback": 0, + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": 4 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 4, + "output": 1 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority_string": { + "binding": { + "config": { + "expression": "case({view.custom.state},\r\n1, \"High\",\r\n2, \"Medium\",\r\n3, \"Low\",\r\n4, \"Diagnostic\",\r\n5, \"No active alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.running_status": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/STATE" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceRunningStatus},0)", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.searchId": { + "binding": { + "config": { + "path": "session.custom.searchId" + }, + "type": "property" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceFaultStatus},0)", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.state_string": { + "binding": { + "config": { + "expression": "case({view.custom.running_status},\r\n1, \"Faulted\",\r\n2, \"Stopped\",\r\n3, \"Running\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "params.directionLeft": { + "paramDirection": "input", + "persistent": true + }, + "params.forceFaultStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.forceRunningStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 25, + "width": 25 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "PressureSwitch_2" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "props.elements[1].elements[0].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "elements": [ + { + "elements": [ + { + "id": "stop1507", + "name": "stop1507", + "offset": "0", + "stopColor": "#020101", + "stopOpacity": "1", + "style": { + "stopColor": "#020101", + "stopOpacity": "1" + }, + "type": "stop" + } + ], + "id": "linearGradient1509", + "name": "linearGradient1509", + "type": "linearGradient" + }, + { + "gradientTransform": "matrix(1.0156665,0,0,0.98457489,-0.22712617,-0.22017344)", + "gradientUnits": "userSpaceOnUse", + "href": "#linearGradient1509", + "id": "linearGradient3055", + "name": "linearGradient3055", + "type": "linearGradient", + "x1": "2.4719212", + "x2": "5.6080947", + "y1": "4.8826461", + "y2": "4.8826461" + } + ], + "id": "defs2", + "name": "defs2", + "type": "defs" + }, + { + "elements": [ + { + "fill": { + "opacity": 1 + }, + "height": "11.216189", + "id": "rect5779", + "name": "rect5779", + "stroke": { + "dasharray": "none", + "linejoin": "round", + "paint": "#000000", + "width": 1.2 + }, + "style": { + "paintOrder": "stroke fill markers" + }, + "type": "rect", + "width": "11.21619", + "x": "7.7715612e-16", + "y": "0" + }, + { + "elements": [ + { + "fill": { + "opacity": "1", + "url": "url(#linearGradient3055)" + }, + "id": "tspan1453", + "name": "tspan1453", + "stroke": { + "dasharray": "none", + "width": "0.116835" + }, + "text": "P", + "type": "tspan", + "x": "0.99078566", + "y": "9.0214157" + } + ], + "fill": { + "opacity": "1", + "url": "url(#linearGradient3055)" + }, + "id": "text1455", + "name": "text1455", + "stroke": { + "dasharray": "none", + "linejoin": "round", + "paint": "#000000", + "width": "0.116835" + }, + "style": { + "InkscapeFontSpecification": "\u0027Arial Narrow, Normal\u0027", + "fontFamily": "\u0027Arial Narrow\u0027", + "fontSize": "9.7785px", + "paintOrder": "stroke fill markers" + }, + "text": "P", + "transform": "scale(0.98457515,1.0156665)", + "type": "text", + "x": "0.99078566", + "y": "9.0214157" + }, + { + "d": "M 7.1327097,2.9635882 9.9122555,5.8103519 6.9937326,8.2419488", + "fill": { + "opacity": "0.0131332", + "paint": "#020101" + }, + "id": "path3213", + "name": "path3213", + "stroke": { + "dasharray": "none", + "linejoin": "round", + "paint": "#000000", + "width": "0.663625" + }, + "style": { + "paintOrder": "stroke fill markers" + }, + "type": "path" + } + ], + "id": "layer1", + "name": "layer1", + "transform": "translate(0.22362278,0.22362278)", + "type": "group" + } + ], + "preserveAspectRatio": "none", + "style": {}, + "viewBox": "0 0 11.663437 11.663435" + }, + "type": "ia.shapes.svg" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.openDock(\u0027Docked-East\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})" + }, + "scope": "G", + "type": "script" + }, + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"StatusPopUP\", \"PopUp-Views/Controller-Equipment/Information\", params \u003d{\"tagProps\":tagProps})\n\t" + }, + "enabled": false, + "scope": "G", + "type": "script" + }, + "onMouseEnter": { + "config": { + "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true, + "location": "top-left", + "style": {} + } + }, + "propConfig": { + "meta.tooltip.style.backgroundColor": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.style.classes": { + "binding": { + "config": { + "expression": "{view.custom.priority}" + }, + "transforms": [ + { + "fallback": "Alarms-Styles/NoAlarm", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 2, + "output": "Alarms-Styles/Low" + }, + { + "input": 3, + "output": "Alarms-Styles/Medium" + }, + { + "input": 4, + "output": "Alarms-Styles/High" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "meta.tooltip.style.color": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired},\r\n\t\u0027#000000\u0027,\r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#000000\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#FFFFFF\u0027,\r\n\t\t\t5,\u0027#FFFFFF\u0027,\r\n\t\t\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({view.custom.disconnected} \u003d False,\n\tif(isNull({view.custom.alarm_message}),\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string},\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Alarm: \" + {view.custom.alarm_message} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string}),\n\"Source Id: \" +{view.params.tagProps[0]} + \", Priority: Unknown, State: Unknown\")" + }, + "type": "expr" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "Disconnects/Device-Connected", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "Disconnects/Device-Disconnected" + }, + { + "input": false, + "output": "Disconnects/Device-Connected" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "mode": "percent", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord/resource.json new file mode 100644 index 0000000..e38d80e --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-24T18:54:32Z" + }, + "lastModificationSignature": "610bf0ddc2a5a74eee1dd35bd51508e7d2caa659ee7e3abf88b680a3bb57e52e" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..b30742bb38b56f096e056749cc8664110fc781e7 GIT binary patch literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-Z!3HEH3jaO_QZk+{jv*Cs$sBxq|K?Ac^lARW kEnB|)UlqDqBb9+c=eFLTbI;SC0o5^hy85}Sb4q9e0ELbksQ>@~ literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord/view.json new file mode 100644 index 0000000..c513773 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord/view.json @@ -0,0 +1,586 @@ +{ + "custom": { + "alarm_message": null, + "covert_mode": true, + "disconnected": false, + "display_icon": true, + "error": false, + "isMatch": 0, + "plc": "value", + "priority": 0, + "priority_string": "No active alarms", + "searchId": "value", + "state": 5 + }, + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.alarm_message": { + "persistent": true + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "this.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t0, {session.custom.alarm_filter.show_safety},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_safety},\r\n\t\t4, {session.custom.alarm_filter.show_safety},\r\n\t\t5, {session.custom.alarm_filter.show_safety},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.disconnected": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}", + "plc": "{view.custom.plc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{plc}/DCN" + }, + "transforms": [ + { + "expression": "if(isNull({value}), False, {value})", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.display_icon": { + "binding": { + "config": { + "expression": "{this.custom.covert_mode}||{this.custom.isMatch}\u003e0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "0 \u003c {value} \u0026\u0026 {value} \u003c 5", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({view.params.tagProps[0]}\u003d\"value\",0,\nif({this.custom.searchId}\u003d{view.params.tagProps[0]},100,0))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.plc": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "transforms": [ + { + "expression": "split({value}, \"/\")[0]", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "fallback": 0, + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": 4 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 4, + "output": 1 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority_string": { + "binding": { + "config": { + "expression": "case({view.custom.state},\r\n1, \"High\",\r\n2, \"Medium\",\r\n3, \"Low\",\r\n4, \"Diagnostic\",\r\n5, \"No active alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.searchId": { + "binding": { + "config": { + "path": "session.custom.searchId" + }, + "type": "property" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceFaultStatus},0)", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "params.forceFaultStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.forceRunningStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 38, + "width": 25 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "PullChord_Part2" + }, + "position": { + "height": 1, + "width": 1, + "x": 0.0015, + "y": 0.0005 + }, + "propConfig": { + "props.elements[0].fill.paint": { + "binding": { + "config": { + "expression": "\u0027#AAAAAA\u0027" + }, + "transforms": [ + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "expr" + } + }, + "props.elements[1].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state1},\r\n3,{session.custom.colours.state1},\r\n4,{session.custom.colours.state1},\r\n{session.custom.colours.state5}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[2].visibility": { + "binding": { + "config": { + "path": "view.custom.error" + }, + "transforms": [ + { + "expression": "if(!{value} \u0026\u0026 {view.custom.display_icon}, \u0027visible\u0027, \u0027hidden\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[3].visibility": { + "binding": { + "config": { + "path": "view.custom.error" + }, + "transforms": [ + { + "expression": "if({value} \u0026\u0026 {view.custom.display_icon}, \u0027visible\u0027, \u0027hidden\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "d": "M 0.01621377,0.01595147 H 25.93719 V 41.138171 H 0.01621377 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m 20.752995,30.343588 a 7.2578735,7.1963887 0 0 1 -7.257873,7.196389 7.2578735,7.1963887 0 0 1 -7.2578736,-7.196389 7.2578735,7.1963887 0 0 1 7.2578736,-7.196389 7.2578735,7.1963887 0 0 1 7.257873,7.196389 z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m 13.785537,6.4238337 -7.0747349,-3.1261989 -0.985,1.7060701 6.2447349,4.563801 z", + "fill": { + "paint": "#0000FF" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m 12.141737,10.447495 -5.3573679,5.578853 1.2662916,1.509108 6.4243953,-4.30722 z", + "fill": { + "paint": "#0000FF" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m 21.18,10 a 5,5 0 0 1 -5,5 5,5 0 0 1 -5,-5 5,5 0 0 1 5,-5 5,5 0 0 1 5,5 z", + "fill": { + "paint": "#0000FF" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + } + ], + "style": {}, + "viewBox": "-0.5 -0.5 27 42" + }, + "type": "ia.shapes.svg" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.openDock(\u0027Docked-East\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})" + }, + "scope": "G", + "type": "script" + }, + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"StatusPopUP\", \"PopUp-Views/Controller-Equipment/Information\", params \u003d{\"tagProps\":tagProps})\n\t" + }, + "enabled": false, + "scope": "G", + "type": "script" + }, + "onMouseEnter": { + "config": { + "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true, + "location": "top-left", + "style": {} + } + }, + "propConfig": { + "meta.tooltip.style.backgroundColor": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.style.classes": { + "binding": { + "config": { + "expression": "{view.custom.priority}" + }, + "transforms": [ + { + "fallback": "Alarms-Styles/NoAlarm", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 2, + "output": "Alarms-Styles/Low" + }, + { + "input": 3, + "output": "Alarms-Styles/Medium" + }, + { + "input": 4, + "output": "Alarms-Styles/High" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "meta.tooltip.style.color": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired},\r\n\t\u0027#000000\u0027,\r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#000000\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#FFFFFF\u0027,\r\n\t\t\t5,\u0027#FFFFFF\u0027,\r\n\t\t\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({view.custom.disconnected} \u003d False,\n\tif(isNull({view.custom.alarm_message}),\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string},\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Alarm: \" + {view.custom.alarm_message} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string}),\n\"Source Id: \" +{view.params.tagProps[0]} + \", Priority: Unknown, State: Unknown\")" + }, + "type": "expr" + } + }, + "meta.visible": { + "binding": { + "config": { + "path": "view.custom.display_icon" + }, + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "Disconnects/Device-Connected", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "Disconnects/Device-Disconnected" + }, + { + "input": false, + "output": "Disconnects/Device-Connected" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "aspectRatio": "25:38", + "mode": "percent", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_End/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_End/resource.json new file mode 100644 index 0000000..4f306fc --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_End/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-24T18:54:32Z" + }, + "lastModificationSignature": "e67d0fe28f4074d176e81f9ce529e605be05cc6da82bc15174a52beb29f46bca" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_End/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_End/view.json new file mode 100644 index 0000000..9e5f0ea --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_End/view.json @@ -0,0 +1,485 @@ +{ + "custom": { + "alarm_message": null, + "covert_mode": true, + "disconnected": false, + "display_icon": true, + "error": false, + "isMatch": 0, + "plc": "value", + "priority": 0, + "priority_string": "No active alarms", + "searchId": "value", + "state": 5 + }, + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.alarm_message": { + "persistent": true + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "this.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t0, {session.custom.alarm_filter.show_safety},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_safety},\r\n\t\t4, {session.custom.alarm_filter.show_safety},\r\n\t\t5, {session.custom.alarm_filter.show_safety},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.disconnected": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}", + "plc": "{view.custom.plc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{plc}/DCN" + }, + "transforms": [ + { + "expression": "if(isNull({value}), False, {value})", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.display_icon": { + "binding": { + "config": { + "expression": "{this.custom.covert_mode}||{this.custom.isMatch}\u003e0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "0 \u003c {value} \u0026\u0026 {value} \u003c 5", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({view.params.tagProps[0]}\u003d\"value\",0,\nif({this.custom.searchId}\u003d{view.params.tagProps[0]},100,0))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.plc": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "transforms": [ + { + "expression": "split({value}, \"/\")[0]", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "fallback": 0, + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": 4 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 4, + "output": 1 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority_string": { + "binding": { + "config": { + "expression": "case({view.custom.state},\r\n1, \"High\",\r\n2, \"Medium\",\r\n3, \"Low\",\r\n4, \"Diagnostic\",\r\n5, \"No active alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.searchId": { + "binding": { + "config": { + "path": "session.custom.searchId" + }, + "type": "property" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceFaultStatus},0)", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "params.forceFaultStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.forceRunningStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 25, + "width": 10 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "PullChord_Part2" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "d": "M 0.01621377,0.01595147 H 25.93719 V 41.138171 H 0.01621377 Z", + "fill": { + "paint": "#D5D5D5" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + } + ], + "preserveAspectRatio": "none", + "style": {}, + "viewBox": "-0.5 -0.5 27 42" + }, + "type": "ia.shapes.svg" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.openDock(\u0027Docked-East\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})" + }, + "scope": "G", + "type": "script" + }, + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"StatusPopUP\", \"PopUp-Views/Controller-Equipment/Information\", params \u003d{\"tagProps\":tagProps})\n\t" + }, + "enabled": false, + "scope": "G", + "type": "script" + }, + "onMouseEnter": { + "config": { + "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true, + "location": "top-left", + "style": {} + } + }, + "propConfig": { + "meta.tooltip.style.backgroundColor": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.style.classes": { + "binding": { + "config": { + "expression": "{view.custom.priority}" + }, + "transforms": [ + { + "fallback": "Alarms-Styles/NoAlarm", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 2, + "output": "Alarms-Styles/Low" + }, + { + "input": 3, + "output": "Alarms-Styles/Medium" + }, + { + "input": 4, + "output": "Alarms-Styles/High" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "meta.tooltip.style.color": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired},\r\n\t\u0027#000000\u0027,\r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#000000\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#FFFFFF\u0027,\r\n\t\t\t5,\u0027#FFFFFF\u0027,\r\n\t\t\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({view.custom.disconnected} \u003d False,\n\tif(isNull({view.custom.alarm_message}),\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string},\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Alarm: \" + {view.custom.alarm_message} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string}),\n\"Source Id: \" +{view.params.tagProps[0]} + \", Priority: Unknown, State: Unknown\")" + }, + "type": "expr" + } + }, + "meta.visible": { + "binding": { + "config": { + "path": "view.custom.display_icon" + }, + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "Disconnects/Device-Connected", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "Disconnects/Device-Disconnected" + }, + { + "input": false, + "output": "Disconnects/Device-Connected" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "aspectRatio": "10:25", + "mode": "percent", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_Line/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_Line/resource.json new file mode 100644 index 0000000..7045adb --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_Line/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-24T18:54:32Z" + }, + "lastModificationSignature": "7487a3ba630459c9eb5e3e9aaebf00655a122d6796ea52dc6568370506b69d58" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_Line/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_Line/view.json new file mode 100644 index 0000000..113bd45 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_Line/view.json @@ -0,0 +1,555 @@ +{ + "custom": { + "alarm_message": null, + "covert_mode": true, + "disconnected": false, + "display_icon": true, + "error": false, + "isMatch": 0, + "plc": "value", + "priority": 0, + "priority_string": "No active alarms", + "searchId": "value", + "state": 5 + }, + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.alarm_message": { + "persistent": true + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "this.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t0, {session.custom.alarm_filter.show_safety},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_safety},\r\n\t\t4, {session.custom.alarm_filter.show_safety},\r\n\t\t5, {session.custom.alarm_filter.show_safety},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.disconnected": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}", + "plc": "{view.custom.plc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{plc}/DCN" + }, + "transforms": [ + { + "expression": "if(isNull({value}), False, {value})", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.display_icon": { + "binding": { + "config": { + "expression": "{this.custom.covert_mode}||{this.custom.isMatch}\u003e0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "0 \u003c {value} \u0026\u0026 {value} \u003c 5", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({view.params.tagProps[0]}\u003d\"value\",0,\nif({this.custom.searchId}\u003d{view.params.tagProps[0]},100,0))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.plc": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "transforms": [ + { + "expression": "split({value}, \"/\")[0]", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "fallback": 0, + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": 4 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 4, + "output": 1 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority_string": { + "binding": { + "config": { + "expression": "case({view.custom.state},\r\n1, \"High\",\r\n2, \"Medium\",\r\n3, \"Low\",\r\n4, \"Diagnostic\",\r\n5, \"No active alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.searchId": { + "binding": { + "config": { + "path": "session.custom.searchId" + }, + "type": "property" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceFaultStatus},0)", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "params.forceFaultStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.forceRunningStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 10, + "width": 100 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "PullChord_Line2" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "props.elements[0].visibility": { + "binding": { + "config": { + "path": "view.custom.error" + }, + "transforms": [ + { + "expression": "if({value}, \u0027visible\u0027,\u0027hidden\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[1].visibility": { + "binding": { + "config": { + "path": "view.custom.error" + }, + "transforms": [ + { + "expression": "if({value}, \u0027visible\u0027,\u0027hidden\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[2].stroke.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state1},\r\n3,{session.custom.colours.state1},\r\n4,{session.custom.colours.state1},\r\n\u0027#000000\u0027\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "d": "m -0.38931298,0.28431365 c 33.95623398,0 67.91246898,0 101.86870298,0", + "fill": { + "paint": "#FFFFFF" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m -0.38931298,10.850587 c 33.95623398,0 67.91246898,0 101.86870298,0", + "fill": { + "paint": "#FFFFFF" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m -0.38931298,5.5674501 c 33.95623398,0 67.91246898,0 101.86870298,0", + "fill": { + "paint": "#FFFFFF" + }, + "name": "path", + "opacity": 1, + "stroke": { + "dasharray": "8, 8, 8", + "dashoffset": "\"20\"", + "key": "\"2.15848\"", + "miterlimit": "\"10\"", + "width": 3 + }, + "type": "path" + } + ], + "preserveAspectRatio": "none", + "style": {}, + "viewBox": "-0.5 -0.5 102 12" + }, + "type": "ia.shapes.svg" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.openDock(\u0027Docked-East\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})" + }, + "scope": "G", + "type": "script" + }, + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"StatusPopUP\", \"PopUp-Views/Controller-Equipment/Information\", params \u003d{\"tagProps\":tagProps})\n\t" + }, + "enabled": false, + "scope": "G", + "type": "script" + }, + "onMouseEnter": { + "config": { + "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true, + "location": "top-left", + "style": {} + } + }, + "propConfig": { + "meta.tooltip.style.backgroundColor": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.style.classes": { + "binding": { + "config": { + "expression": "{view.custom.priority}" + }, + "transforms": [ + { + "fallback": "Alarms-Styles/NoAlarm", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 2, + "output": "Alarms-Styles/Low" + }, + { + "input": 3, + "output": "Alarms-Styles/Medium" + }, + { + "input": 4, + "output": "Alarms-Styles/High" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "meta.tooltip.style.color": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired},\r\n\t\u0027#000000\u0027,\r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#000000\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#FFFFFF\u0027,\r\n\t\t\t5,\u0027#FFFFFF\u0027,\r\n\t\t\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({view.custom.disconnected} \u003d False,\n\tif(isNull({view.custom.alarm_message}),\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string},\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Alarm: \" + {view.custom.alarm_message} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string}),\n\"Source Id: \" +{view.params.tagProps[0]} + \", Priority: Unknown, State: Unknown\")" + }, + "type": "expr" + } + }, + "meta.visible": { + "binding": { + "config": { + "path": "view.custom.display_icon" + }, + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "Disconnects/Device-Connected", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "Disconnects/Device-Disconnected" + }, + { + "input": false, + "output": "Disconnects/Device-Connected" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "mode": "percent", + "style": { + "cursor": "pointer", + "overflow": "visible" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_Line_Vertical/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_Line_Vertical/resource.json new file mode 100644 index 0000000..67876ae --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_Line_Vertical/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-24T18:54:32Z" + }, + "lastModificationSignature": "ce9a816f41d3b2e0552f8f0195169e0d160eb15e69a3bc341e40e2cfd4ba483e" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_Line_Vertical/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_Line_Vertical/view.json new file mode 100644 index 0000000..1bb31fc --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/PullChord_Line_Vertical/view.json @@ -0,0 +1,555 @@ +{ + "custom": { + "alarm_message": null, + "covert_mode": true, + "disconnected": false, + "display_icon": true, + "error": false, + "isMatch": 0, + "plc": "value", + "priority": 0, + "priority_string": "No active alarms", + "searchId": "value", + "state": 5 + }, + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.alarm_message": { + "persistent": true + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "this.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t0, {session.custom.alarm_filter.show_safety},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_safety},\r\n\t\t4, {session.custom.alarm_filter.show_safety},\r\n\t\t5, {session.custom.alarm_filter.show_safety},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.disconnected": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}", + "plc": "{view.custom.plc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{plc}/DCN" + }, + "transforms": [ + { + "expression": "if(isNull({value}), False, {value})", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.display_icon": { + "binding": { + "config": { + "expression": "{this.custom.covert_mode}||{this.custom.isMatch}\u003e0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "0 \u003c {value} \u0026\u0026 {value} \u003c 5", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({view.params.tagProps[0]}\u003d\"value\",0,\nif({this.custom.searchId}\u003d{view.params.tagProps[0]},100,0))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.plc": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "transforms": [ + { + "expression": "split({value}, \"/\")[0]", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "fallback": 0, + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": 4 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 4, + "output": 1 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority_string": { + "binding": { + "config": { + "expression": "case({view.custom.state},\r\n1, \"High\",\r\n2, \"Medium\",\r\n3, \"Low\",\r\n4, \"Diagnostic\",\r\n5, \"No active alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.searchId": { + "binding": { + "config": { + "path": "session.custom.searchId" + }, + "type": "property" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceFaultStatus},0)", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "params.forceFaultStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.forceRunningStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 100, + "width": 10 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "PullChord_Line" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "props.elements[0].visibility": { + "binding": { + "config": { + "path": "view.custom.error" + }, + "transforms": [ + { + "expression": "if({value}, \u0027visible\u0027,\u0027hidden\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[1].visibility": { + "binding": { + "config": { + "path": "view.custom.error" + }, + "transforms": [ + { + "expression": "if({value}, \u0027visible\u0027,\u0027hidden\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[2].stroke.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state1},\r\n3,{session.custom.colours.state1},\r\n4,{session.custom.colours.state1},\r\n\u0027#000000\u0027\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "d": "m 0.22819265,-0.5 c 0,33.992373 0,67.984747 0,101.97712", + "fill": { + "paint": "#FFFFFF" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m 10.792046,-0.5 c 0,33.992373 0,67.984747 0,101.97712", + "fill": { + "paint": "#FFFFFF" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m 5.5101192,-0.5 c 0,33.992373 0,67.984747 0,101.97712", + "fill": { + "paint": "#FFFFFF" + }, + "name": "path", + "opacity": 1, + "stroke": { + "dasharray": "8, 8, 8", + "dashoffset": "\"20\"", + "key": "\"2.15848\"", + "miterlimit": "\"10\"", + "width": 2 + }, + "type": "path" + } + ], + "preserveAspectRatio": "none", + "style": {}, + "viewBox": "-0.5 -0.5 12 102" + }, + "type": "ia.shapes.svg" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.openDock(\u0027Docked-East\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})" + }, + "scope": "G", + "type": "script" + }, + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"StatusPopUP\", \"PopUp-Views/Controller-Equipment/Information\", params \u003d{\"tagProps\":tagProps})\n\t" + }, + "enabled": false, + "scope": "G", + "type": "script" + }, + "onMouseEnter": { + "config": { + "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true, + "location": "top-left", + "style": {} + } + }, + "propConfig": { + "meta.tooltip.style.backgroundColor": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.style.classes": { + "binding": { + "config": { + "expression": "{view.custom.priority}" + }, + "transforms": [ + { + "fallback": "Alarms-Styles/NoAlarm", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 2, + "output": "Alarms-Styles/Low" + }, + { + "input": 3, + "output": "Alarms-Styles/Medium" + }, + { + "input": 4, + "output": "Alarms-Styles/High" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "meta.tooltip.style.color": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired},\r\n\t\u0027#000000\u0027,\r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#000000\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#FFFFFF\u0027,\r\n\t\t\t5,\u0027#FFFFFF\u0027,\r\n\t\t\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({view.custom.disconnected} \u003d False,\n\tif(isNull({view.custom.alarm_message}),\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Priority: \" + {view.custom.priority_string},\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Alarm: \" + {view.custom.alarm_message} +\n\t\", Priority: \" + {view.custom.priority_string}),\n\"Source Id: \" +{view.params.tagProps[0]} + \", Priority: Unknown\")" + }, + "type": "expr" + } + }, + "meta.visible": { + "binding": { + "config": { + "path": "view.custom.display_icon" + }, + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "Disconnects/Device-Connected", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "Disconnects/Device-Disconnected" + }, + { + "input": false, + "output": "Disconnects/Device-Connected" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "mode": "percent", + "style": { + "cursor": "pointer", + "overflow": "visible" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/RFID/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/RFID/resource.json new file mode 100644 index 0000000..76aa9bb --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/RFID/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-24T18:54:32Z" + }, + "lastModificationSignature": "1281798360b4e8d9ac8ef5e500e764b7371d12f337f0c3d4835866b9768ae4c6" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/RFID/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/RFID/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..38b785b40e13e0713d95b9eb063fa49af610242a GIT binary patch literal 526 zcmV+p0`dKcP)IY=ng!v9PceB4J}=Wl3zLb`lXQpMXc(*9t+JDa{}+ z^^l-by>qAiz1}-It-eW4Zf55E?m6fGKf?1oTEmqtWv>iX%#(NX#Gm7=J+86htg!iK z6VVEN$uID0*$R%|j+wM4>A&o!E8Rsj6~#(g#D2#bp!8%=r2?n#r;OZ=AQA#`E`qZ) z>X7o3skHvIPG_Ps0FvKeEjm&i^kw?!&Ggcp?nabl8BYaOr*qRL$x2z~jHP0XWyjbp z>~isOfm3pDTnD>oBXqTjsxW0wA*nZ;IN%RqHY;(y}|Tn&T*{RpL$Y3K0u&?u{g(&x-LtNWmX?nnY*8BfO^ezn+y2`1L=7qi3s!gd9!l=iSuLCYT%-? zi1-y$)BCBvX?3+_2GZ}%V7*N#CBwJFY!|jeb@jiTo8##9h=Z2{PTo)W2fJ-u=fZN5 Q^8f$<07*qoM6N<$f;`6irvLx| literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/RFID/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/RFID/view.json new file mode 100644 index 0000000..a13432a --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/RFID/view.json @@ -0,0 +1,449 @@ +{ + "custom": { + "alarm_message": null, + "covert_mode": true, + "disconnected": false, + "display_icon": true, + "error": false, + "isMatch": 0, + "plc": "value", + "priority": 0, + "priority_string": "No active alarms", + "running_status": 0, + "searchId": "value", + "state": 5, + "state_string": "Unknown" + }, + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.alarm_message": { + "persistent": true + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t0, {session.custom.alarm_filter.show_running},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_low_alarm},\r\n\t\t4, {session.custom.alarm_filter.show_diagnostic},\r\n\t\t5, {session.custom.alarm_filter.show_running},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.disconnected": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}", + "plc": "{view.custom.plc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{plc}/DCN" + }, + "transforms": [ + { + "expression": "if(isNull({value}), False, {value})", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.display_icon": { + "binding": { + "config": { + "expression": "{this.custom.covert_mode}//||{this.custom.isMatch}\u003e0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "0 \u003c {value} \u0026\u0026 {value} \u003c 5", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({view.params.tagProps[0]}\u003d\"value\",0,\nif({this.custom.searchId}\u003d{view.params.tagProps[0]},100,0))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.plc": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "transforms": [ + { + "expression": "split({value}, \"/\")[0]", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "fallback": 0, + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": 4 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 4, + "output": 1 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority_string": { + "binding": { + "config": { + "expression": "case({view.custom.state},\r\n1, \"High\",\r\n2, \"Medium\",\r\n3, \"Low\",\r\n4, \"Diagnostic\",\r\n5, \"No active alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.running_status": { + "binding": { + "config": { + "expression": "coalesce(try(jsonGet(jsonGet({session.custom.state_messages},{this.custom.tag_path_to_lookup}),\"state\"),null),{view.params.forceRunningStatus},0)" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.searchId": { + "binding": { + "config": { + "path": "session.custom.searchId" + }, + "type": "property" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceFaultStatus},0)", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.state_string": { + "binding": { + "config": { + "expression": "case({view.custom.running_status},\r\n1, \"Faulted\",\r\n2, \"Stopped\",\r\n3, \"Running\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "params.forceFaultStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.forceRunningStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 48, + "width": 48 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "RFID_0" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "props.elements[0].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "elements": [ + { + "d": "M6.35 0.2507 C4.0842 0.2507 1.9091 1.5163 0.3079 3.7675 L1.174 4.9681 C2.6039 2.9621 4.477 1.9591 6.35 1.9591 C8.223 1.9591 10.0961 2.9621 11.526 4.9681 L12.3921 3.7675 C10.7909 1.5163 8.6158 0.2507 6.35 0.2507 ZM6.35 3.6831 C4.7961 3.6831 3.2421 4.5117 2.0526 6.1688 L2.8834 7.4219 C3.7997 6.1213 5.0484 5.3909 6.35 5.3909 C7.6516 5.3909 8.9003 6.1213 9.8166 7.4219 L10.6474 6.1688 C9.4579 4.5117 7.9039 3.6831 6.35 3.6831 ZM6.35 7.1155 C5.4135 7.1155 4.477 7.617 3.762 8.6201 L4.6179 9.8557 C5.0761 9.2079 5.698 8.8427 6.35 8.8427 C7.002 8.8427 7.6239 9.2079 8.0821 9.8557 L8.938 8.6201 C8.223 7.617 7.2865 7.1155 6.35 7.1155 ZM6.35 10.5667 C6.0416 10.5667 5.7332 10.7299 5.4966 11.0563 L6.35 12.257 L7.2034 11.0563 C6.9668 10.7299 6.6584 10.5667 6.35 10.5667 Z", + "name": "path", + "stroke": { + "paint": "transparent" + }, + "type": "path" + } + ], + "fill": { + "opacity": 1 + }, + "name": "group", + "stroke": { + "opacity": "0.502", + "paint": "rgb(128,128,128)" + }, + "type": "group" + } + ], + "style": {}, + "viewBox": "0 0 12.7 12.7" + }, + "type": "ia.shapes.svg" + } + ], + "events": { + "dom": { + "onMouseEnter": { + "config": { + "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": {} + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({view.custom.disconnected} \u003d False,\n\tif(isNull({view.custom.alarm_message}),\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string},\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Alarm: \" + {view.custom.alarm_message} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string}),\n\"Source Id: \" +{view.params.tagProps[0]} + \", Priority: Unknown, State: Unknown\")" + }, + "type": "expr" + } + }, + "meta.visible": { + "binding": { + "config": { + "expression": "{view.custom.display_icon}" + }, + "type": "expr" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "Disconnects/Device-Connected", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "Disconnects/Device-Disconnected" + }, + { + "input": false, + "output": "Disconnects/Device-Connected" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "mode": "percent", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Robot/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Robot/resource.json new file mode 100644 index 0000000..c2173e4 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Robot/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-24T18:54:32Z" + }, + "lastModificationSignature": "87c7c8ba84a0e3328f3c3c12ab0cb524316742748d40cfc0b20d8998567195c6" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Robot/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Robot/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..f425560df6acea93db56ae5012664b140354cb8e GIT binary patch literal 1844 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 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SLAMs/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SLAMs/view.json new file mode 100644 index 0000000..6091991 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SLAMs/view.json @@ -0,0 +1,628 @@ +{ + "custom": { + "FillColour": "value", + "alarm_message": null, + "covert_mode": true, + "disconnected": false, + "display_icon": true, + "error": false, + "isMatch": 0, + "plc": "value", + "priority": 0, + "priority_string": "No active alarms", + "running": false, + "running_status": 0, + "searchId": "value", + "show_error": false, + "show_running": true, + "state": 5, + "state_string": "Unknown" + }, + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.FillColour": { + "persistent": true + }, + "custom.alarm_message": { + "persistent": true + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t0, {session.custom.alarm_filter.show_running},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_low_alarm} || {session.custom.alarm_filter.show_running},\r\n\t\t4, {session.custom.alarm_filter.show_diagnostic} || {session.custom.alarm_filter.show_running},\r\n\t\t5, {session.custom.alarm_filter.show_running},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.disconnected": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}", + "plc": "{view.custom.plc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{plc}/DCN" + }, + "transforms": [ + { + "expression": "if(isNull({value}), False, {value})", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.display_icon": { + "binding": { + "config": { + "expression": "{this.custom.covert_mode}//||{this.custom.isMatch}\u003e0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "0 \u003c {value} \u0026\u0026 {value} \u003c 5", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({view.params.tagProps[0]}\u003d\"value\",0,\nif({this.custom.searchId}\u003d{view.params.tagProps[0]},100,0))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.plc": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "transforms": [ + { + "expression": "split({value}, \"/\")[0]", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "fallback": 0, + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": 4 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 4, + "output": 1 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority_string": { + "binding": { + "config": { + "expression": "case({view.custom.state},\r\n1, \"High\",\r\n2, \"Medium\",\r\n3, \"Low\",\r\n4, \"Diagnostic\",\r\n5, \"No active alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.running": { + "binding": { + "config": { + "expression": "{view.custom.running_status} \u003d 3" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.running_status": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/STATE" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceRunningStatus},0)", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.searchId": { + "binding": { + "config": { + "path": "session.custom.searchId" + }, + "type": "property" + }, + "persistent": true + }, + "custom.show_error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_low_alarm},\r\n\t\t4, {session.custom.alarm_filter.show_diagnostic},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.show_running": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t1, False,\r\n\t\t2, False,\r\n\t\t{session.custom.alarm_filter.show_running}\r\n\t\t)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceFaultStatus},0)", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.state_string": { + "binding": { + "config": { + "expression": "case({view.custom.running_status},\r\n1, \"Faulted\",\r\n2, \"Stopped\",\r\n3, \"Running\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "params.forceFaultStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.forceRunningStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 100, + "width": 100 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "SLAM" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "position.rotate.angle": { + "binding": { + "config": { + "path": "view.params.directionLeft" + }, + "enabled": false, + "transforms": [ + { + "expression": "if({value}, \u0027180deg\u0027, \u00270deg\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[0].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,if({view.custom.running},{session.custom.colours.state5},{session.custom.colours.state0}),\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "d": "M 25.072251,49.491677 C 8.305025,50.18642 -4.5893078,30.832553 2.4672281,15.562464 8.2437711,-0.23935905 31.006999,-4.7804171 42.373386,7.6015452 54.088036,18.389216 50.750821,39.438697 36.798277,46.490083 33.221446,48.453809 29.149949,49.49602 25.072251,49.491677 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1.5 + }, + "type": "path" + }, + { + "d": "m 25.27,19.376563 c -3.799453,0.197118 -4.03784,-6.218759 0,-6.053125 3.946982,-0.08033 3.946979,6.133451 0,6.053125 z m 7,0 c -3.799453,0.197118 -4.03784,-6.218759 0,-6.053125 3.946982,-0.08033 3.946979,6.133451 0,6.053125 z m -0.240001,-0.316562 c 0,2.383333 0,4.766667 0,7.15 -2.173333,0 -4.346667,0 -6.52,0 0,-2.383333 0,-4.766667 0,-7.15 2.173333,0 4.346667,0 6.52,0 z M 17.07,23.24 c 0,4.116667 0,8.233333 0,12.35 -0.666667,0 -1.333333,0 -2,0 0,-4.116667 0,-8.233333 0,-12.35 0.666667,0 1.333333,0 2,0 z m 25.119999,4.220001 c 0,1.3 0,2.6 0,3.9 -8.69,0 -17.38,0 -26.07,0 0,-1.3 0,-2.6 0,-3.9 8.69,0 17.38,0 26.07,0 z M 12.079999,8.75 c 0,10.833333 0,21.666667 0,32.5 -1.086667,0 -2.173333,0 -3.26,0 0,-10.833333 0,-21.666667 0,-32.5 1.086667,0 2.173333,0 3.26,0 z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 0.5 + }, + "type": "path" + } + ], + "style": { + "overflow": "hidden" + }, + "viewBox": "-0.5 -0.5 51 51" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "SLAMs" + }, + "position": { + "height": 0.005, + "width": 0.005, + "x": 0.0225, + "y": 0.0277 + }, + "props": { + "params": { + "tagProps": [ + "", + "", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/SLAMs" + }, + "type": "ia.display.view" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.openDock(\u0027Docked-East\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})" + }, + "scope": "G", + "type": "script" + }, + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"StatusPopUP\", \"PopUp-Views/Controller-Equipment/Information\", params \u003d{\"tagProps\":tagProps})\n\t" + }, + "enabled": false, + "scope": "G", + "type": "script" + }, + "onMouseEnter": { + "config": { + "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true, + "location": "top-left", + "style": {} + } + }, + "propConfig": { + "meta.tooltip.style.backgroundColor": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.style.classes": { + "binding": { + "config": { + "expression": "{view.custom.priority}" + }, + "transforms": [ + { + "fallback": "Alarms-Styles/NoAlarm", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 2, + "output": "Alarms-Styles/Low" + }, + { + "input": 3, + "output": "Alarms-Styles/Medium" + }, + { + "input": 4, + "output": "Alarms-Styles/High" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "meta.tooltip.style.color": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired},\r\n\t\u0027#000000\u0027,\r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#000000\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#FFFFFF\u0027,\r\n\t\t\t5,\u0027#FFFFFF\u0027,\r\n\t\t\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({view.custom.disconnected} \u003d False,\n\tif(isNull({view.custom.alarm_message}),\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string},\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Alarm: \" + {view.custom.alarm_message} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string}),\n\"Source Id: \" +{view.params.tagProps[0]} + \", Priority: Unknown, State: Unknown\")" + }, + "type": "expr" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "Disconnects/Device-Connected", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "Disconnects/Device-Disconnected" + }, + { + "input": false, + "output": "Disconnects/Device-Connected" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "aspectRatio": "1:1", + "mode": "percent", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SafetyGate/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SafetyGate/resource.json new file mode 100644 index 0000000..20e3195 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SafetyGate/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-24T18:54:32Z" + }, + "lastModificationSignature": "68f40942c9ba754c2476adc760face6736216d9b78414f0bdc7753f4b48d075e" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SafetyGate/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SafetyGate/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..083d011fa24e1cd0783a357b6a2eae3c07b4286b GIT binary patch literal 82 zcmeAS@N?(olHy`uVBq!ia0vp^Od!m`1|*BN@u~nRNlzEYkcznEA75Wz|39-h?O!^B f;gq{m{xdUFEaEX1((ykERK(!v>gTe~DWM4f5Dga> literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SafetyGate/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SafetyGate/view.json new file mode 100644 index 0000000..41879b1 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SafetyGate/view.json @@ -0,0 +1,736 @@ +{ + "custom": { + "alarm_message": null, + "covert_mode": true, + "disconnected": false, + "display_icon": true, + "error": false, + "isMatch": 0, + "plc": "value", + "priority": 0, + "priority_string": "No active alarms", + "searchId": "value", + "state": 5 + }, + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.alarm_message": { + "persistent": true + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "this.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t0, {session.custom.alarm_filter.show_safety},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_safety},\r\n\t\t4, {session.custom.alarm_filter.show_safety},\r\n\t\t5, {session.custom.alarm_filter.show_safety},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.disconnected": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}", + "plc": "{view.custom.plc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{plc}/DCN" + }, + "transforms": [ + { + "expression": "if(isNull({value}), False, {value})", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.display_icon": { + "binding": { + "config": { + "expression": "{this.custom.covert_mode}||{this.custom.isMatch}\u003e0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "0 \u003c {value} \u0026\u0026 {value} \u003c 5", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({view.params.tagProps[0]}\u003d\"value\",0,\nif({this.custom.searchId}\u003d{view.params.tagProps[0]},100,0))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.plc": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "transforms": [ + { + "expression": "split({value}, \"/\")[0]", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "fallback": 0, + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": 4 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 4, + "output": 1 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority_string": { + "binding": { + "config": { + "expression": "case({view.custom.state},\r\n1, \"High\",\r\n2, \"Medium\",\r\n3, \"Low\",\r\n4, \"Diagnostic\",\r\n5, \"No active alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.searchId": { + "binding": { + "config": { + "path": "session.custom.searchId" + }, + "type": "property" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceFaultStatus},0)", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "params.forceFaultStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.forceRunningStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 25, + "width": 25 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Closed" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "{view.custom.state} \u003d 5" + }, + "type": "expr" + } + }, + "position.rotate.angle": { + "binding": { + "config": { + "path": "view.params.directionLeft" + }, + "enabled": false, + "transforms": [ + { + "expression": "if({value}, \u0027180deg\u0027, \u00270deg\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[0].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "d": "M 8.6500001,0 H 26.15 c 2.0775,0 3.75,1.6725 3.75,3.75 v 22.5 C 29.9,28.3275 28.2275,30 26.15,30 H 8.6500001 c -2.0775,0 -3.75,-1.6725 -3.75,-3.75 V 3.75 c 0,-2.0775 1.6725,-3.75 3.75,-3.75 z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1.5 + }, + "type": "path" + }, + { + "d": "m 12,15 a 1,1 0 0 1 -1,1 1,1 0 0 1 -1,-1 1,1 0 0 1 1,-1 1,1 0 0 1 1,1 z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1.5 + }, + "type": "path" + }, + { + "d": "m -0.1,28 h 34 v 3 h -34 z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1.5 + }, + "type": "path" + }, + { + "d": "M 12 14.97 L 13.7 14.97 Q 15.4 14.97 15.4 14.97 L 15.4 14.97", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1.5 + }, + "type": "path" + } + ], + "preserveAspectRatio": "xMidYMin", + "style": { + "overflow": "hidden" + }, + "viewBox": "-0.5 -0.5 35 32" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "Open" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "{view.custom.state} !\u003d 5" + }, + "type": "expr" + } + }, + "position.rotate.angle": { + "binding": { + "config": { + "path": "view.params.directionLeft" + }, + "enabled": false, + "transforms": [ + { + "expression": "if({value}, \u0027180deg\u0027, \u00270deg\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[1].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state1},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state1},\r\n3,{session.custom.colours.state1},\r\n4,{session.custom.colours.state1},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "d": "m 8.75,0 h 17.5 C 28.3275,0 30,1.6725 30,3.75 v 22.5 C 30,28.3275 28.3275,30 26.25,30 H 8.75 C 6.6725,30 5,28.3275 5,26.25 V 3.75 C 5,1.6725 6.6725,0 8.75,0 Z", + "fill": { + "paint": "#D5D5D5" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1.5 + }, + "type": "path" + }, + { + "d": "m 13,0 h 14 c 1.662,0 3,1.338 3,3 v 24 c 0,1.662 -1.338,3 -3,3 H 13 c -1.662,0 -3,-1.338 -3,-3 V 3 c 0,-1.662 1.338,-3 3,-3 z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1.5 + }, + "type": "path" + }, + { + "d": "m 16.1,15 a 1,1 0 0 1 -1,1 1,1 0 0 1 -1,-1 1,1 0 0 1 1,-1 1,1 0 0 1 1,1 z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1.5 + }, + "type": "path" + }, + { + "d": "M 15 15 L 18 18", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1.5 + }, + "type": "path" + }, + { + "d": "m 0,28 h 34 v 3 H 0 Z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1.5 + }, + "type": "path" + } + ], + "preserveAspectRatio": "xMidYMin", + "style": { + "overflow": "hidden" + }, + "viewBox": "-0.5 -0.5 35 32" + }, + "type": "ia.shapes.svg" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.openDock(\u0027Docked-East\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})" + }, + "scope": "G", + "type": "script" + }, + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"StatusPopUP\", \"PopUp-Views/Controller-Equipment/Information\", params \u003d{\"tagProps\":tagProps})\n\t" + }, + "enabled": false, + "scope": "G", + "type": "script" + }, + "onMouseEnter": { + "config": { + "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true, + "location": "top-left", + "style": {} + } + }, + "propConfig": { + "meta.tooltip.style.backgroundColor": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.style.classes": { + "binding": { + "config": { + "expression": "{view.custom.priority}" + }, + "transforms": [ + { + "fallback": "Alarms-Styles/NoAlarm", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 2, + "output": "Alarms-Styles/Low" + }, + { + "input": 3, + "output": "Alarms-Styles/Medium" + }, + { + "input": 4, + "output": "Alarms-Styles/High" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "meta.tooltip.style.color": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired},\r\n\t\u0027#000000\u0027,\r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#000000\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#FFFFFF\u0027,\r\n\t\t\t5,\u0027#FFFFFF\u0027,\r\n\t\t\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({view.custom.disconnected} \u003d False,\n\tif(isNull({view.custom.alarm_message}),\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Priority: \" + {view.custom.priority_string},\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Alarm: \" + {view.custom.alarm_message} +\n\t\", Priority: \" + {view.custom.priority_string}),\n\"Source Id: \" +{view.params.tagProps[0]} + \", Priority: Unknown\")" + }, + "type": "expr" + } + }, + "meta.visible": { + "binding": { + "config": { + "path": "view.custom.display_icon" + }, + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "Disconnects/Device-Connected", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "Disconnects/Device-Disconnected" + }, + { + "input": false, + "output": "Disconnects/Device-Connected" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "aspectRatio": "1:1", + "mode": "percent", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SmartPac/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SmartPac/resource.json new file mode 100644 index 0000000..3447e8e --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SmartPac/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": false, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "rolfed", + "timestamp": "2024-04-02T15:29:53Z" + }, + "lastModificationSignature": "32f348da4c2c3f94d893b75e00b3d745d1c09ff143a9d9746b64ed2fc329a2c5" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SmartPac/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/SmartPac/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..303adf5a70de3dba6347a47e3e1b612d995029f9 GIT binary patch literal 2612 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 P00000NkvXXu0mjfnvJ-y literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/THEA/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/THEA/view.json new file mode 100644 index 0000000..7c71dff --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/THEA/view.json @@ -0,0 +1,623 @@ +{ + "custom": { + "alarm_message": null, + "covert_mode": true, + "disconnected": false, + "display_icon": true, + "error": false, + "isMatch": 0, + "plc": "value", + "priority": 0, + "priority_string": "No active alarms", + "running_status": 0, + "searchId": "value", + "state": 5, + "state_string": "Unknown" + }, + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "custom.alarm_message": { + "persistent": true + }, + "custom.covert_mode": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case(\t{value},\r\n\t\t0, {session.custom.alarm_filter.show_running},\r\n\t\t1, True,\r\n\t\t2, True,\r\n\t\t3, {session.custom.alarm_filter.show_low_alarm},\r\n\t\t4, {session.custom.alarm_filter.show_diagnostic},\r\n\t\t5, {session.custom.alarm_filter.show_running},\r\n\t\tFalse)", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.disconnected": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}", + "plc": "{view.custom.plc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{plc}/DCN" + }, + "transforms": [ + { + "expression": "if(isNull({value}), False, {value})", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.display_icon": { + "binding": { + "config": { + "expression": "{this.custom.covert_mode}//||{this.custom.isMatch}\u003e0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.error": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "0 \u003c {value} \u0026\u0026 {value} \u003c 5", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.isMatch": { + "binding": { + "config": { + "expression": "if({view.params.tagProps[0]}\u003d\"value\",0,\nif({this.custom.searchId}\u003d{view.params.tagProps[0]},100,0))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.plc": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "transforms": [ + { + "expression": "split({value}, \"/\")[0]", + "type": "expression" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "fallback": 0, + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": 4 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 4, + "output": 1 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.priority_string": { + "binding": { + "config": { + "expression": "case({view.custom.state},\r\n1, \"High\",\r\n2, \"Medium\",\r\n3, \"Low\",\r\n4, \"Diagnostic\",\r\n5, \"No active alarms\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.running_status": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/STATE" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceRunningStatus},0)", + "type": "expression" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.searchId": { + "binding": { + "config": { + "path": "session.custom.searchId" + }, + "type": "property" + }, + "persistent": true + }, + "custom.state": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]{0}/ALARMST" + }, + "transforms": [ + { + "expression": "coalesce({value},{view.params.forceFaultStatus},0)", + "type": "expression" + }, + { + "fallback": null, + "inputType": "scalar", + "mappings": [ + { + "input": 4, + "output": 1 + }, + { + "input": 3, + "output": 2 + }, + { + "input": 2, + "output": 3 + }, + { + "input": 1, + "output": 4 + }, + { + "input": 0, + "output": 5 + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "tag" + }, + "persistent": true + }, + "custom.state_string": { + "binding": { + "config": { + "expression": "case({view.custom.running_status},\r\n1, \"Faulted\",\r\n2, \"Stopped\",\r\n3, \"Running\",\r\n\"Unknown\")" + }, + "type": "expr" + }, + "persistent": true + }, + "params.directionLeft": { + "paramDirection": "input", + "persistent": true + }, + "params.forceFaultStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.forceRunningStatus": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 100, + "width": 100 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "THEA" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "props.elements[1].elements[0].fill.paint": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours}[\"state\"+{value}] \u003d null, \r\n{session.custom.colours}[\"Fallback\"],\r\n{session.custom.colours}[\"state\"+{value}])", + "type": "expression" + }, + { + "expression": "if({view.custom.display_icon}\u0026\u0026 {view.custom.isMatch}\u003d0,{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({session.custom.colours.colour_impaired} \u003d True \u0026\u0026 {view.custom.isMatch} \u003e 0,\r\n{view.custom.state} + 100 + {view.custom.isMatch},\r\n{view.custom.state} + {view.custom.isMatch})" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 101, + "output": "State-Styles/State101" + }, + { + "input": 102, + "output": "State-Styles/State102" + }, + { + "input": 103, + "output": "State-Styles/State103" + }, + { + "input": 104, + "output": "State-Styles/State104" + }, + { + "input": 105, + "output": "State-Styles/State105" + }, + { + "input": 106, + "output": "State-Styles/State106" + }, + { + "input": 201, + "output": "State-Styles/State201" + }, + { + "input": 202, + "output": "State-Styles/State202" + }, + { + "input": 203, + "output": "State-Styles/State203" + }, + { + "input": 204, + "output": "State-Styles/State204" + }, + { + "input": 205, + "output": "State-Styles/State205" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "elements": [ + { + "id": "defs963", + "name": "defs963", + "type": "defs" + }, + { + "elements": [ + { + "d": "M 108.69378,77.205299 A 30.372795,30.372799 0 0 1 78.350262,107.57808 30.372795,30.372799 0 0 1 47.948245,77.263855 30.372795,30.372799 0 0 1 78.23315,46.832627 a 30.372795,30.372799 0 0 1 30.4604,30.255561", + "fill": {}, + "id": "path2823", + "name": "path2823", + "stroke": { + "dasharray": "none", + "linejoin": "round", + "miterlimit": "4", + "paint": "#000000", + "width": "2.30899" + }, + "style": { + "paintOrder": "markers fill stroke" + }, + "type": "path" + }, + { + "elements": [ + { + "elements": [ + { + "elements": [ + { + "d": "m 308.1,277.95 c 0,35.7 -28.9,64.6 -64.6,64.6 -35.7,0 -64.6,-28.9 -64.6,-64.6 0,-35.7 28.9,-64.6 64.6,-64.6 35.7,0 64.6,28.9 64.6,64.6 z m 132.2,-161.9 c 25.8,0 46.7,20.9 46.7,46.7 v 122.4 103.8 c 0,27.5 -22.3,49.8 -49.8,49.8 H 49.8 C 22.3,438.75 0,416.45 0,388.95 v -103.9 -122.3 0 c 0,-25.8 20.9,-46.7 46.7,-46.7 h 93.4 l 4.4,-18.6 c 6.7,-28.8 32.4,-49.2 62,-49.2 h 74.1 c 29.6,0 55.3,20.4 62,49.2 l 4.3,18.6 z m -342.9,67.4 c 0,-12.9 -10.5,-23.4 -23.4,-23.4 -13,0 -23.5,10.5 -23.5,23.4 0,12.9 10.5,23.4 23.4,23.4 13,0.1 23.5,-10.4 23.5,-23.4 z m 261.3,94.5 c 0,-63.6 -51.6,-115.2 -115.2,-115.2 -63.6,0 -115.2,51.6 -115.2,115.2 0,63.6 51.6,115.2 115.2,115.2 63.6,0 115.2,-51.6 115.2,-115.2 z", + "id": "path954", + "name": "path954", + "type": "path" + } + ], + "id": "g956", + "name": "g956", + "type": "group" + } + ], + "id": "g958", + "name": "g958", + "transform": "matrix(0.10552692,0,0,0.1049851,58.573883,61.035557)", + "type": "group" + }, + { + "elements": [ + { + "id": "tspan1770", + "name": "tspan1770", + "stroke": { + "width": "0.60875" + }, + "style": { + "InkscapeFontSpecification": "\u0027sans-serif Bold\u0027", + "fontFamily": "sans-serif", + "fontSize": "12.9867px", + "fontStretch": "normal", + "fontStyle": "normal", + "fontVariant": "normal", + "fontWeight": "bold" + }, + "text": "THEA", + "type": "tspan", + "x": "64.152344", + "y": "64.152351" + } + ], + "id": "text1772", + "name": "text1772", + "stroke": { + "width": "0.60875" + }, + "style": { + "InkscapeFontSpecification": "\u0027sans-serif Bold\u0027", + "fontFamily": "sans-serif", + "fontSize": "12.9867px", + "fontStretch": "normal", + "fontStyle": "normal", + "fontVariant": "normal", + "fontWeight": "bold", + "lineHeight": "1.25" + }, + "type": "text", + "x": "64.152344", + "y": "64.152351" + } + ], + "id": "g2695", + "name": "g2695", + "transform": "matrix(0.78290367,0,0,0.78703031,12.345936,11.651649)", + "type": "group" + } + ], + "id": "g3222", + "name": "g3222", + "transform": "matrix(0.45169465,0,0,0.44391375,-20.878644,-19.304276)", + "type": "group" + } + ], + "fill": { + "paint": "#000000" + }, + "style": {}, + "viewBox": "0 0 29.22 29.22" + }, + "type": "ia.shapes.svg" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.openDock(\u0027Docked-East\u0027,params\u003d{\u0027tagProps\u0027:self.view.params.tagProps})" + }, + "scope": "G", + "type": "script" + }, + "onDoubleClick": { + "config": { + "script": "\ttagProps \u003d self.view.params.tagProps\n\tsystem.perspective.openPopup(\"StatusPopUP\", \"PopUp-Views/Controller-Equipment/Information\", params \u003d{\"tagProps\":tagProps})\n\t" + }, + "enabled": false, + "scope": "G", + "type": "script" + }, + "onMouseEnter": { + "config": { + "script": "\tfrom time import sleep\n\t\n\talarm \u003d []\n\tmessage \u003d None\n\t\n\tsleep(0.5)\n\t\n\tif system.tag.exists(\"System/aws_data\"):\n\t\tif self.view.params.tagProps[0] !\u003d \"\":\n\t\t\ttags_to_read \u003d system.tag.readBlocking(\"System/aws_data\")\n\t\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\t\talarm \u003d [decode_alarm_data[i] for i in decode_alarm_data\n\t\t\t\t\tif decode_alarm_data[i][\u0027sourceId\u0027].startswith(self.view.params.tagProps[0])]\n\t\tif alarm:\n\t\t\talarm \u003d sorted(alarm, key \u003d lambda t:t[\u0027timestamp\u0027], reverse\u003dTrue)\n\t\t\tmessage \u003d max(alarm, key \u003d lambda p:p[\u0027priority\u0027]).get(\u0027message\u0027)\n\t\t\tif len(alarm) \u003e 1:\n\t\t\t\tmessage +\u003d \" (+\" + str(len(alarm)-1) + \")\"\n\tself.view.custom.alarm_message \u003d message" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true, + "location": "top-left", + "style": {} + } + }, + "propConfig": { + "meta.tooltip.style.backgroundColor": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "case({value},\r\n0,{session.custom.colours.state0},\r\n1,{session.custom.colours.state1},\r\n2,{session.custom.colours.state2},\r\n3,{session.custom.colours.state3},\r\n4,{session.custom.colours.state4},\r\n5,{session.custom.colours.state5},\r\n6,{session.custom.colours.state6},\r\n{session.custom.colours.fallback}\r\n)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.style.classes": { + "binding": { + "config": { + "expression": "{view.custom.priority}" + }, + "transforms": [ + { + "fallback": "Alarms-Styles/NoAlarm", + "inputType": "scalar", + "mappings": [ + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 2, + "output": "Alarms-Styles/Low" + }, + { + "input": 3, + "output": "Alarms-Styles/Medium" + }, + { + "input": 4, + "output": "Alarms-Styles/High" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "meta.tooltip.style.color": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired},\r\n\t\u0027#000000\u0027,\r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#000000\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#FFFFFF\u0027,\r\n\t\t\t5,\u0027#FFFFFF\u0027,\r\n\t\t\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if({view.custom.disconnected} \u003d False,\n\tif(isNull({view.custom.alarm_message}),\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string},\n\t\"Source Id: \" + {view.params.tagProps[0]} +\n\t\", Alarm: \" + {view.custom.alarm_message} +\n\t\", Priority: \" + {view.custom.priority_string} +\n\t\", State: \" + {view.custom.state_string}),\n\"Source Id: \" +{view.params.tagProps[0]} + \", Priority: Unknown, State: Unknown\")" + }, + "type": "expr" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "Disconnects/Device-Connected", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "Disconnects/Device-Disconnected" + }, + { + "input": false, + "output": "Disconnects/Device-Connected" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "aspectRatio": "1:1", + "mode": "percent", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Test/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Test/resource.json new file mode 100644 index 0000000..bfd15de --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Test/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-24T18:54:32Z" + }, + "lastModificationSignature": "f6dabe463c6cf3ddbf10d69b05e49fb8f99e2bab393db27325530d6ad7bc2a21" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Test/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Equipment-Views/Test/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..bb9e9138a05297e36d41a4e380e4a6eb43c03432 GIT binary patch literal 3442 zcmeHKX;2f^7LH{ei$+8iiEOdd0v3>9K_aU@K#L-=h++|hz!QZ8Vh};LL>>@i3$-e! z6r!RaiV3M~VM&l|b%_yyM7CrkvS=U>AtYoW4|O`zUvK8MGjHb2>yJBU?wR|YbMLw5 z`|jMLLm~UtueDeU007npeHRc40Ib1%9QwMe9_$6XiB`;q!f;|CoiW$OG=7nJDq!Dvm!u`jn6r|vO&VURy>8XFV1Gxku?mM^|E zvdyrShj1ZVd+MZoa$9TMr1Uf&hNh*8vp$ zR}KB!8`afi6bi+@mA?NQUJQBD@iw})5aOLTUIyK@YqP(ZaT3nyNzD{~kbMVfcYzjd&L4)OH7 zA-Kb89B|`Dl64Dmrw)RKo1wsP(usqp(72wI7b9TDi8vJ4ZX!d+%4qE+ug7qTSj>KH4(Uz&!9e;lqt9UD$&Ui{yHrHs) zg*AjCDqSV&Bwr6aPAKKkhbX-I2JW~@29`AVaFLoNdi~f?OFs6nEgJ&IKn#}*BbH7Mia z?UMIu$<+4Li9%@814n@{%|W8x0q##HF{L66T8t4bV=b1y3E5!CSR%TkrF%utf;UV~ zp5BIW_40yjgab45KnY5pRhn<#v3gNPxSh^sIMyu7^8Cuwy1xFb+ZYu)7bc>uG;e!R zGgC(7WQmp@_Pr+8+UqK_;-2Ai&=U2TQXwHR@`-SB(Zdlrn{s)bN)qgbndH*hqPz`h zj2_CZc6aH4MeEmQdU&g{SxXN_&-@^CQOav~%XBuxba~-zd`!h1JK1uNWQO3ODo$)1{ZQ8OB;p*vovAezQ$mrq-gHAd=SHUTRklDjWo}qLd{Js zi~3{)EIvvlXIHc!YPG!{Xhr`RdJ>84Qc1kXv{TVtd>I@#5VDv>o6b=ybybE;3IXAP z@!mYwwIC#8h4y5$m2-f3UWyc zDQE9P2+MR%S!(msOQZ0#u1;skc7exyTn-pfMF;A{TIpzDw>s5mCj%+)|xyYs_pC6 z27CW}{US}x28+NR7UkwRa}UlrcVAx{5^W_D`MT+iG!4uCq!bmFxF_OhwzhinJs}lC zcEQ)QhtYECZRJr^p)+qB9fsn`b$E(NpgEnyI}v!Ts&$urncx_tOdDz<4` z+Kj+DJbA2~eCZK6gMMRrSYYBe)(x)5XItP}dR_BNCs!ZWOFkV1gTja9Z5m2NkN@ zlRJN7_i1cJ=1iz6_{d~}_`qj*`9N=)#wH$5E#NC#GP0zHom%GlSo=l@EA7gq0uD`? zy?oB4i^bEX3Az*sQE{BPg3mPb1F}++|BW{G#vG;V>r`+359GFv2?tpxsa1Pdv6;Wq z>j*2{rAwCT4kP-ubUya5z3>>!YD$-N28J0^qy+H5UT@u&GG8KlzxJI}VK~UmueTapEHx z&qsfoZ-hIzM}2GgNX})pqc%^-zl5{nq+-x_f;?4IU;tDk_MRSlb5soM(xm1OVSJxQA0Ts5uyEov9DAD~+ z%umi#DiU)Tt6`$`b(&1!4qpRzx9IzCg9Gjdg7zEe9CGeGv>$XKaU(9Y7Z6qgxnit) zGa~=i6$oH(HA?=Pdz=1WARLIAnilJPdp=RLRrM;PWkp#cGSZFN)_dsv_aKZSiE%gF zf?#ptXbV4jRfYivRx5V6#pGSKcb7C`_Kvc1*h~(7Ps3*{t8aaTI^gRukuWRA3lJwE z(v8?0oyJ5r+gSG4_BJ7zW@%D!Wo0#NZO^Me)nb3LL;r&RVRHXfy8oflt^92!!CLc5 U1#evaO96rcLjs6@kNM}n0AN661P(a- za<60NGSn(~bcQSE>>0L(?7fT)`z4tf5_uR}3>gHDF*rz!az?{oG#!lQg<)DA$fWIM W;9!$~y9`)JGI+ZBxvXi)t5mw6ign11bOk z0DzpubrS~wK!UKFH^@rwMh)IGH2?tQXJK;9>AuIp7!R9`S9%wsed^iOn-5Wo_u8b6 z`sz3H4^{k?Z1lkB0g)vaX8iMhNeXYs?b+x3CFSVhOVn;o@CS;YO&Vmz>oU>%vR}_> zePXs=@hR&se379A-Ez`t-Zjf-WlO#J*47Gy`*eF_Auq>xs^R4`o9IJq_8bC<3~cOfd>4#= zmyvTEN=``H-4&S+k6a8)dAsf79kEcvWRc}E=oeN{@Pl2LGum7nX9X|c(&&M6X)X~X% z|AmPRh6=Q$vr!_<(@am+)SDtQuv$S$u}?^iyD29(*Skjfgh)IO8Q{|go-h>@vVpyo z8eOyPRvwcgKPnY<7+6Xzu{)m$?$Mmz9HMQ?nAgx=S5R1bNVdwZoJGTly3}!~BQmVn zIi7bzbxQYupuQ;t4<-MyM{<|Lr;7ABL>RR_9zOanl+!6r34Qz32nwb1d-ra0G;E$O z)*a4vy7Gs!OF-esfOnSQ(VPQPTnD!*d)?$tp*K0lKV`0U*oWb3C?xIT?(%HA z7&G0lpe*1HmF()CINX#~5HkJSCFDR~0ZA9tQJy&eFjcDiQUH+r%XcATpky;7GQ?CY z8Q+%7&-hJ`**DT(zHQ>6M66qW8dXYnW7XM^Mo@z+cJazBtCjpzHnZJ&%s!&Yy1G6d zXQ@3mXQjp(EpiROABZa|Sb*^9LDu$b_ekvV+`g-xWt{=p>?bxQbydh!r&u-CKR`p^ zuS$er;x#lCyC&mXT4C1Ep`|Nh``6^j!Zyh|4_w=aukM!Ak%)I<`E4&8)s1k9(R)TO z*xy2~HZ04-oqONB);}Kkc494{6pQfpFE`FCgSes5&P?`ia#Iy*97XQ?>-80S_<-B1 zW-eIGx%TcvuQjd8VU*=-gBZu^l*X9gHh7YstmHZ~Dhb0k^XPDDZ@KJCQzun1tTy;K zKIbK2fa-5EU2_-b7F1Q@HbGU$aqA1k)}I$KJ_RLWcYL?q5LI=-Xc%mGLv5bpLyAb! z@q{{PC_AD8o;)7jceb~e05hzt7`MlxsnR6>92)#h zj*cT<>@tSZV21jjE3ETfZO0g~;^jmJjVH<}=F7D4P&d^d1s&Db3*zDDbw-`H<8ha5 z>wV@Y+Wl5qc1eWnkvIyJWWvGtz0`mSKY#w^s#XWQ%UF3!Dl?8f@&P5ZbO+_E|r z-CQZf@W=<;-_QV7xoTW7gAID(PJ-a37&t0M_KnALz=aFSQ?OaB1PLE59H45QAVGiw z?j}f_a=3BhMvc3aT^3--mf?+tJ&$JBCw{=HNvNd3TTRkjYRXRN+du&aq!V1V_IiTQ z`@N)0yo$u$D$g76m#ienNCav`T2XPXsdqTg*}%ZSln+?`cFZt_yaxs)^z`&BTX1skA3bs;w6EAsH6ety)wF8# zW8@8k2aCCn`m^hLmPVK0CqQsz>4@pE!NHoZ+-thEX^-7pw4x~N|l)4=hG_$@?e|M>> z5`{*u4J=?zfQHo9O+IFKml(LJ1)AhreT>*KHuxe?F$mvIrhgkX-{e%K9}eFv*m313 z(rZIqjc`AM;EjZ~+~}EN>9F-d3$bV#f=KJ~Tk|oiZ2l6_Ec`mqnKnK$v=p7k$3NFx zA@O(bEFbZ>zW0z|p%4yiX)H2Nk1q0bSG0@qcd}J(eu2FbW05XZMu0Uf`$2zqU%yKy z?Yg^ra`D}xsd1l;<=B{U~R6ehc_=z{M1=_ox%Z{q8!d#UL|`(iIwE!GxV|Z)ri2Hyqp|1#j!Ya z;tg?GxUn*s{PrdthH3Q}1~Pj+8Vk(RGG^;HfjFih2 zl(!a=E_vql-TlaS*WER|5d@5Pa2Z+9lx0rV)$b#5(_2bonpVg+XZL}bC`~2ybj301 z*zqxJHnn>%TAT-P{FKsvI_3ZR`10q2WK+m^hefvVF8D8F9zkO zzCTmblk>+(bKx6^?Pp4HF0jQqZ2l4>w)v$zAuqR_!;OPS&Rk4sl`_qxa44P8;tR6O tlh>g1<3BPD@fTdU2N!LjcU{Hcm7JbmTk0N)cK;p#3sW1DieJ6r{ta}Hn5X~% literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Filter-View/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Filter-View/view.json new file mode 100644 index 0000000..26801a2 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Filter-View/view.json @@ -0,0 +1,109 @@ +{ + "custom": {}, + "params": { + "Categories": [], + "SelectedRow": null + }, + "propConfig": { + "params.Categories": { + "paramDirection": "inout", + "persistent": true + }, + "params.SelectedRow": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 390 + } + }, + "root": { + "children": [ + { + "events": { + "component": { + "onRowClick": { + "config": { + "script": "\tparams \u003d {\u0027UserClickData\u0027: self.props.selection.data[0].Category}\n\tsystem.perspective.sendMessage(\"UserClickCategory\", payload \u003d params, scope \u003d \"page\")\n\tsystem.perspective.print(params)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Table" + }, + "position": { + "basis": "400px" + }, + "propConfig": { + "props.data": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.Categories" + }, + "type": "property" + } + }, + "props.selection.data[0].Category": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.SelectedRow" + }, + "type": "property" + } + } + }, + "props": { + "enableHeader": false, + "filter": { + "enabled": true + } + }, + "type": "ia.display.table" + } + ], + "meta": { + "contextMenu": { + "items": [ + { + "children": [], + "icon": { + "color": "", + "path": "", + "style": {} + }, + "link": { + "target": "self", + "url": "" + }, + "message": { + "payload": {}, + "scope": "page", + "type": "" + }, + "method": { + "name": "", + "params": {} + }, + "style": { + "classes": "" + }, + "text": "menu-item", + "type": "link" + } + ] + }, + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Icons-View/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Icons-View/resource.json new file mode 100644 index 0000000..9a8ebca --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Icons-View/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "dmamani", + "timestamp": "2024-01-22T16:06:37Z" + }, + "lastModificationSignature": "f92ab33fdb2300cbc7961ac9892e5071ed567ce6b3d4d35453944d9df27d6e50" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Icons-View/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Icons-View/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd1d739c523ff6361feb169bce683309fd130af GIT binary patch literal 51602 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 z z*>dI0Tvsw%@-~q44#G_%kYG8@ zCwZ%1kx%072akI{xg}RW0s%=6RusLD@mSRJJSaexzTksVE4oKSUL{?R(qg|G>I3(e zakdRD;lw|;Z&V?~v8-_iRL~u~pLx-M3C3Y*;R#)NL%>Dv8rk{o%mR(bl}znxLb2?} zMUM3sI<48!LVIX}PvL(}uTcP-72S+1k`VIW+R)ei^FwQg^ykR^*(7An~aAQHTCuiW2T4!S$^zxR>@`lwK)TPDp|FMKM0jX9;TGMI9Sh{DQAmwDa`6 z&bS+&9e-h?HODxFYLR0YKkgUw(0g7iGSo$(Em>D$&EEW>eHOSk0&phKa8{w-5i{k- zAg@!7I`LXPz02!5-{7YM^`=9jlP@g&f@%Eaea2#QA&YH~=~~H-ZRj;G3QqxSKl``8 zB3&Te-;RI`v^dsJKuXt2nGs17&nh46`5yfttEHEYu$~0<&L5-vfXovAvCbI zNe{NJE&gdv)AI2BoDNm+Nl47Y|MQ z?K$};+E9%Mve}q;NglPq)RU)3`+0wg^6;?C`r(dHb+tM%Qco#+AZqa0$Qw8;ChJd| zz%e0+c)48mU4ZQ4a@l~4tmCADdI4Owx<&!seL_}G;{)=yru!@* z+4ZmM3@oXX`_)h#D#1>FhO;#XiVEMGUp0v?YL+=v-CT=OdIhTFD-Pr@$mj13zpcMV zx^A^uV*-FW3eG)Po+Izm+2TJNvgC4w7!Nmo;C;|QeifzeReI>bPKMrRz-6-zD zKNCe)976`iO^`|9HF-!x_s_TbG?bLK)(5fP>`3XZcV}#=gd}IbmY!!+F2TeZ6trp_ z%By0}QNOMVu;I}w2t1e05k2Dj>r$I5ft*iu07PH<;W9;&5YX%!OamMb$6nrHwRY8&J}nD8G?#8Uv*fRhvi zj_>$nvhx-WNUK%nJ0=}-Kc@Y9lQe{YB%7SXCr1E=rs#8CQK9a?CYTBG+@!M3=mB-m z7`3d%RaSros?=vQdhA~(gF#;SL0!3oMBj^BQ;QySuo|A;q27-nv26~bhbUv3^1D8 zC$X>l9=WD_w#`Y2a=3>d{0C@Hk$^eB+OqY+Yzc@ng7lW9=A1r|=f7N50Vf*LVK1hb z(+^qj8ziWZAK-Yido@b{gB=KcKdO?};RWk|9k~&@{T60NHQX13QWwUaZ#PU}@-6&| zl4;S9p&jgB^$clmXnluQ;0!vmFf;!6c@ds@OKYQw+$n)s~}YLo92!9`le(QoxVbX|7g{a$iH39kBXBN!)2jmJCoHU@YT zA(QpbtK;^GV1WlC1(rW18OnL?Xa9uQeZdRSi${wASbfioCXwdlu_5v+PJrxXtYVx~ z|Gt%A;7agiSEKjQr|hrt4fX2U7H$BQ4~R^1dp={&$1jCUpQx_d&zDuR;P!T(_oI97 zf7a zkIDlc3|7pTz-7BRle$@63SL8rvpEo5@U)ci1qY`&@9_4XkcWi51b|Zn0j!gvhjjv= zn$k?{g9zjYdgCnB?R7zSE8|#sXC`<4Qo?9h$F;#ASWqVG=dd+-RxwRA8e<=kn-Q?^ z42tYC3ldJ@W~tkUTl+*CVhQ|OlOB9D-5*;iMT0ZolFXLbk8~W{7Se-`N z^Mh}zL2aFFmsutYC>>f}h1F*bI<|?AEOMJp=xlw(GmhTvc^L!7&iLpX#k%v>da}zC zi|!D6p4hUDJ8Zw@-uq@XUo`&v0_Ot95vqC*sU}T&`1uLt6!kLWxH=Xa3GmS441qVHSLi_Op7%M)sd8seC?wCkZG(11{CEUk|m0||*2E_E&w?Ok%iTG62| zdpyb0q7zO~r4u5h?Il|2$ZGFX>rM<>hH=)^ejd}clJ6PLj*1Z>xQlZ)H?Cu#jb1ig(_3Fr50*()( zbhnM+sxTBGAhuv!pv0ZAInU^Dm(C!b^#(uRa#wr`zwXNF-F-kWG&$-25cjgu{bO<6;KX=WOFZnTupBEY#STJ2LXv<@EITjLY3KLP%xTUXDKJY+dC-nm*YFUxZ5`LF@pU*L;dykmsf`95rmPaU^kG2 zZL!<}@Pr2EmwB!+)kRWxI$mUNxFZzu&eoqUoFb>th+1v(b62o&k+U@&hv{%;grk+m z6ysl~V(lskEd;@V!m1DVlU--gHJZ=scMeB*7vdDVN7)*8CV?nCrr#ut-7C|2)PC~x zJ`1xfZbojo8nRu}E`Cf#_9re5_)C=n)h4NmW$sQVMi#qMY}&uFfoTMJ6{C`YMGZSv zBN)=rnpE?ET58@AD~&kXy>~8M`+YfkaQ^-sSvwJjkMHiLzXaNMNS6;-ouv*C8ls%W7_6$jKx=Khk>jkCWsG-7ecQJ1rHL+`0zc!u zG2Au<;4JAvB1)MNSd$qy5McY$lJpoCGf{-e;b}|lB-a7RFmCZ=tmi)7-ry&-mpI!% zASTz|qd<-3%ar1qcB5Jk$g-l3w_enCE^je!oXRH8--^tn3-2w?)`!Fn0}G6$XAd%2I{2mpY)n=a;p6{S7t6VF|pXP5)t z@)uMIG7@VGH0s)kMxryz@WIhTnhvWy>A#LUHqLH7@T|*a?0*L&-?#11v@F4j3SNXH#oj z1jeX(o?E6j+OuBG=iOvkW$DZrr_15!zdk$0Ys`;LXGu(THR`@w9Lt@d3XoIGh&do! zNtwuSJJ-BfWf1LhZMhJxd$m7QGwTl^rUZZ+F;S;1S@FkVjAQe-1m&{{eeCz%Q6~g{ z-17nPTDDy9r{am}uaw|-5S7-RKA*djYx|L=i+*mm%SwWUlGk&&kx+n3OC{H-G z)tG6{jKbhFu>dy^#f#Id&m<#rv)1Y85A3u9RVc4qmGJa9tK=ZZmhuTB4*>uu{FmYz zlYDz(KkTFup&cfLZ)7=bHjHlkey~x)w?}7vt;_RTDQx4nbK>7jf<~yHIiI8;oBAS& z!tV`sY&e_%@sTLV~eP?>)``!}xK!&hkj7lZC^1w{h;=%2j0zy0@t zURNmh2=d-NJ$cj1-ydzWZ-mOT5~?aR)%C!#-@Ma43BH`)L)*KUKj1!tHB=8yltlvE zw?{(q+KF4X!ZU;CB-@QTkj1SctokP5wf5bL4cQ!!K3A`RsXOz|oMsQ{Fs~g43vfj^ zVLh>mT}WRsnICCh*Ge00KB?eknFE{qQ0l-Ys}yH1jNsBMtVj1Y7R(bLd+DE?_f9VJ zTRj$Pn(99l*xtU~vl880IJ-GisnJ}}F9A1AHB7OsZ)}}eAKba$PI&K(e9&t_M}`cu zPBghq%%BOg!RnX`JW?iYlJ zGOc;>fO}l=W3UB&3akBP@PH^Rk5gf?POH0tyyuV6yd+TvRS~cdC(U0y)%&ipI zI?q-(@)7TaX%~m$0HKjLEAwH<3YqpAQ)^{Yrc^~uahGcO2NgSu*A4O$yz6tbY#o?F)UVew+-xjF{i60=0z@p|aX!PEv((}abJy>2pzbI4 z;(?YM%2rO8wN9kH)yr@>rzt8D-h(eGyLp}ZT@U((t(e2wY@x%lsAQ#UN9XypuBL*C zaJFr-sqnIELJ(}f{0Hl_K_1-z@(g*V`%#l-0#-twi>3lpgd5GL2G!T_vk58li`y%e z-xNsxL-si{D$D8IpBRP=w=YFY(R+6W7EJFniv{Zk{MR$wV-zGT6F0+Wa&5O5 z5`sUN6`OX6G^n+!IzApi-w9R+CxIqRX9kaHr9T9P^E(Bqb?p;V7bn5QQ4#G7gU3A}cY!!`I$YEd8&-K4xSDZ(h>I@j7KS z7ofy&pfciEtcD%Gd85VJ|C;Vqcvwuj17cZd*5GPr`R646f_nO+8LCct3W?z(bji?T z)t}J3xyIxf!{x*icu5i?yM}Kt2c9(9VA&4EHB-1 zYwx<&s2AL_Mqc+ErRuE4|NNo>)n+V-<0tPw0LEx%k<=lasfPPVjMlj<){9zoz- zmP0tiQkW50uFF(hEMc$gH#n8qNxK?9m8Q1O)pDcw2n)3aW9T)VU8(@#3&Of~#~oy7 zku!dpC%!tH&SP^12G1%JjM-V&FQt03W9b25kF%GM)06Anxm?qv`{5Pklld@Ni#9Q*^gijr@2Pu28RFGtb+{|G1J#S%36G{VKh4R92 z3zpE&N1M}%&QI++n3$_C2q?US$<2L2F{ms;99;bac5D#ci#p?^&iUNA2qvT>d-8mh zAhkBFuO6G%^4SJ9WusBYIw-%@1jMRfL-SW6=k?Qu?W9Cj`VGVtL;_SL^_pb-6(1j4 zngSj&cDJTlIhKL2o?Ux=Dv^9_!AX|R!1#0-(Mr7RZWe3|OZe2O={8#*au@gF)$vlM<}36TY+V0on0+=7-1 zV@3ih!*6>Y?v@b0e4L+IMb@^AZS6>or7X-y9D-AZKcGRqEUc}u&$1UOVj`dB(@) z#jC}d_wdcrxFL->2*mtu$c;67t*jY*@bDg`W&tk}yw`jqQn@0oj#aGA=Yn51+%9hI zKFNPw3|+-}IvsDHR5vc6(mt(`oi#_4vCD{#(yVo$Zmc+j3p&tv8fGHF15Pd zyn&4{f&#((;1=cFxnn~mufw&0C{H07p`-~Fx?Tx4pkCw`uE<`H%nviJ8%)JIv`hY$ zc|v=PdjT*vkYrexKkWE#C2bM={s{2kaBnBiAy_w>?^G*$yXoj!pBPfJH-X0f*i5JqI+>Rt>C6yg{McQTF z0c6!y&fTxf6))Yd4f}484zbWWt&|n>*e*KTHs_K!_T&ojuIyYj{YZ9z&>K)ZG&APF zl{^-i!J@XUi9HR`6}&;+gW$u~*LE5QzIEs6j78Q0-)C>55fqU1oi*W)x43+xmx=_)0Bl5}0*-We0R5gY}U! zFrF_}3nGW&G%Vs1hr&(86AQaB@$l6d+`f0M3^i7f&^g)-FEKi3!)Hzr!7IL2DO<4Q zxVv34KSUjn4Bt$Jg%5p6>v$|A}LxDI04XkvxL(h$Nxzipos! zDS1s76_)|Uc~7TtORNHx^^7cL_0YAB55_-AzF2F*0T#^RFg8Ot6cU$QTqoH{kn z6^c6ZoPXu66LY#SC_BGIvU|*_aC$W~a1-Hh8sES5Rs@Pqj-)?z2Hjl>qD$d1II4U` zYMWi8j#vvR6)< z;iU$XR(!~pMz^QWppAk!*SC{Pl#~&j`-=whB)n+wk0+LvD#>wFysSLk_ZRp^Yx6p43=WM!{G-kLjtP#z-P}M$|XiZ&7a8#>H3Z}MJ?$&cd{>Xjp2V-jWl%$c?DzM@1< z{{X|?oo*!YXs2GR8N$ev{meM>8o&rF%jTxg@bU-!59VoqRK0UN?{=~R2CA`j;^~S# zC$9Kng(JgxU~p)|h}~ccH-gQ}7?~)P_8((-OJyf;Ssh*+9^K4V3mJZ~E3$Uyb8Nv2 z)@clYQt&yj;n9!byu~*P=y0$HuSHw$MbLihL3dF?m$)|!#@y#1hV zPjPL?-Ws3Li>lVR=sp58;RY>8_J)FGc2}>g2u5poIWhejI$!%W@s2;)jsdMjhE8ly zReiy~+n?vt7!7e4gSR@8!^dz$Rv%1>;@?SKDr12IR3eK_jzsP4=N+OvB&ZFu9M0X; zIq^R-xbwY5mdmQ)(vy)D+A1^4`N+N}j`SqxD$B@41?2bE==+McV}+a>T`OGLI{K&G zs*ioUqqQssmNz(|OM{CO}!-7%-F5Z@XwcZi4ap3D#OhQcDdu&I`gNSF&(%QTU z;VaZabcGlC7HnK~>Uw~`MTxx?evnQk3DZM~M(>DPR6^XFk0f}WVEEa0aMbG#N`N2I zIx3?Y-f%W8vOnqEf=+gLNFOudex?T9YJMa~e)BN~7wewF58C2EbS@385R zzLW4mXve`_j$TCISe{1CE-ggaw>#AgqiwVKWn?w8gtc&~N*f3y*ZE5iPuzF&W zi)Vdhm_axX7okHO!^w(7f6{H^!$v+_A~o%|m&D;A;sOp&381jiDC!p!k-$btG!#+)@w}Qyv)oeU@i7e zHOV&{j#d)M;HFXy1!IO`XLr6-NjW2x!}>%}UX+IVslCq1 zETw0+V~>qD1B81<$>>@(@ArHO<)QQ|4#YC_E#WsDrEU!Ys(b+(^|I zw_2yVSB&BF^zj!(CBiLV`~EE>RP%}=Z`S*wi1A16-W4YDxYdun7e){ zQb#5(oMSy${Ka0{Y)7ntOj=#}r8(3urKmiWo$u4j_)|P%0TW+W*DqPGk2P$`7PsOj zrP&wCZz_Zh!~`hcV{ce2M=J4>+fz>WRR>I^x!w+;2jV|{qpJELEE$;u(zkc4l7J^3 zMu<4)1G{Nz+R*qcQi9}D(e64cV%2J#^Iza@no5m7!8WbrS=-P8?;o zCc0F5(z=0PJ}=8;G>_(R)l(N_>=$AUDridkcdsqwW=ycHF-nAIu^$6tU=ALQqy)$()8Z9{_o1rW6L}_up)Kiup&X(+s&oBC`7=LmjVV+$1-)tmGfLguHKET}4~42SO+=h2jgRv#x3a=E^< ze!Mp}oxT6XZjKf9hJ0#vUN=4Y($|-;mD#I<>#7uKhV~aIlq_ibJwD;v(1l9l%hsUt zR=5(nop&YH$@(9jK!{%tf8C3X|$@Rr)vX*dS!NxE#U>P=)6u7&*{2i;uVMa-ayN1 zZ(dvD*IsIJNio-3J;~RXySKTQh&nGaP`LPOWT)3%&eZe(wQrHXkz7BMl9ryE?DxW~ zH`AIb+R-Zc3M8I}`-y}vo9Il}j`>b1S?MgipAl7h*|gYsRD3xCw9cMFKS^7-LZA5X zUj=1LO|C#U?%i(fxkq%IQ6U#QpJNb$j;L)Ag(WkB3=t?e{`HFW7cqp9ItSn%qLBC*!w3WA3e>*E} zvRO4A&_h3numydAY9RlXe|IobK;CbYH7v|}S^$1wL`_S6$;5+bLSB zE+^IiI{u(cmw5j0-ti!j=8kL4Mv!;Zeq67R*4Fo;)dDVUS+FKiO*OkL7bCyZ_6KTN zQ_~JDX|lFQ6t|*d>A!ymh|eNW=#(xLSv`!`E0B(sK>;NF7#M>9f|T|LJ?w-0_CbU8hcS;-g<1kd=)4P9P|6aK`P;hVb>A%Z&A<=PHrR z0AJWAxMZyvy33@D1J4}5dMw^On1w~s18u|#NeB_wAJwpDt^*HC^!RIFqQ`#S;}as* z_U2JL{6w|hXDkZ(I3|2y*@}+NseF;yzxV;wU50IQkgfNQ_VMMt=P5_I!||$9BFnPJ zgU}zN==VDiAwVO6#W%koPeDPKAR%t4=|c45m*bOb%2rsUf`ee@hcf=Np`x#a-=u<| z85wJ8+{p!&RT`A=@`#j2l%F+!Y1BecA2e{^hW52RmOYU1X0rcPb!0T5_(ysuT$xKa zwSaGmZnw}y0}EhYJ0{Oe2Tm(%FZjX|6znMkMn@-~fvs2HMfXai@%cDQg!?A5{`fK3 zH%47XLef)yG%m+B;IsgEzE!7QplF5fag2m>|9g-F;6dWx#HR@W4M4}fivY5j8T`?1 z6MH(jU~y>+$yQ$!;&%0viIw0n7D!sw3ok4xpGt%U&u#13;nC3tK&pQDBuvs&h3x(F zCpeY7q;$?KxKSu7h?G&V!ZO#7qbJZ6#V=nggq*XTN^zU#& z6;>{@zXSw;Q8n{!Z@XdWPH|u$oW%I(wq?FiM`lhAm!|;B51cy6$jr8PPv#u^!dNFroSoWW~_^Pqk0!gsG=bj~$+n8E`GD7;cS*&hOC?i2qP!n@_ zjfjpe_v91l(!+B34F@#vK!5?ODx``85PVl3NFsFwXdjh>IK*|)GWqpocofc`AuFH3 zORlH1(-i@Srz`hjsJ>1Inh^7C=3063fGIGm^llqpr!<4%Y{STMJR1=WBO`W+&;_xy zElNk<1cS0Ek7?If?m1rmA&^055w=qTe(#<~u37H#UM}*V6LV6`H~9Ln><}QK&f0Zg zT=s}A#93~#*Iw>=X)7%#MF!Y&^nQQ;Qo4_*Q0`y_AwNez=NukXR%XKz?c5^sozGL>-|qK=pjZ0Fp94p-q{}l zUjPwV`06{x$i<(4T`}n>Us{6meX)(nU%!@kp(Uu8m8tA8n;MvZ;Gw zNJSE43q9$=a=VgLSF>g_v7@w^>at*EWros! zdG|d(F)#<B&vxu%UAgSzER5>bhDPHMt zO4H@(vtTJMuu3Mp=NZb5pc8N=1sE*?`?V(uT-B9i$5yicyDd}(*gEvDKl?ufE&wEG z4zSQ3<%qo{k?&K}E1z&O3<3HU`|?T5rTiw4PP7|H_%`(-Hd|ttx8>^fRo}v8-@+CB z8K5EV2BJ=UWFuOWlLkkVgzGj0jQ*G$`$XBji-Oq>5HXG+URvSLIZ`$NAKC9ZDEy;8 z&#R;GAlp+d-7iK&!lU+ah+e;TkTPk8wRtA@t0Iz$M_nBV946hH6;s>^uE|8-sk>Nf zJy!uWIMt=8wGI5cQKW#>*N*s;<4^7>gPXumhv`teHfzM_xKnvlI>cmKeP;rIzezId zw&A+AfX+<6y9p@tih?P<5nFE7O6(S}d?19Un>3<%%XhPPfYdIk+GcUdZ6_sJ>W=iN zsbN3XR&66>q>hkU_2HcJx6{JpBSm95vakUrTF9Vwsgj7Z=@X&UH}%yX)7#n6_s{)8 zZ26|BLNea!dvWKDqz2UnO5keoNvSE_+|LMJEPgEzj8fD#L+t4vjp5w<@mVWhKxBt8 zTH$4-2(qLUI2R?W=$t#dOAFq)QcDS53Rj#~EJEg^KYid=F<%r!nF#EslDH_ejpF5Q zvAbrJzpTppYA#$^U3C-5dW}nX^A=hYA|OY3n(MWdrUn(yU&0`vPubpQU-W>_|phLq0!IyG;$D4+>ZN| zw1VxHwibMRVP1n2u21j9;M2Wqv}80`DIm{yOl{P*s8%&mB@=XX%7=7CJZ|BIc=xW9 zu4I;Cz9WhZ$bTARAdsOzG1{%YW_KSXR_nRyHWUIcQFRJ13I#&ZgL+bj0nt`aO&t<{ zU4!$IW{ee+Q1|#J15X|^E8GND6%HOwnu?Z1vMOetrOaS#vKo}N_@7M3GQ+1=b6=I~ zR|C6Xp3jA9Qcx71cSpA9ubsqtOP&kkKEa}z6bF9Aj8SOaNgA@sixVpWeiaAlWQ|aH z!R-L|*7{BALHCm)NB@M5pdLPbaHmwW=ykLO z%DX)oT^i{q)r*|M&U508gI<^O$#WM~RrQs`x4LH(V_PziRjq^L#bnEpE}CeOyo7Gz z4vCPazm<1fc-@FL}r*2}l>RKI{QTja_XaU`cR#Fz#KHZBBwO~u+n)u}Y)3Td|Cq;K1T%Id|myW%Tf z4zZ0`fNEQPXg5|c4+47=mGMJ1Lt>+O&4$$FWE_YM!R>ggEZ;1)m_{`NO(nYNt0XLc zd>wKJLEBgyiyro)fwzq8L)-kFi%PWCq@T{3&yRO!F6iJ@?4$! z*}Uqyd-L-YK%{*pq`mY)ET)~N;?;O`+z&2ipEHJx0(aKRRJw-|B?N4fM`DR1|9N}% zve_dRXiQqRr14S~gpM6|l)0Uzts|x#@9s8M&O6L?y(O3?w`cL_aoncNhqF1iYjL+) z>I{s;JPsh0M7Gv5eq@sqcQ}Fj2tm3 zS=3(kQ!_Y34hEYdvZE#H+Xo47U->?~cPVK->)+HU^kxKvk3FLYD-3QSe;GE|nb zz+>R8r^mLViT=<(eqkyIybxc-+aea)dwEUi+mcJbT0^9Gd!)EAI4p^#x&2C3JKx2D z0K_VNe|O8_GRyZfarj*KKoscT=b6B0zQ6}L)-wtDPiGZ}_QZB##YGJ2V`sa_$MZ8C z>B%$G-x=b9GK7#m(JS(p9>+1Tn{KP7G34o$7N(AUy1OEJPm~D8BS&=salQMPtc$x; zH)I0tA1b0mc#bk$WdJfHL^Bz&9Gek1L@^M3A4NpI9{ zZ>)Q{i`h#3PRZLd29|pnMXE83UpNnji1wEu;w|AwDwyPfIpcfS6qKIPur^q+i@ehN z7MNQ_LG_IDqdB6*#3lJ%$`qwi7L8k#S@UT*Zd!^>Gl`(fnv;iFkMG}CcVPlhHVY0x z3>km4`7YG{)f;cGA#RAM;kPHO2@8lc^x$QC(x%t1Y*w+waY$mweJruvu8)rZW@4Bh z!s7z>yb(`SjAWrcN8uQX?2^B?HT1(FaW7{aN<>Hm?OEfFjc_#>lboExf!3_?l#|E0 zPts+7ijk37+`f-vcS!ULCa2DcMS&J(!@hvm);7Z}Y-!8b9(*u{;*#kJo0Ecm}0 zP$6NuT~6d7g=UOkO>>FJgK=X1IsG@T@zdww{{Ap9;JyB8}dTZxT^YlU(pbQ>qHqu#l>YE!PD=qCeEV&vExn~(YiG}91(gDVo=3{okmc$SQx}J|s_JW)|g>5}s zg33F`A7qs;wg`X)mxmQAb(l1VuFF8(3YW+Fm%lYq7i0ggNVXS~#x}dxP@iM;bCbfZ z?Fg${Zq&kx%{WuPzoy3Lcc_ZG0eHoEPowsAqkkQAXIJLIZ`s=}RTPSwc#;R?n>UAZ zg6WJ_2&ta45q*E_6WG3N%Pwkx6uUx5E!==ToCo(_kzl!sA){-zOI8Cf!@rZDOykOp zb(^e7OHgg{c6!B?mmfTW{1dB;`udNs3=a> zSz2dohs0s&D~G&SN;4ftu899JVr4u~RnD4(rUexzXU&piBwl`W;_~QHHlv7Uc>N1C zMkap04zQf^*6Fh95q#l7BO1ZapU{}kp-sU9N@{As6Q)4)-y+GYExcY)jgS(@Y8t_o z%U$$n*#_O58kFeKFOhvfh-}Pw0VU ziw+*{%$^i4f%Bi%@4ovH2v!=Oh*+QGA#h@D>yH#cH9B96kb4y8#q_kMZOeaxNbC#u z*GGvdmB)G+Slm@-U#;yra{VDGix%%c@M24T(tnhmJt}H`fD0n|g!r77^yNVEC|7OM z^yMv+NBs!f%Z13~-K#|rG8Atcin0Hg6o~}nv}h3)t9&t96D`La-G9uoP&M+V+ttn2Yu~zzK?=kk-?*YA=|5bRskEAc175OH3X;X*2LAsC5Xus~ literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Icons-View/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Icons-View/view.json new file mode 100644 index 0000000..98e8b42 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Icons-View/view.json @@ -0,0 +1,384 @@ +{ + "custom": {}, + "params": { + "Dataset": [ + { + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + { + "path": "Symbol-Views/Device-Views/DeviceStatus_old" + }, + { + "path": "Symbol-Views/Device-Views/Estop" + }, + { + "path": "Symbol-Views/Equipment-Views/ARSAW" + }, + { + "path": "Symbol-Views/Equipment-Views/AUS" + }, + { + "path": "Symbol-Views/Equipment-Views/Camera" + }, + { + "path": "Symbol-Views/Equipment-Views/ControlCabinet" + }, + { + "path": "Symbol-Views/Equipment-Views/Estop" + }, + { + "path": "Symbol-Views/Equipment-Views/GoodsLift" + }, + { + "path": "Symbol-Views/Equipment-Views/JAM" + }, + { + "path": "Symbol-Views/Equipment-Views/Light_Curtain" + }, + { + "path": "Symbol-Views/Equipment-Views/Main_Panel" + }, + { + "path": "Symbol-Views/Equipment-Views/Network" + }, + { + "path": "Symbol-Views/Equipment-Views/Pointer" + }, + { + "path": "Symbol-Views/Equipment-Views/PressureSwitch" + }, + { + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + { + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + { + "path": "Symbol-Views/Equipment-Views/PullChord_Line" + }, + { + "path": "Symbol-Views/Equipment-Views/PullChord_Line_Vertical" + }, + { + "path": "Symbol-Views/Equipment-Views/RFID" + }, + { + "path": "Symbol-Views/Equipment-Views/Robot" + }, + { + "path": "Symbol-Views/Equipment-Views/SLAMs" + }, + { + "path": "Symbol-Views/Equipment-Views/SafetyGate" + }, + { + "path": "Symbol-Views/Equipment-Views/Stacker_Destacker" + }, + { + "path": "Symbol-Views/Equipment-Views/Status" + }, + { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered_NS" + }, + { + "path": "Symbol-Views/Equipment-Views/Status_NS" + }, + { + "path": "Symbol-Views/Equipment-Views/THEA" + }, + { + "path": "Symbol-Views/Equipment-Views/Test" + } + ], + "FilteredViews": [ + { + "Name": "ARSAW", + "Path": "Symbol-Views/Equipment-Views/ARSAW", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "AUS", + "Path": "Symbol-Views/Equipment-Views/AUS", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "Camera", + "Path": "Symbol-Views/Equipment-Views/Camera", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "ControlCabinet", + "Path": "Symbol-Views/Equipment-Views/ControlCabinet", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "Estop", + "Path": "Symbol-Views/Equipment-Views/Estop", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "GoodsLift", + "Path": "Symbol-Views/Equipment-Views/GoodsLift", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "JAM", + "Path": "Symbol-Views/Equipment-Views/JAM", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "Light_Curtain", + "Path": "Symbol-Views/Equipment-Views/Light_Curtain", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "Main_Panel", + "Path": "Symbol-Views/Equipment-Views/Main_Panel", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "Network", + "Path": "Symbol-Views/Equipment-Views/Network", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "Pointer", + "Path": "Symbol-Views/Equipment-Views/Pointer", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "PressureSwitch", + "Path": "Symbol-Views/Equipment-Views/PressureSwitch", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "PullChord", + "Path": "Symbol-Views/Equipment-Views/PullChord", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "PullChord_End", + "Path": "Symbol-Views/Equipment-Views/PullChord_End", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "PullChord_Line", + "Path": "Symbol-Views/Equipment-Views/PullChord_Line", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "PullChord_Line_Vertical", + "Path": "Symbol-Views/Equipment-Views/PullChord_Line_Vertical", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "RFID", + "Path": "Symbol-Views/Equipment-Views/RFID", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "Robot", + "Path": "Symbol-Views/Equipment-Views/Robot", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "SLAMs", + "Path": "Symbol-Views/Equipment-Views/SLAMs", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "SafetyGate", + "Path": "Symbol-Views/Equipment-Views/SafetyGate", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "Stacker_Destacker", + "Path": "Symbol-Views/Equipment-Views/Stacker_Destacker", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "Status", + "Path": "Symbol-Views/Equipment-Views/Status", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "StatusNonPowered", + "Path": "Symbol-Views/Equipment-Views/StatusNonPowered", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "StatusNonPowered_NS", + "Path": "Symbol-Views/Equipment-Views/StatusNonPowered_NS", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "Status_NS", + "Path": "Symbol-Views/Equipment-Views/Status_NS", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Name": "THEA", + "Path": "Symbol-Views/Equipment-Views/THEA", + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + } + ], + "SelectedValue": "", + "key": "" + }, + "propConfig": { + "params.Dataset": { + "paramDirection": "input", + "persistent": true + }, + "params.FilteredViews": { + "paramDirection": "input", + "persistent": true + }, + "params.SelectedValue": { + "paramDirection": "inout", + "persistent": true + }, + "params.key": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 650, + "width": 1165 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "ViewRepeater" + }, + "position": { + "basis": "1px", + "grow": 1 + }, + "propConfig": { + "props.instances": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.FilteredViews" + }, + "type": "property" + } + } + }, + "props": { + "alignContent": "flex-start", + "alignItems": "flex-start", + "elementPosition": { + "basis": "auto" + }, + "elementStyle": { + "classes": "Framework/Cards/Title" + }, + "justify": "center", + "path": "Symbol-Views/Symbol-Library-Views/Symbol", + "style": { + "gap": "20px", + "overflow": "hidden" + }, + "wrap": "wrap" + }, + "type": "ia.display.flex-repeater" + } + ], + "meta": { + "name": "root" + }, + "props": { + "alignItems": "center", + "justify": "space-evenly", + "wrap": "wrap" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Information-View/resource.json b/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Information-View/resource.json new file mode 100644 index 0000000..e16474e --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Information-View/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "dmamani", + "timestamp": "2024-01-22T16:06:37Z" + }, + "lastModificationSignature": "350db1b8a0e056a423e65bce5ad2234b1c91d167ffe7331f75d27ac283093ec5" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Information-View/thumbnail.png b/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/Symbol-Information-View/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..575140c31718ed70167e44724f1268fd75d66cfb GIT binary patch literal 1183 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%0D!3eCTQdRDY=w{5f=TY4rMHcwPJ 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 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/SymbolLibraryMain/view.json b/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/SymbolLibraryMain/view.json new file mode 100644 index 0000000..3f0cd71 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Symbol-Views/Symbol-Library-Views/SymbolLibraryMain/view.json @@ -0,0 +1,1142 @@ +{ + "custom": { + "key": { + "alt_pageid": "library", + "pageid": "library", + "start_time": { + "$": [ + "ts", + 192, + 1702653666845 + ], + "$ts": 1702653102761 + } + } + }, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\t#############################################################################################\n\t# Purpose:\tThis script searches the current views in the parent project. Script compares \t#\n\t#\t\t\tthe information from S3 to make sure the correct paths and information is\t\t#\n\t#\t\t\tdisplayed to the child objects. Where the path is the key for the JSON\t\t\t#\n\t# Login: \t\t\tDate:\t\t\t\t#Comment:\t\t\t\t\t\t\t\tVersion:\t# \n\t# dmamani\t\t\t1/4/23\t\t\t\tRelease to Production\t\t\t\t\tV1\t\t\t#\n\t# \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t#\n\t#############################################################################################\n\t\t\n\t# - Params to Force Filters to show all symbols on the custom properties\n\tself.session.custom.alarm_filter.show_running \u003d True\n\tself.session.custom.alarm_filter.show_safety \u003d True\n\tself.session.custom.alarm_filter.show_diagnostic \u003d True\n\tself.session.custom.alarm_filter.show_gateways \u003d True\n\tself.session.custom.alarm_filter.show_low_alarm \u003d True\n\tfrom SymbolLibrary import list_categories, fetch_library, update_symbol_library\n\t# - Default Symbol JSON structure definitions\n\tdefault_symbol_info \u003d {\"description\": \"\",\t\"name\": \"\",\t\"category\": \"\",\"info\": \"\"} \n\t# - Get all Symbol Views and write them to tags\n\tproject_info \u003d system.perspective.getProjectInfo()\n\tviews \u003d project_info.get(\u0027views\u0027,[])\n\t# - Define criterias\n\tfilter_criterion \u003d \"Symbol-Views\"\n\tfilter_criterion2 \u003d \"Symbol-Library-Views\"\n\tfilter_criterion3 \u003d \"Controller-Views\"\n\tfilter_criterion4 \u003d \"Symbol-Views/Equipment-Views/Test\"\n\t# - Filter views that are not necessary for the symbol library and ensure the correct path\n\tfiltered_views \u003d [\n\t\tview for view in views \n\t\tif filter_criterion in view.get(\u0027path\u0027,\u0027\u0027) \n\t\tand not filter_criterion2 in view.get(\u0027path\u0027,\u0027\u0027) \n\t\tand not filter_criterion3 in view.get(\u0027path\u0027,\u0027\u0027)\n\t\tand not filter_criterion4 in view.get(\u0027path\u0027,\u0027\u0027)\n\t\t]\n\t# - Create JSON from the list \n\tjson_structure \u003d []\n\tsymbol_view_list \u003d []\n\tfor view in filtered_views:\n\t\tinstance \u003d {\n\t\t\t\"instanceStyle\": {\n\t\t\t\t\"classes\": \"\"\n\t\t\t},\n\t\t\t\"instancePosition\": {},\n\t\t\t\"Path\": view.get(\u0027path\u0027,\u0027\u0027),\n\t\t\t\"forceRunning\": 3,\n\t\t\t\"forceFault\": None\n\t\t}\n\t\tjson_structure.append(instance)\n\t\tsymbol_view_list.append(view.get(\u0027path\u0027,\u0027\u0027))\n\tjson_structure.sort(key \u003d lambda x:x[\u0027Path\u0027].split(\"/\")[len(x[\u0027Path\u0027].split(\"/\"))-1])\n\t# - Encode JSON for igniton variables to populate correctly\n\tjson_result \u003d system.util.jsonEncode(json_structure)\n\tself.params.Dataset \u003d filtered_views\n\tself.params.FilteredViews \u003d json_structure\n\tsystem.perspective.print(filtered_views)\n\t\n\t# - Get all Symbol Categories from JSON Dictionary\t\n\tremote_json \u003d fetch_library(username\u003dself.session.props.auth.user.userName)\n\tfor path in json_structure:\n\t\tif path[\"Path\"] not in remote_json:\n\t\t\tupdate_symbol_library(path[\"Path\"], username\u003dself.session.props.auth.user.userName, **default_symbol_info)\n\t\t\tremote_json[path[\"Path\"]] \u003d default_symbol_info\n\t# - Remove by key in case symbol does not exist in Folder Structure\n\tself.params.SymbolLibrary \u003d {k: v for k, v in remote_json.items() if k in symbol_view_list}\n\tcategory_data \u003d [{\"Category\": category} for category in list_categories(self.params.SymbolLibrary)]\n\tself.params.CategoryList \u003d category_data\n" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": { + "CategoryList": [ + { + "Category": "ALL" + }, + { + "Category": "Control" + }, + { + "Category": "Device Status" + }, + { + "Category": "Equipment Status" + }, + { + "Category": "Field Device" + }, + { + "Category": "Machine" + }, + { + "Category": "Network" + }, + { + "Category": "Not in use" + }, + { + "Category": "Safety" + } + ], + "SelectedCategory": "", + "SelectedDescription": "", + "SelectedInfo": "", + "SelectedPath": "", + "SelectedRow": "ALL", + "SymbolDetails": { + "ARSAW": { + "category": "", + "description": "", + "info": "Test", + "path": "Symbol-Views/Equipment-Views/ARSAW" + }, + "AUS": { + "category": "A", + "description": "AUS DESCRIPTION AUS DESCRIPTIONAUS DESCRIPTIONAUS DESCRIPTIONAUS DESCRIPTIONAUS DESCRIPTIONAUS DESCRIPTIONAUS DESCRIPTIONAUS DESCRIPTIONAUS DESCRIPTIONAUS DESCRIPTIONAUS DESCRIPTIONAUS DESCRIPTIONAUS DESCRIPTIONAUS DESCRIPTIONAUS DESCRIPTIONAUS DESCRIPTIONAUS DESCRIPTION", + "info": "AUS INFO AUS INFO AUS INFO AUS INFO AUS INFO AUS INFO AUS INFO AUS INFO AUS INFO AUS INFO ", + "path": "Symbol-Views/Equipment-Views/AUS" + }, + "Camera": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/Camera" + }, + "ControlCabinet": { + "category": "", + "description": "", + "info": "### Symbol Information\nDate Created: 12/20/21\n\nCreated By: amazonuser\n\nSize: 10X10", + "path": "Symbol-Views/Equipment-Views/ControlCabinet" + }, + "DeviceStatus": { + "category": "B", + "description": "", + "info": "", + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "DeviceStatus_old": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Device-Views/DeviceStatus_old" + }, + "Estop": { + "category": "C", + "description": "E-stop description, E-stop description, E-stop description, E-stop description, E-stop description", + "info": "E-stop info, E-stop info, E-stop info, E-stop info, E-stop info, E-stop info, E-stop info", + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "GoodsLift": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/GoodsLift" + }, + "JAM": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/JAM" + }, + "Light_Curtain": { + "category": "B", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/Light_Curtain" + }, + "Main_Panel": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/Main_Panel" + }, + "Network": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/Network" + }, + "Pointer": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/Pointer" + }, + "PressureSwitch": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/PressureSwitch" + }, + "PullChord": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + "PullChord_End": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + "PullChord_Line": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/PullChord_Line" + }, + "PullChord_Line_Vertical": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/PullChord_Line_Vertical" + }, + "RFID": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/RFID" + }, + "Robot": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/Robot" + }, + "SLAMs": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/SLAMs" + }, + "SafetyGate": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/SafetyGate" + }, + "Stacker_Destacker": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/Stacker_Destacker" + }, + "Status": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/Status" + }, + "StatusNonPowered": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "StatusNonPowered_NS": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/StatusNonPowered_NS" + }, + "Status_NS": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/Status_NS" + }, + "THEA": { + "category": "", + "description": "", + "info": "", + "path": "Symbol-Views/Equipment-Views/THEA" + } + }, + "SymbolLibrary": { + "Symbol-Views/Device-Views/DeviceStatus": { + "category": "Device Status", + "description": "The Area status symbol, displaying different colors for running state\n\n", + "info": "### Device Status\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- width: 0.0146, height: 0.0565\n\n### Symbol Category\nDevice Status ", + "name": "DeviceStatus" + }, + "Symbol-Views/Device-Views/DeviceStatus_old": { + "category": "Not in use", + "description": "Deprecated", + "info": "### Symbol Information \n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- width: 0.0146, height: 0.0565\n\n### Symbol Category\nNot In use", + "name": "DeviceStatus_old" + }, + "Symbol-Views/Device-Views/Estop": { + "category": "Safety", + "description": "Standard symbol for an e-stop device in the field or on the control cabinet Initiated by a human action and is intended to shut down equipment in the case of an emergency. The emergency stop device is a manual control device. It is the method of initiating the emergency stop function.", + "info": "### Symbol Information \n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- Width: 0.0104, Height: 0.0185\n\n### Symbol Category\nSafety", + "name": "Estop" + }, + "Symbol-Views/Equipment-Views/ARSAW": { + "category": "Machine", + "description": "Amazon Robotics Semi Automated Workstation or ARSAW is a machine used in Amazon Robotics (AR) sortable buildings for the primary purpose of picking inventory items from the AR fields. An associate would pick items assigned to them on a VDU screen which would be scanned and transferred to pre-scanned totes stacked in a row along a flow rack. There are 5 totes per flow rack, once each tote is filled, it can be pushed through to the take away conveyor to be lifted by a four position carriage system. The tote would be then transferred across to a trunk conveyor for subsequent order consolidation.", + "info": "### ARSAW\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- Width: 0.026, height :0.0463\n\n### Symbol Category\nMachine ", + "name": "ARSAW" + }, + "Symbol-Views/Equipment-Views/AUS": { + "category": "Machine", + "description": "Amazon Universal Sorter (AUS); a modular high-density matrix sorter which includes integrated container management. The AUS is wholly owned by Amazon and developed using commodity components which are already being maintained by RME", + "info": "### AUS\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- Width: 0.026, height :0.0463\n\n### Symbol Category\nMachine ", + "name": "AUS" + }, + "Symbol-Views/Equipment-Views/Camera": { + "category": "Field Device", + "description": "Generic Camera Symbol for any Cameras used in the process flow of product", + "info": "### Camera\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- Width: 0.026, height :0.0463\n\n### Symbol Category\nField Device", + "name": "Camera" + }, + "Symbol-Views/Equipment-Views/CognexCamera": { + "category": "Device Status", + "description": "OR ELSE", + "info": "DELETE THIS ", + "name": "" + }, + "Symbol-Views/Equipment-Views/ControlCabinet": { + "category": "Control", + "description": "Generic Control Cabinet for any panel used in the design ", + "info": "### Control Cabinet\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- Remote control cabinets must use the following dimensions for smaller gateways width: 0.0104, height: 0.0185.\n- For larger remote panels width:0.013, height: 0.0185.\n\n### Symbol Category\nControl", + "name": "ControlCabinet" + }, + "Symbol-Views/Equipment-Views/Estop": { + "category": "Safety", + "description": "Standard symbol for an e-stop device in the field or on the control cabinet Initiated by a human action and is intended to shut down equipment in the case of an emergency. The emergency stop device is a manual control device. It is the method of initiating the emergency stop function..", + "info": "### E-STOP\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- Width: 0.0104, Height: 0.0185\n\n### Symbol Category\nSafety", + "name": "Estop" + }, + "Symbol-Views/Equipment-Views/GoodsLift": { + "category": "Machine", + "description": "Goods lifts or \"vertical reciprocating conveyors\" (VRCs) are systems which functionality is to move inventory or non-inventory between floor levels. In TNS buildings, they are a key player in the building throughput, as they are intended and used to move inventory to fill or empty the TNS pick tower. \n\nIn ARS buildings, they are used to move non-inventory (spares), non-conveyable items or even inventory as a contingency to conveyor capacity in the event of equipment failure. ", + "info": "### Goodslift\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- Width: 0.026, height :0.0463\n\n### Symbol Category\nMachine ", + "name": "GoodsLift" + }, + "Symbol-Views/Equipment-Views/JAM": { + "category": "Device Status", + "description": "Jam indicator that initiate downtime events. ", + "info": "### Jam\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- width: 0.0146, height: 0.0565\n\n### Symbol Category\nDevice Status", + "name": "JAM" + }, + "Symbol-Views/Equipment-Views/Light_Curtain": { + "category": "Safety", + "description": "A safety device used when light beams are obstructed and the outputs turn off, which signals a stop to the associated hazardous movement(s).", + "info": "### Light Curtain\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- Width: 0.0104, Height: 0.0185\n\n### Symbol Category\nSafety", + "name": "Light_Curtain" + }, + "Symbol-Views/Equipment-Views/Main_Panel": { + "category": "Control", + "description": "Generic Control Cabinet for any panel used in the design ", + "info": "### Panel\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- width:0.013, height: 0.0185.\n\n### Symbol Category\nControl", + "name": "Main_Panel" + }, + "Symbol-Views/Equipment-Views/Network": { + "category": "Network", + "description": "Symbol used to display a Network Panel used in industrial control environments or as a remote network panel for other devices that need to be in the same network. ", + "info": "### Camera\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- Width: 0.026, height :0.0463\n\n### Symbol Category\nField Device", + "name": "Network" + }, + "Symbol-Views/Equipment-Views/Pointer": { + "category": "Device Status", + "description": "The Pointer status symbol, displaying different colors for running state.\n\n", + "info": "### Pointer\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- width: 0.0146, height: 0.0565\n\n### Symbol Category\nDevice Status ", + "name": "Pointer" + }, + "Symbol-Views/Equipment-Views/PressureSwitch": { + "category": "Field Device", + "description": "Symbol for Pressure switches in the field, controlling the activation and deactivation of pumps in fluid systems when pressure thresholds are reached. They are also used in process control systems for maintaining steady pneumatic or mechanical pressure.", + "info": "### Pressure Switch\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- width:0.013, height: 0.0185.\n\n### Symbol Category\nField Device", + "name": "PressureSwitch" + }, + "Symbol-Views/Equipment-Views/PullChord": { + "category": "Safety", + "description": "Cable-pull safety rope switches allow operators to initiate an E-stop from any point along the installed cable length, providing protection for exposed conveyors or machines, or wherever equipment cannot be protected by guards.", + "info": "### Pullchord\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- Width: 0.026, height :0.0463\n\n### Symbol Category\nSafety", + "name": "PullChord" + }, + "Symbol-Views/Equipment-Views/PullChord_End": { + "category": "Safety", + "description": "Cable-pull safety rope switches allow operators to initiate an E-stop from any point along the installed cable length, providing protection for exposed conveyors or machines, or wherever equipment cannot be protected by guards.", + "info": "### Pull Chord - END\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- Width: 0.026, height :0.0463\n\n### Symbol Category\nMachine ", + "name": "PullChord_End" + }, + "Symbol-Views/Equipment-Views/PullChord_Line": { + "category": "Safety", + "description": "Cable-pull safety rope switches allow operators to initiate an E-stop from any point along the installed cable length, providing protection for exposed conveyors or machines, or wherever equipment cannot be protected by guards.", + "info": "### Pullchord Line\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- Width: 0.026, height :0.0463\n\n### Symbol Category\nSafety", + "name": "PullChord_Line" + }, + "Symbol-Views/Equipment-Views/PullChord_Line_Vertical": { + "category": "Safety", + "description": "Cable-pull safety rope switches allow operators to initiate an E-stop from any point along the installed cable length, providing protection for exposed conveyors or machines, or wherever equipment cannot be protected by guards.", + "info": "\n### Pullchord\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- Width: 0.026, height :0.0463\n\n### Symbol Category\nSafety", + "name": "PullChord_Line_Vertical" + }, + "Symbol-Views/Equipment-Views/RFID": { + "category": "Field Device", + "description": "Symbols for RFID devices. There is a device that reads information contained in a wireless device or “tag” from a distance without making any physical contact or requiring a line of sight.", + "info": "###RFID \n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- width: 0.0146, height: 0.0565\n\n### Symbol Category\nField Device", + "name": "RFID" + }, + "Symbol-Views/Equipment-Views/Robot": { + "category": "Machine", + "description": "Symbol for Robots used in FC\u0027s. One example would be the RWC4. Robotic Work Cell 4 (RWC4) is the Robotic Tote Palletizer seen in IXDs and FCs which is a robotic arm that eliminates the manual tote stacking process at the end of Transship lanes by physically and virtually palletizing totes by destination. In addition to the process efficiency gains, a RWC4 improves Amazonian safety by minimizing the bending/twisting motion associated with manual palletizing. ", + "info": "###Robot\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- Width: 0.026, height :0.0463\n\n### Symbol Category\nMachine ", + "name": "Robot" + }, + "Symbol-Views/Equipment-Views/SLAMs": { + "category": "Machine", + "description": "Symbol used for SLAMs in FC\u0027s. SLAM (Scan/Label/Apply/Manifest) line is to collect package data including weight, dimensions, and barcode data, transmit this data to the Warehouse Management System (WMS) which performs various pre-ship validations to ensure the package has the correct items, labeling, and packaging. If all validations pass, a shipping label is printed and applied to the package via a Label Print and Apply unit (LPA), also called the printer assembly. Finally, the SPOO and shipping labels are scanned to confirm that the correct shipping label has been applied to the package. If the package fails any portion of the verification process it will be rejected at the kick-out line. ", + "info": "### SLAM \n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- Width: 0.026, height :0.0463\n\n### Symbol Category\nMachine ", + "name": "SLAMs" + }, + "Symbol-Views/Equipment-Views/SafetyGate": { + "category": "Safety", + "description": "Access gate symbol that provides protection from falling regardless of the position of the doors.", + "info": "### Safety Gate\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- Width: 0.026, height :0.0463\n\n### Symbol Category\nSafety", + "name": "SafetyGate" + }, + "Symbol-Views/Equipment-Views/Stacker_Destacker": { + "category": "", + "description": "", + "info": "### Tote Stacker \u0026 Destacker\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- Width: 0.026, height :0.0463\n\n### Symbol Category\nMachine ", + "name": "Stacker_Destacker" + }, + "Symbol-Views/Equipment-Views/Status": { + "category": "Equipment Status", + "description": "", + "info": "### Status\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- width: 0.0146, height: 0.0565\n\n### Symbol Category\nEquipment Status ", + "name": "Status" + }, + "Symbol-Views/Equipment-Views/StatusNonPowered": { + "category": "Equipment Status", + "description": "Test ", + "info": "### Status Non Powered\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- width: 0.0146, height: 0.0565\n\n### Symbol Category\nEquipment Status ", + "name": "StatusNonPowered" + }, + "Symbol-Views/Equipment-Views/StatusNonPowered_NS": { + "category": "Equipment Status", + "description": "", + "info": "### Status Non Powered North and South\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- width: 0.0146, height: 0.0565\n\n### Symbol Category\nEquipment Status ", + "name": "StatusNonPowered_NS" + }, + "Symbol-Views/Equipment-Views/Status_NS": { + "category": "Equipment Status", + "description": "", + "info": "### Status North and South \n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- width: 0.0146, height: 0.0565\n\n### Symbol Category\nEquipment Status ", + "name": "Status_NS" + }, + "Symbol-Views/Equipment-Views/THEA": { + "category": "Machine", + "description": "THEA ", + "info": "### THEA\n\nDate Created: \n- 12/20/21\n\nCreated By: \n- MAP Team\n\nDimensions: \n- Width: 0.026, height :0.0463\n\n### Symbol Category\nMachine ", + "name": "THEA" + } + } + }, + "propConfig": { + "custom.key": { + "persistent": true + }, + "params.CategoryList": { + "binding": { + "config": { + "bidirectional": true, + "path": "/root/Dashboard.props.widgets[0].viewParams.Categories" + }, + "type": "property" + }, + "paramDirection": "inout", + "persistent": true + }, + "params.Dataset": { + "binding": { + "config": { + "path": "/root/Dashboard.props.widgets[3].viewParams.Dataset" + }, + "type": "property" + } + }, + "params.FilteredViews": { + "binding": { + "config": { + "bidirectional": true, + "path": "/root/Dashboard.props.widgets[3].viewParams.FilteredViews" + }, + "type": "property" + } + }, + "params.SelectedCategory": { + "paramDirection": "input", + "persistent": true + }, + "params.SelectedDescription": { + "binding": { + "config": { + "bidirectional": true, + "path": "/root/Dashboard.props.widgets[1].viewParams.Description" + }, + "type": "property" + }, + "paramDirection": "inout", + "persistent": true + }, + "params.SelectedInfo": { + "binding": { + "config": { + "bidirectional": true, + "path": "/root/Dashboard.props.widgets[2].viewParams.Information" + }, + "type": "property" + }, + "paramDirection": "inout", + "persistent": true + }, + "params.SelectedPath": { + "paramDirection": "input", + "persistent": true + }, + "params.SelectedRow": { + "onChange": { + "enabled": null, + "script": "\tfrom SymbolLibrary import search_items\n\tsystem.perspective.print(currentValue.value)\n\titems \u003d [{\t\"instanceStyle\": {\n\t\t\t\t\"classes\": \"\"\n\t\t\t\t\t},\n\t\t\t\t\t\"instancePosition\": {},\n\t\t\t\t\t\"forceRunning\": 3,\n\t\t\t\t\t\"forceFault\": None,\n\t\t\t\t\"Path\": item} for item in search_items(self.params.SymbolLibrary,currentValue.value)]\n\tsystem.perspective.print(items)\n\tself.params.FilteredViews \u003d items\n\t\n\t" + }, + "paramDirection": "inout", + "persistent": true + }, + "params.SymbolDetails": { + "binding": { + "config": { + "path": "" + }, + "enabled": false, + "transforms": [ + { + "code": "\tfrom SymbolLibrary import library_items\n\treturn library_items", + "type": "script" + } + ], + "type": "property" + }, + "paramDirection": "inout", + "persistent": true + }, + "params.SymbolLibrary": { + "binding": { + "config": { + "path": "/root/Dashboard.props.widgets[3].viewParams.SymbolLibrary" + }, + "type": "property" + }, + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 786, + "width": 1196 + } + }, + "root": { + "children": [ + { + "events": { + "dom": { + "onDoubleClick": { + "config": { + "draggable": true, + "id": "editItem", + "modal": false, + "overlayDismiss": false, + "resizable": true, + "showCloseIcon": true, + "type": "open", + "viewParams": { + "btnTextPrimary": "Submit Changes", + "btnTextSecondary": "", + "editField1": "{view.params.SelectedCategory}", + "editField2": "{view.params.SelectedInfo}", + "editField3": "{view.params.SelectedDescription}", + "field1Description": "Category", + "field2Description": "Information", + "field3Description": "Description", + "message": " ", + "path": "{view.params.SelectedPath}", + "showCloseBtn": "False", + "title": "Update Symbol Details" + }, + "viewPath": "PopUp-Views/EditItem", + "viewportBound": false + }, + "scope": "C", + "type": "popup" + } + } + }, + "meta": { + "name": "Dashboard" + }, + "position": { + "basis": "400px", + "grow": 1 + }, + "propConfig": { + "props.widgets[0].viewParams.Dataset": { + "binding": { + "config": { + "path": "view.params.Dataset" + }, + "type": "property" + } + } + }, + "props": { + "editingToggle": false, + "stretch": { + "rowCount": 5 + }, + "widgets": [ + { + "body": { + "style": { + "classes": "" + } + }, + "header": { + "enabled": true, + "style": { + "classes": "" + }, + "title": "Category" + }, + "isConfigurable": false, + "minSize": { + "columnSpan": 1, + "rowSpan": 1 + }, + "name": "Category", + "position": { + "columnEnd": 3, + "columnStart": 1, + "rowEnd": 3, + "rowStart": 1 + }, + "style": { + "classes": "" + }, + "viewParams": { + "Categories": [ + { + "Category": "ALL" + }, + { + "Category": "Control" + }, + { + "Category": "Device Status" + }, + { + "Category": "Equipment Status" + }, + { + "Category": "Field Device" + }, + { + "Category": "Machine" + }, + { + "Category": "Network" + }, + { + "Category": "Not in use" + }, + { + "Category": "Safety" + } + ], + "SelectedRow": "" + }, + "viewPath": "Symbol-Views/Symbol-Library-Views/Symbol-Filter-View" + }, + { + "body": { + "style": { + "classes": "" + } + }, + "header": { + "enabled": true, + "style": { + "classes": "" + }, + "title": "Symbol Description" + }, + "isConfigurable": false, + "minSize": { + "columnSpan": 1, + "rowSpan": 1 + }, + "name": "Description", + "position": { + "columnEnd": 9, + "columnStart": 3, + "rowEnd": 6, + "rowStart": 4 + }, + "style": { + "classes": "" + }, + "viewParams": { + "Description": "" + }, + "viewPath": "Symbol-Views/Symbol-Library-Views/Selected-Symbol-Description" + }, + { + "body": { + "style": { + "classes": "" + } + }, + "header": { + "enabled": true, + "style": { + "classes": "" + }, + "title": "Symbol Information" + }, + "isConfigurable": false, + "minSize": { + "columnSpan": 1, + "rowSpan": 1 + }, + "name": "Information", + "position": { + "columnEnd": 3, + "columnStart": 1, + "rowEnd": 6, + "rowStart": 3 + }, + "style": { + "classes": "" + }, + "viewParams": { + "Information": "" + }, + "viewPath": "Symbol-Views/Symbol-Library-Views/Symbol-Information-View" + }, + { + "body": { + "style": { + "classes": "" + } + }, + "header": { + "enabled": true, + "style": { + "classes": "" + }, + "title": "Symbol Library - All Available Symbols" + }, + "isConfigurable": false, + "minSize": { + "columnSpan": 1, + "rowSpan": 1 + }, + "name": "Description", + "position": { + "columnEnd": 9, + "columnStart": 3, + "rowEnd": 4, + "rowStart": 1 + }, + "style": { + "classes": "" + }, + "viewParams": { + "Dataset": [ + { + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + { + "path": "Symbol-Views/Device-Views/DeviceStatus_old" + }, + { + "path": "Symbol-Views/Device-Views/Estop" + }, + { + "path": "Symbol-Views/Equipment-Views/ARSAW" + }, + { + "path": "Symbol-Views/Equipment-Views/AUS" + }, + { + "path": "Symbol-Views/Equipment-Views/Camera" + }, + { + "path": "Symbol-Views/Equipment-Views/ControlCabinet" + }, + { + "path": "Symbol-Views/Equipment-Views/Estop" + }, + { + "path": "Symbol-Views/Equipment-Views/GoodsLift" + }, + { + "path": "Symbol-Views/Equipment-Views/JAM" + }, + { + "path": "Symbol-Views/Equipment-Views/Light_Curtain" + }, + { + "path": "Symbol-Views/Equipment-Views/Main_Panel" + }, + { + "path": "Symbol-Views/Equipment-Views/Network" + }, + { + "path": "Symbol-Views/Equipment-Views/Pointer" + }, + { + "path": "Symbol-Views/Equipment-Views/PressureSwitch" + }, + { + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + { + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + { + "path": "Symbol-Views/Equipment-Views/PullChord_Line" + }, + { + "path": "Symbol-Views/Equipment-Views/PullChord_Line_Vertical" + }, + { + "path": "Symbol-Views/Equipment-Views/RFID" + }, + { + "path": "Symbol-Views/Equipment-Views/Robot" + }, + { + "path": "Symbol-Views/Equipment-Views/SLAMs" + }, + { + "path": "Symbol-Views/Equipment-Views/SafetyGate" + }, + { + "path": "Symbol-Views/Equipment-Views/Stacker_Destacker" + }, + { + "path": "Symbol-Views/Equipment-Views/Status" + }, + { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered_NS" + }, + { + "path": "Symbol-Views/Equipment-Views/Status_NS" + }, + { + "path": "Symbol-Views/Equipment-Views/THEA" + }, + { + "path": "Symbol-Views/Equipment-Views/Test" + } + ], + "FilteredViews": [ + { + "Path": "Symbol-Views/Equipment-Views/ARSAW", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/AUS", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Camera", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/CognexCamera", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/ControlCabinet", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Device-Views/DeviceStatus", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Device-Views/DeviceStatus_old", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Device-Views/Estop", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Estop", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/GoodsLift", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/JAM", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Light_Curtain", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Main_Panel", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Network", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Pointer", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/PressureSwitch", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/PullChord", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/PullChord_End", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/PullChord_Line", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/PullChord_Line_Vertical", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/RFID", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Robot", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/SLAMs", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/SafetyGate", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Stacker_Destacker", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Status", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/StatusNonPowered", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/StatusNonPowered_NS", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/Status_NS", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + }, + { + "Path": "Symbol-Views/Equipment-Views/THEA", + "forceFault": null, + "forceRunning": 3, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + } + } + ], + "SelectedValue": "", + "SymbolLibrary": "", + "key": "" + }, + "viewPath": "Symbol-Views/Symbol-Library-Views/Symbol-Icons-View" + } + ] + }, + "type": "ia.display.dashboard" + } + ], + "meta": { + "name": "root" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "UserClickInfo", + "pageScope": true, + "script": "\tfrom pprint import pformat\n\tSymbolPath \u003d payload[\"UserClickPath\"]\n\tsystem.perspective.print(pformat(self.view.params.SymbolLibrary[SymbolPath]))\n\tself.view.params.SelectedInfo \u003d self.view.params.SymbolLibrary[SymbolPath][\u0027info\u0027]\n\tself.view.params.SelectedDescription \u003d self.view.params.SymbolLibrary[SymbolPath][\u0027description\u0027]\n\tself.view.params.SelectedPath \u003d SymbolPath \n\tself.view.params.SelectedCategory \u003d self.view.params.SymbolLibrary[SymbolPath][\u0027category\u0027]\n\tsystem.perspective.print(SymbolPath)\n", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "UserClickCategory", + "pageScope": true, + "script": "\n\tSelectedRow \u003d payload[\"UserClickData\"]\n\tself.view.params.SelectedRow \u003d SelectedRow", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "UserClickRefresh", + "pageScope": true, + "script": "\tfrom SymbolLibrary import list_categories, fetch_library\n\t\n\t#Get all Symbol Views and write them to tags\n\tproject_info \u003d system.perspective.getProjectInfo()\n\tviews \u003d project_info.get(\u0027views\u0027,[])\n\t# - Define criterias\n\tfilter_criterion \u003d \"Symbol-Views\"\n\tfilter_criterion2 \u003d \"Symbol-Library-Views\"\n\tfilter_criterion3 \u003d \"Controller-Views\"\n\tfilter_criterion4 \u003d \"Symbol-Views/Equipment-Views/Test\"\n\t# - Filter views that are not necessary for the symbol library and ensure the correct path\n\tfiltered_views \u003d [\n\t\tview for view in views \n\t\tif filter_criterion in view.get(\u0027path\u0027,\u0027\u0027) \n\t\tand not filter_criterion2 in view.get(\u0027path\u0027,\u0027\u0027) \n\t\tand not filter_criterion3 in view.get(\u0027path\u0027,\u0027\u0027)\n\t\tand not filter_criterion4 in view.get(\u0027path\u0027,\u0027\u0027)\n\t\t]\n\t# - Create JSON from the list \n\tjson_structure \u003d []\n\tsymbol_view_list \u003d []\n\tfor view in filtered_views:\n\t\tinstance \u003d {\n\t\t\t\"instanceStyle\": {\n\t\t\t\t\"classes\": \"\"\n\t\t\t},\n\t\t\t\"instancePosition\": {},\n\t\t\t\"Path\": view.get(\u0027path\u0027,\u0027\u0027),\n\t\t\t\"forceRunning\": 3,\n\t\t\t\"forceFault\": None\n\t\t}\n\t\tjson_structure.append(instance)\n\t\tsymbol_view_list.append(view.get(\u0027path\u0027,\u0027\u0027))\n\tjson_structure.sort(key \u003d lambda x:x[\u0027Path\u0027].split(\"/\")[len(x[\u0027Path\u0027].split(\"/\"))-1])\t\n\t# - Encode JSON for igniton variables to populate correctly\n\tjson_result \u003d system.util.jsonEncode(json_structure)\n\tself.view.params.Dataset \u003d filtered_views\n\tself.view.params.FilteredViews \u003d json_structure\n\tsystem.perspective.print(filtered_views)\n\t\n\t# - Get all Symbol Categories from JSON Dictionary\t\n\tremote_json \u003d fetch_library(username\u003dself.session.props.auth.user.userName)\n\tself.view.params.SymbolLibrary \u003d {k: v for k, v in remote_json.items() if k in symbol_view_list}\n\tcategory_data \u003d [{\"Category\": category} for category in list_categories(self.view.params.SymbolLibrary)]\n\tself.view.params.CategoryList \u003d category_data\n\tself.view.params.SelectedRow \u003d \u0027ALL\u0027\n\tself.view.params.SelectedDescription \u003d \"\"\n\tself.view.params.SelectedInfo \u003d \"\"", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Test/resource.json b/com.inductiveautomation.perspective/views/Test/resource.json new file mode 100644 index 0000000..59eff6a --- /dev/null +++ b/com.inductiveautomation.perspective/views/Test/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-08-16T14:01:05Z" + }, + "lastModificationSignature": "54d4caf4abf9d920b8a17c9508c04ebae603cd56c88f63addb3bb25ffdee9f20" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.perspective/views/Test/thumbnail.png b/com.inductiveautomation.perspective/views/Test/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..62a1fbfc2d3ac8ae5cb4a80142af5a76051ec6d8 GIT binary patch literal 46641 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 LP4y~t9B=;*4O7_7 literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.perspective/views/Test/view.json b/com.inductiveautomation.perspective/views/Test/view.json new file mode 100644 index 0000000..dc4ed85 --- /dev/null +++ b/com.inductiveautomation.perspective/views/Test/view.json @@ -0,0 +1,4007 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tlogger \u003d system.util.getLogger(\"Command.send_request\")\n\tlogger.info(\"UI : runAction called\")\n\tsourceId \u003d str(self.getSibling(\"TextField\").props.text)\n\twhid \u003d\"DNG2\"\n\taction \u003d \"shelve\"\n\tparameters\u003d{}\n\tparameters[\"sourceId\"] \u003d sourceId\n\tparameters[\"siteId\"] \u003d whid\n\tlogger.info(\"UI : sending command\")\n\tCommands.button_commands.send_request(action,parameters)\n\tlogger.info(\"UI : command sent\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "height": 0.0315, + "width": 0.0417, + "x": 0.0203, + "y": 0.1009 + }, + "props": { + "image": { + "icon": { + "color": "#AAAAAA" + } + }, + "text": "Shelve" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "TextField" + }, + "position": { + "height": 0.0296, + "width": 0.0781, + "x": 0.0672, + "y": 0.1019 + }, + "props": { + "text": "PLC09/L1_8/ES1" + }, + "type": "ia.input.text-field" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tlogger \u003d system.util.getLogger(\"Command.send_request\")\n\tlogger.info(\"UI : runAction called\")\n\tsourceId \u003d str(self.getSibling(\"TextField\").props.text)\n\twhid \u003d\"DNG2\"\n\taction \u003d \"unshelve\"\n\tparameters\u003d{}\n\tparameters[\"sourceId\"] \u003d sourceId\n\tparameters[\"siteId\"] \u003d whid\n\tlogger.info(\"UI : sending command\")\n\tCommands.button_commands.send_request(action,parameters)\n\tlogger.info(\"UI : command sent\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_0" + }, + "position": { + "height": 0.0315, + "width": 0.0417, + "x": 0.0203, + "y": 0.1417 + }, + "props": { + "image": { + "icon": { + "color": "#AAAAAA" + } + }, + "text": "unShelve" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "TextField_0" + }, + "position": { + "height": 0.0296, + "width": 0.0781, + "x": 0.0672, + "y": 0.1426 + }, + "props": { + "text": "PLC09/L1_8/ES1" + }, + "type": "ia.input.text-field" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tlogger \u003d system.util.getLogger(\"Command.send_request\")\n\tlogger.info(\"UI : runAction called\")\n\tcommandTarget \u003d str(self.getSibling(\"TextField\").props.text)\n\twhid \u003d\"DNG2\"\n\taction \u003d \"command\"\n\tparameters\u003d{}\n\tparameters[\"siteId\"] \u003d whid\n\tparameters[\"commandTarget\"] \u003d commandTarget\n\tparameters[\"commandCode\"] \u003d 1\n\tparameters[\"commandParams\"] \u003d \u0027\u0027\n\tparameters[\"commandToken\"] \u003d \u0027\u0027\n\tparameters[\"commandTimeout\"] \u003d 2000\n\tlogger.info(\"UI : sending command\")\n\tCommands.button_commands.send_request(action,parameters)\n\tlogger.info(\"UI : command sent\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_1" + }, + "position": { + "height": 0.0315, + "width": 0.0417, + "x": 0.0203, + "y": 0.1824 + }, + "props": { + "image": { + "icon": { + "color": "#AAAAAA" + } + }, + "text": "Start" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "TextField_1" + }, + "position": { + "height": 0.0296, + "width": 0.0781, + "x": 0.0672, + "y": 0.1833 + }, + "props": { + "text": "PLC09/L1_8/ES1" + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "TextField_2" + }, + "position": { + "height": 0.0296, + "width": 0.0781, + "x": 0.0672, + "y": 0.224 + }, + "props": { + "text": "PLC09/L1_8/ES1" + }, + "type": "ia.input.text-field" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tlogger \u003d system.util.getLogger(\"Command.send_request\")\n\tlogger.info(\"UI : runAction called\")\n\tcommandTarget \u003d str(self.getSibling(\"TextField\").props.text)\n\twhid \u003d\"DNG2\"\n\taction \u003d \"command\"\n\tparameters\u003d{}\n\tparameters[\"siteId\"] \u003d whid\n\tparameters[\"commandTarget\"] \u003d commandTarget\n\tparameters[\"commandCode\"] \u003d 2\n\tparameters[\"commandParams\"] \u003d \u0027\u0027\n\tparameters[\"commandToken\"] \u003d \u0027\u0027\n\tparameters[\"commandTimeout\"] \u003d 2000\n\tlogger.info(\"UI : sending command\")\n\tCommands.button_commands.send_request(action,parameters)\n\tlogger.info(\"UI : command sent\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_2" + }, + "position": { + "height": 0.0315, + "width": 0.0417, + "x": 0.0203, + "y": 0.2231 + }, + "props": { + "image": { + "icon": { + "color": "#AAAAAA" + } + }, + "text": "Stop" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tlogger \u003d system.util.getLogger(\"Command.send_request\")\n\tlogger.info(\"UI : runAction called\")\n\tcommandTarget \u003d str(self.getSibling(\"TextField\").props.text)\n\twhid \u003d\"DNG2\"\n\taction \u003d \"command\"\n\tparameters\u003d{}\n\tparameters[\"siteId\"] \u003d whid\n\tparameters[\"commandTarget\"] \u003d commandTarget\n\tparameters[\"commandCode\"] \u003d 3\n\tparameters[\"commandParams\"] \u003d \u0027\u0027\n\tparameters[\"commandToken\"] \u003d \u0027\u0027\n\tparameters[\"commandTimeout\"] \u003d 2000\n\tlogger.info(\"UI : sending command\")\n\tCommands.button_commands.send_request(action,parameters)\n\tlogger.info(\"UI : command sent\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_3" + }, + "position": { + "height": 0.0315, + "width": 0.0417, + "x": 0.0203, + "y": 0.2639 + }, + "props": { + "image": { + "icon": { + "color": "#AAAAAA" + } + }, + "text": "Reset" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "TextField_3" + }, + "position": { + "height": 0.0296, + "width": 0.0781, + "x": 0.0672, + "y": 0.2648 + }, + "props": { + "text": "PLC09/L1_8/ES1" + }, + "type": "ia.input.text-field" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "config": { + "backgroundColor": "AUTO", + "type": "ANY", + "uuid": "1957745e-fa42-4f8f-bfa1-f22d7ca47707" + }, + "context": {} + }, + "scope": "C", + "type": "native/barcode" + } + } + }, + "meta": { + "name": "Barcode" + }, + "position": { + "height": 0.162, + "width": 0.1042, + "x": 0.1979, + "y": 0.4962 + }, + "props": { + "type": "qrcode" + }, + "type": "ia.display.barcode" + }, + { + "meta": { + "name": "BarcodeScannerInput" + }, + "position": { + "height": 0.0741, + "width": 0.0729, + "x": 0.162, + "y": 0.0295 + }, + "type": "ia.input.barcodescannerinput" + }, + { + "meta": { + "name": "Priority4" + }, + "position": { + "height": 0.05, + "width": 0.0302, + "x": 0.0922, + "y": 0.3657 + }, + "props": { + "elements": [ + { + "id": "defs2", + "name": "defs2", + "type": "defs" + }, + { + "elements": [ + { + "elements": [ + { + "elements": [ + { + "fill": { + "paint": "transparent" + }, + "height": "920", + "id": "rect522", + "name": "rect522", + "stroke": { + "paint": "#000000" + }, + "type": "rect", + "width": "600", + "x": "0", + "y": "0" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect524", + "name": "rect524", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "80", + "x": "0", + "y": "65" + }, + { + "id": "g530", + "name": "g530", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect532", + "name": "rect532", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "80", + "x": "0", + "y": "385" + }, + { + "id": "g538", + "name": "g538", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect540", + "name": "rect540", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "80", + "x": "0", + "y": "545" + }, + { + "id": "g546", + "name": "g546", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect548", + "name": "rect548", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "80", + "x": "0", + "y": "305" + }, + { + "id": "g554", + "name": "g554", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect556", + "name": "rect556", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "80", + "x": "0", + "y": "225" + }, + { + "id": "g562", + "name": "g562", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect564", + "name": "rect564", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "80", + "x": "0", + "y": "145" + }, + { + "id": "g570", + "name": "g570", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect572", + "name": "rect572", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "80", + "x": "0", + "y": "465" + }, + { + "id": "g578", + "name": "g578", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect580", + "name": "rect580", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "90", + "x": "0", + "y": "625" + }, + { + "id": "g586", + "name": "g586", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect588", + "name": "rect588", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "80", + "x": "151", + "y": "10" + }, + { + "id": "g594", + "name": "g594", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect596", + "name": "rect596", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "244", + "x": "320", + "y": "10" + }, + { + "id": "g602", + "name": "g602", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 397,60 h 39.99 v 0 L 467,90 436.99,120 v 0 H 397 l 30.04,-30 z", + "fill": { + "paint": "#007dfa" + }, + "id": "path604", + "name": "path604", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 397,140 h 39.99 v 0 l 30.01,30 -30.01,30 v 0 H 397 l 30.04,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path606", + "name": "path606", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 419,230 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#ff0000" + }, + "id": "path608", + "name": "path608", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g614", + "name": "g614", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 425,230 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 425 l 29.96,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path616", + "name": "path616", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 419,310 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#f00077" + }, + "id": "path618", + "name": "path618", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g624", + "name": "g624", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 425,310 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 425 l 29.96,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path626", + "name": "path626", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 419,390 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#ff6000" + }, + "id": "path628", + "name": "path628", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g634", + "name": "g634", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 425,390 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 425 l 29.96,-30 z", + "fill": { + "paint": "#007dfa" + }, + "id": "path636", + "name": "path636", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 419,470 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#ff6000" + }, + "id": "path638", + "name": "path638", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g644", + "name": "g644", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 425,470 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 425 l 29.96,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path646", + "name": "path646", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 419,550 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#fcc400" + }, + "id": "path648", + "name": "path648", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g654", + "name": "g654", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 425,550 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 425 l 29.96,-30 z", + "fill": { + "paint": "#007dfa" + }, + "id": "path656", + "name": "path656", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 419,630 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#fcc400" + }, + "id": "path658", + "name": "path658", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g664", + "name": "g664", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 425,630 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 425 l 29.96,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path666", + "name": "path666", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 156,60 h 39.99 v 0 L 226,90 195.99,120 v 0 H 156 l 30.04,-30 z", + "fill": { + "paint": "#00cc00" + }, + "id": "path668", + "name": "path668", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "elements": [ + { + "d": "m -82.240706,284.83398 30,30 -30,30 -30.000004,-30 z", + "fill": { + "paint": "#ff0000" + }, + "id": "path670", + "name": "path670", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g676", + "name": "g676", + "transform": "translate(-255.67434,65.072266)", + "type": "group" + }, + { + "d": "m -76.240706,284.83398 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 h -19.96 l 29.96,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path678", + "name": "path678", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + } + ], + "id": "g1105", + "name": "g1105", + "transform": "matrix(0.52711014,0,0,0.67777713,-167.34865,118.01125)", + "type": "group" + }, + { + "d": "m 156,140 h 39.99 v 0 l 30.01,30 -30.01,30 v 0 H 156 l 30.04,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path680", + "name": "path680", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 170,300 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#ff8000" + }, + "id": "path682", + "name": "path682", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g688", + "name": "g688", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 176,300 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 176 l 29.96,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path690", + "name": "path690", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 170,380 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#ffff00" + }, + "id": "path692", + "name": "path692", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g698", + "name": "g698", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 176,380 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 176 l 29.96,-30 z", + "fill": { + "paint": "#00cc00" + }, + "id": "path700", + "name": "path700", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 170,460 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#ffff00" + }, + "id": "path702", + "name": "path702", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g708", + "name": "g708", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 176,460 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 176 l 29.96,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path710", + "name": "path710", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 170,540 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#7ea6e0" + }, + "id": "path712", + "name": "path712", + "stroke": { + "paint": "transparent" + }, + "type": "path" + }, + { + "id": "g718", + "name": "g718", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 176,540 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 176 l 29.96,-30 z", + "fill": { + "paint": "#00cc00" + }, + "id": "path720", + "name": "path720", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 170,620 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#7ea6e0" + }, + "id": "path722", + "name": "path722", + "stroke": { + "paint": "transparent" + }, + "type": "path" + }, + { + "id": "g728", + "name": "g728", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 176,620 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 176 l 29.96,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path730", + "name": "path730", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 170,620 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#007dfa" + }, + "id": "path732", + "name": "path732", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g738", + "name": "g738", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 170,540 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#007efc" + }, + "id": "path740", + "name": "path740", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g746", + "name": "g746", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect748", + "name": "rect748", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "372", + "x": "48", + "y": "730" + }, + { + "id": "g754", + "name": "g754", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect756", + "name": "rect756", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "372", + "x": "40", + "y": "770" + }, + { + "id": "g762", + "name": "g762", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect764", + "name": "rect764", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "372", + "x": "40", + "y": "800" + }, + { + "id": "g770", + "name": "g770", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect772", + "name": "rect772", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "372", + "x": "40", + "y": "830" + }, + { + "id": "g778", + "name": "g778", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect780", + "name": "rect780", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "372", + "x": "40", + "y": "870" + }, + { + "id": "g786", + "name": "g786", + "transform": "translate(-0.5,-0.5)", + "type": "group" + } + ], + "id": "g788", + "name": "g788", + "type": "group" + } + ], + "id": "g940", + "name": "g940", + "transform": "matrix(0.26458333,0,0,0.26458333,60.284253,-81.332525)", + "type": "group" + } + ], + "id": "layer1", + "name": "layer1", + "transform": "translate(-0.25437278,-0.84333903)", + "type": "group" + } + ], + "viewBox": "0 0 12.191251 11.013321" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "Priority2" + }, + "position": { + "height": 0.0907, + "width": 0.0536, + "x": 0.1979, + "y": 0.3565 + }, + "props": { + "elements": [ + { + "id": "defs2", + "name": "defs2", + "type": "defs" + }, + { + "elements": [ + { + "elements": [ + { + "elements": [ + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect1457", + "name": "rect1457", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "244", + "x": "320", + "y": "10" + }, + { + "elements": [ + { + "d": "m 490.65035,981.01865 h 22.75736 v 0 l 34.25004,24.28225 -34.25004,24.2824 v 0 h -22.75736 l 34.15883,-24.2824 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path1591", + "name": "path1591", + "stroke": { + "miterlimit": "10", + "paint": "#000000", + "width": "0.960651" + }, + "type": "path" + }, + { + "d": "m 488.14248,983.11489 30.11426,22.40621 -30.11426,22.4061 -30.11426,-22.4061 z", + "fill": { + "paint": "#007dfa" + }, + "id": "path1593", + "name": "path1593", + "stroke": { + "miterlimit": "10", + "paint": "#000000", + "width": "0.865861" + }, + "type": "path" + }, + { + "id": "g1599", + "name": "g1599", + "transform": "matrix(1.1457588,0,0,0.97675093,83.234844,335.9194)", + "type": "group" + }, + { + "elements": [ + { + "elements": [ + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect3295", + "name": "rect3295", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "244", + "x": "320", + "y": "10" + }, + { + "id": "g3301", + "name": "g3301", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 397,60 h 39.99 v 0 L 467,90 436.99,120 v 0 H 397 l 30.04,-30 z", + "fill": { + "paint": "#007dfa" + }, + "id": "path3303", + "name": "path3303", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 397,140 h 39.99 v 0 l 30.01,30 -30.01,30 v 0 H 397 l 30.04,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path3305", + "name": "path3305", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 419,230 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#ff0000" + }, + "id": "path3307", + "name": "path3307", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g3313", + "name": "g3313", + "transform": "matrix(1.6699378,0,0,1.9507892,-317.91426,-208.76339)", + "type": "group" + }, + { + "d": "m 425,230 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 425 l 29.96,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path3315", + "name": "path3315", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 419,310 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#f00077" + }, + "id": "path3317", + "name": "path3317", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g3323", + "name": "g3323", + "transform": "translate(-24.489348,34.308074)", + "type": "group" + }, + { + "d": "m 425,310 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 425 l 29.96,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path3325", + "name": "path3325", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 419,390 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#ff6000" + }, + "id": "path3327", + "name": "path3327", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g3333", + "name": "g3333", + "transform": "translate(-0.5,-1.424355)", + "type": "group" + }, + { + "d": "m 425,390 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 425 l 29.96,-30 z", + "fill": { + "paint": "#007dfa" + }, + "id": "path3335", + "name": "path3335", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 419,470 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#ff6000" + }, + "id": "path3337", + "name": "path3337", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g3343", + "name": "g3343", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 425,470 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 425 l 29.96,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path3345", + "name": "path3345", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 419,550 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#fcc400" + }, + "id": "path3347", + "name": "path3347", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g3353", + "name": "g3353", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 425,550 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 425 l 29.96,-30 z", + "fill": { + "paint": "#007dfa" + }, + "id": "path3355", + "name": "path3355", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 419,630 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#fcc400" + }, + "id": "path3357", + "name": "path3357", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g3363", + "name": "g3363", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 425,630 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 425 l 29.96,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path3365", + "name": "path3365", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect3447", + "name": "rect3447", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "372", + "x": "48", + "y": "730" + }, + { + "id": "g3453", + "name": "g3453", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect3455", + "name": "rect3455", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "372", + "x": "40", + "y": "770" + }, + { + "id": "g3461", + "name": "g3461", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect3463", + "name": "rect3463", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "372", + "x": "40", + "y": "800" + }, + { + "id": "g3469", + "name": "g3469", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect3471", + "name": "rect3471", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "372", + "x": "40", + "y": "830" + }, + { + "id": "g3477", + "name": "g3477", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect3479", + "name": "rect3479", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "372", + "x": "40", + "y": "870" + }, + { + "id": "g3485", + "name": "g3485", + "transform": "translate(-0.5,-0.5)", + "type": "group" + } + ], + "id": "g3487", + "name": "g3487", + "type": "group" + } + ], + "id": "g3639", + "name": "g3639", + "transform": "matrix(1.862586,0,0,1.2955924,-101.29241,402.21741)", + "type": "group" + } + ], + "id": "g1808", + "name": "g1808", + "transform": "matrix(0.53688798,0,0,0.77184771,-310.91046,-777.4312)", + "type": "group" + } + ], + "id": "g1649", + "name": "g1649", + "transform": "translate(-24.206493,-38.038774)", + "type": "group" + } + ], + "id": "g1801", + "name": "g1801", + "transform": "matrix(0.26458333,0,0,0.26458333,23.680108,16.682133)", + "type": "group" + } + ], + "id": "layer1", + "name": "layer1", + "type": "group" + } + ], + "viewBox": "0 0 12.7 12.7" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "Priority3" + }, + "position": { + "height": 0.0787, + "width": 0.0604, + "x": 0.0734, + "y": 0.4398 + }, + "props": { + "elements": [ + { + "id": "defs2", + "name": "defs2", + "type": "defs" + }, + { + "elements": [ + { + "elements": [ + { + "elements": [ + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect1457", + "name": "rect1457", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "244", + "x": "320", + "y": "10" + }, + { + "elements": [ + { + "d": "m 490.65035,981.01865 h 22.75736 v 0 l 34.25004,24.28225 -34.25004,24.2824 v 0 h -22.75736 l 34.15883,-24.2824 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path1591", + "name": "path1591", + "stroke": { + "miterlimit": "10", + "paint": "#000000", + "width": "0.960651" + }, + "type": "path" + }, + { + "d": "m 488.14248,983.11489 30.11426,22.40621 -30.11426,22.4061 -30.11426,-22.4061 z", + "fill": { + "paint": "#007dfa" + }, + "id": "path1593", + "name": "path1593", + "stroke": { + "miterlimit": "10", + "paint": "#000000", + "width": "0.865861" + }, + "type": "path" + }, + { + "id": "g1599", + "name": "g1599", + "transform": "matrix(1.1457588,0,0,0.97675093,83.234844,335.9194)", + "type": "group" + }, + { + "elements": [ + { + "elements": [ + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect3295", + "name": "rect3295", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "244", + "x": "320", + "y": "10" + }, + { + "id": "g3301", + "name": "g3301", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 397,60 h 39.99 v 0 L 467,90 436.99,120 v 0 H 397 l 30.04,-30 z", + "fill": { + "paint": "#007dfa" + }, + "id": "path3303", + "name": "path3303", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 397,140 h 39.99 v 0 l 30.01,30 -30.01,30 v 0 H 397 l 30.04,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path3305", + "name": "path3305", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 419,230 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#ff0000" + }, + "id": "path3307", + "name": "path3307", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g3313", + "name": "g3313", + "transform": "matrix(1.6699378,0,0,1.9507892,-317.91426,-208.76339)", + "type": "group" + }, + { + "d": "m 425,230 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 425 l 29.96,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path3315", + "name": "path3315", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 419,310 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#f00077" + }, + "id": "path3317", + "name": "path3317", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g3323", + "name": "g3323", + "transform": "matrix(0.63064787,0,0,0.72984766,52.132513,218.46822)", + "type": "group" + }, + { + "d": "m 425,310 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 425 l 29.96,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path3325", + "name": "path3325", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 419,390 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#ff6000" + }, + "id": "path3327", + "name": "path3327", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g3333", + "name": "g3333", + "transform": "translate(38.223218,-57.895716)", + "type": "group" + }, + { + "d": "m 425,390 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 425 l 29.96,-30 z", + "fill": { + "paint": "#007dfa" + }, + "id": "path3335", + "name": "path3335", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 419,470 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#ff6000" + }, + "id": "path3337", + "name": "path3337", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g3343", + "name": "g3343", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 425,470 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 425 l 29.96,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path3345", + "name": "path3345", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 419,550 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#fcc400" + }, + "id": "path3347", + "name": "path3347", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g3353", + "name": "g3353", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 425,550 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 425 l 29.96,-30 z", + "fill": { + "paint": "#007dfa" + }, + "id": "path3355", + "name": "path3355", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "d": "m 419,630 30,30 -30,30 -30,-30 z", + "fill": { + "paint": "#fcc400" + }, + "id": "path3357", + "name": "path3357", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "id": "g3363", + "name": "g3363", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "d": "m 425,630 h 19.96 v 0 l 30.04,30 -30.04,30 v 0 H 425 l 29.96,-30 z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path3365", + "name": "path3365", + "stroke": { + "miterlimit": "10", + "paint": "#000000" + }, + "type": "path" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect3447", + "name": "rect3447", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "372", + "x": "48", + "y": "730" + }, + { + "id": "g3453", + "name": "g3453", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect3455", + "name": "rect3455", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "372", + "x": "40", + "y": "770" + }, + { + "id": "g3461", + "name": "g3461", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect3463", + "name": "rect3463", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "372", + "x": "40", + "y": "800" + }, + { + "id": "g3469", + "name": "g3469", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect3471", + "name": "rect3471", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "372", + "x": "40", + "y": "830" + }, + { + "id": "g3477", + "name": "g3477", + "transform": "translate(-0.5,-0.5)", + "type": "group" + }, + { + "fill": { + "paint": "transparent" + }, + "height": "30", + "id": "rect3479", + "name": "rect3479", + "stroke": { + "paint": "transparent" + }, + "type": "rect", + "width": "372", + "x": "40", + "y": "870" + }, + { + "id": "g3485", + "name": "g3485", + "transform": "translate(-0.5,-0.5)", + "type": "group" + } + ], + "id": "g3487", + "name": "g3487", + "type": "group" + } + ], + "id": "g3639", + "name": "g3639", + "transform": "matrix(1.862586,0,0,1.2955924,-101.29241,402.21741)", + "type": "group" + } + ], + "id": "g1808", + "name": "g1808", + "transform": "matrix(0.53688798,0,0,0.77184771,-310.91046,-777.4312)", + "type": "group" + } + ], + "id": "g1649", + "name": "g1649", + "transform": "translate(-24.206493,-38.038774)", + "type": "group" + } + ], + "id": "g1801", + "name": "g1801", + "transform": "matrix(0.26458333,0,0,0.26458333,23.680108,16.682133)", + "type": "group" + } + ], + "id": "layer1", + "name": "layer1", + "type": "group" + } + ], + "viewBox": "0 0 12.7 12.7" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "Priority5" + }, + "position": { + "height": 0.0593, + "width": 0.0464, + "x": 0.1297, + "y": 0.5157 + }, + "props": { + "elements": [ + { + "elements": [ + { + "elements": [ + { + "id": "stop8271", + "name": "stop8271", + "offset": "0", + "stopColor": "#ff0000", + "stopOpacity": "1", + "style": { + "stopColor": "#ff0000", + "stopOpacity": "1" + }, + "type": "stop" + }, + { + "id": "stop8273", + "name": "stop8273", + "offset": "1", + "stopColor": "#ff0000", + "stopOpacity": "0", + "style": { + "stopColor": "#ff0000", + "stopOpacity": "0" + }, + "type": "stop" + } + ], + "id": "linearGradient8275", + "name": "linearGradient8275", + "type": "linearGradient" + }, + { + "height": "12.373591", + "id": "rect7873", + "name": "rect7873", + "type": "rect", + "width": "6.960145", + "x": "-34.35881", + "y": "17.345123" + }, + { + "height": "19.333736", + "id": "rect7857", + "name": "rect7857", + "type": "rect", + "width": "8.617322", + "x": "12.925983", + "y": "13.478376" + }, + { + "height": "17.513809", + "id": "rect7801", + "name": "rect7801", + "type": "rect", + "width": "12.015919", + "x": "13.367897", + "y": "15.577467" + } + ], + "id": "defs7185", + "name": "defs7185", + "type": "defs" + }, + { + "elements": [ + { + "elements": [ + { + "d": "M 29.64905,-0.00379873 59.301882,29.999999 29.64905,60.003797 -0.00378149,29.999999 Z", + "fill": { + "paint": "#ff0000" + }, + "id": "path7353", + "name": "path7353", + "stroke": { + "miterlimit": "10", + "paint": "#000000", + "width": "0.99426" + }, + "type": "path" + }, + { + "id": "g7359", + "name": "g7359", + "transform": "matrix(0.98842772,0,0,1.0001266,-0.49799535,-0.50386203)", + "type": "group" + }, + { + "d": "m 35.579616,-0.00379873 h 19.729018 v 0 L 85.001002,29.999999 55.308634,60.003797 v 0 H 35.579616 L 65.192911,29.999999 Z", + "fill": { + "paint": "#8c8c8c" + }, + "id": "path7361", + "name": "path7361", + "stroke": { + "miterlimit": "10", + "paint": "#000000", + "width": "0.99426" + }, + "type": "path" + }, + { + "fill": { + "paint": "transparent" + }, + "id": "text7799", + "name": "text7799", + "stroke": { + "linecap": "round", + "linejoin": "round", + "paint": "#000000", + "width": "1.88976" + }, + "style": { + "opacity": "0.745318", + "paintOrder": "stroke fill markers", + "shapeInside": "url(#rect7801)", + "whiteSpace": "pre" + }, + "text": "", + "transform": "matrix(1.8153486,0,0,1.5943188,-1.6050095,-7.7561459)", + "type": "text" + }, + { + "fill": { + "paint": "transparent" + }, + "id": "text7855", + "name": "text7855", + "stroke": { + "linecap": "round", + "linejoin": "round", + "paint": "#000000", + "width": "1.88976" + }, + "style": { + "opacity": "0.745318", + "paintOrder": "stroke fill markers", + "shapeInside": "url(#rect7857)", + "whiteSpace": "pre" + }, + "text": "", + "transform": "matrix(1.8153486,0,0,1.5943188,-1.6050095,-7.7561459)", + "type": "text" + }, + { + "elements": [ + { + "id": "tspan8587", + "name": "tspan8587", + "text": "1", + "type": "tspan", + "x": "-34.359375", + "y": "25.679114" + } + ], + "fill": { + "opacity": "0.99182", + "paint": "#050505" + }, + "id": "text7871", + "name": "text7871", + "stroke": { + "dasharray": "none", + "linecap": "round", + "linejoin": "round", + "paint": "#000000", + "width": "0.25802" + }, + "style": { + "InkscapeFontSpecification": "\u0027Arial Narrow, Normal\u0027", + "fontFamily": "\u0027Arial Narrow\u0027", + "fontSize": "9.25159px", + "fontStretch": "normal", + "fontStyle": "normal", + "fontVariant": "normal", + "fontVariantCaps": "normal", + "fontVariantEastAsian": "normal", + "fontVariantLigatures": "normal", + "fontVariantNumeric": "normal", + "fontWeight": "normal", + "opacity": "0.745318", + "paintOrder": "stroke fill markers", + "shapeInside": "url(#rect7873)", + "whiteSpace": "pre" + }, + "text": "1", + "transform": "matrix(7.0991451,0,0,4.6510814,257.54231,-73.971779)", + "type": "text" + } + ], + "id": "g7387", + "name": "g7387", + "transform": "matrix(0.14574795,0,0,0.16595384,0.23392684,1.2871622)", + "type": "group" + } + ], + "id": "layer1", + "name": "layer1", + "type": "group" + } + ], + "viewBox": "0 0 12.7 12.7" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "EmbeddedView" + }, + "position": { + "height": 0.0426, + "width": 0.0245, + "x": 0.087, + "y": 0.6241 + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "Custom" + }, + "position": { + "height": 0.037, + "width": 0.0208, + "x": 0.0552, + "y": 0.3444 + }, + "props": { + "params": { + "tagProps": [ + "PLC09/L1_8/ES1", + "sensor_door", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/AMZL/Equipment-Views/Custom" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "Priority" + }, + "position": { + "height": 0.0287, + "rotate": { + "angle": "270deg" + }, + "width": 0.0177, + "x": 0.1879, + "y": 0.1273 + }, + "props": { + "path": "Symbol-Views/AMZL/Equipment-Views/Priority" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "RFID_0" + }, + "position": { + "height": 0.0361, + "width": 0.026, + "x": 0.2344, + "y": 0.7361 + }, + "props": { + "elements": [ + { + "elements": [ + { + "d": "M6.35 0.2507 C4.0842 0.2507 1.9091 1.5163 0.3079 3.7675 L1.174 4.9681 C2.6039 2.9621 4.477 1.9591 6.35 1.9591 C8.223 1.9591 10.0961 2.9621 11.526 4.9681 L12.3921 3.7675 C10.7909 1.5163 8.6158 0.2507 6.35 0.2507 ZM6.35 3.6831 C4.7961 3.6831 3.2421 4.5117 2.0526 6.1688 L2.8834 7.4219 C3.7997 6.1213 5.0484 5.3909 6.35 5.3909 C7.6516 5.3909 8.9003 6.1213 9.8166 7.4219 L10.6474 6.1688 C9.4579 4.5117 7.9039 3.6831 6.35 3.6831 ZM6.35 7.1155 C5.4135 7.1155 4.477 7.617 3.762 8.6201 L4.6179 9.8557 C5.0761 9.2079 5.698 8.8427 6.35 8.8427 C7.002 8.8427 7.6239 9.2079 8.0821 9.8557 L8.938 8.6201 C8.223 7.617 7.2865 7.1155 6.35 7.1155 ZM6.35 10.5667 C6.0416 10.5667 5.7332 10.7299 5.4966 11.0563 L6.35 12.257 L7.2034 11.0563 C6.9668 10.7299 6.6584 10.5667 6.35 10.5667 Z", + "name": "path", + "stroke": { + "paint": "transparent" + }, + "type": "path" + } + ], + "fill": { + "opacity": 1, + "paint": "#FF4747" + }, + "name": "group", + "stroke": { + "opacity": "0.502", + "paint": "rgb(128,128,128)" + }, + "type": "group" + } + ], + "viewBox": "0 0 12.7 12.7" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "Goods_Lift" + }, + "position": { + "height": 0.0528, + "width": 0.026, + "x": 0.261, + "y": 0.1315 + }, + "props": { + "elements": [ + { + "id": "defs2", + "name": "defs2", + "type": "defs" + }, + { + "elements": [ + { + "elements": [ + { + "cx": "69.035934", + "cy": "129.08073", + "fill": { + "paint": "#FF0000" + }, + "id": "path509", + "name": "path509", + "rx": "9.5693493", + "ry": "9.4979048", + "stroke": { + "dasharray": "none", + "linejoin": "round", + "paint": "#000000", + "width": "1.3051" + }, + "style": { + "paintOrder": "stroke fill markers" + }, + "type": "ellipse" + }, + { + "d": "m 67.713019,128.18115 1.322917,-0.66146 1.322917,0.66146 v -3.06917 h -2.645834 z m -1.322916,3.54542 v -1.05833 h 2.645833 v 1.05833 z m -1.322918,2.11667 q -0.3175,0 -0.555625,-0.23812 -0.238125,-0.23813 -0.238125,-0.55563 v -7.93751 q 0,-0.3175 0.238125,-0.55562 0.238125,-0.23813 0.555625,-0.23813 h 7.937499 q 0.3175,0 0.55563,0.23813 0.23812,0.23812 0.23812,0.55562 v 7.93751 q 0,0.3175 -0.23812,0.55563 -0.23813,0.23812 -0.55563,0.23812 z m 0,-8.73126 v 7.93751 z m 0,7.93751 h 7.937499 v -7.93751 h -1.852081 v 4.3524 l -2.116667,-1.05834 -2.116666,1.05834 v -4.3524 h -1.852085 z", + "id": "path132", + "name": "path132", + "stroke": { + "dasharray": "none", + "width": "0" + }, + "type": "path" + }, + { + "d": "m 66.429788,123.74768 -0.568854,-0.56885 3.175,-3.175 3.175,3.16177 -0.568855,0.56885 -2.606145,-2.60614 z", + "id": "path2154", + "name": "path2154", + "stroke": { + "width": "0.264583" + }, + "type": "path" + }, + { + "d": "m 71.642074,134.41379 0.56886,0.56885 -3.175,3.175 -3.175,-3.16177 0.56885,-0.56885 2.60615,2.60614 z", + "id": "path2154-5", + "name": "path2154-5", + "stroke": { + "width": "0.264583" + }, + "type": "path" + } + ], + "id": "g2552", + "name": "g2552", + "type": "group" + } + ], + "id": "layer1", + "name": "layer1", + "transform": "translate(-58.814035,-118.93028)", + "type": "group" + } + ], + "viewBox": "0 0 20.443798 20.300909" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "Goods_Lift_0" + }, + "position": { + "height": 0.0787, + "width": 0.051, + "x": 0.187, + "y": 0.2491 + }, + "props": { + "elements": [ + { + "elements": [ + { + "d": "M10.2219 0.6525 C4.9369 0.6525 0.6525 4.9049 0.6525 10.1505 C0.6525 15.396 4.9369 19.6484 10.2219 19.6484 C15.5069 19.6484 19.7912 15.396 19.7912 10.1505 C19.7912 4.9049 15.5069 0.6525 10.2219 0.6525 Z", + "name": "path", + "stroke": { + "paint": "transparent" + }, + "type": "path" + } + ], + "fill": { + "opacity": "0.502", + "paint": "rgb(128,128,128)" + }, + "name": "group", + "stroke": { + "opacity": "0.502", + "paint": "rgb(128,128,128)" + }, + "type": "group" + } + ], + "viewBox": "0 0 20.443798 20.300909" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "Goods_Lift_1" + }, + "position": { + "height": 0.1611, + "width": 0.0839, + "x": 0.3557, + "y": 0.0426 + }, + "props": { + "elements": [ + { + "id": "defs2", + "name": "defs2", + "type": "defs" + }, + { + "elements": [ + { + "elements": [ + { + "cx": "69.035934", + "cy": "129.08073", + "fill": { + "paint": "#ffffff" + }, + "id": "path509", + "name": "path509", + "rx": "9.5693493", + "ry": "9.4979048", + "stroke": { + "dasharray": "none", + "linejoin": "round", + "paint": "#000000", + "width": "1" + }, + "style": { + "paintOrder": "stroke fill markers" + }, + "type": "ellipse" + }, + { + "d": "m 67.713019,128.18115 1.322917,-0.66146 1.322917,0.66146 v -3.06917 h -2.645834 z m -1.322916,3.54542 v -1.05833 h 2.645833 v 1.05833 z m -1.322918,2.11667 q -0.3175,0 -0.555625,-0.23812 -0.238125,-0.23813 -0.238125,-0.55563 v -7.93751 q 0,-0.3175 0.238125,-0.55562 0.238125,-0.23813 0.555625,-0.23813 h 7.937499 q 0.3175,0 0.55563,0.23813 0.23812,0.23812 0.23812,0.55562 v 7.93751 q 0,0.3175 -0.23812,0.55563 -0.23813,0.23812 -0.55563,0.23812 z m 0,-8.73126 v 7.93751 z m 0,7.93751 h 7.937499 v -7.93751 h -1.852081 v 4.3524 l -2.116667,-1.05834 -2.116666,1.05834 v -4.3524 h -1.852085 z", + "id": "path132", + "name": "path132", + "stroke": { + "dasharray": "none", + "width": "1" + }, + "type": "path" + }, + { + "d": "m 66.429788,123.74768 -0.568854,-0.56885 3.175,-3.175 3.175,3.16177 -0.568855,0.56885 -2.606145,-2.60614 z", + "id": "path2154", + "name": "path2154", + "stroke": { + "dasharray": "none", + "width": "1" + }, + "type": "path" + }, + { + "d": "m 71.642074,134.41379 0.56886,0.56885 -3.175,3.175 -3.175,-3.16177 0.56885,-0.56885 2.60615,2.60614 z", + "id": "path2154-5", + "name": "path2154-5", + "stroke": { + "dasharray": "none", + "width": "1" + }, + "type": "path" + } + ], + "id": "g2552", + "name": "g2552", + "stroke": { + "dasharray": "none", + "width": "1" + }, + "type": "group" + } + ], + "id": "layer1", + "name": "layer1", + "transform": "translate(-58.814035,-118.93028)", + "type": "group" + } + ], + "viewBox": "0 0 20.443798 20.300909" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "AUS" + }, + "position": { + "height": 0.0898, + "width": 0.0417, + "x": 0.5062, + "y": 0.3667 + }, + "props": { + "elements": [ + { + "id": "defs2", + "name": "defs2", + "type": "defs" + }, + { + "elements": [ + { + "elements": [ + { + "cx": "69.035934", + "cy": "129.08073", + "fill": { + "paint": "#ffffff" + }, + "id": "path509", + "name": "path509", + "rx": "9.5693493", + "ry": "9.4979048", + "stroke": { + "dasharray": "none", + "linejoin": "round", + "paint": "#000000", + "width": "1" + }, + "style": { + "paintOrder": "stroke fill markers" + }, + "type": "ellipse" + }, + { + "d": "m 64.008851,131.72656 2.143125,-5.29166 h 0.833438 l 2.129896,5.29166 h -0.833438 l -0.502708,-1.30968 h -2.434167 l -0.502708,1.30968 z m 1.600729,-1.9976 h 1.905 l -0.926041,-2.4474 h -0.05292 z m 4.590521,1.9976 v -0.82021 l 3.082396,-3.78354 h -2.844271 v -0.68791 h 3.598334 v 0.83343 l -3.055938,3.77032 h 3.082396 v 0.68791 z m -2.169583,-6.6675 1.27,-1.27 1.27,1.27 z m 1.27,9.31334 -1.27,-1.27 h 2.54 z", + "id": "path6803", + "name": "path6803", + "stroke": { + "width": "0.264583" + }, + "type": "path" + } + ], + "id": "g2552", + "name": "g2552", + "stroke": { + "dasharray": "none", + "width": "1" + }, + "type": "group" + } + ], + "id": "layer1", + "name": "layer1", + "transform": "translate(-58.814035,-118.93028)", + "type": "group" + } + ], + "viewBox": "0 0 20.443798 20.300909" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "GoodsLift" + }, + "position": { + "height": 0.0926, + "width": 0.0521, + "x": 0.3828, + "y": 0.3917 + }, + "props": { + "params": { + "tagProps": [ + "", + "", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/GoodsLift" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "AUS_0" + }, + "position": { + "height": 0.0898, + "width": 0.0417, + "x": 0.4166, + "y": 0.5297 + }, + "props": { + "elements": [ + { + "elements": [ + { + "d": "M10.2219 0.6525 C4.9369 0.6525 0.6525 4.9049 0.6525 10.1505 C0.6525 15.396 4.9369 19.6484 10.2219 19.6484 C15.5069 19.6484 19.7912 15.396 19.7912 10.1505 C19.7912 4.9049 15.5069 0.6525 10.2219 0.6525 Z", + "name": "path", + "stroke": { + "paint": "transparent" + }, + "type": "path" + } + ], + "fill": { + "opacity": "0.502", + "paint": "rgb(128,128,128)" + }, + "name": "group", + "stroke": { + "opacity": "0.502", + "paint": "rgb(128,128,128)" + }, + "type": "group" + } + ], + "viewBox": "0 0 20.443798 20.300909" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "SLAMs" + }, + "position": { + "height": 0.0926, + "width": 0.0521, + "x": 0.2968, + "y": 0.2648 + }, + "props": { + "params": { + "tagProps": [ + "", + "", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/SLAMs" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "jam-jar-icon" + }, + "position": { + "height": 0.0241, + "width": 0.0146, + "x": 0.0651, + "y": 0.7954 + }, + "props": { + "elements": [ + { + "d": "M20.34,21.47A83.51,83.51,0,0,0,9.12,28a18.88,18.88,0,0,0-3.75,3.35,17.9,17.9,0,0,0,3.08,1.41,15.17,15.17,0,0,0,4.62.86,12.37,12.37,0,0,0,5.09-1.58,19,19,0,0,1,7.4-2.21c2.68-.11,4.73.95,6.74,2a9.73,9.73,0,0,0,3.92,1.41,11.85,11.85,0,0,0,4.39-1.34,21,21,0,0,1,6.83-2,16.92,16.92,0,0,1,7.3,1.36,15.33,15.33,0,0,0,4.77,1.15A20.45,20.45,0,0,0,65,31.26a27.16,27.16,0,0,1,7.38-1.42,17.2,17.2,0,0,1,6.43,1.38,12,12,0,0,0,3.76.94,16.75,16.75,0,0,0,4.13-.51,17,17,0,0,0,2.16-.71,13.53,13.53,0,0,0-3.44-3.44,59.47,59.47,0,0,0-10.81-6Zm4.18,30.88H71.18a11.81,11.81,0,0,1,8.34,3.47v0A11.76,11.76,0,0,1,83,64.17V81.69A11.81,11.81,0,0,1,79.53,90h0a11.76,11.76,0,0,1-8.33,3.47H24.52a11.81,11.81,0,0,1-8.34-3.47v0a11.77,11.77,0,0,1-3.47-8.34V64.17a11.81,11.81,0,0,1,3.47-8.34h0a11.76,11.76,0,0,1,8.33-3.47ZM71.18,57H24.52a7.1,7.1,0,0,0-5.06,2.1h0a7.14,7.14,0,0,0-2.1,5.07V81.69a7.12,7.12,0,0,0,2.1,5.07h0a7.1,7.1,0,0,0,5.06,2.1H71.18a7.14,7.14,0,0,0,5.07-2.1h0a7.13,7.13,0,0,0,2.11-5.07V64.17a7.15,7.15,0,0,0-2.11-5.07h0A7.14,7.14,0,0,0,71.18,57ZM88.27,16.49l5.55.37a3.19,3.19,0,0,1-.43,6.36l-6.6-.44q.75.51,1.44,1c3.32,2.5,5.37,5.12,5.8,7.9a2.31,2.31,0,0,1-1.18,2.49,21.89,21.89,0,0,1-4.22,1.75A31.23,31.23,0,0,1,93.39,46,53.19,53.19,0,0,1,95,60.4v28h0c.17,10.13-2.24,18.14-7.35,24s-12.75,9.33-23.12,10.51a1.84,1.84,0,0,1-.41,0H32.27c-10-.39-17.24-3.75-22.38-9.31S2,100.6.75,91.72a2.73,2.73,0,0,1-.05-.5V62.14h0a53,53,0,0,1,2-17.06,29.52,29.52,0,0,1,3.88-8,24.66,24.66,0,0,1-5.49-2.89,2.33,2.33,0,0,1-1-2.66C.79,29.15,3,26.74,6.4,24.26a72,72,0,0,1,8.36-5.12,10.4,10.4,0,0,1-1.18-1h0a10.55,10.55,0,0,1,0-15h0A10.57,10.57,0,0,1,21.07,0H73a10.55,10.55,0,0,1,7.49,3.12h0a10.57,10.57,0,0,1,3.12,7.49,8.44,8.44,0,0,1-.05,1l8.25-3.75a3.18,3.18,0,0,1,2.64,5.79l-6.19,2.82ZM73,4.64H21.07a6,6,0,0,0-4.22,1.75h0a6,6,0,0,0,0,8.44h0a6,6,0,0,0,4.22,1.75H73a6,6,0,0,0,4.22-1.75h0a6,6,0,0,0,0-8.44h0A6,6,0,0,0,73,4.64ZM11.56,38.17a24.5,24.5,0,0,0-4.39,8.31A49.22,49.22,0,0,0,5.33,62.1v0h0v29c1.12,8,3.62,14.61,8,19.32s10.49,7.46,19.06,7.82H64c9.17-1,15.85-4,20.15-9s6.36-11.91,6.21-20.88v0h0v-28a48.93,48.93,0,0,0-1.45-13.16,26.53,26.53,0,0,0-5.52-10.43H82.6a15.52,15.52,0,0,1-5.32-1.23,13.74,13.74,0,0,0-4.8-1.1,23.74,23.74,0,0,0-6.14,1.23A23.73,23.73,0,0,1,59.49,37a18.89,18.89,0,0,1-6.27-1.4,13.21,13.21,0,0,0-5.38-1.13,17.34,17.34,0,0,0-5.38,1.69,15,15,0,0,1-6.27,1.72,13.09,13.09,0,0,1-6-1.92,9.48,9.48,0,0,0-4.44-1.48,15.42,15.42,0,0,0-5.64,1.79c-2.28,1.05-4.47,2.07-7.15,2-.46,0-.93,0-1.39-.09Z", + "name": "path", + "type": "path" + } + ], + "viewBox": "0 0 96.79 122.88" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "jar-solid (2)" + }, + "position": { + "height": 0.0324, + "width": 0.0182, + "x": 0.0829, + "y": 0.6945 + }, + "props": { + "elements": [ + { + "d": "M32 32C32 14.3 46.3 0 64 0H256c17.7 0 32 14.3 32 32s-14.3 32-32 32H64C46.3 64 32 49.7 32 32zM0 160c0-35.3 28.7-64 64-64H256c35.3 0 64 28.7 64 64V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V160zm96 64c-17.7 0-32 14.3-32 32v96c0 17.7 14.3 32 32 32H224c17.7 0 32-14.3 32-32V256c0-17.7-14.3-32-32-32H96z", + "name": "path", + "type": "path" + } + ], + "style": { + "color": "#FF8C00" + }, + "viewBox": "0 0 320 512" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "car_crash_white_24dp" + }, + "position": { + "height": 0.0222, + "width": 0.0125, + "x": 0.1294, + "y": 0.7574 + }, + "props": { + "elements": [ + { + "elements": [ + { + "fill": { + "paint": "transparent" + }, + "height": "24", + "name": "rect", + "type": "rect", + "width": "24" + } + ], + "name": "group", + "type": "group" + }, + { + "elements": [ + { + "elements": [ + { + "d": "M18,1c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5S20.76,1,18,1z M18.5,7h-1V3h1V7z M18.5,8v1h-1V8H18.5z M6,13.5 C6,12.67,6.67,12,7.5,12S9,12.67,9,13.5S8.33,15,7.5,15S6,14.33,6,13.5z M19,12.93c0.65-0.09,1.34-0.28,2-0.6h0V19 c0,0.55-0.45,1-1,1h-1c-0.55,0-1-0.45-1-1v-1H6v1c0,0.55-0.45,1-1,1H4c-0.55,0-1-0.45-1-1v-8l2.08-5.99C5.29,4.42,5.84,4,6.5,4 l4.79,0C11.1,4.63,11,5.31,11,6H6.85L5.81,9h5.86v0c0.36,0.75,0.84,1.43,1.43,2L5,11v5h14L19,12.93z M17.91,13 c-0.89-0.01-1.74-0.19-2.53-0.51C15.15,12.76,15,13.11,15,13.5c0,0.83,0.67,1.5,1.5,1.5s1.5-0.67,1.5-1.5 C18,13.32,17.97,13.16,17.91,13z", + "name": "path", + "type": "path" + } + ], + "name": "group", + "type": "group" + } + ], + "name": "group", + "type": "group" + } + ], + "fill": { + "paint": "#FFFFFF" + }, + "viewBox": "0 0 24 24" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "troubleshoot_white_24dp" + }, + "position": { + "height": 0.0222, + "width": 0.0125, + "x": 0.0078, + "y": 0.5194 + }, + "props": { + "elements": [ + { + "elements": [ + { + "fill": { + "paint": "transparent" + }, + "height": "24", + "name": "rect", + "type": "rect", + "width": "24" + } + ], + "name": "group", + "type": "group" + }, + { + "elements": [ + { + "elements": [ + { + "d": "M22,20.59l-4.69-4.69C18.37,14.55,19,12.85,19,11c0-4.42-3.58-8-8-8c-4.08,0-7.44,3.05-7.93,7h2.02C5.57,7.17,8.03,5,11,5 c3.31,0,6,2.69,6,6s-2.69,6-6,6c-2.42,0-4.5-1.44-5.45-3.5H3.4C4.45,16.69,7.46,19,11,19c1.85,0,3.55-0.63,4.9-1.69L20.59,22 L22,20.59z", + "name": "path", + "type": "path" + }, + { + "name": "polygon", + "points": "8.43,9.69 9.65,15 11.29,15 12.55,11.22 13.5,13.5 15.5,13.5 15.5,12 14.5,12 13.25,9 11.71,9 10.59,12.37 9.35,7 7.7,7 6.45,11 1,11 1,12.5 7.55,12.5", + "type": "polygon" + } + ], + "name": "group", + "type": "group" + } + ], + "name": "group", + "type": "group" + } + ], + "fill": { + "paint": "#FFFFFF" + }, + "viewBox": "0 0 24 24" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "PressureSwitch" + }, + "position": { + "height": 0.0231, + "width": 0.013, + "x": 0.3646, + "y": 0.6584 + }, + "props": { + "elements": [ + { + "name": "defs", + "type": "text" + }, + { + "elements": [ + { + "fill": { + "paint": "#FF4747" + }, + "height": "24", + "name": "rect", + "stroke": { + "paint": "rgb(0, 0, 0)" + }, + "type": "rect", + "width": "24", + "x": "0", + "y": "0" + }, + { + "name": "group", + "transform": "translate(-0.5 -0.5)", + "type": "group" + } + ], + "name": "group", + "type": "group" + } + ], + "style": { + "backgroundColor": " rgb(237, 237, 237)" + }, + "viewBox": "-0.5 -0.5 25 25" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "PressureSwitch_0" + }, + "position": { + "height": 0.0333, + "width": 0.0182, + "x": 0.3333, + "y": 0.5259 + }, + "props": { + "elements": [ + { + "elements": [ + { + "elements": [ + { + "id": "stop1507", + "name": "stop1507", + "offset": "0", + "stopColor": "#020101", + "stopOpacity": "1", + "style": { + "stopColor": "#020101", + "stopOpacity": "1" + }, + "type": "stop" + } + ], + "id": "linearGradient1509", + "name": "linearGradient1509", + "type": "linearGradient" + }, + { + "elements": [ + { + "id": "stop1391", + "name": "stop1391", + "offset": "0", + "stopColor": "#020101", + "stopOpacity": "1", + "style": { + "stopColor": "#020101", + "stopOpacity": "1" + }, + "type": "stop" + } + ], + "id": "linearGradient1393", + "name": "linearGradient1393", + "type": "linearGradient" + }, + { + "elements": [ + { + "id": "stop1381", + "name": "stop1381", + "offset": "0", + "stopColor": "#ffffff", + "stopOpacity": "1", + "style": { + "stopColor": "#ffffff", + "stopOpacity": "1" + }, + "type": "stop" + }, + { + "id": "stop1383", + "name": "stop1383", + "offset": "1", + "stopColor": "#ffffff", + "stopOpacity": "0", + "style": { + "stopColor": "#ffffff", + "stopOpacity": "0" + }, + "type": "stop" + } + ], + "id": "linearGradient1385", + "name": "linearGradient1385", + "type": "linearGradient" + }, + { + "gradientTransform": "scale(0.93677795,1.0674888)", + "gradientUnits": "userSpaceOnUse", + "href": "#linearGradient1509", + "id": "linearGradient3055", + "name": "linearGradient3055", + "type": "linearGradient", + "x1": "2.4719212", + "x2": "5.6080947", + "y1": "4.8826461", + "y2": "4.8826461" + } + ], + "id": "defs2", + "name": "defs2", + "type": "defs" + }, + { + "elements": [ + { + "elements": [ + { + "fill": { + "opacity": "1", + "url": "url(#linearGradient3055)" + }, + "id": "tspan1453", + "name": "tspan1453", + "stroke": { + "dasharray": "none", + "width": "0.263597" + }, + "text": "P", + "type": "tspan", + "x": "2.1310973", + "y": "7.0375786" + } + ], + "fill": { + "opacity": "1", + "url": "url(#linearGradient3055)" + }, + "id": "text1455", + "name": "text1455", + "stroke": { + "dasharray": "none", + "linejoin": "round", + "paint": "#000000", + "width": 0.5 + }, + "style": { + "InkscapeFontSpecification": "\u0027Arial Narrow, Normal\u0027", + "fontFamily": "\u0027Arial Narrow\u0027", + "fontSize": "3.55804px", + "paintOrder": "stroke fill markers" + }, + "text": "P", + "transform": "scale(1.0674889,0.9367779)", + "type": "text", + "x": "2.1310973", + "y": "7.0375786" + }, + { + "fill": { + "opacity": "0.0131332", + "paint": "#020101" + }, + "height": "5.0202694", + "id": "rect2295", + "name": "rect2295", + "stroke": { + "dasharray": "none", + "linejoin": "round", + "paint": "#000000", + "width": "0.278718" + }, + "style": { + "paintOrder": "stroke fill markers" + }, + "type": "rect", + "width": "5.0202694", + "x": "0.85620493", + "y": "2.8895655" + }, + { + "d": "M 5.8764744,5.3996999 H 8.910435", + "fill": { + "opacity": "0.0131332", + "paint": "#020101" + }, + "id": "path2444", + "name": "path2444", + "stroke": { + "dasharray": "0.535709, 0.535709", + "dashoffset": "0", + "linejoin": "round", + "paint": "#000000", + "width": "0.535709" + }, + "style": { + "paintOrder": "stroke fill markers" + }, + "type": "path" + }, + { + "d": "M 9.7533984,1.9768429 8.2352994,8.0007424 8.2115423,10.620118", + "fill": { + "opacity": "0.0131332", + "paint": "#020101" + }, + "id": "path2497", + "name": "path2497", + "stroke": { + "dasharray": "none", + "dashoffset": "0", + "linejoin": "round", + "paint": "#000000", + "width": "0.461924" + }, + "style": { + "paintOrder": "stroke fill markers" + }, + "type": "path" + }, + { + "d": "M 10.943707,2.4945992 H 8.2013803 l 10e-8,-1.69078389", + "fill": { + "opacity": "0.0131332", + "paint": "#020101" + }, + "id": "path2515", + "name": "path2515", + "stroke": { + "dasharray": "none", + "dashoffset": "0", + "linejoin": "round", + "paint": "#000000", + "width": "0.441581" + }, + "style": { + "paintOrder": "stroke fill markers" + }, + "type": "path" + }, + { + "fill": { + "opacity": "0.0131332", + "paint": "#020101" + }, + "height": "11.216189", + "id": "rect2517", + "name": "rect2517", + "stroke": { + "dasharray": "none", + "dashoffset": "0", + "linejoin": "round", + "paint": "#000000", + "width": "0.0883165" + }, + "style": { + "paintOrder": "stroke fill markers" + }, + "type": "rect", + "width": "11.216189", + "x": "6.1553953e-07", + "y": "0" + } + ], + "id": "layer1", + "name": "layer1", + "type": "group" + } + ], + "viewBox": "0 0 11.21619 11.21619" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "PressureSwitch_1" + }, + "position": { + "height": 0.0259, + "width": 0.0151, + "x": 0.3302, + "y": 0.7852 + }, + "props": { + "elements": [ + { + "elements": [ + { + "elements": [ + { + "id": "stop1507", + "name": "stop1507", + "offset": "0", + "stopColor": "#020101", + "stopOpacity": "1", + "style": { + "stopColor": "#020101", + "stopOpacity": "1" + }, + "type": "stop" + } + ], + "id": "linearGradient1509", + "name": "linearGradient1509", + "type": "linearGradient" + }, + { + "gradientTransform": "scale(1.0156665,0.98457489)", + "gradientUnits": "userSpaceOnUse", + "href": "#linearGradient1509", + "id": "linearGradient3055", + "name": "linearGradient3055", + "type": "linearGradient", + "x1": "2.4719212", + "x2": "5.6080947", + "y1": "4.8826461", + "y2": "4.8826461" + } + ], + "id": "defs2", + "name": "defs2", + "type": "defs" + }, + { + "elements": [ + { + "elements": [ + { + "fill": { + "opacity": "1", + "url": "url(#linearGradient3055)" + }, + "id": "tspan1453", + "name": "tspan1453", + "stroke": { + "dasharray": "none", + "width": "0.724446" + }, + "text": "P", + "type": "tspan", + "x": "0.99078566", + "y": "9.0214157" + } + ], + "fill": { + "opacity": "1", + "url": "url(#linearGradient3055)" + }, + "id": "text1455", + "name": "text1455", + "stroke": { + "dasharray": "none", + "linejoin": "round", + "paint": "#000000", + "width": "0.724446" + }, + "style": { + "InkscapeFontSpecification": "\u0027Arial Narrow, Normal\u0027", + "fontFamily": "\u0027Arial Narrow\u0027", + "fontSize": "9.7785px", + "paintOrder": "stroke fill markers" + }, + "text": "P", + "transform": "scale(0.98457515,1.0156665)", + "type": "text", + "x": "0.99078566", + "y": "9.0214157" + }, + { + "fill": { + "opacity": 1, + "paint": "#FF4747" + }, + "height": "11.216189", + "id": "rect5779", + "name": "rect5779", + "stroke": { + "dasharray": "none", + "linejoin": "round", + "paint": "#000000", + "width": "0.447246" + }, + "style": { + "paintOrder": "stroke fill markers" + }, + "type": "rect", + "width": "11.21619", + "x": "7.7715612e-16", + "y": "0" + }, + { + "d": "M 7.1327097,2.9635882 9.9122555,5.8103519 6.9937326,8.2419488", + "fill": { + "opacity": "0.0131332", + "paint": "#020101" + }, + "id": "path3213", + "name": "path3213", + "stroke": { + "dasharray": "none", + "linejoin": "round", + "paint": "#000000", + "width": "0.453321" + }, + "style": { + "paintOrder": "stroke fill markers" + }, + "type": "path" + } + ], + "id": "layer1", + "name": "layer1", + "type": "group" + } + ], + "viewBox": "0 0 11.21619 11.21619" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "PressureSwitch_2" + }, + "position": { + "height": 0.0213, + "width": 0.0099, + "x": 0.4766, + "y": 0.7213 + }, + "props": { + "elements": [ + { + "elements": [ + { + "elements": [ + { + "id": "stop1507", + "name": "stop1507", + "offset": "0", + "stopColor": "#020101", + "stopOpacity": "1", + "style": { + "stopColor": "#020101", + "stopOpacity": "1" + }, + "type": "stop" + } + ], + "id": "linearGradient1509", + "name": "linearGradient1509", + "type": "linearGradient" + }, + { + "gradientTransform": "matrix(1.0156665,0,0,0.98457489,-0.22712617,-0.22017344)", + "gradientUnits": "userSpaceOnUse", + "href": "#linearGradient1509", + "id": "linearGradient3055", + "name": "linearGradient3055", + "type": "linearGradient", + "x1": "2.4719212", + "x2": "5.6080947", + "y1": "4.8826461", + "y2": "4.8826461" + } + ], + "id": "defs2", + "name": "defs2", + "type": "defs" + }, + { + "elements": [ + { + "fill": { + "opacity": "0.0131332", + "paint": "#020101" + }, + "height": "11.216189", + "id": "rect5779", + "name": "rect5779", + "stroke": { + "dasharray": "none", + "linejoin": "round", + "paint": "#000000", + "width": 1.2 + }, + "style": { + "paintOrder": "stroke fill markers" + }, + "type": "rect", + "width": "11.21619", + "x": "7.7715612e-16", + "y": "0" + }, + { + "elements": [ + { + "fill": { + "opacity": "1", + "url": "url(#linearGradient3055)" + }, + "id": "tspan1453", + "name": "tspan1453", + "stroke": { + "dasharray": "none", + "width": "0.116835" + }, + "text": "P", + "type": "tspan", + "x": "0.99078566", + "y": "9.0214157" + } + ], + "fill": { + "opacity": "1", + "url": "blue" + }, + "id": "text1455", + "name": "text1455", + "stroke": { + "dasharray": "none", + "linejoin": "round", + "paint": "#000000", + "width": "0.116835" + }, + "style": { + "InkscapeFontSpecification": "\u0027Arial Narrow, Normal\u0027", + "fontFamily": "\u0027Arial Narrow\u0027", + "fontSize": "9.7785px", + "paintOrder": "stroke fill markers" + }, + "text": "P", + "transform": "scale(0.98457515,1.0156665)", + "type": "text", + "x": "0.99078566", + "y": "9.0214157" + }, + { + "d": "M 7.1327097,2.9635882 9.9122555,5.8103519 6.9937326,8.2419488", + "fill": { + "opacity": "0.0131332", + "paint": "#020101" + }, + "id": "path3213", + "name": "path3213", + "stroke": { + "dasharray": "none", + "linejoin": "round", + "paint": "#000000", + "width": "0.663625" + }, + "style": { + "paintOrder": "stroke fill markers" + }, + "type": "path" + } + ], + "id": "layer1", + "name": "layer1", + "transform": "translate(0.22362278,0.22362278)", + "type": "group" + } + ], + "viewBox": "0 0 11.663437 11.663435" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "test3" + }, + "position": { + "height": 0.0213, + "width": 0.0187, + "x": 0.4052, + "y": 0.7953 + }, + "props": { + "elements": [ + { + "id": "defs2", + "name": "defs2", + "type": "defs" + }, + { + "elements": [ + { + "elements": [ + { + "fill": { + "paint": "#000000" + }, + "id": "text2816", + "name": "text2816", + "stroke": { + "dasharray": "none", + "linejoin": "round", + "opacity": "1", + "paint": "#000000", + "width": 1 + }, + "style": { + "InkscapeFontSpecification": "\u0027Arial Narrow, Normal\u0027", + "fontFamily": "\u0027Arial Narrow\u0027", + "fontSize": "24.246px", + "paintOrder": "stroke fill markers" + }, + "text": "TEST", + "transform": "scale(0.95052221,1.0520533)", + "type": "text", + "x": "0.053112458", + "y": "29.578585" + } + ], + "id": "g2001", + "name": "g2001", + "transform": "matrix(0.26458333,0,0,0.26458333,2.0794599,4.809009)", + "type": "group" + } + ], + "id": "layer1", + "name": "layer1", + "transform": "translate(-1.9471683,-4.6767173)", + "type": "group" + } + ], + "style": { + "borderStyle": "solid", + "borderWidth": "1.5px" + }, + "viewBox": "0 0 12.964584 12.964583" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "Pressure" + }, + "position": { + "height": 0.0926, + "width": 0.0516, + "x": 0.5297, + "y": 0.2824 + }, + "props": { + "elements": [ + { + "name": "defs", + "type": "defs" + }, + { + "elements": [ + { + "fill": { + "paint": "red" + }, + "height": "30", + "name": "rect", + "stroke": { + "paint": "#FF0000" + }, + "type": "rect", + "width": "30", + "x": "0", + "y": "0" + }, + { + "name": "group", + "transform": "translate(-0.5 -0.5)", + "type": "group" + } + ], + "name": "group", + "type": "group" + } + ], + "style": { + "backgroundColor": " rgb(255, 255, 255)" + }, + "viewBox": "-0.5 -0.5 31 31" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "Pressure_0" + }, + "position": { + "height": 0.0287, + "width": 0.0161, + "x": 0.5729, + "y": 0.4787 + }, + "props": { + "elements": [ + { + "name": "defs", + "type": "defs" + }, + { + "elements": [ + { + "fill": { + "paint": "rgb(255, 255, 255)" + }, + "height": "30", + "name": "rect", + "stroke": { + "paint": "rgb(0, 0, 0)" + }, + "type": "rect", + "width": "30", + "x": "0", + "y": "0" + }, + { + "name": "group", + "transform": "translate(-0.5 -0.5)", + "type": "group" + } + ], + "name": "group", + "type": "group" + } + ], + "style": { + "backgroundColor": " rgb(255, 255, 255)" + }, + "viewBox": "-0.5 -0.5 31 31" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "Pressure_1" + }, + "position": { + "height": 0.0287, + "width": 0.0161, + "x": 0.5968, + "y": 0.5268 + }, + "props": { + "elements": [ + { + "id": "defs132", + "name": "defs132", + "type": "defs" + }, + { + "elements": [ + { + "fill": { + "paint": "#ffffff" + }, + "height": "30", + "id": "rect134", + "name": "rect134", + "stroke": { + "paint": "#000000" + }, + "type": "rect", + "width": "30", + "x": "0", + "y": "0" + }, + { + "id": "g140", + "name": "g140", + "transform": "translate(-0.5,-0.5)", + "type": "group" + } + ], + "id": "g142", + "name": "g142", + "type": "group" + } + ], + "viewBox": "-0.5 -0.5 31 31" + }, + "type": "ia.shapes.svg" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tdef getPresignedURL(self, objectKey):\n\t\t\"\"\"\n\t\tGenerates a uri to retrieve images from an S3 bucket.\n\t\tBucket names are globally unique so different regions \n\t\tmust use a prefix for the bucket name. \n\t\tRegion and prefix are stored as custom session variables.\n\t\t\n\t\t\tArgs:\n\t\t \tself: Refrence to the object calling the function.\n\t\t \tparam2: key to the s3 object returned.\n\t\t\n\t\t\tReturns:\n\t\t \ts3 Url to display the image in S3.\n\t\t\n\t\t\tRaises:\n\t\t \tKeyError: None.\n\t\t\"\"\"\n\t\timport com.amazonaws.services.s3.AmazonS3ClientBuilder as AmazonS3ClientBuilder\n\t\timport com.amazonaws.services.s3.model.GeneratePresignedUrlRequest as GeneratePresignedUrlRequest\n\t\timport com.amazonaws.HttpMethod as HttpMethod\n\t\t\n\t\tbucket_names \u003d {\"eu\":\"ignition-image-repo\", \"na\":\"na-ignition-image-repo\", \n\t\t\t\t\t\t\"jp\":\"jp-ignition-image-repo\"}\n\t\t\t\n\t\ttry:\n\t\t\tclientRegion \u003d self.session.custom.s3.region\n\t\t\tprefix \u003d self.session.custom.s3.prefix\n\t\texcept:\n\t\t\tclientRegion \u003d \"eu-west-1\"\n\t\t\tprefix \u003d \"eu\" \n\n\t\tif not clientRegion:\n\t\t\tclientRegion \u003d \"eu-west-1\";\n\t\t\n\t\tbucketName \u003d bucket_names.get(prefix, \"ignition-image-repo\")\n\t\tsystem.perspective.print(clientRegion)\n\t\tsystem.perspective.print(bucketName)\n\t\t\n\t\t\n\t\ts3Client \u003d AmazonS3ClientBuilder.standard().withRegion(clientRegion).build();\n\t\tgeneratePresignedUrlRequest \u003d GeneratePresignedUrlRequest(bucketName, objectKey).withMethod(HttpMethod.GET);\n\t\turl \u003d s3Client.generatePresignedUrl(generatePresignedUrlRequest);\n\t\t\n\t\treturn url\n\tgetPresignedURL(self, \"SCADA/CGN9/images/CGN9_V2.svg\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_4" + }, + "position": { + "height": 0.0315, + "width": 0.0417, + "x": 0.5516, + "y": 0.1463 + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\n\tAWS.secrets_manager.get_secret(self)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_5" + }, + "position": { + "height": 0.0315, + "width": 0.0417, + "x": 0.537, + "y": 0.2222 + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "chute" + }, + "position": { + "height": 0.0324, + "width": 0.0047, + "x": 0.6302, + "y": 0.6944 + }, + "props": { + "elements": [ + { + "id": "defs2", + "name": "defs2", + "type": "defs" + }, + { + "elements": [ + { + "fill": { + "opacity": "1", + "paint": "#ffffff" + }, + "height": "9.259264", + "id": "rect144", + "name": "rect144", + "stroke": { + "dasharray": "none", + "opacity": "1", + "paint": "#000000", + "width": "0.15" + }, + "type": "rect", + "width": "2.3794692", + "x": "0.0016391517", + "y": "1.0313853e-08" + } + ], + "id": "layer1", + "name": "layer1", + "type": "group" + } + ], + "viewBox": "0 0 2.3812499 9.2604166" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "Status" + }, + "position": { + "height": 0.0185, + "width": 0.0151, + "x": 0.0911, + "y": 0.5769 + }, + "props": { + "params": { + "directionLeft": false, + "tagProps": [ + "PLC24/0511_43_02", + "PLC02", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.print(config.project_config.get_project_config())" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_6" + }, + "position": { + "height": 0.0315, + "width": 0.0417, + "x": 0.7234, + "y": 0.1704 + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "pointer_symbol_3" + }, + "position": { + "height": 0.0648, + "width": 0.026, + "x": 0.6281, + "y": 0.5963 + }, + "props": { + "elements": [ + { + "id": "defs2", + "name": "defs2", + "type": "defs" + }, + { + "elements": [ + { + "elements": [ + { + "elements": [ + { + "d": "m 10.648338,6.5392075 c 0,2.2076808 -1.7019291,4.4141715 -3.90961,4.4141715 -2.2076807,0 -4.0851094,-2.2064908 -4.0851094,-4.4141715 -1e-7,-2.2076807 1.7896788,-3.9973596 3.9973595,-3.9973596 2.2076809,-2e-7 3.9973599,1.7896787 3.9973599,3.9973596 z", + "fill": { + "opacity": "1", + "paint": "transparent" + }, + "id": "path7858", + "name": "path7858", + "stroke": { + "dasharray": "none", + "opacity": "1", + "paint": "#000000", + "width": "0.523875" + }, + "style": { + "color": "#000000" + }, + "type": "path" + }, + { + "d": "m 6.6503906,0.5703125 c -3.2732983,0 -5.96874998,2.6954516 -5.96874998,5.96875 0,3.2732984 6.23199968,11.0143705 6.23199968,11.0143705 0,0 5.7055007,-7.7410721 5.7055007,-11.0143705 0,-3.2732984 -2.695452,-5.96875 -5.9687504,-5.96875 z m 0,3.9433594 c 1.1420587,0 2.0253907,0.883332 2.0253907,2.0253906 0,1.1420586 -0.883332,2.0253906 -2.0253907,2.0253906 C 5.508332,8.5644531 4.625,7.6811211 4.625,6.5390625 4.625,5.3970039 5.508332,4.5136719 6.6503906,4.5136719 Z", + "fill": { + "opacity": "1", + "paint": "#000000" + }, + "id": "path7860", + "name": "path7860", + "stroke": { + "dasharray": "none", + "opacity": "1", + "paint": "#000000", + "width": "0.523875" + }, + "style": { + "color": "#000000" + }, + "type": "path" + } + ], + "fill": { + "opacity": "1", + "paint": "transparent" + }, + "id": "path7854", + "name": "path7854", + "stroke": { + "dasharray": "none", + "opacity": "1", + "paint": "#000000", + "width": "0.523875" + }, + "type": "group" + } + ], + "id": "path4106", + "name": "path4106", + "type": "group" + } + ], + "id": "layer1", + "name": "layer1", + "type": "group" + } + ], + "viewBox": "0 0 13.229166 18.520834" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "Icon" + }, + "position": { + "height": 0.0278, + "width": 0.0156, + "x": 0.4068, + "y": 0.3102 + }, + "props": { + "path": "material/hourglass_empty", + "style": { + "classes": "rotate" + } + }, + "type": "ia.display.icon" + } + ], + "meta": { + "name": "root" + }, + "position": { + "x": -0.125, + "y": 0.0278 + }, + "props": { + "mode": "percent" + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.vision/client-tags/data.bin b/com.inductiveautomation.vision/client-tags/data.bin new file mode 100644 index 0000000000000000000000000000000000000000..399a4f77bea89357efb21cbe08df8388d2eacd77 GIT binary patch literal 346 zcmV-g0j2&QiwFP!000000CiEpN&_(vo!HiHTWi~!h=)B1Uc&CS#ZtT#iU`_E{eYOJ zCA!(Ho3tYM3*t@u1}}mK|3N>)pYZCW5l)mb>B zHd}HlSAs3AR?K3SuB2I;UvLYcTxf0mnC$_LX`ebVQ7;+95r%6318(GL`Ru7Y`)xYM>PO5~u`z seLx(jO5CPuUK@~Iza^-w+1BqaU4_Y8(R*${@?)s0A}@~3IG5A literal 0 HcmV?d00001 diff --git a/com.inductiveautomation.vision/client-tags/resource.json b/com.inductiveautomation.vision/client-tags/resource.json new file mode 100644 index 0000000..eca335d --- /dev/null +++ b/com.inductiveautomation.vision/client-tags/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "C", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "data.bin" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2021-10-25T07:43:53Z" + }, + "lastModificationSignature": "9507094e62bcbd4b5c0d3a9ca915ea0954abe4004aa32cbc6a7d373cbe6de012" + } +} \ No newline at end of file diff --git a/com.inductiveautomation.vision/login-properties/data.bin b/com.inductiveautomation.vision/login-properties/data.bin new file mode 100644 index 0000000000000000000000000000000000000000..ac02e3d97714faa924a953a21a120a183b85b460 GIT binary patch literal 288 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 literal 0 HcmV?d00001 diff --git a/ignition/event-scripts/data.bin b/ignition/event-scripts/data.bin new file mode 100644 index 0000000000000000000000000000000000000000..56ba51ebea95aed21eea55d16853626e52e8e12a GIT binary patch literal 1200 zcmV;h1W)@PiwFP!000000L@k1ZW~1uK2Flc*$~n+{Ylfb-P&ntr}4z=q)iA=DLAwh z6k5q{xu~kucs;QUL4&w{HFTug zVliCgpCh(U!0l2E!HdE|PMaaJwUTCq<38hh#r$$Z9FyOMIJ$q@QHz)HCu zn)^*|T9#?;>}}`w^1J4Xa?vd03)`r29}+*OC9Mft1~zB3YJO~r4&pTkN{Nzu;swsJ z>(?@`QpLbObZa4xqT75_Ol_E{Qlz~}+rq9=NmH-0M!H>h6;MC!tNd%yqF%_1H1#NN zXziZ2D77OI_y^1hsw^{LYsIz*ZKNgd>>249A*l=n0=#rZNIh5Rl4&t{%w#FzGAfo0 zv(IO?YfLJk>s4)i$n?qE+?6a+j-=X{M8tN2(3hmfq~=EA8)^2&VNHo~n)vL0RU(Y@ zfD27*Y*N)@Jhn~gNOJ>;Bo}d_HhaUIP_j%`Pt$Zz zIbx0!$Zi0vjW!LN7$+Mry#p}W3?*_Gkn@<2++Bd3e><5Pnv|8F&shhp(*Scvv_*Ai zzo1Q&r2ysylaZFrPX(IQ(o&tOsjjPzqcjJQMCk$ZsDir&u+W41)DIgaro!D+;rcb? z-UC=v;3rGabC5(G$5Y%2z!XDUWG`#{=Tz3!mqpYOk|Xy%{(7F&a-lGR?hiR_uy(+Y zNsDoT$)o&%j{QYcQSA|>m#~ZnLEHBNTD9wl5O9?PF5G$DHho1b>=KJ?6$tL)R{jI4 zU|A@?h)qPqFVPpCrT}IvORMGaoIwcPK0K@r)Z_^jbzSD$0MDPIitlttOpDZWLQnV3 z>xpo@Pbu!VYW=$LF`AJA2B+q}$pbZGIREN4zz=I!pJzz70M@mT4C;_!vj}kqAg`9A zT@lW)v}q;ak~m%L9&`NQcxD%3vNLDd)7~ z=@B8Q;~||zss`)^QZ*vj)chGM?9eJznc6zefsLF-^8o2GvT9^Sl*cWc^SFPuLp|kh z2H?Xn*HjN`@uYuq=t^ZfiLE>fspX1@bSHlS;NiHp!{BNn$Q2AL9Z}uaOG_HtHbe44FfE70j{0ox!kq6eiFpWM8D{U65Sjt z*IWOX>!}JSP9vCOC4YNZJJr=r4^P4B=<3{wY}9creouA%t`dz^iOjHewyV7!XAbxJ zO*Z~xU?avc*L6is0>i&Qn2E*Am;Cs-SnsaL?>3i0|6%L@TJi1iD}I02rzg%7l_ps>n=x5;h; zgR>8IXJhdrEN_%Y&t9zZU+5q5s69Iq5-LDtwsteUJ>S>eUr#6b_W0|My}xe{e|`D$ zZ2#)#Zve;vI9H8}?;qjz>k&O`+FS>iOHdx;MapCJUZ6mU$DzPP@0Y^PIl5B4EdW#m zo-+5c<#p(Ng*JAlK}ZBm1IqkhC^D%$VpjVg|Uloyy$r<&&WFgFyD`Tz=Kcd^)o!6D9C)WHpvng zkX5CS6z3ola1@716}iXh?g!HJd4M7lELH)w0h$9Mk1+{Ts-)MUU4X{G_6Lrids}4^ zpxV>`D0o5igv)Hsiw4h-DwlRrzO%ww_l5} z!vsl)RGJzUd%{G5`rPxbP~L}hRxFO$rQnH@xk&X$cG^OZtJfkGqSQHbhqO);F_AG@ zGs-$qrEO4`2V0!QDG@=%pQDC)OfuaKa_rn}#Cz7g?oow=%Q#i2Cei zn|MbU`#ed=_cCA|fu25zB|3i(yF5#=OmWf#<0&)6PE&n2N_R!K63UBO6clnwWm(S; zl&X$CkZcbs!>H;osy2+OU!%r{^H1E)nansjJ<-{d+tMA+u7Vy{TdHHIGk55@hnhFk zhCQ`lo>_Zp(NO2?sbhvZZ%-{5YSW%tHq-@sYQ<0&?Wt8mU9zXv40ZVq>I&R5ysI$k z1ZLljUe27!xi&IYryLocw}Th#;6*$5m>s-i2QS;fD|Yaz9lUl2eEoWeHq@S)HTtW8 py7Fx1{u#Wp4*egDt>Gx!H=`({K8)HK3AK9*>Obi4SsN1x007oDRLTGV literal 0 HcmV?d00001 diff --git a/ignition/global-props/resource.json b/ignition/global-props/resource.json new file mode 100644 index 0000000..80cc116 --- /dev/null +++ b/ignition/global-props/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "data.bin" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-04-08T08:08:33Z" + }, + "lastModificationSignature": "8c0dce8b2a0912f2db47461bcbee1774c1d52b7d50cac0a39362b7442b74c877" + } +} \ No newline at end of file diff --git a/ignition/named-query/StoredProcedures/GetHistoricalAlarms/data.bin b/ignition/named-query/StoredProcedures/GetHistoricalAlarms/data.bin new file mode 100644 index 0000000000000000000000000000000000000000..512c6723a4d41664dfd6b87626f5b7c7eb55c1f7 GIT binary patch literal 1258 zcmVw zrjhtkE$0O`obTXn&kdFO4_ft0RrNRYOQrsc_6MaO)0tb}fpw;FMT-sz?ab`V>@&~K z?D?1RAAimL_4>{4Km0kj{PS;r06+^s;=7gae`y07ri#5BdlFio&#KT zxh!(0B3u`tQIafTM&rhjCE5F;V^>9)J7|9jkjyj5OQOP29Y@@2%oo!DoeFD_?UG>- zpw;A5=rxQp?20a|vS&z9<;;_Ig%J(9*tLW&phE?hT~Fwgv0U2Ye%@Yy9z?Rr-mi1% zIo5{wmdr!QRI@qVLsPO{SFhM*ZtC*rfV(;t!AdA$stnS%VB02V1ojnHi01`YpyTF- zx1Du3L+vU+H*VGeyh3&QOpc(mnJ=LONfI{w?lKcXH{FcwfVOy;^8QNYUEuI~CbrEgkDh2t_aa&rl! za>qg7-`LK+PEM)|Utob)(mK|U+6;nSu_Sk@%tUnp8-@CEfvUKzieD*nONt%gXT@%6 zEf#VpeXiQ5zQu2-kRqdlF)LBfqb_ubndUY#_P=7LM<>r>XD?O`e7*LKCM&3 zPEMs~QaD8L4ACqJOSpTev?0<|%6Fo@c7P6vP3cNjIY503J+Kh!_D(F`z;zB_zS)-X zT<+*ww#A8;b$;jx2XEV=d%$8Bn@v;R)-CFlL+U2g*M4IS*Dm@N!0R*T3faYk!vJgl zUBVj5j(a;bC1Fy#jb-S8)h4tI&Lu6uP?AjGXw3`v zz+^{7Cih6Ceh=0K-;t({*4jJZ$Asg0tet3m|ENNamg6_^So2?VQcGKYUV6|;P|ZzJ zFoPufQ!!4DJd$AJ`T$uv0U9mcxI?prU!#%JZmKF=e+ei5KHkU4-g&9+fw~?w4F`w5 z0EZ@3*$*l^B$8@Ap*5+75ZaUKqXP+Yx{#pvu0wSVbPOoi&`BX(N%c-ZcV|L9fRGrj z2~f*+DH_pJA3*{{y?R5h%jBi0ml--fs@$VJ(U7ZQ$hDxdzLo$!nXZ$mKN@%=3>*mR zzDe3(%g5TWSL(UAMTAB3+^(-os|m!zov61KdJmB|5!pvV2ze-gd^Z|=FAN?&8Qc;E z4+p{b&kB9ylh8>>d=euGEoTKY+BA=?Q69(62jh602zwAGFb|so(;(;n0cIjj%sh${ z7(Gs49>)pHWSqdH;shogCooUq1ZFBuV5Xb?ezrxwpHI&RGjaN4&3+P0 z{g2-8<}%IUi+Vi|y&C;AP6W2&qUIXsc~M^!2@QVqzdXJ420z timeout: + return True + else: + return False + + +def get_heartbeat(provider): + tag_to_write = "%sSystem/wbsckt_heartbeat_interval" % (provider) + current_time = system.date.now() + system.tag.writeAsync([tag_to_write], [current_time]) diff --git a/ignition/script-python/AWS/heartbeat/resource.json b/ignition/script-python/AWS/heartbeat/resource.json new file mode 100644 index 0000000..28c2e4f --- /dev/null +++ b/ignition/script-python/AWS/heartbeat/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2024-01-03T17:08:37Z" + }, + "lastModificationSignature": "6e1c22e408ad5be09f49b6225f9fc8a9bd275847ce78e6a636268e829695a632", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/AWS/message_types/code.py b/ignition/script-python/AWS/message_types/code.py new file mode 100644 index 0000000..56654e5 --- /dev/null +++ b/ignition/script-python/AWS/message_types/code.py @@ -0,0 +1,302 @@ +from datetime import datetime +import Queue +import copy + +"""Global variables required so we can use different event timer scripts to perform +the writing of tag values seperateley from the reading of messages on the web socket. +State tags messages are queued into the global_queue, where they are read on a different +thread by the Update class and writen to tags. All alarms are written to global_alarms. +The alarms are then read by the Visualisation.status class where they are transformed into +an alarm state and written to tags. """ + +global_alarms = {} +global_states = set([]) +global_queue = Queue.Queue(maxsize=100000) +global_first_connect = False + + +class A2C_MessageHandler(): + """ + Handles the incoming A2C messages. Stores values in memory as dictionaries + and then writes them to tags. + + Instance Attributes: + self.alarms: Holds the current active alarm data(dict). + self.state: Holds the current active state data(dict). + self.update_state: Flag, set when state data is available to write(bool) + self.update_alarms: Flag, set when alarm data is available to write(bool) + self.whid: Warehouse id for the site(str) + self.tag_provider: Tag provider to write tag values to(str) + self.A2C_MESSAGE_TYPES: Holds a reference to the methods called + for different message types(dict) + + Returns: + NA. + + Raises: + KeyError: NA. + """ + def __init__(self, whid): + global global_alarms + global global_first_connect + global_first_connect = False + global_alarms = {} + self.whid = whid + self.tag_provider = "[%s_SCADA_TAG_PROVIDER]" % (self.whid) + self.logger = system.util.getLogger("%s-Web-Socket-Message-Handler" % (self.whid)) + tag_to_read = "%sSystem/wbsckt_logging" % (self.tag_provider) + self.check_logger_active = system.tag.readBlocking([tag_to_read])[0].value + self.A2C_MESSAGE_TYPES = { + "SCADAMetricsInterface.StateChange": self.handle_state_message, +# "SCADAMetricsInterface.Event": self.handle_alarm_message, + "CloudMetricsInterface.Event": self.handle_alarm_message, + "ScadaCloud.Download": self.handle_download_message, + "ScadaCloud.Connection": self.handle_cloud_connection} + + def message_logger(self, message): + if self.check_logger_active: + self.logger.info(message) + + def message_lookup(self, message_type, message): + try: + self.A2C_MESSAGE_TYPES[message_type](message) + except KeyError as e: + self.message_logger("Message type not found:" + + str(message)) + + def handle_message(self, message): + heartbeat_message = message.get("action") + message_type = message.get("payload", {}).get("payloadType") + format = message.get("payload", {}).get("format") + if message_type == "ScadaCloud.Batch": + messages = message.get("payload", {}).get("messages",[]) + for i in messages: + message_type = i.get("payload", {}).get("payloadType") + self.message_lookup(message_type, i) + elif message_type !="ScadaCloud.Batch" and not heartbeat_message: + self.message_lookup(message_type, message) + else: + self.message_logger("Heartbeat:" + str(message)) + tag_to_write = "%sSystem/wbsckt_heartbeat_interval" % (self.tag_provider) + current_time = system.date.now() + system.tag.writeAsync([tag_to_write], [current_time]) + + + def handle_alarm_message(self, message): + global global_alarms + header = message.get("header",{}) + payload = message.get("payload",{}) + source = header.get("sourceId") + alarm_message = payload.get("message") + alarm_type = payload.get("type") + timestamp = payload.get("timestamp") + priority = payload.get("priority") + alarm_id = payload.get("id") + shelve_expiry = payload.get("shelveExpiryEpoch",0) + state = payload.get("state") + if (isinstance(source, unicode) and isinstance(alarm_message, unicode) + and isinstance(alarm_type, int)and isinstance(timestamp, long) + and isinstance(priority, int) and isinstance(shelve_expiry, int) + and isinstance(state, int)) and isinstance(alarm_id, int): + scada_alarm_message = {"sourceId": source, + "message": alarm_message, + "type": alarm_type, + "timestamp": timestamp, + "priority": priority, + "id": alarm_id, + "shelveExpiryEpoch": shelve_expiry, + "state": state} + alarm_id = "%s/alarm/%s" % (source, alarm_id) + if state == 0: + removed_value = global_alarms.pop(alarm_id, "No key found") + self.message_logger("Value removed from aws_data: " + + str(removed_value) + ":" + str(alarm_id)) + else: + global_alarms[alarm_id] = scada_alarm_message + self.message_logger("Value added to aws_data: " + + str(scada_alarm_message)) + else: + self.message_logger("Incorrect type value in message fields: " + + str(message)) + + def handle_state_message(self, message): + global global_queue + header = message.get("header",{}) + payload = message.get("payload",{}) + source_id = header.get("sourceId") + state = payload.get("currentMachineState") + time_stamp = payload.get("timestamp") + if isinstance(source_id, unicode) and isinstance(state, int): + scada_state_message = {"timestamp": time_stamp, + "state":state} + global_queue.put([source_id, state]) + self.message_logger("State message written to queue: " + + str({source_id:scada_state_message})) + else: + self.message_logger("Incorrect type value in message fields: " + + str(message)) + + def handle_download_message(self, message): + url = message.get("payload", {}).get("downloadUrl", None) + session_id = message.get("payload", {}).get("sessionId", None) + download = {} + payload = {"session_id":session_id, "url": url} + download["data"] = [payload] + tag_to_write = "%sSystem/download" % (self.tag_provider) + json_payload = system.util.jsonEncode(download) + system.tag.writeAsync([tag_to_write], [json_payload]) + self.message_logger("Download message received: " + + str(message)) + def handle_cloud_connection(self, message): + global global_alarms + UNKNOWN = 3 + ACTIVE = 1 + header = message.get("header",{}) + payload = message.get("payload",{}) + component_type = payload.get("componentType") + timestamp = header.get("timestamp", 0) + event_type = payload.get("eventType") + component_id = payload.get("componentId") + scada_alarm_message = create_disconnect_message(component_id, timestamp, 1) + if event_type == "DISCONNECT": + self.message_logger(str(scada_alarm_message)) +# #Call disconnect routine with a value 3 which is an unknown state. + self.alarms_disconnect(component_id, UNKNOWN, scada_alarm_message) + if event_type == "CONNECT": + #Call disconnect routine with a value 1 which is an active state. + self.alarms_disconnect(component_id, ACTIVE, scada_alarm_message) + if event_type == "SYNC" and component_type == "PLC": + alarm_id = "%s/alarm/%s" % (component_id, message) + for k,v in global_alarms.items(): + if k.startswith(component_id): + global_alarms.pop(alarm_id, "No key found") + + def alarms_disconnect(self, component_id, value, message): + global global_alarms + #Set alarms in the global_alarms to an unknown state. + #If component id == "DATABRIDGE" set all alarms to unknown + SITE_DISCONNECTS = ["DATABRIDGE", self.whid] + if component_id in SITE_DISCONNECTS: + site_disconnect = True + source_id = "" + else: + source_id = component_id + site_disconnect = False + for k,v in global_alarms.items(): + device_name = k.split("/")[0] + if k.startswith(source_id) and device_name not in SITE_DISCONNECTS: + global_alarms[k]["state"] = value + alarm_id = "%s/alarm/%s" % (component_id, "Device disconnected") + #Set the alarms to true for device disconnects + if site_disconnect: + data_bridge_disconnect(self.whid, value, message, component_id) + else: + tag_path = "%s%s/DCN" % (self.tag_provider, source_id) + if value == 3: + create_disconnect_tags(self.whid, source_id) + global_alarms[alarm_id] = message + system.tag.writeBlocking([tag_path], [1]) + else: + global_alarms.pop(alarm_id, "No key found") + system.tag.writeBlocking([tag_path], [0]) + +def create_disconnect_message(component_id, timestamp, state): + alarm_message = {"sourceId": component_id, + "message": "Device disconnected", + "type": 0, + "timestamp":timestamp, + "priority": 4, + "shelveExpiryEpoch": 0, + "state": state} + return alarm_message + +def data_bridge_disconnect(whid, value, message, component_id): + global global_alarms + device_list = get_device_list(whid) + time_stamp = message.get("timestamp") + tags_to_write = [] + values_to_write = [] + if value == 3: + disconnect = True + else: + disconnect = False + for i in device_list: + create_disconnect_tags(whid, i) + alarm_id = "%s/alarm/%s" % (i, "Device disconnected") + tag_path = "[%s_SCADA_TAG_PROVIDER]%s/DCN" % (whid, i) + device_message = create_disconnect_message(i, time_stamp, 3) + tags_to_write.append(tag_path) + if disconnect: + global_alarms[alarm_id] = device_message + values_to_write.append(1) + else: + global_alarms.pop(alarm_id, "No key found") + values_to_write.append(0) + alarm_id = "%s/alarm/%s" % (component_id, "Device disconnected") + if disconnect: + global_alarms[alarm_id] = message + else: + global_alarms.pop(alarm_id, "No key found") + system.tag.writeAsync(tags_to_write, values_to_write) + +def get_device_list(whid): + provider = "[%s_SCADA_TAG_PROVIDER]" % (whid) + tag_path = "%sConfiguration/DetailedViews" % (provider) + tags_to_read = system.tag.readBlocking([tag_path]) + devices = system.util.jsonDecode(tags_to_read[0].value) + device_list = [] + for k,v in devices.items(): + for i in v: + device_list.append(i) + return device_list + +def create_disconnect_tags(whid, component_id): + logger_name = "%s-Create-Disconnect-Tags" % (whid) + logger = system.util.getLogger(logger_name) + base = "[%s_SCADA_TAG_PROVIDER]%s" % (whid, component_id) + if not system.tag.exists(base + "/DCN"): + tag = {"name": "DCN", + "valueSource": "memory", + "dataType": "Boolean", + "value": True} + create_tag = system.tag.configure(base, tag) + if not create_tag[0].isGood(): + logger.warn("Failed to create tag: " + str(source_id)) + +class Update(): + def __init__(self): + tags_to_read = system.tag.readBlocking(["Configuration/FC"]) + self.fc = tags_to_read[0].value + self.tag_provider = "[%s_SCADA_TAG_PROVIDER]" % (self.fc) + self.tags_to_write = [] + self.values_to_write = [] + self.logger = system.util.getLogger("%s-Global variable reader" + % (self.fc)) + def read_messages_from_queue(self): + size = global_queue.qsize() + self.logger.info("Queue size: " + str(size)) + for i in range(0, size): + message = global_queue.get() + source_id ="%s%s/STATE" % (self.tag_provider, message[0]) + create_tags_in_place(source_id, message[1], self.logger) + self.tags_to_write.append(source_id) + self.values_to_write.append(message[1]) + + def write_tags(self): + alarm_path = "%sSystem/aws_data" % ( self.tag_provider) + alarm_data = system.util.jsonEncode(global_alarms) + self.tags_to_write.append(alarm_path) + self.values_to_write.append(alarm_data) + system.tag.writeBlocking(self.tags_to_write, self.values_to_write) + self.logger.info("State messages written: " + str(len(self.values_to_write))) + +def create_tags_in_place(source_id, value, logger): + base = source_id.replace("/STATE", "") + if not system.tag.exists(source_id): + tag = {"name": "STATE", + "valueSource": "memory", + "dataType": "Int1", + "value": value} + create_tag = system.tag.configure(base, tag) + if not create_tag[0].isGood(): + logger.warn("Failed to create tag: " + str(source_id)) \ No newline at end of file diff --git a/ignition/script-python/AWS/message_types/resource.json b/ignition/script-python/AWS/message_types/resource.json new file mode 100644 index 0000000..d72098b --- /dev/null +++ b/ignition/script-python/AWS/message_types/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-07-20T06:46:28Z" + }, + "lastModificationSignature": "c4ee22c6dbd2bbbd8ce428267e611350570675d37b3f9523b8bd60f3ab930aa7", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/AWS/s3/code.py b/ignition/script-python/AWS/s3/code.py new file mode 100644 index 0000000..9c230b5 --- /dev/null +++ b/ignition/script-python/AWS/s3/code.py @@ -0,0 +1,879 @@ +import com.amazonaws.services.s3.AmazonS3ClientBuilder as AmazonS3ClientBuilder +import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest as GeneratePresignedUrlRequest +import com.amazonaws.HttpMethod as HttpMethod + +import boto3 +from botocore.client import BaseClient +from botocore.exceptions import ClientError +import json +from pprint import pformat +from urllib2_aws4auth import aws_urlopen, Request +from urllib2 import HTTPError +from urllib import urlencode +from helper.helper import sanitize_tree +from loggerConfig import getLogger + +REGION_NAME = 'us-east-1' +LOGGER = getLogger('S3Manager', 'debug') + +def getPresignedURL(self, objectKey): + """ + Generates a uri to retrieve images from an S3 bucket. + Bucket names are globally unique so different regions + must use a prefix for the bucket name. + Region and prefix are stored as custom session variables. + + Args: + self: Refrence to the object calling the function. + param2: key to the s3 object returned. + + Returns: + s3 Url to display the image in S3. + + Raises: + KeyError: None. + """ + + + bucket_names = {"eu":"ignition-image-repo", "na":"ignition-image-repo-na", + "jp":"jp-ignition-image-repo"} + +# aws = system.tag.readBlocking("Configuration/aws")[0].value +# aws = system.util.jsonDecode(aws) +# clientRegion = aws.get("region") +# prefix = aws.get("prefix") + clientRegion = self.session.custom.aws.region + prefix = self.session.custom.aws.prefix + + + bucketName = bucket_names.get(prefix, "ignition-image-repo") + + s3Client = AmazonS3ClientBuilder.standard().withRegion(clientRegion).build(); + generatePresignedUrlRequest = GeneratePresignedUrlRequest(bucketName, objectKey).withMethod(HttpMethod.GET); + url = s3Client.generatePresignedUrl(generatePresignedUrlRequest); + + return url + +S3_REPO_BUCKET_NAME = 'ignition-image-repo-na' +S3_SOURCE_BUCKET_NAME = 'ignition-image-source-na' +# api stage config +API_STAGES = ['beta', 'prod'] +API_REGIONS = ['na', 'eu'] +STAGE_CONFIG = { + 'beta': { + 'na': { + 'region': 'us-east-1', + 'lambda_name': 'RMESDScadaS3ManagementFlaskLambda-beta', + 'endpoint': 'https://us-east-1.beta.scada-s3-management.scada.eurme.amazon.dev/', + 'repo_bucket': 'ignition-image-repo-na', + 'source_bucket': 'ignition-image-source-na', + 's3_region': 'us-east-1', + 'account_id': '006306898152', + 'api_call_role': 'arn:aws:iam::604741092380:role/RMESDScadaS3ManagementAPIcallRole-beta-us-east-1' + }, + 'eu': { + 'region': 'eu-west-2', + 'lambda_name': 'RMESDScadaS3ManagementFlaskLambda-beta', + 'endpoint': 'https://eu-west-2.beta.scada-s3-management.scada.eurme.amazon.dev/', + 'repo_bucket': 'ignition-image-repo', + 'source_bucket': 'ignition-image-source', + 's3_region': 'eu-west-1', + 'account_id': '006306898152', + 'api_call_role': 'arn:aws:iam::604741092380:role/RMESDScadaS3ManagementAPIcallRole-beta-eu-west-2' + } + }, + 'prod': { + 'na': { + 'region': 'us-east-2', + 'lambda_name': 'RMESDScadaS3ManagementFlaskLambda-prod', + 'endpoint': 'https://us-east-2.scada-s3-management.scada.eurme.amazon.dev/', + 'repo_bucket': 'ignition-image-repo-na', + 'source_bucket': 'ignition-image-source-na', + 's3_region': 'us-east-1', + 'account_id': '006306898152', + 'api_call_role': 'arn:aws:iam::609617486056:role/RMESDScadaS3ManagementAPIcallRole-prod-us-east-2' + }, + 'eu': { + 'region': 'eu-west-1', + 'lambda_name': 'RMESDScadaS3ManagementFlaskLambda-prod', + 'endpoint': 'https://eu-west-1.scada-s3-management.scada.eurme.amazon.dev/', + 'repo_bucket': 'ignition-image-repo', + 'source_bucket': 'ignition-image-source', + 's3_region': 'eu-west-1', + 'account_id': '006306898152', + 'api_call_role': 'arn:aws:iam::609617486056:role/RMESDScadaS3ManagementAPIcallRole-prod-eu-west-1' + } + } +} +OPERATION_MAP = { + 'download': { + 'method': 'GET', + 'reqd_args': ['bucket', 'obj_key'] + }, + 'get_presigned_url': { + 'method': 'GET', + 'reqd_args': ['bucket', 'obj_key'] + }, + 'list_objects': { + 'method': 'GET', + 'reqd_args': ['bucket'] + }, + 'list_object_versions': { + 'method': 'GET', + 'reqd_args': ['bucket'] + }, + 'list_object_delete_markers': { + 'method': 'GET', + 'reqd_args': ['bucket'] + }, + 'delete': { + 'method': 'DELETE', + 'reqd_args': ['bucket', 'obj_key'] + }, + 'upload': { + 'method': 'PUT', + 'reqd_args': ['bucket', 'obj_key', 'obj_data'] + }, + 'add_new_site': { + 'method': 'PUT', + 'reqd_args': ['site', 'bucket'] + }, + 'copy_single': { + 'method': 'POST', + 'reqd_args': ['source_bucket', 'dest_bucket', 'source_key', 'dest_key'] + }, + 'fetch_site_list': { + 'method': 'GET', + 'reqd_args': ['bucket'] + }, + 'fetch_object_list_by_site_and_bucket': { + 'method': 'GET', + 'reqd_args': ['site', 'bucket'] + }, + 'fetch_upload_url': { + 'method': 'PUT', + 'reqd_args': ['bucket', 'obj_key', 'region', 'content_type'] + }, + 'query_audit_table': { + 'method': 'POST', + 'reqd_args': [] + } +} + +class S3Manager(object): + """ + This class contains convenience methods for working with S3 objects from Ignition python 2.7 + """ + + def __init__(self, api_stage='prod', api_region_name='na', username='', profile_name=None): + """ + Instantiates an S3 Class. + + :param api_stage: str; (default='prod') api target stage (and default S3 folder) + :param api_region_name: str; (default='na') api target region (and account) + :param username: str; ignition session username (from `session.props.auth.user.userName`) + :return: None + """ + self._logger = LOGGER + # sanitize api stage and region values + if api_stage not in API_STAGES: + self._logger.info("`api_stage` must be one of: %s, received: %s" % (API_STAGES, api_stage)) + api_stage = 'prod' + if api_region_name not in API_REGIONS: + self._logger.info("`api_region_name` must be one of: %s, received: %s" % (API_REGIONS, api_region_name)) + api_region_name = 'na' + self._api_stage = api_stage + self._api_region_name = api_region_name + # grab stage config for this instance from global object + self._stage_config = STAGE_CONFIG.get(api_stage, STAGE_CONFIG['prod']).get(api_region_name, STAGE_CONFIG['prod']['na']) + d = self._stage_config + self._api_region = d.get('region', 'us-east-2') + self._s3_region = d.get('s3_region', 'us-east-1') + self._repo_bucket = d.get('repo_bucket', 'ignition-image-repo-na') + self._source_bucket = d.get('source_bucket', 'ignition-image-source-na') + self._lambda_name = d.get('lambda_name', 'RMESDScadaS3ManagementFlaskLambda-prod') + self._account_id = d.get('account_id', '006306898152') + self._endpoint = d.get('endpoint', 'https://us-east-2.scada-s3-management.scada.eurme.amazon.dev/') + self._service = 'execute-api' + if profile_name: + self._creds = boto3.Session(profile_name=profile_name).get_credentials() + # Define an opener method. The opener will apply AWS Sigv4 signing to requests + self._opener = aws_urlopen( + self._creds.access_key, + self._creds.secret_key, + self._api_region, + self._service, + session_token=self._creds.token, + verify=False + ) + else: + # DEVNOTE: As the API has been segregated from the AWS account for the dev server, assume a dedicated role here + sts_client = boto3.Session().client('sts') + role_arn = d.get('api_call_role', None) + if role_arn: + response = sts_client.assume_role(RoleArn=role_arn, RoleSessionName='ignition-s3-mgmt-client') + creds = response['Credentials'] + # Define an opener method. The opener will apply AWS Sigv4 signing to requests + self._opener = aws_urlopen( + creds['AccessKeyId'], + creds['SecretAccessKey'], + self._api_region, + self._service, + session_token=creds['SessionToken'], + verify=False + ) + else: + # use native boto3 creds if 'api_call_role' not defined in STAGE_CONFIG + self._creds = boto3.Session(profile_name=profile_name).get_credentials() + self._opener = aws_urlopen( + self._creds.access_key, + self._creds.secret_key, + self._api_region, + self._service, + session_token=self._creds.token, + verify=False + ) + self._headers = {'Content-type': 'application/json', 'X-Remote-User': username} + + def _send(self, operation='download', params={}, print_resp=False, **kwargs): + """ + private method to compile and send the request to api endpoint + + :param operation: str; api endpoint method for request (See `OPERATION_MAP` for options) + :param params: dict; dictionary of parameters to pass to request (See `OPERATION_MAP` for reqd args) + :param print_resp: bool; if True, the associated logger will receive a print statement of the raw response, pprint.format'd + :return resp: dict; response object from api + """ + l = self._logger + if operation not in OPERATION_MAP.keys(): + msg = 'operation "%s" is not a valid S3Manager operation! Options: %s' % (operation, list(OPERATION_MAP.keys())) + l.error(msg) + raise InvalidOperationS3Manager(msg) + op_config = OPERATION_MAP[operation] + method = op_config['method'] + reqd_args = op_config['reqd_args'] + missing_args = [x for x in reqd_args if x not in params.keys()] + if len(missing_args): + msg = 'The following required args were not provided in params for "%s" operation: %s' % (operation, missing_args) + l.error(msg) + raise InvalidParametersS3Manager(msg) + if method in ('GET', 'DELETE'): + querystring = '?%s' % urlencode(params) + payload = None + url = self._endpoint + operation + querystring + else: + try: + payload = json.dumps(params) + l.debug('payload for %s operation successfully serialized' % operation) + except: + payload = urlencode(params) + l.debug('payload for %s operation not serialized using json.dumps(), instead used urlencode()' % operation) + url = self._endpoint + operation + # Create a request object + req = Request(url=url, method=method, headers=self._headers, data=payload) + # open the request and process the read + try: + # use self._opener to sign and send the prepared request + resp = self._opener(req) + data = json.loads(resp.read()) + if print_resp: + l.info('Response data: %s' % pformat(sanitize_tree(data))) + return data + except HTTPError, e: + try: + body = json.loads(e.fp.read()) + e_msg = body.get('message', e.reason) + msg = 'Error sending S3Manager request: %s. Message: %s' % (str(e), e_msg) + l.error(msg) + raise HTTPErrorS3Manager(e.code, e_msg) + except AttributeError, e2: + # failed to extract reason or code from urllib2.HTTPError for some reason + import traceback + msg = 'Failed to extract reason and/or error code from urllib2.HTTPError. Trace: %s' % traceback.format_exc() + l.error(msg) + msg = 'Error sending S3Manager request: %s' % (str(e)) + l.error(msg)# raise HTTPErrorS3Manager(e.code, msg) + raise HTTPErrorS3Manager(400, msg) + + def upload(self, obj_data, obj_key, bucket=None, content_type='', region=None, **kwargs): + """ + Method to upload a JSON object to S3. Converts S3 to a compressed binary parquet file, then writes + the file to S3. + + :param obj_data: JSON data object to upload to S3 + :param obj_key: Path and object name of the object to create in S3 + :param bucket: S3 bucket to write data to. + :param content_type: str; 'application/json' for json files, 'image/svg+xml' for svg files + :param region: AWS region that hosts the target S3 bucket. + :return: Boto3 `put_object` response + """ + l = self._logger + if not bucket: + # if no bucket provided, use repo bucket name from stage config + bucket = self._repo_bucket + if not region: + # if no region provided, use region name from stage config + region = self._s3_region + l.info('Uploading %s dataset to bucket %s' % (obj_key, bucket)) + l.debug('++ Storing data file in S3') + operation = 'upload' + # check the suffix of obj_key and auto-populate content_type accordingly + if obj_key.endswith('json'): + content_type = 'application/json' + elif obj_key.endswith('svg'): + content_type = 'image/svg+xml' + elif obj_key.endswith('drawio'): + content_type = 'binary/octet-stream' + try: + if isinstance(obj_data, dict): + # serialize the object to a JSON string + obj_data = json.dumps(obj_data) + msg = '++ Uploading. Successfully serialized (json dump) object data for %s' % obj_key + l.debug(msg) + else: + msg = 'Uploading. Type of incoming object data: %s' % type(obj_data) + l.debug(msg) + except: + import traceback + msg = '++ Uploading. Error trying to serialize (json dump) object data: %s' % traceback.format_exc() + l.error(msg) + return msg +# params = { +# 'bucket': bucket, +# 'obj_key': obj_key, +# 'obj_data': obj_data, +# 'content_type': content_type, +# 'region': region +# } +# try: +# resp = self._send(operation, params, print_resp=kwargs.get('print_resp', False)) +# l.debug('** Uploading Complete. Successfully uploaded %s' % obj_key) +# return resp +# except HTTPErrorS3Manager, e: +# return {'code': e.code, 'message': e.message} + # DEVNOTE: As there is a 10mb limitation on payload size to API gateway calls, going to use the + # `fetch_upload_url` method to get a presigned upload link and upload via system.net.httpPut + # so the above code will be commented out to use the below code + params = { + 'bucket': bucket, + 'obj_key': obj_key, + 'region': region, + 'content_type': content_type + } + try: + upload_url = self.fetch_upload_url(**params) + l.debug('** Fetching Upload URL Complete for object key: %s' % obj_key) + except HTTPErrorS3Manager, e: + return {'code': e.code, 'message': e.message} + try: + # DEVNOTE: Test code below to upload to pre-signed S3 PUT url using urllib2_aws4auth module + # Create a request object using urllib2_aws4auth.Request and aws_urlopen methods + # see if this is limited like with the upload call to API gateway. + # system.net.httpPut call below is not limited + # Results: what works with `system.net.httpPut` fails with `urllib2_aws4auth` module (returns 400: BadRequest) + # if the file is > ~ 75 kb +# req = Request(url=upload_url, method='PUT', headers=self._headers, data=obj_data) +# resp = self._opener(req).read() +# msg = '** Successfully uploaded %s to %s bucket!\nResponse: %s' % (obj_key, bucket, pformat(resp)) + resp = system.net.httpPut(upload_url, putData=obj_data, contentType=content_type) + msg = '** Successfully uploaded %s to %s bucket!' % (obj_key, bucket) + l.debug(msg) + return {'code': 200, 'message': msg} + except Exception, e: + msg = '++ Error uploading %s to %s bucket: %s' % (obj_key, bucket, str(e)) + l.error(msg) + return {'code': 400, 'message': msg} + + def fetch_upload_url(self, obj_key, bucket=None, region=None, expiration=3600, content_type="image/svg+xml", **kwargs): + """ + Retrieves a pre-signed URL for the obj key and bucket and the `put_object` client method. + Caller then uses pre-signed URL to upload the file to S3 directly. + + :param obj_key: Path and object name of the object to create in S3 + :param bucket: S3 bucket to write data to. + :param region: AWS region that hosts the target S3 bucket. + :param expiration: int; number of seconds until the link expires (default = 3600, 1 hour) + :param content_type: str; the content-type of the object (default = 'image/svg+xml') + :return: str; presigned URL as string. + """ + l = self._logger + if not bucket: + # if no bucket provided, use repo bucket name from stage config + bucket = self._repo_bucket + if not region: + # if no region provided, use region name from stage config + region = self._s3_region + l.info('Fetching upload pre-signed URL for %s object in %s bucket' % (obj_key, bucket)) + operation = 'fetch_upload_url' + params = { + 'bucket': bucket, + 'obj_key': obj_key, + 'expiration': expiration, + 'region': region, + 'content_type': content_type + } + try: + resp = self._send(operation, params, print_resp=kwargs.get('print_resp', False)) + l.debug('** Fetching Upload URL Completed for %s' % obj_key) + return resp + except HTTPErrorS3Manager, e: + return {'code': e.code, 'message': e.message} + + def add_new_site(self, site=None, bucket='both', **kwargs): + """ + Adds a new site folder to either repo, source, or both buckets + + :param site: str; name of site/WHID. Must be 4 chars in format of "ABC1" + :param bucket: str; name of the bucket (S3_REPO_BUCKET_NAME, S3_SOURCE_BUCKET_NAME, or 'both') to add site folder to + if = 'both', then site folder will be added to both buckets + :return: dict; {'message': str} summarizing the folder add operation + """ + l = self._logger + l.info('Adding site %s folder' % (site)) + operation = 'add_new_site' + params = {'site': site, 'bucket': bucket} + try: + resp = self._send(operation, params, print_resp=kwargs.get('print_resp', False)) + l.debug('** Adding Site Complete. Successfully added %s to %s bucket(s)' % (site, bucket)) + return resp + except HTTPErrorS3Manager, e: + return {'code': e.code, 'message': e.message} + + def download(self, obj_key, bucket=None, region=None): + """ + Downloads a JSON object from S3. File is received as a compressed binary Parquet file + :param obj_key: Path and object name of the data stored in S3 + :param bucket: Bucket the target object is stored in. + :param region: AWS Region of the target bucket. + :return: JSON data object generated from the Parquet file stored in S3 + """ + l = self._logger + if not bucket: + # if no bucket provided, use repo bucket name from stage config + bucket = self._repo_bucket + if not region: + # if no region provided, use region name from stage config + region = self._s3_region + # - Only used for logging; extract dates and data source from the object key + obj_key_parts = obj_key.split('/') + l.info('-- Downloading %s object from bucket %s' % (obj_key, bucket)) + operation = 'download' + params = { + 'bucket': bucket, + 'obj_key': obj_key, + 'region': region + } + try: + resp = self._send(operation, params) + return resp + except HTTPErrorS3Manager, e: + return {'code': e.code, 'message': e.message} + + def get_presigned_url(self, bucket=None, obj_key='', client_method='get_object', expiration=3600, region=None, content_type="text/plain"): + """ + Generate a presigned URL to object from S3. + Used primarily for retreiving image objects in Ignition + + :param obj_key: str; uri of object to fetch + :param bucket_: str; bucket name where object resides + :param client_method: str; (default = 'get_object') + :param expiration: int; number of seconds until the link expires (default = 3600, 1 hour) + :param content_type: str; the content-type of the object (default = 'text/plain') + :return: str; presigned URL as string. If no client_method or error, returns None. + """ + l = self._logger + if not bucket: + # if no bucket provided, use repo bucket name from stage config + bucket = self._repo_bucket + if not region: + # if no region provided, use region name from stage config + region = self._s3_region + if not content_type: + msg = 'content_type cannot be null!' + l.error(msg) + raise InvalidParametersS3Manager(msg) + l.info('Fetching pre-signed url for %s from bucket %s' % (obj_key, bucket)) + operation = 'get_presigned_url' + params = { + 'bucket': bucket, + 'obj_key': obj_key, + 'client_method': client_method, + 'expiration': expiration, + 'content_type': content_type + } + try: + resp = self._send(operation, params) + return resp + except HTTPErrorS3Manager, e: + return {'code': e.code, 'message': e.message} + + def delete(self, obj_key, bucket=None, region=None): + """ + Deletes a JSON object from S3. File is flagged for deletion in the S3 bucket + :param obj_key: Path and object name of the data stored in S3 + :param bucket: Bucket the target object is stored in. + :param region: AWS Region of the target bucket. + :return: Boto3 `delete_object` response + """ + l = self._logger + if not bucket: + # if no bucket provided, use repo bucket name from stage config + bucket = self._repo_bucket + if not region: + # if no region provided, use region name from stage config + region = self._s3_region + l.info('Deleting %s object from bucket %s' % (obj_key, bucket)) + operation = 'delete' + params = { + 'bucket': bucket, + 'obj_key': obj_key, + 'region': region + } + try: + resp = self._send(operation, params) + l.debug('** Complete. Successfully deleted %s' % obj_key) + return resp + except HTTPErrorS3Manager, e: + return {'code': e.code, 'message': e.message} + + def list_objects(self, bucket=None, prefix='', start_after='', region=None): + """ + Fetches a list of objects within a specified bucket, prefix, and starting point + + :param bucket: str; Bucket target object is located + :param prefix: str; Limits the response to keys that begin with the specified prefix + :param start_after: str; StartAfter is where you want Amazon S3 to start listing from. + Amazon S3 starts listing after this specified key. StartAfter can be any key in the bucket. + :param region: Region of the target S3 Bucket + :return: Boto3 `list_objects_v2.Contents` response. This consists of the following keys per object returned: + { + 'ETag': str; unique id, + 'Key': str; path to object in bucket, + 'LastModified': datetime.datetime(); time object last modified, + 'Size': int; size in bytes of the object, + 'StorageClass': str; type of storage used on the object + } + """ + l = self._logger + if not bucket: + # if no bucket provided, use repo bucket name from stage config + bucket = self._repo_bucket + if not region: + # if no region provided, use region name from stage config + region = self._s3_region + l.info('Fetching list of objects from bucket %s' % bucket) + operation = 'list_objects' + params = { + 'bucket': bucket, + 'prefix': prefix, + 'start_after': start_after, + 'region': region + } + try: + resp = self._send(operation, params) + return resp + except HTTPErrorS3Manager, e: + return {'code': e.code, 'message': e.message} + + def list_object_versions(self, bucket=None, prefix='', region=None): + """ + Fetches a list of object versions within a specified bucket, prefix, and starting point + + :param bucket: str; Bucket target object is located + :param prefix: str; Limits the response to keys that begin with the specified prefix + :param region: Region of the target S3 Bucket + :return: Boto3 `list_object_versions.Versions` response. This consists of the following keys per object returned: + { + 'ETag': str; unique id, + 'IsLatest': bool; only true for the current version, + 'Key': str; path to object in bucket, + 'LastModified': datetime.datetime(); time object last modified, + 'Owner': {'DisplayName': str; name of owner/group, 'ID': str;,} + 'Size': int; size in bytes of the object, + 'StorageClass': str; type of storage used on the object, + 'VersionId': str; ID of object version + } + """ + l = self._logger + if not bucket: + # if no bucket provided, use repo bucket name from stage config + bucket = self._repo_bucket + if not region: + # if no region provided, use region name from stage config + region = self._s3_region + l.info('Fetching list of object versions from bucket %s' % bucket) + operation = 'list_object_versions' + params = { + 'bucket': bucket, + 'prefix': prefix, + 'region': region + } + try: + resp = self._send(operation, params) + return resp + except HTTPErrorS3Manager, e: + return {'code': e.code, 'message': e.message} + + def list_object_delete_markers(self, bucket=None, prefix='', region=None): + """ + Fetches a list of object delete markers within a specified bucket, prefix, and starting point + + :param bucket: str; Bucket target object is located + :param prefix: str; Limits the response to keys that begin with the specified prefix + :param region: Region of the target S3 Bucket + :return: Boto3 `list_object_versions.DeleteMarkers` response. This consists of the following keys per object returned: + { + 'IsLatest': bool; only true for the current version, + 'Key': str; path to object in bucket, + 'LastModified': datetime.datetime(); time object last modified, + 'Owner': {'DisplayName': str; name of owner/group, 'ID': str;,} + 'VersionId': str; ID of object version + } + """ + l = self._logger + if not bucket: + # if no bucket provided, use repo bucket name from stage config + bucket = self._repo_bucket + if not region: + # if no region provided, use region name from stage config + region = self._s3_region + l.info('Fetching list of object delete markers from bucket %s' % bucket) + operation = 'list_object_delete_markers' + params = { + 'bucket': bucket, + 'prefix': prefix, + 'region': region + } + try: + resp = self._send(operation, params) + return resp + except HTTPErrorS3Manager, e: + return {'code': e.code, 'message': e.message} + + def copy_single(self, source_bucket=None, dest_bucket=None, source_key='', dest_key='', region=None): + """ + Method to copy a single object from source bucket|key to destination bucket|key. + + :param source_bucket: str; Source bucket name to copy from + :param dest_bucket: str; Destination bucket name to copy to + :param source_key: str; Source object key name to copy + :param dest_key: str; Destination object key name to copy to + :param region: Region of the target S3 Bucket + :return: null or ClientError; returns null if successfully copied + """ + l = self._logger + if not source_bucket: + # if no source bucket provided, use repo bucket name from stage config + source_bucket = self._repo_bucket + if not dest_bucket: + # if no destination bucket provided, use repo bucket name from stage config + dest_bucket = self._repo_bucket + if not region: + # if no region provided, use region name from stage config + region = self._s3_region + l.info('Copying %s object from bucket %s to object %s in bucket %s' % (source_key, source_bucket, dest_key, dest_bucket)) + l.debug('++ Copying data in S3') + operation = 'copy_single' + params = { + 'source_bucket': source_bucket, + 'dest_bucket': dest_bucket, + 'source_key': source_key, + 'dest_key': dest_key, + 'region': region + } + try: + resp = self._send(operation, params) + l.debug('** Complete. Successfully copied object %s from bucket %s to object %s in bucket %s' % + (source_key, source_bucket, dest_key, dest_bucket)) + return resp + except HTTPErrorS3Manager, e: + return {'code': e.code, 'message': e.message} + + def fetch_site_list(self, bucket=None): + """ + This method will compile a list of all sites configured in the requested S3 bucket + + :param bucket: str; the S3 bucket to fetch sites from. (Default = S3_REPO_BUCKET_NAME) + :return: list; array of whids present in the S3 bucket + """ + l = self._logger + if not bucket: + # if no bucket provided, use repo bucket name from stage config + bucket = self._repo_bucket + l.info('Requesting site list for bucket: %s' % bucket) + operation = 'fetch_site_list' + params = { + 'bucket': bucket + } + try: + resp = self._send(operation, params) + l.debug('** Complete. Successfully returned %d sites for bucket %s' % (len(resp), bucket)) + return resp + except HTTPErrorS3Manager, e: + return {'code': e.code, 'message': e.message} + + def fetch_object_list_by_site_and_bucket(self, site='', bucket=None): + """ + This function fetches the list of file objects + from the S3 folder specified by the bucket and site args supplied. + + :param site: str; whid name of the site to fetch from + :param bucket: str; name of the bucket where the files reside + :return: Dict[str, Any]; {'instance_configs': Dict[str,Any], 'flow_views': List[str]} + """ + l = self._logger + if not bucket: + # if no bucket provided, use repo bucket name from stage config + bucket = self._repo_bucket + l.info('Requesting object list for site %s in bucket: %s' % (site, bucket)) + operation = 'fetch_object_list_by_site_and_bucket' + params = { + 'site': site, + 'bucket': bucket + } + try: + resp = self._send(operation, params) + l.debug('** Complete. Successfully returned object list for site %s on bucket %s' % (site, bucket)) + return resp + except HTTPErrorS3Manager, e: + return {'code': e.code, 'message': e.message} + + def query_audit_table(self, start_time = None, end_time = None, operation = None, copy_option = None, + destination_bucket = None, destination_view = None, destination_object_key = None, + destination_site = None, destination_stage = None, destination_version_id = None, + error_message = None, error_occurred = None, expires = None, + source_bucket = None, source_view = None, source_object_key = None, source_site = None, + source_stage = None, source_version_id = None, timestamp = None, username = None, + return_items_only = True, **kwargs): + """ + Query/scan the audit table and return records matching the supplied parameters + + :param start_time: Optional[Union[str,datetime]]; if provided, will define the beginning of the + time range to filter on the `timestamp` column. `timestamp` column is a string in the format + "%Y-%m-%d %H:%M:%S" + :param end_time: Optional[Union[str,datetime]]; if provided, will define the beginning of the + time range to filter on the `timestamp` column. `timestamp` column is a string in the format + "%Y-%m-%d %H:%M:%S" + :param operation: Optional[Union[str,List,Dict]]; match on operation column + :param copy_option: Optional[Union[str,List,Dict]]; match on copy_option column ('svg', 'json', 'both') + :param destination_bucket: Optional[Union[str,List,Dict]]; match on destination_bucket column + :param destination_view: Optional[Union[str,List,Dict]]; match on destination_view column + :param destination_object_key: Optional[Union[str,List,Dict]]; match on destination_object_key column + :param destination_site: Optional[Union[str,List,Dict]]; match on destination_site column + :param destination_stage: Optional[Union[str,List,Dict]]; match on destination_stage column + :param destination_version_id: Optional[Union[str,List,Dict]]; match on destination_version_id column + :param error_message: Optional[Union[str,List,Dict]]; match on error_message column + :param error_occurred: Optional[Union[bool,List,Dict]]; match on error_error_occurred column + :param expires: Optional[Union[str,List,Dict]]; match/filter on expires column + :param source_bucket: Optional[Union[str,List,Dict]]; match on source_bucket column + :param source_view: Optional[Union[str,List,Dict]]; match on source_view column + :param source_object_key: Optional[Union[str,List,Dict]]; match on source_object_key column + :param source_site: Optional[Union[str,List,Dict]]; match on source_site column + :param source_stage: Optional[Union[str,List,Dict]]; match on source_stage column + :param source_version_id: Optional[Union[str,List,Dict]]; match on source_version_id column + :param timestamp: Optional[Union[str,List,Dict]]; match/filter on timestamp column + (overridden by `start_time` and `end_time` args) + :param username: Optional[Union[str,List,Dict]]; match on username column + :param return_items_only: bool; if true, strip the `Items` from boto3 response, + if false, return the entire response object + :returns: List[Dict[str,Any]]; array of items that match the scan filters supplied + """ + l = self._logger + # build params to send to Lambda using `locals()`. I know it's frowned upon but I'm not trying to type all that!! + params = {k:v for k,v in locals().items() if k not in ('self', 'l', 'kwargs') and v not in (None, '')} + # override `operation` arg for pass to `_send` method, as the value to query is already packed in `params` + operation = 'query_audit_table' + try: + resp = self._send(operation, params) + l.debug('** Complete. Successfully queried audit table using supplied query params') + return resp + except HTTPErrorS3Manager, e: + return {'code': e.code, 'message': e.message} + + def check_user_site_permissions(self, whid = None, obj_key = None): + """ + Check if a given username has permissions to the site folder in the flow-view S3 bucket + + :param whid: str; warehouse id/site name to check + :param obj_key: str; [OPTIONAL] if provided, will check user permissions to the object key, rather than the whid + :return: Dict[str,Any]; { + 'code': int; 200 if the user has permissions, 403 if Forbidden to access + 'message': str; explanation to display, if needed. Will include necessary group memberships missing if Forbidden + } + """ + l = self._logger + operation = 'check_user_site_permissions' + params = {'whid': whid, 'obj_key': obj_key} + try: + resp = self._send(operation, params) + l.debug('** Complete. Successfully checked user site permissions on backend') + return resp + except HTTPErrorS3Manager, e: + return {'code': e.code, 'message': e.message} + + def fetch_user_site_permissions_and_area_list(self, username = None, stage_name = 'beta'): + """ + Fetch the sites for which the user has flow-view write permissions for the given stage. + Also fetches the list of "area" names that flow-views can be created for + + :param username: str; user alias/id to fetch sites for + :param stage_name: str; stage folder of flow-view resources to check permissions on + :return: Dict[str,Any]; response object including a list of sites and area names. + { + "code": int; 200 if successful call, 4** if user not found, + "sites": List[str]; List of site names, + "areas": List[str]; List of valid flow-view area names + } + """ + l = self._logger + operation = 'fetch_user_site_permissions_and_area_list' + params = {'username': username, 'stage_name': stage_name} + try: + resp = self._send(operation, params) + l.debug('** Complete. Successfully fetched user site permissions and area list') + return resp + except HTTPErrorS3Manager, e: + return {'code': e.code, 'message': e.message} + + def fetch_master_area_list(self): + """ + Download a master list of valid flow-view area names, stored in S3 + + :return: List[str]; returns list of area names + """ + l = self._logger + operation = 'fetch_master_area_list' + params = {} + try: + resp = self._send(operation, params) + l.debug('** Complete. Successfully fetched master area list') + return resp + except HTTPErrorS3Manager, e: + return {'code': e.code, 'message': e.message} + +class InvalidOperationS3Manager(Exception): + """ + Invalid operation requested for S3Manager class + """ + def __init__(self, code=400, msg='Invalid operation requested for S3Manager class'): + self.code = code + self.message = msg + + +class InvalidParametersS3Manager(Exception): + """ + Invalid parameters for S3Manager operation + """ + def __init__(self, code=400, msg='Invalid parameters for S3Manager operation'): + self.code = code + self.message = msg + + +class HTTPErrorS3Manager(Exception): + """ + HTTP Error for S3Manager Request + """ + def __init__(self, code=500, msg='HTTP Error Encountered Sending S3Manager Request'): + self.code = code + self.message = msg + \ No newline at end of file diff --git a/ignition/script-python/AWS/s3/resource.json b/ignition/script-python/AWS/s3/resource.json new file mode 100644 index 0000000..b8f77ee --- /dev/null +++ b/ignition/script-python/AWS/s3/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-25T17:46:20Z" + }, + "hintScope": 2, + "lastModificationSignature": "5a7b082c78cfdf0323520d25deb15b343d605711fb4d7a23b5e4d6cfaa333532" + } +} \ No newline at end of file diff --git a/ignition/script-python/AWS/secrets_manager/code.py b/ignition/script-python/AWS/secrets_manager/code.py new file mode 100644 index 0000000..5a3f367 --- /dev/null +++ b/ignition/script-python/AWS/secrets_manager/code.py @@ -0,0 +1,33 @@ +import json +import com.amazonaws.services.secretsmanager.AWSSecretsManager as AWSSecretsManager ; +import com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder as AWSSecretsManagerClientBuilder; +import com.amazonaws.services.secretsmanager.model.GetSecretValueRequest as GetSecretValueRequest; +import com.amazonaws.services.secretsmanager.model.GetSecretValueResult as GetSecretValueResult; + +def get_secret(whid, secret_name): + logger_name = "%s-Secrets Manager" % (whid) + logger = system.util.getLogger(logger_name) + logger.info("Getting secret from Secrets Manager") + ec2_name = system.tag.readBlocking(["[System]Gateway/SystemName"])[0].value + secretClient = AWSSecretsManagerClientBuilder.standard().build() + getSecretValueRequest = GetSecretValueRequest().withSecretId(secret_name) + + try: + getSecretValueResponse = secretClient.getSecretValue(getSecretValueRequest).getSecretString() + secrets_dict = json.loads(getSecretValueResponse) + beta_gateway_name = secrets_dict.get("beta-gateway-name") + if ec2_name == beta_gateway_name: + api_id = secrets_dict.get("beta-api-id") + stage = secrets_dict.get("beta-stage") + account_id = secrets_dict.get("beta-account-id") + function_url = secrets_dict.get("beta-history-function-url") + else: + api_id = secrets_dict.get("prod-api-id") + stage = secrets_dict.get("prod-stage") + account_id = secrets_dict.get("prod-account-id") + function_url = secrets_dict.get("prod-history-function-url") + return api_id, stage, account_id, function_url + except: + AWS.errors.error_handler(whid, "Secrets Manager") + + \ No newline at end of file diff --git a/ignition/script-python/AWS/secrets_manager/resource.json b/ignition/script-python/AWS/secrets_manager/resource.json new file mode 100644 index 0000000..4369205 --- /dev/null +++ b/ignition/script-python/AWS/secrets_manager/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "jmmclela", + "timestamp": "2023-11-14T22:31:40Z" + }, + "hintScope": 2, + "lastModificationSignature": "934f3557446acab5dc2cde093201ef9cafc777ac72469d011c854032c0f5a3ab" + } +} \ No newline at end of file diff --git a/ignition/script-python/AWS/wbsckt_abort/code.py b/ignition/script-python/AWS/wbsckt_abort/code.py new file mode 100644 index 0000000..e8d6d02 --- /dev/null +++ b/ignition/script-python/AWS/wbsckt_abort/code.py @@ -0,0 +1,54 @@ +import time + +def close_websckt(): + """ + This function disconnects the web socket and exits any loops. + Should be called when a project is saved or modified to stop + multiple threads running. + + Args: + None + + Returns: + N/A + + Raises: + N/A + """ + + fc = system.tag.readBlocking(["Configuration/FC"]) + fc_value = fc[0].value + tag_provider = "[%s_SCADA_TAG_PROVIDER]" % (fc_value) + system.tag.writeBlocking([tag_provider + "System/close_socket"],[0]) + running = system.util.getGlobals().get(fc_value, {}).get("wbsckt_running", 0) + if running: + system.util.getGlobals()[fc_value]["wbsckt_running"] = False + system.tag.writeBlocking(tag_provider + "System/wbsckt_running", [0]) + time.sleep(2) + system.tag.writeBlocking([tag_provider + "System/close_socket"],[1]) + logger = system.util.getLogger("%s-WebSocket-Restart" % (fc)) + logger.info("Web-Socket closed due to restart, AWS.wbsckt_abort.close_websckt()") + +def check_web_socket(): + """ + This function checks to see if the "System/close_socket" tag is active + (boolean on) or inactive (boolean off). If the tag is active the web + socket will run, if it is inactive then the web socket will stop running. + This function is called from the main web socket gateway event. + Used to exit the web socket gateway event. + + Args: + None + + Returns: + True or False + + Raises: + N/A + """ + request_to_close = system.tag.readBlocking(["System/close_socket"]) + request_to_close_val = request_to_close[0].value + if not request_to_close_val: + return True + else: + return False diff --git a/ignition/script-python/AWS/wbsckt_abort/resource.json b/ignition/script-python/AWS/wbsckt_abort/resource.json new file mode 100644 index 0000000..6532f6a --- /dev/null +++ b/ignition/script-python/AWS/wbsckt_abort/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2024-01-03T17:07:56Z" + }, + "lastModificationSignature": "eff3963e3051fede56c53b722d7baf59b4b245bac4207db9be68500feac7abed", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/AWS/web_socket/code.py b/ignition/script-python/AWS/web_socket/code.py new file mode 100644 index 0000000..5ab8a80 --- /dev/null +++ b/ignition/script-python/AWS/web_socket/code.py @@ -0,0 +1,211 @@ +import java.net.http.WebSocketHandshakeException +from java.net.http import HttpClient; +from java.net.http import WebSocket; +from java.net import URI +from java.lang import Thread +import uuid +import json +import time + +#Check for a http client stored in the globals. +whid = system.tag.readBlocking(["Configuration/FC"])[0].value +client = system.util.getGlobals().get(whid, {}).get("http_client", None) +#Store the http client as a global variable to be reused on project saves. +if not client: + client = HttpClient.newHttpClient() + system.util.getGlobals()[whid]["http_client"] = client + +class Listener(WebSocket.Listener): + """ + Creates a Listener for receiving web socket messages. + The mehtods in this class are standard Java methods + that have been overidden to include additional functionality. onOpen, + onText, onClose and onError are called by the class whenthe web socket + is opened, when the web socket receives data, + when the web socket is closed, when the web socket encounters an error, + respectively. Messages are sent from the web socket by calling the sendText + method on the Listener object. + + Args: + whid: Warehouse id for the tag provider (string). + message_handler: A message handler object which parses + the messages received from the onText + method (class) + + Returns: + Listener object. + + Raises: + Error handling is performed by the onError method. + This method can be overidden with additional logic + for handling errors detected by the Listener object. + """ + def __init__(self, whid, message_handler): + self.whid = whid + self.alarms = {} + self.tag_provider = "[%s_SCADA_TAG_PROVIDER]" % (self.whid) + self.logger = system.util.getLogger("%s-Web-Socket-Listener" % (self.whid)) + self.message = "" + self.message_handler = message_handler + + def onOpen(self, websocket): + #Generate uuid to help track the connection in aws. + uid = uuid.uuid4() + on_open_subscribe = json.dumps({"action": "subscribe", + "parameters": {"siteId": self.whid, + "clientName": str(uid)}} + ) + websocket.sendText(on_open_subscribe, True) + logger = system.util.getLogger("Web-Socket-OnOpen") + self.logger.info("message sent =" + str(on_open_subscribe)) + websocket.request(1) + + def onText(self, websocket, data, last): + self.message += str(data) + if not last: + websocket.request(1) + else: + json_message = json.loads(self.message) + self.message = "" + self.message_handler.handle_message(json_message) + websocket.request(1) + + def onClose(self, websocket, error): + self.logger.info("Onclose method " + str(error)) + + def onError(self, websocket, error): + self.logger.error("OnError method " + str(error)) + + +def web_socket_main(whid, provider, region, message_handler, secret_name): + """ + Main function for running a web socket. This function can + be called in an asynchronous thread and should only exit + when the socket has been closed or an error is encountered. + The function will create a web socket object and run in a + while loop to keep the socket connection open. + It will exit if an error is encounterd, the socket is manually + closed from the tag provider or the socket is closed. + + Args: + whid: Warehouse id for the tag provider (string). + provider: Tag provider that the web socket will use to write messages to/from (string). + region: The AWS region of the api endpoint. Usally the same region as the EC2 + running the web socket (string). + message_handler: message handler object used for parsing of the web socket messages (class). + secret_name : name of the secret to be passed into the web socket. This will retreive the api endpoint for AWS. + + Returns: + N/A. + Raises: + Secrets manager error + web socket error + """ + thread_name = str(Thread.getId(Thread.currentThread())) + system.tag.writeAsync([provider + "system/thread_id"],[thread_name]) + system.util.getGlobals()[whid]["wbsckt_running"] = True + system.tag.writeAsync([provider + "System/wbsckt_running"],[1]) + logger_name = "%s-web-socket-main" % (whid) + logger = system.util.getLogger(logger_name) + timer_end = None + timer_started = False + """The heartbeat is initalised with the current time on first connect + Each time a new heartbeat is recieved in AWS.message_types + the current time is written to the tag wbsckt_heartbeat_interval. + The websocket checks that a heartbeat has been recieved at least every 120 secs. + If a heartbeat is not recieved within the 120 sec duration the connection is closed and the loop will exit. + """ + AWS.heartbeat.get_heartbeat(provider) + tags_to_read = system.tag.readBlocking([provider + "System/wbsckt_heartbeat_interval"]) + wbsckt_heartbeat_interval = tags_to_read[0].value + #Return api endpoint from secrets manager. + API_ID, STAGE, ACC_ID, FUNC_URL = AWS.secrets_manager.get_secret(whid, secret_name) + + try: + credentials = AWS.credentials.assume_role(profile_name = "default", region = region, arn = ACC_ID, api_id = API_ID, stage = STAGE) + except: + AWS.errors.error_handler(whid, "AWS.credentials.assume_role") + return + + logger.info("Building URL ....") + url, headers = AWS.build_url.make_websocket_connection(API_ID, region, STAGE, credentials) + listener = AWS.web_socket.Listener(whid, message_handler) +# client = HttpClient.newHttpClient() + #set the client as global (stored in the system global variables). + global client + uri = URI.create(url) + logger.info(str(uri)) + logger.info("Building web-socket object ....") + wsBuilder = client.newWebSocketBuilder() + wsBuilder.header("Authorization", headers["Authorization"]) + wsBuilder.header("X-Amz-Date", headers["X-Amz-Date"]) + wsBuilder.header("X-Amz-Security-Token", headers["X-Amz-Security-Token"]) + + try: + wsObj = wsBuilder.buildAsync(uri, listener) + except: + AWS.errors.error_handler(whid, "Build web socket") + return + + web_socket = wsObj.get() + logger.info("Web socket object built, starting while loop ....") + running = 1 + + while True: + time.sleep(0.1) + if running == 1: + logger.info("While loop running ....") + running = 0 + + if AWS.heartbeat.check_heartbeat(provider, 70): + web_socket.sendClose(web_socket.NORMAL_CLOSURE, "Missing heartbeat") + logger.warn("socket closed , missing heartbeat") + web_socket.abort() + text_val = web_socket.sendText(str({"action":"abort"}), True) + break + + check_socket_closed_in_loop = AWS.wbsckt_abort.check_web_socket() + if check_socket_closed_in_loop: + web_socket.sendClose(web_socket.NORMAL_CLOSURE, "") + logger.info("socket close initiated") + # web_socket.abort() + text_val = web_socket.sendText(str({"action":"abort"}), True) + break + + if not timer_started: + timer_start = system.date.now() + timer_started = True + + timer_end = system.date.now() + time_diff = system.date.secondsBetween(timer_start, timer_end) + if time_diff >= wbsckt_heartbeat_interval: + send_heartbeat = True + timer_started = False + + if web_socket.isOutputClosed(): + logger.info("Websocket output closed") + break + + if web_socket.isInputClosed(): + logger.info("Websocket input closed") + break + + this_thread = system.tag.readBlocking(provider + "System/thread_id")[0].value + if this_thread != thread_name: + logger.warn("thread_id does not match current thread_id") + break + + tags_to_read = system.tag.readBlocking(["System/wbsckt_messages_send"]) + messages = system.util.jsonDecode(tags_to_read[0].value) + message_list = messages.get("message_list") + if message_list: + for i in message_list: + message_string = str(i) + formatted_string = message_string.replace("u'","'") + json_string = formatted_string.replace("'","\"") + web_socket.sendText(str(json_string), True) + logger.info("Message sent: " + str(json_string)) + system.tag.writeAsync(["System/wbsckt_messages_send"], "{}") + system.util.getGlobals()[whid]["wbsckt_running"] = False + web_socket.abort() + system.tag.writeBlocking([provider + "System/wbsckt_running"], [0]) \ No newline at end of file diff --git a/ignition/script-python/AWS/web_socket/resource.json b/ignition/script-python/AWS/web_socket/resource.json new file mode 100644 index 0000000..8d6ce88 --- /dev/null +++ b/ignition/script-python/AWS/web_socket/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2024-01-03T17:08:20Z" + }, + "lastModificationSignature": "5a18fd4c8b1e7e36931588bbbdc2757d380ef265ac9e7c4f3c14a5a3ee331059", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/AWS/web_socket_send/code.py b/ignition/script-python/AWS/web_socket_send/code.py new file mode 100644 index 0000000..2b69950 --- /dev/null +++ b/ignition/script-python/AWS/web_socket_send/code.py @@ -0,0 +1,21 @@ +import json + +class SendMessage(): + + def __init__(self, whid): + self.whid = whid + tag_path = "[%s_SCADA_TAG_PROVIDER]System/wbsckt_messages_send" % (whid) + tags_to_read = system.tag.readBlocking([tag_path]) + self.messages_to_send = system.util.jsonDecode(tags_to_read[0].value) + system.tag.writeBlocking([tag_path],[system.util.jsonEncode({})]) + self.message_list = {} + + def build_message_list(self): + if self.messages_to_send: + self.message_list = json.dumps(self.messages_to_send) + else: + self.message_list = None + + + + diff --git a/ignition/script-python/AWS/web_socket_send/resource.json b/ignition/script-python/AWS/web_socket_send/resource.json new file mode 100644 index 0000000..126bc06 --- /dev/null +++ b/ignition/script-python/AWS/web_socket_send/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol@amazon.co.uk", + "timestamp": "2022-07-11T20:22:46Z" + }, + "lastModificationSignature": "1ef21aee15ab7d94f66d670fcf45236316b1d4248612afa0bac7bdf33ac7bb67" + } +} \ No newline at end of file diff --git a/ignition/script-python/Alerts/code.py b/ignition/script-python/Alerts/code.py new file mode 100644 index 0000000..dd3e5d8 --- /dev/null +++ b/ignition/script-python/Alerts/code.py @@ -0,0 +1,17 @@ +def showAlert(state, title, message, showCloseBtn, btnTextPrimary, btnTextSecondary, btnIconPrimary, btnIconSecondary, btnIconAlignment="left", btnActionPrimary="", btnActionSecondary="", btnActionClose="", payload={}): + params = { + "state": state, + "title": title, + "message": message, + "showCloseBtn": showCloseBtn, + "btnTextPrimary": btnTextPrimary, + "btnTextSecondary": btnTextSecondary, + "btnIconPrimary": btnIconPrimary, + "btnIconSecondary": btnIconSecondary, + "btnIconAlignment": btnIconAlignment, + "btnActionPrimary": btnActionPrimary, + "btnActionSecondary": btnActionSecondary, + "btnActionClose": btnActionClose, + "payload": payload ## Added 2021-09-23 + } + system.perspective.openPopup(id="alertDialog", view="Alerts/alert", params=params, showCloseIcon=False, draggable=False, resizable=False, modal=True, overlayDismiss=True, btnActionPrimary="closePopup") diff --git a/ignition/script-python/Alerts/resource.json b/ignition/script-python/Alerts/resource.json new file mode 100644 index 0000000..b475503 --- /dev/null +++ b/ignition/script-python/Alerts/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "dmamani", + "timestamp": "2024-01-23T18:10:27Z" + }, + "lastModificationSignature": "7a1f5bf240b03932fa9f1da5ff719e54cd8aad2ba6ffe4a29842a4ac8980e496", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/Commands/analytics/code.py b/ignition/script-python/Commands/analytics/code.py new file mode 100644 index 0000000..fd6d3e2 --- /dev/null +++ b/ignition/script-python/Commands/analytics/code.py @@ -0,0 +1,15 @@ +def send_page_details(whid, session_id, pageId): + messages_to_send = {} + message_payload = {} + message_list = [] + time_stamp = system.date.toMillis(system.date.now()) + parameters = {"siteId":whid, "sessionId": session_id, + "pageId": pageId, "timestamp":time_stamp} + message_payload["parameters"] = parameters + message_payload["action"] = "pageview" +# message_payload["siteId"] = whid + message_list.append(message_payload) + messages_to_send["message_list"] = message_list + tag_provider = "[%s_SCADA_TAG_PROVIDER]" % (whid) + system.tag.writeBlocking([tag_provider + "System/wbsckt_messages_send"], + [system.util.jsonEncode(messages_to_send)]) \ No newline at end of file diff --git a/ignition/script-python/Commands/analytics/resource.json b/ignition/script-python/Commands/analytics/resource.json new file mode 100644 index 0000000..5847823 --- /dev/null +++ b/ignition/script-python/Commands/analytics/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-01-20T09:41:32Z" + }, + "hintScope": 2, + "lastModificationSignature": "f54fb1db84154cd6d8ee801d292ca54d38af2d4849e1060cce4ec430872509c5" + } +} \ No newline at end of file diff --git a/ignition/script-python/Commands/button_commands/code.py b/ignition/script-python/Commands/button_commands/code.py new file mode 100644 index 0000000..3c9a383 --- /dev/null +++ b/ignition/script-python/Commands/button_commands/code.py @@ -0,0 +1,122 @@ +def send_request(whid,actionCode,parameters): + """ + Creates the request to send to the web socket from a button in SCADA. + Args: + whid = identifier of the warehouse ie MAN2 + actionCode : possible actionCode as per MAP data model (int values): + 0 -> Not used + 1 -> Start + 2 -> Stop + 3 -> Reset + 4 -> Get + 5 -> Set + 6 -> Enable + 7 -> Disable + parameters = dictionary with the parameters of the command + {"commandTarget":id, + "commandCode":action, + "commandTimestamp":time_stamp, + "commandParams":""} + Returns: + a messsage that inform the user about there status of the request + """ + import sys + try: + loggerName=whid+ "_SCADA" + logger = system.util.getLogger(loggerName) + tag_provider = "[%s_SCADA_TAG_PROVIDER]" % (whid) + messages_to_send = {} + message_payload = {} + message_list = [] + returnMessage="" + time_stamp = system.date.toMillis(system.date.now()) + + payloadParams={} + if not parameters["commandTarget"] or parameters["commandTarget"] == "": + returnMessage = "Missing commandTarget parameter. Command can\'t be executed" + logger.trace(returnMessage) + return returnMessage + payloadParams["commandTarget"]=parameters["commandTarget"] + if not parameters["commandCode"] or parameters["commandCode"] == "": + returnMessage = "Missing commandCode parameter. Command can\'t be executed" + logger.trace(returnMessage) + return returnMessage + payloadParams["commandCode"]=parameters["commandCode"] + payloadParams["commandTimeout"]=2000 + payloadParams["commandTimestamp"]=time_stamp + payloadParams["commandParams"]=parameters["commandParams"] + + message_payload["parameters"] = payloadParams + message_payload["action"] = "command" + message_payload["siteId"] = whid + message_list.append(message_payload) + messages_to_send["message_list"] = message_list + system.tag.writeBlocking([tag_provider + "System/wbsckt_messages_send"], [system.util.jsonEncode(messages_to_send)]) + return "Message sent correctly" + + except: + exc_type, exc_obj, tb = sys.exc_info() + lineno = tb.tb_lineno + exceptionMessage=str(lineno)+" -> "+str(exc_type)+" -> "+str(exc_obj) + errorMessage = "Error while sending a command : "+exceptionMessage + logger.fatal(errorMessage) + return errorMessage + +def send_request_old_to_be_removed(whid, id, action): + + """ + Creates the request to send to the web socket from a button in SCADA. + + Args: + id =Unique material handling equipment id. + request = Type of request i.e Start, Stop, Reset. + Returns: + N/A + """ + """{"action": "command", "parameters": {"": "Reset", "siteId": "DNG2"}}""" + messages_to_send = {} + message_payload = {} + message_list = [] + time_stamp = system.date.toMillis(system.date.now()) + parameters = {"commandTarget":id, "commandCode":action, "commandTimestamp":time_stamp, + "commandToken":"", "commandTimeout":2000, "commandParams":""} + message_payload["parameters"] = parameters + message_payload["action"] = "command" + message_payload["siteId"] = whid + message_list.append(message_payload) + messages_to_send["message_list"] = message_list + tag_provider = "[%s_SCADA_TAG_PROVIDER]" % (whid) + system.tag.writeBlocking([tag_provider + "System/wbsckt_messages_send"], + [system.util.jsonEncode(messages_to_send)]) + + +def send_download_request(whid, filters, session_id): + + """ + Creates the request to download alarm history + to the web socket from a button in SCADA. + + Args: + whid = four character whid for the project + filters = filter string for passing with the download request. + These a re similar to the url parameters but do not need encoding. + session_id = unique session id of the perspective session. + Returns: + N/A + Example: + {"action":"download", "parameters":{"siteId":"FED1", "sessionId":"bob2", + "filter": "MinimumDuration=360000&Type=1"}} + """ + messages_to_send = {} + message_payload = {} + message_list = [] + time_stamp = system.date.toMillis(system.date.now()) + parameters = {"siteId":whid, "sessionId": session_id, "filter": filters} + message_payload["parameters"] = parameters + message_payload["action"] = "download" +# message_payload["siteId"] = whid + message_list.append(message_payload) + messages_to_send["message_list"] = message_list + tag_provider = "[%s_SCADA_TAG_PROVIDER]" % (whid) + system.tag.writeBlocking([tag_provider + "System/wbsckt_messages_send"], + [system.util.jsonEncode(messages_to_send)]) diff --git a/ignition/script-python/Commands/button_commands/resource.json b/ignition/script-python/Commands/button_commands/resource.json new file mode 100644 index 0000000..9e01f68 --- /dev/null +++ b/ignition/script-python/Commands/button_commands/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-01-19T16:21:04Z" + }, + "lastModificationSignature": "fd405bafcc137449ac9818d535f56c72a75d6c3b3f7013dd82718e19427e08c0", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/Commands/shelve_alarms/code.py b/ignition/script-python/Commands/shelve_alarms/code.py new file mode 100644 index 0000000..a26f93d --- /dev/null +++ b/ignition/script-python/Commands/shelve_alarms/code.py @@ -0,0 +1,31 @@ +def send_shelve_request(whid, ids, action, duration, messages): + + """ + Creates a alarm shelve request to send to the web socket from a button in SCADA. + + Args: + ids = List of strings. Unique material handling equipment ids. + request = String Type of request i.e Start, Stop, Reset. + Returns: + N/A + """ + """{"action": "shelve", "parameters": {"sourceId": "PLC01", "siteId": "DNG2", "durationMinutes": 2, + shelvedTime:""}}""" + messages_to_send = {} + message_list = [] + for i,j in enumerate(ids): + parameters = {} + message_payload = {} + parameters["sourceId"] = j + parameters["siteId"] = whid + parameters["id"] = messages[i] + if action == "shelve": + parameters["durationMinutes"] = duration + time_now = system.date.now() + parameters["shelvedTime"] = (system.date.toMillis(time_now)/1000) + message_payload["parameters"] = parameters + message_payload["action"] = action + message_list.append(message_payload) + messages_to_send["message_list"] = message_list + message_send_tag_path = "[%s_SCADA_TAG_PROVIDER]System/wbsckt_messages_send" % (whid) + system.tag.writeBlocking([message_send_tag_path],[system.util.jsonEncode(messages_to_send)]) diff --git a/ignition/script-python/Commands/shelve_alarms/resource.json b/ignition/script-python/Commands/shelve_alarms/resource.json new file mode 100644 index 0000000..d6f7f98 --- /dev/null +++ b/ignition/script-python/Commands/shelve_alarms/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-05-15T15:18:09Z" + }, + "lastModificationSignature": "3cc6d6da16acadaaa1c2d12218492b12b9cd6812c7c78cf8d4f9abaa79909428", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/DocStringTemplate/code.py b/ignition/script-python/DocStringTemplate/code.py new file mode 100644 index 0000000..d11998f --- /dev/null +++ b/ignition/script-python/DocStringTemplate/code.py @@ -0,0 +1,16 @@ +# This function is not intented to be called. This docstring template should be used on all function call. + +def docstring(): + """ + This is an example of Google style. + + Args: + param1: This is the first param. + param2: This is a second param. + + Returns: + This is a description of what is returned. + + Raises: + KeyError: Raises an exception. + """ diff --git a/ignition/script-python/DocStringTemplate/resource.json b/ignition/script-python/DocStringTemplate/resource.json new file mode 100644 index 0000000..ab22bf0 --- /dev/null +++ b/ignition/script-python/DocStringTemplate/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-04-26T12:37:38Z" + }, + "lastModificationSignature": "e3d335291c453a1a180e7900eb51042b49495a92256ea10921f736e4078c0306", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/FileHandler/downloader/code.py b/ignition/script-python/FileHandler/downloader/code.py new file mode 100644 index 0000000..f3228e2 --- /dev/null +++ b/ignition/script-python/FileHandler/downloader/code.py @@ -0,0 +1,96 @@ +# These scripts are use to download data from the igniton project into any file type. + + +def download_file(filename, data , converter): + """ + This script will download data from ignition perspective to the users computer. + + Args: + filename: The name of the file to be downloaded . + data: The data to be downloaded. May be a string, a byte[], or an InputStream. Strings will be written in UTF-8 encoding. + converter: This is a function that is used to convert the ignition data into the required format for the file. + If not conversion is required then pass a function that just returns original data. + + Returns: + None. + + Raises: + ValueError: Raises an Value erorr if no data or converter is provided. + """ + if not data: + raise ValueError("No data provided. Data is required to perform download ") + + if not converter: + raise ValueError("Please provide a data converter to transform the data") + + _data = converter(data) + system.perspective.download(filename, _data) + +def device_data_converter(data): + """ + This script converts a list of dicts to a dataset, it uses the first dict to set the column headers in the dataset. + + Args: + + data: List of dictionaries. + + Returns: + Ignition Data Set + + Raises: + None + """ + dataset = [] + for index,row in enumerate(data): + if index == 0: + header = row.keys() + row = [] + for i in header: + value = data[index][i] + row.append(value) + dataset.append(row) + + convert_data = system.dataset.toDataSet(header, dataset) + return system.dataset.toCSV(convert_data) + +def detailed_views_converter(data): + """ + This script converts a list of dicts to a dataset, it uses the first dict to set the column headers in the dataset. + + Args: + + data: List of dictionaries. + + Returns: + Ignition Data Set + + Raises: + None + """ + dataset = [] + for index,row in enumerate(data): + if index == 0: + header = row.keys() + row = [] + for i in header: + if i == "Devices": + value = array_to_string(data[index][i]) + else: + value = data[index][i] + row.append(value) + dataset.append(row) + + convert_data = system.dataset.toDataSet(header, dataset) + return system.dataset.toCSV(convert_data) + +def array_to_string(array , deliminator="#"): + converted = "" + if len(array) == 1: + return array[0] + for i , value in enumerate(array): + converted += value + if not i == len(array)-1: + converted += deliminator + + + return converted \ No newline at end of file diff --git a/ignition/script-python/FileHandler/downloader/resource.json b/ignition/script-python/FileHandler/downloader/resource.json new file mode 100644 index 0000000..0fdb9e0 --- /dev/null +++ b/ignition/script-python/FileHandler/downloader/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "sipearso", + "timestamp": "2024-05-23T11:48:44Z" + }, + "hintScope": 2, + "lastModificationSignature": "61634f4815f440496b3c48685393c8123ef710fe944496c420bc0e3a1c6a2dcd" + } +} \ No newline at end of file diff --git a/ignition/script-python/FileHandler/uploader/code.py b/ignition/script-python/FileHandler/uploader/code.py new file mode 100644 index 0000000..b440aeb --- /dev/null +++ b/ignition/script-python/FileHandler/uploader/code.py @@ -0,0 +1,64 @@ +import csv +from StringIO import StringIO + +def check_csv_file(event): + """ + This function checks if the CSV file was saved as CSV-UF8 settings if it has removes extra data bytes from the file. + + Args: + event : Containes the file data to be uploaded + + Returns: + a string representing the file that is to be uploaded. + + Raises: + None + """ + file_bytes = event.file.getBytes() + if bytearray.fromhex("ef bb bf") == bytearray(file_bytes[0:3]): + # Strip first three bytes + file_bytes = file_bytes[3:] + return file_bytes.tostring() + + +def add_device_btn_code(whid, event): + + reader = csv.DictReader(StringIO(FileHandler.uploader.check_csv_file(event))) + data ={} + def get_child(): + return { + "Area":"", + "SubArea":"" + } + + for i, v in enumerate(reader): + child = get_child() + child["Area"] = v["Area"] + child["SubArea"] = v["SubArea"] + data[v["Device"]]= child + + + system.tag.writeBlocking(["[%s_SCADA_TAG_PROVIDER]Configuration/PLC"%whid], system.util.jsonEncode(data)) + + return "Success" + +def add_detailed_view_btn_code(whid, event): + + reader = csv.DictReader(StringIO(FileHandler.uploader.check_csv_file(event))) + + data ={} + + def convert_dict_value_to_list(string): + device_list = [] + for i in string.replace("#", ",").split(","): + device_list.append(i.strip()) + return device_list + + for v in reader: + + data[v["DetailedView"]]= convert_dict_value_to_list(v["Devices"]) + + + system.tag.writeBlocking(["[%s_SCADA_TAG_PROVIDER]Configuration/DetailedViews"%whid], system.util.jsonEncode(data)) + + return "Success" \ No newline at end of file diff --git a/ignition/script-python/FileHandler/uploader/resource.json b/ignition/script-python/FileHandler/uploader/resource.json new file mode 100644 index 0000000..09ca2d9 --- /dev/null +++ b/ignition/script-python/FileHandler/uploader/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "sipearso", + "timestamp": "2024-05-23T11:48:43Z" + }, + "hintScope": 2, + "lastModificationSignature": "040f157b34b9a70fdb7dfc9b5c6b54395f48fd3db082da24908a2011a05d1b02" + } +} \ No newline at end of file diff --git a/ignition/script-python/Gateway/timer_scripts/code.py b/ignition/script-python/Gateway/timer_scripts/code.py new file mode 100644 index 0000000..138eeca --- /dev/null +++ b/ignition/script-python/Gateway/timer_scripts/code.py @@ -0,0 +1,59 @@ +def scada_web_socket_execute(): +#We read a list of tags at the beginning of the script for efficiency. + tags_to_read = system.tag.readBlocking(["Configuration/FC", "Configuration/aws"]) + whid = tags_to_read[0].value + aws_config = system.util.jsonDecode(tags_to_read[1].value) + region = aws_config.get("region") + logger = system.util.getLogger("%s-Web-Socket-Execute" % (whid)) + provider = "[%s_SCADA_TAG_PROVIDER]" % (whid) + AWS.create_tags.create_web_socket_tags(whid) + Latency.CreateLatencyTags.create_latency_tags(whid) # attempt to create latency lags + check_socket_closed_in_loop = AWS.wbsckt_abort.check_web_socket() + #Check the heartbeat and restart if not recieved within the specified time + check_heartbeat = AWS.heartbeat.check_heartbeat(provider, 120) + if check_heartbeat: + AWS.wbsckt_abort.close_websckt() + AWS.heartbeat.get_heartbeat(provider) + if whid == "" or whid == None: + raise ValueError("FC not configured. A project on the gateway is missing Configuration/FC id") + + elif not region: + raise ValueError("No aws region configured for project") + + elif check_socket_closed_in_loop: + logger.warn("Socket is closed check System/close_socket tag") + + else: + description = provider + "websocket api gateway" + set_global = system.util.getGlobals().setdefault(whid,{}) + running = system.util.getGlobals()[whid].get("wbsckt_running", 0) + if not running: + try: + message_handler = AWS.message_types.A2C_MessageHandler(whid) + args = [whid, provider, region, message_handler, "scada/api/endpoint"] + description = "%s-web-socket-api" + system.util.invokeAsynchronous(AWS.web_socket.web_socket_main, args, description ) + except: + AWS.errors.error_handler(whid, "Web-Socket-Execute") + +def update_execute(): + data = AWS.message_types.Update() + data.read_messages_from_queue() + data.write_tags() + +def status_execute(): + tags_to_read = system.tag.readBlocking(["Configuration/FC", "System/aws_data"]) + whid = tags_to_read[0].value + alarms_data = system.util.jsonDecode(tags_to_read[1].value) +# Alarm script + try: + if AWS.message_types.global_first_connect == False: + Visualisation.status.reset_alarms(whid) + Visualisation.status.global_previous_state = {} + AWS.message_types.global_first_connect = True + status = Visualisation.status.GetStatus(whid, alarms_data) + status.build_status() + status.write_data() + alarms.alarm_count.get_count(whid, alarms_data) + except: + AWS.errors.error_handler(whid, "Status-Visualisation-Script") \ No newline at end of file diff --git a/ignition/script-python/Gateway/timer_scripts/resource.json b/ignition/script-python/Gateway/timer_scripts/resource.json new file mode 100644 index 0000000..646816a --- /dev/null +++ b/ignition/script-python/Gateway/timer_scripts/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "iama", + "timestamp": "2024-04-11T17:40:47Z" + }, + "hintScope": 2, + "lastModificationSignature": "6a1c89ba2dd546d8818c1585c752e9f0cd936252bc930ebf7ad54d9b0490e19e" + } +} \ No newline at end of file diff --git a/ignition/script-python/Latency/CreateLatencyTags/code.py b/ignition/script-python/Latency/CreateLatencyTags/code.py new file mode 100644 index 0000000..daa117a --- /dev/null +++ b/ignition/script-python/Latency/CreateLatencyTags/code.py @@ -0,0 +1,53 @@ +def create_latency_tags(whid): + logger = system.util.getLogger("%s-Create-Latency-Tags" % (whid)) + if whid != "" and whid != None: + provider = "[%s_SCADA_TAG_PROVIDER]" % (whid) + tag_paths = {"avg_latency":{"name":"avg_latency", "valueSource": "memory", + "dataType": "String", "value" : ""}, + "aws_data_copy":{"name":"aws_data_copy", "valueSource": "reference", + "dataType": "String", "sourceTagPath": "[~]System/aws_data.value"}, + "first_pass":{"name":"first_pass", "valueSource": "memory", + "dataType": "Boolean", "value" : True}, + "last_alarm_change_ts":{"name":"last_alarm_change_ts", "valueSource": "memory", + "dataType": "DateTime", "formatString": "yyyy-MM-dd h:mm:ss aa"}, + "prev_key":{"name":"prev_key", "valueSource": "memory", + "dataType": "String", "value" : ""}, + "rolling_latency":{"name":"rolling_latency", "valueSource": "memory", + "dataType": "StringArray", "alarmEvalEnabled": True, + "value": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" ],}} + + for k,v in tag_paths.items(): + if not system.tag.exists("%sLatency/%s" % (provider, k)): + base_path = "%s/Latency" % (provider) + system.tag.configure(base_path, v) + logger.info("Created tag %s" % (k)) \ No newline at end of file diff --git a/ignition/script-python/Latency/CreateLatencyTags/resource.json b/ignition/script-python/Latency/CreateLatencyTags/resource.json new file mode 100644 index 0000000..221dc2f --- /dev/null +++ b/ignition/script-python/Latency/CreateLatencyTags/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "iama", + "timestamp": "2024-04-11T17:40:20Z" + }, + "hintScope": 2, + "lastModificationSignature": "bd5f35a173e029987f79b06f8c86895bf99383a1e4f3fc457b4499ddd1a0c4d8" + } +} \ No newline at end of file diff --git a/ignition/script-python/Latency/LatencyAvgCalculation/code.py b/ignition/script-python/Latency/LatencyAvgCalculation/code.py new file mode 100644 index 0000000..e674279 --- /dev/null +++ b/ignition/script-python/Latency/LatencyAvgCalculation/code.py @@ -0,0 +1,24 @@ +def AvgCalc(): + ## Code to calc avg latency. + whid = system.tag.readBlocking(["Configuration/FC"])[0].value + + # Read tag value + tag_values = system.tag.readBlocking(['[%s_SCADA_TAG_PROVIDER]Latency/rolling_latency'% whid])[0].value + + # Convert string timestamps to milliseconds + timestamps = [int(value) for value in tag_values] + + if 0 in timestamps: + return + else: + # Calculate the average latency in milliseconds + avg_latency = round(sum(timestamps) / len(tag_values), 3) + zero_list = [0]*30 + circular_buffer = '[%s_SCADA_TAG_PROVIDER]Latency/rolling_latency.value'% whid + avg_latency_path ='[%s_SCADA_TAG_PROVIDER]Latency/avg_latency'% whid + + # clear array to all 0's so we can wait to trigger until 30 new records have happened and write new avg + system.tag.writeBlocking([avg_latency_path,circular_buffer], [avg_latency,zero_list]) # writing the avg_latency back to tag on purpose for visual. + + # Call Dynamodb write script, passing in site and latency to be written. + Latency.WriteToDynamo.DynamoWriter(whid,avg_latency) \ No newline at end of file diff --git a/ignition/script-python/Latency/LatencyAvgCalculation/resource.json b/ignition/script-python/Latency/LatencyAvgCalculation/resource.json new file mode 100644 index 0000000..4435d8f --- /dev/null +++ b/ignition/script-python/Latency/LatencyAvgCalculation/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "iama", + "timestamp": "2024-04-11T17:40:28Z" + }, + "hintScope": 2, + "lastModificationSignature": "13b2e0643af7aea0d242827a51028df54771f78c6555e92f56394b2bd986f6f9" + } +} \ No newline at end of file diff --git a/ignition/script-python/Latency/LatencyCalculation/code.py b/ignition/script-python/Latency/LatencyCalculation/code.py new file mode 100644 index 0000000..343918d --- /dev/null +++ b/ignition/script-python/Latency/LatencyCalculation/code.py @@ -0,0 +1,82 @@ +def latencyCalc(): + import json + import system + from java.lang import Exception as JException, Thread + import time + + whid = system.tag.readBlocking(["Configuration/FC"])[0].value + aws_data,first_pass = system.tag.readBlocking(['[%s_SCADA_TAG_PROVIDER]Latency/aws_data_copy'% whid,'[%s_SCADA_TAG_PROVIDER]Latency/first_pass'% whid]) + json_data = json.loads(aws_data.value) + first_pass = first_pass.value + ids = [] + + # in instances where aws_data tag has been reset + if not json_data: + system.tag.writeBlocking(['[%s_SCADA_TAG_PROVIDER]Latency/first_pass.value'% whid], [1]) + return + + #### check if this is the first time running. if it is, set the values in prev_key to get this kicked off and then set the flag tag to False. + if first_pass: + if not json_data: + return + for key in json_data: + ids.append(str(key)) + system.tag.writeBlocking(["[%s_SCADA_TAG_PROVIDER]Latency/prev_key"% whid,"[%s_SCADA_TAG_PROVIDER]Latency/first_pass"% whid],[ids,0]) + return + + # get a list of names that are new and can be used to calculate latency. + # added try except in here in case there is a time when new prev keys are present during first pass or a reset of the tag accidentely. + try: + prev_ids = set(system.util.jsonDecode(system.tag.readBlocking(['[%s_SCADA_TAG_PROVIDER]Latency/prev_key'% whid])[0].value)) + except: + system.tag.writeBlocking(['[%s_SCADA_TAG_PROVIDER]Latency/first_pass.value'% whid], 1) + return + to_be_processed = [] + new_to_be_processed = {} + for key in json_data: + if key not in prev_ids: + to_be_processed.append(str(key)) + + if to_be_processed: + new_to_be_processed = {key: json_data[key] for key in to_be_processed if key in json_data} + + #### This class will read the aws_data tag and calculate the latency of all the tags provided(newly added tags). + class TimestampLatencyCollector: + + def __init__(self): + self.latencies = [] + + def process_dict(self, data_dict): + import system + current_time_ms = system.date.toMillis(system.date.now()) # Current time in milliseconds + + for key, value in data_dict.items(): + timestamp_ms = data_dict[key]['timestamp'] + # Calculate latency in milliseconds + latency_ms = current_time_ms - timestamp_ms + self.latencies.append(latency_ms) + + if new_to_be_processed: + last_alarm_change = '[%s_SCADA_TAG_PROVIDER]Latency/last_alarm_change_ts.value'% whid + + # Create an instance of the TimestampLatencyCollector + collector = TimestampLatencyCollector() + + # Process the nested dictionary + collector.process_dict(new_to_be_processed) + + #read in circular buffer of latencies + circular_buffer_tag_path = '[%s_SCADA_TAG_PROVIDER]Latency/rolling_latency.value'% whid + circular_buffer = system.tag.readBlocking([circular_buffer_tag_path])[0].value + + for latency in collector.latencies: + circular_buffer.append(str(latency)) + + # keep only the last 30 entries. + circular_buffer = circular_buffer[-30:] + system.tag.writeBlocking([circular_buffer_tag_path,last_alarm_change], [circular_buffer,system.date.now()]) + + persistence = [] + for key in json_data: + persistence.append(str(key)) + system.tag.writeBlocking(["[%s_SCADA_TAG_PROVIDER]Latency/prev_key"% whid],[persistence]) \ No newline at end of file diff --git a/ignition/script-python/Latency/LatencyCalculation/resource.json b/ignition/script-python/Latency/LatencyCalculation/resource.json new file mode 100644 index 0000000..9bef8a6 --- /dev/null +++ b/ignition/script-python/Latency/LatencyCalculation/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "iama", + "timestamp": "2024-04-11T17:40:37Z" + }, + "hintScope": 2, + "lastModificationSignature": "3580d98a0c1a313beb5edfd65567781b8dea209ed405fce5b7b76337582a1a20" + } +} \ No newline at end of file diff --git a/ignition/script-python/Latency/WriteToDynamo/code.py b/ignition/script-python/Latency/WriteToDynamo/code.py new file mode 100644 index 0000000..d31f088 --- /dev/null +++ b/ignition/script-python/Latency/WriteToDynamo/code.py @@ -0,0 +1,77 @@ +def DynamoWriter(site,latency): + import json + from pprint import pformat + import boto3 + from datetime import datetime + from decimal import Decimal + import time + + LOGGER = system.util.getLogger('latency_to_dynamodb_log') + + # Get STAGE variable + + API_ID, STAGE, ACC_ID, FUNC_URL = AWS.secrets_manager.get_secret(str(site), 'scada/api/endpoint') + API_ID,ACC_ID,FUNC_URL = None, None, None # set these to None becuase they are not used in here but must be returned during the call. + + # Make sure STAGE is valid. no gamma stage configured + if STAGE not in ['alpha', 'beta', 'gamma', 'prod']: + STAGE = 'beta' + if STAGE == 'gamma': + STAGE = 'beta' + + STAGE_CONFIG = { + 'alpha':{ + 'region' : 'us-east-1', + 'roleArn' : 'arn:aws:iam::905418469996:role/ignition_to_aws_latency_alpha', + 'tableName' : 'SCADA_Latency_alpha' + }, + 'beta': { + 'region':'us-east-1', + 'roleArn': 'arn:aws:iam::381492071451:role/ignition_to_aws_latency_beta', + 'tableName' : 'SCADA_Latency_beta' + + }, + 'prod': { + 'region':'us-east-1', + 'roleArn': 'arn:aws:iam::891377003949:role/ignition_to_aws_latency_prod', + 'tableName' : 'SCADA_Latency_prod' + } + } + + + # create sts session to get credentials from EC2 + sts_client = boto3.client('sts') + region_name = STAGE_CONFIG.get(STAGE, 'alpha').get('region', 'us-east-1') + + assume_role_response = sts_client.assume_role( + RoleArn = STAGE_CONFIG.get(STAGE, 'alpha').get('roleArn', 'arn:aws:iam::905418469996:role/ignition_to_aws_latency_alpha_test'), + RoleSessionName = 'AssumeRole' + ) + + temp_credentials = assume_role_response['Credentials'] + + # create session using the temp creds + b3_session = boto3.Session( + aws_access_key_id = temp_credentials['AccessKeyId'], + aws_secret_access_key = temp_credentials['SecretAccessKey'], + aws_session_token = temp_credentials['SessionToken'], + region_name = 'us-east-1', + ) + + # create a dynamodb session + dynamodb = b3_session.resource('dynamodb') + table = dynamodb.Table(STAGE_CONFIG.get(STAGE, 'alpha').get('tableName', 'SCADA_Latency_alpha')) + + # write data directly to dynamodb table + try: + response = table.put_item(Item={ + 'site':site, + 'timestamp':int(time.time()*1000), + 'latency':str(round( int(Decimal(latency)) / 1000.0 , 3 ) ), + 'source':3, + 'TTL':int(time.time()+ (30*60) ) + } + ) + + except Exception as e: + LOGGER.error(str(e)) \ No newline at end of file diff --git a/ignition/script-python/Latency/WriteToDynamo/resource.json b/ignition/script-python/Latency/WriteToDynamo/resource.json new file mode 100644 index 0000000..256dd1c --- /dev/null +++ b/ignition/script-python/Latency/WriteToDynamo/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "iama", + "timestamp": "2024-04-11T17:40:54Z" + }, + "hintScope": 2, + "lastModificationSignature": "ed4aa23fbe0ec666a06a70b4188a17807df1d5087c7aa2627f4dd5ae4579a17f" + } +} \ No newline at end of file diff --git a/ignition/script-python/SymbolLibrary/code.py b/ignition/script-python/SymbolLibrary/code.py new file mode 100644 index 0000000..a355cbf --- /dev/null +++ b/ignition/script-python/SymbolLibrary/code.py @@ -0,0 +1,105 @@ +############################################################################################# +# Purpose: This package contains all the modules that get called by the symbol library # +# and edit item views. These modules MAKES calls to S3 under the SCADA account. # +# Some of these modules depend on the AWS > S3 manager. # +# Login: Date: #Comment: Version: # +# dmamani 1/4/23 Release to Production V1 # +# # +############################################################################################# + +from AWS.s3 import S3Manager +from datetime import datetime +from pprint import pprint +import json + +BUCKET_REGION = "us-east-1" +BUCKET_NAME = "map-ignition-parent-docs" +SYMBOL_LIBRARY_JSON = "symbol_library.json" + +def fetch_library(backup_path=SYMBOL_LIBRARY_JSON, username=None): + # - Create a client to interact with AWS S3 + s3 = S3Manager(username=username) + # - Fetch the object from S3. If backup path was provided, use that, otherwise fetch the primary file. Convert + # data response to a string + library_json = s3.download(backup_path or SYMBOL_LIBRARY_JSON, bucket=BUCKET_NAME, region=BUCKET_REGION) + return library_json + +def list_backups(username=None): + # - Create a client to interact with AWS S3 + s3 = S3Manager(username=username) + # - Fetch list of objects in S3 from the backups folder. List comp is used to convert response objects from + # aws to a simple list of S3 paths to each Backup object + backup_objects = [] + + for backup_object in s3.list_objects(bucket=BUCKET_NAME, region=BUCKET_REGION): + if backup_object['Key'] != SYMBOL_LIBRARY_JSON: + backup_objects.append(backup_object['Key']) + return sorted(backup_objects, reverse=True) + +def write_library(library, backup=True, username=None): + # - Check type of object to write. Raise exception if it isnt a dictionary + if not isinstance(library, dict): + raise ValueError("'library' argument must be a dictionary of the entire symbol " + "library dataset, not %" % type(library)) + # - Create a client to interact with AWS S3 + library = json.dumps(library).encode() + s3 = S3Manager(username=username) + if backup: + resp = s3.upload( + library, + "%s--%s" % (datetime.utcnow().strftime('%m-%d-%y %H:%M:%S.%f'), username), + bucket=BUCKET_NAME, + region=BUCKET_REGION, + content_type='application/json' + ) + resp = s3.upload(library, SYMBOL_LIBRARY_JSON, bucket=BUCKET_NAME, region=BUCKET_REGION, content_type='application/json') + return resp + +def update_symbol_library(path, username=None, **value): + # - Fetch the most recent library from S3 + current_lib = fetch_library(username=username) + # - Update the given path with the **value dictionary of key-value arguments + if path in current_lib: + current_lib[path].update(value) + else: + current_lib[path]=value + print(current_lib[path]) + print(value) + # - Write the modified library to S3 + resp = write_library(current_lib, username=username) + return resp + + +def delete_symbol(path, username=None): + current_lib = fetch_library(username=username) + try: + del current_lib[path] + return write_library(current_lib, username=username) + except KeyError: + raise Exception("path %s does not exist" % path) + +def rollback(backup_path, username=None): + # - Fetch the backup object + library = fetch_library(backup_path, username=username) + # - Write it to the primary location. Disable backup to prevent duplicate backups + write_library(library, backup=False, username=username) + + + # - Gets List of Categories +def list_categories(library_items): + # - Example of Entry: !!! insert example here bro + categories = list(set([entry["category"] for entry in library_items.values() if entry["category"]])) + categories = sorted(categories) + categories.insert(0,"ALL") + return categories + + # - Searches List of +def search_items(library_items, category): + if category == 'ALL' : + items = [name for name, entry in library_items.items()] + else: + items = [name for name, entry in library_items.items() if entry["category"] == category] + # - Obtains the last part of the path for example ( + items.sort(key = lambda x : x.split("/")[len(x.split("/"))-1]) + return items + \ No newline at end of file diff --git a/ignition/script-python/SymbolLibrary/resource.json b/ignition/script-python/SymbolLibrary/resource.json new file mode 100644 index 0000000..261a8b2 --- /dev/null +++ b/ignition/script-python/SymbolLibrary/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "dmamani", + "timestamp": "2024-01-23T18:10:53Z" + }, + "hintScope": 2, + "lastModificationSignature": "7437df488838d77f88ebfe9acb7c1ee162865c6a35599be3a6eac0cb7dc2c54d" + } +} \ No newline at end of file diff --git a/ignition/script-python/Visualisation/home_page/code.py b/ignition/script-python/Visualisation/home_page/code.py new file mode 100644 index 0000000..49ef45f --- /dev/null +++ b/ignition/script-python/Visualisation/home_page/code.py @@ -0,0 +1,92 @@ +def create_home_page(self): + self.session.custom.covert = True + fc = self.session.custom.fc + tag_provider = "[%s_SCADA_TAG_PROVIDER]" % (fc) + data_to_read = system.tag.readBlocking([tag_provider+"Configuration/PLC"]) + data = system.util.jsonDecode(data_to_read[0].value) + try: devices_list = sorted(data.keys()) + except: devices_list = [] + + if len(devices_list)>0: + instances = [] + dashboard_devices = {} + for i in devices_list: + area = data[i]['Area'] + if len(data[i]['Area'])>0: + + dashboard_devices.update({i:area}) + else: + dashboard_devices.update({i:'unknown'}) + instances.append({ + "instanceStyle": { + "classes": "", + "margin": "5px" + }, + "instancePosition": {}, + "tagProps": [ + i, + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ],"Counts":{"Diag":0, "High":0, "Low":0, "Medium":0}, + "area":data[i]['Area'], + "subarea":data[i]['SubArea'] + }) + self.custom.Devices = sorted(dashboard_devices.items(), key=lambda x:x[1], reverse = False) + self.getChild("FlexRepeater").props.instances = sorted(instances, reverse = False) + +def get_counters(alarm_counters, controller): + counters = alarm_counters.get(controller,{"High":0, "Medium":0, "Low":0, "Diagnostic":0}) + return counters + + +def get_device_values(tag_provider, devices_list): + tag_paths_to_read = [] + read_values = [] + for device in devices_list: + tag_path = "%s%s/ALARMST" % (tag_provider, str(device[0])) + tag_paths_to_read.append(tag_path) + values = system.tag.readBlocking(tag_paths_to_read) + for i,j in enumerate(values): + value = values[i].value + if value == None: + read_values.append(0) + else: + read_values.append(value) + return read_values + + +def update_home_status(self): + orderBy = self.session.custom.alarm_filter.orderby + fc = self.session.custom.fc + tag_provider = "[%s_SCADA_TAG_PROVIDER]" % (fc) + alarm_counters = system.tag.readBlocking([tag_provider + "System/device_count"])[0].value + counters_decoded = system.util.jsonDecode(alarm_counters) + if not counters_decoded: + counters_decoded = {} + devices_list = self.custom.Devices + values = get_device_values(tag_provider, devices_list) + + devices_only = [] + for device in devices_list: + devices_only.append(str(device[0])) + + if orderBy == True: + zipped_list = zip(values, devices_only) + else: + zipped_list = sorted(zip(values, devices_only), reverse = True) + + devices_sorted = [y for x, y in (zipped_list)] + for i,j in enumerate(devices_sorted): + counters = get_counters(counters_decoded, j) + self.getChild("FlexRepeater").props.instances[i].tagProps[0] = j + self.getChild("FlexRepeater").props.instances[i].Counts.Diag = counters.get("Diagnostic") + self.getChild("FlexRepeater").props.instances[i].Counts.Low = counters.get("Low") + self.getChild("FlexRepeater").props.instances[i].Counts.Medium = counters.get("Medium") + self.getChild("FlexRepeater").props.instances[i].Counts.High = counters.get("High") diff --git a/ignition/script-python/Visualisation/home_page/resource.json b/ignition/script-python/Visualisation/home_page/resource.json new file mode 100644 index 0000000..29e1080 --- /dev/null +++ b/ignition/script-python/Visualisation/home_page/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-01-12T19:53:31Z" + }, + "hintScope": 2, + "lastModificationSignature": "141c3651a88e792776a615e6409464bc57bf2b4e8f0c3ec8f53a0fdc98bf69f5" + } +} \ No newline at end of file diff --git a/ignition/script-python/Visualisation/status/code.py b/ignition/script-python/Visualisation/status/code.py new file mode 100644 index 0000000..204e23f --- /dev/null +++ b/ignition/script-python/Visualisation/status/code.py @@ -0,0 +1,162 @@ +global_previous_state = {} +class GetStatus(): + """This class calculates the highest priority + alarm active for all parts of the source id. It scans the active alarms list, + splits each source id and returns the highest priority alarm to a dict object id_to_status. + It stores the previuos state of the dict object and compares current to previous. + ALARMST tags are then updated if they have been removed, added or the value changed + Args: + whid : Warehouse id for the project/ tag provider(string) + alarm_data: Current active alarms(dict) + KeyError: N/A""" + def __init__(self, whid, alarm_data): + self.whid = whid + self.alarm_data = alarm_data + self.id_to_status = {} + self.tag_provider = "[%s_SCADA_TAG_PROVIDER]" % (whid) + self.logger = system.util.getLogger("%s-Update-Visualisation" % (whid)) + + def update_status(self, item, priority): + if(self.id_to_status.get(item) is None or + self.id_to_status.get(item) < priority): + self.id_to_status[item] = priority + + def build_status(self): + for k, v in self.alarm_data.items(): + equipment, device, sub_device = "","","" + alarm_dict = v + source_id = alarm_dict.get("sourceId") + priority = alarm_dict.get("priority") + state = alarm_dict.get("state") + if state != 2: + id_elements = source_id.split("/") + controller = id_elements[0] + if len(id_elements) > 4: + self.logger.error("Incorrect length for source id") + else: + while True: + path = "/".join(id_elements) + self.update_status(path, priority) + id_elements.pop() + if len(id_elements) == 0: + break + global global_previous_state + self.calculate_diff() + global_previous_state = self.id_to_status + + def build_alarm_paths_and_values(self, keys, paths, values): + for item in keys: + value = self.id_to_status.get(item) + tag_path = "%s%s/%s" % (self.tag_provider, item, "ALARMST") + paths.append(tag_path) + values.append(value) + return paths, values + + def write_to_tags(self, message, paths, values): + system.tag.writeBlocking(paths, values) + self.logger.info(message + str(paths)) + + def calculate_diff(self): + set_previous_values = set(global_previous_state.keys()) + set_current_values = set(self.id_to_status.keys()) + intersect = set_current_values.intersection(set_previous_values) + removed_keys = set_previous_values - intersect + added_keys = set_current_values - intersect + changed_values = set(k for k in intersect if global_previous_state[k] != self.id_to_status[k]) + tag_paths_to_delete = [] + values_to_delete = [] + for i in removed_keys: + tag_path = "%s%s/%s" % (self.tag_provider, i, "ALARMST") + tag_paths_to_delete.append(tag_path) + values_to_delete.append(0) + + tag_paths_to_add, values_to_add = self.build_alarm_paths_and_values(added_keys, [], []) + for item in added_keys: + self.create_alarm_state_tags(self.tag_provider + item) + changed_tag_paths, changed_values = self.build_alarm_paths_and_values(changed_values, [], []) + + if changed_tag_paths: + self.write_to_tags("Changed paths = ", changed_tag_paths, changed_values) + + if tag_paths_to_add: + self.write_to_tags("Paths added = ", tag_paths_to_add, values_to_add) + + if tag_paths_to_delete: + self.write_to_tags("Deleted paths = ", tag_paths_to_delete, values_to_delete) + + def write_data(self): + status_encoded = system.util.jsonEncode(self.id_to_status) + system.tag.writeAsync([self.tag_provider + + "System/IdToStatus"], + [status_encoded] + ) + + def create_alarm_state_tags(self, source_id): + if not system.tag.exists(source_id +"/ALARMST"): + tag = {"name": "ALARMST", + "valueSource": "memory", + "dataType": "Int1", + "value": 0} + create_tag = system.tag.configure(source_id, tag) + if not create_tag[0].isGood(): + logger.warn("Failed to create tag: " + str(source_id)) + +def reset_tags(provider, query): + results = system.tag.query(provider, query) + tags_to_write = [] + values_to_write = [] + for i in results: + tags_to_write.append(str(i["fullPath"])) + values_to_write.append(0) + if tags_to_write: + system.tag.writeBlocking(tags_to_write, values_to_write) + +def reset_alarms(whid): + logger_name = "%s-Alarm-Reset" % (whid) + logger = system.util.getLogger(logger_name) + logger.warn("Alarms have been reset") + provider = "%s_SCADA_TAG_PROVIDER" % (whid) + limit = 100 + query = { + "options": { + "includeUdtMembers": True, + "includeUdtDefinitions": False + }, + "condition": { + "path": "*ALARMST*", + "attributes": { + "values": [], + "requireAll": True + } + }, + "returnProperties": [ + "tagType", + "quality" + ] + } + reset_tags(provider, query) + +def reset_disconnects(whid): + logger_name = "%s-Disconnects-Reset" % (whid) + logger = system.util.getLogger(logger_name) + provider = "%s_SCADA_TAG_PROVIDER" % (whid) + limit = 100 + query = { + "options": { + "includeUdtMembers": True, + "includeUdtDefinitions": False + }, + "condition": { + "path": "*DCN*", + "attributes": { + "values": [], + "requireAll": True + } + }, + "returnProperties": [ + "tagType", + "quality" + ] + } + reset_tags(provider, query) + logger.warn("DCN tags have been reset") diff --git a/ignition/script-python/Visualisation/status/resource.json b/ignition/script-python/Visualisation/status/resource.json new file mode 100644 index 0000000..f0b9d6c --- /dev/null +++ b/ignition/script-python/Visualisation/status/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-07-13T13:31:00Z" + }, + "lastModificationSignature": "4c8af7c413439f485844889a8b880542cd3773978e9286ddf5badfccc90727d8", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/Visualisation/status_2/code.py b/ignition/script-python/Visualisation/status_2/code.py new file mode 100644 index 0000000..f6f7490 --- /dev/null +++ b/ignition/script-python/Visualisation/status_2/code.py @@ -0,0 +1,66 @@ +#from logging import raiseExceptions + + +class GetStatus(): + + def __init__(self, whid, alarm_data): + self.alarm_data = alarm_data + self.priority_dict = {} + self.id_to_status = {} + self.tag_provider = "[%s_SCADA_TAG_PROVIDER]" % (whid) + self.logger = system.util.getLogger("%s-Update-Visualisation" % (whid)) + + def convert_priority(self, priority): + #The alarm priority is converted into a status + #This is based on the highest active alarm priority + if str(priority) == "0": + return 4 + elif str(priority) == "1": + return 3 + elif str(priority) == "2": + return 2 + elif str(priority) == "3" or priority == "4": + return 1 + else: + return 6 + + def check_priority(self, alarm_id, priority): + #We check to see if the current priority is greater + #than the current priority in the priority_dict. This is + #because the status is based on the active alarm. With the + #highest priority. + controller_id = alarm_id.split("/")[0] + if self.priority_dict.get(controller_id) is None: + self.priority_dict[controller_id] = {} + self.priority_dict[controller_id][alarm_id] = self.convert_priority(priority) + + elif self.priority_dict[controller_id].get(alarm_id) is None: + self.priority_dict[controller_id][alarm_id] = self.convert_priority(priority) + + elif self.priority_dict[controller_id].get(alarm_id) < priority: + self.priority_dict[controller_id][alarm_id] = ( + self.convert_priority + (priority) + ) + + def run_status(self): + for i in self.alarm_data: + alarm_id = i + priority = self.alarm_data.get(i, {}).get("priority") + if priority != None: + self.check_priority(alarm_id, priority) + + def update_tags(self): + device_paths = [] + status_values = [] + if isinstance(self.priority_dict, dict): + for i in self.priority_dict: + device_path = "%sTags/%s/IdToStatus/json" % (self.tag_provider, i) + device_paths.append(device_path) + status_json = self.priority_dict.get(i) + status_values.append(system.util.jsonEncode(status_json, 4)) + self.logger.info("device paths " + str(device_paths)) + else: + raise TypeError("Not a python dictionary") + system.tag.writeAsync(device_paths, status_values) + diff --git a/ignition/script-python/Visualisation/status_2/resource.json b/ignition/script-python/Visualisation/status_2/resource.json new file mode 100644 index 0000000..0d6574c --- /dev/null +++ b/ignition/script-python/Visualisation/status_2/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-05-16T09:23:51Z" + }, + "lastModificationSignature": "2896b95e315e5d68113ce0ec3cdd09dd728dfe3095f71a55bb734f71e6d62b0f", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/activityLog/logger/code.py b/ignition/script-python/activityLog/logger/code.py new file mode 100644 index 0000000..b9ae40a --- /dev/null +++ b/ignition/script-python/activityLog/logger/code.py @@ -0,0 +1,83 @@ +from urllib2_aws4auth import aws_urlopen, Request +from urllib2 import HTTPError +from urllib import urlencode +import json +import boto3 +from pprint import pformat + +REGION = 'us-east-2' +SERVICE = 'execute-api' +ENDPOINT = 'https://l7o38q47a6.execute-api.us-east-2.amazonaws.com/default/ScadaProductMetrics' +LOGGER = system.util.getLogger('activityLog') + +def openSession(): + CREDS = boto3.Session().get_credentials() + AWS_ACCESS_KEY_ID = CREDS.access_key + AWS_SECRET_ACCESS_KEY = CREDS.secret_key + TOKEN = CREDS.token + + OPENER = aws_urlopen( + AWS_ACCESS_KEY_ID, + AWS_SECRET_ACCESS_KEY, + REGION, + SERVICE, + session_token=TOKEN, + verify=False) + return OPENER + +def createActivityDetails(session, resource_type, resource, current_page, start_time, end_time = None): + user = session.props.auth.user.userName + session_id = session.props.id + site = session.custom.fc + start_time = system.date.format(start_time, 'yyyy-MM-dd HH:mm:ss') + end_time = system.date.format(end_time, 'yyyy-MM-dd HH:mm:ss') if end_time != None else end_time + user_UTCoffset = session.props.device.timezone.utcOffset + activityDetails = {'username':user, + 'session_id':session_id, + 'site': site, + 'start_time': start_time, + 'end_time':end_time, + 'user_UTCoffset': user_UTCoffset, + 'resource_type': resource_type, + 'resource': resource, + 'current_page': current_page} + return activityDetails + +def logActivity(session, resource_type, resource, current_page, start_time, end_time = None): + activityDetails = createActivityDetails(session, resource_type, resource, current_page, start_time, end_time) + user = session.props.auth.user.userName + opener = openSession() + params = activityDetails + payload = json.dumps(params) + method = 'POST' + # in the headers the Ignition session username (session.props.auth.user.userName) must be supplied as 'X-Ignition-User' + headers = { + 'Content-type': 'application/json', + 'X-Ignition-User': user + } + req = Request(url=ENDPOINT, method=method, data=payload, headers=headers) + # open the request and process the read + try: + resp = opener(req) + response = json.loads(resp.read()) + error = None + print pformat(response) + except HTTPError, e: + error = str(e) + response = None + print error + LOGGER.info(error) + return {'error': error, 'response':response } + +def callLogger(self, resource_type, resource = None, current_page= None): + """ self is reference to the view. So if calling from shutdown script on the view, pass self. + If calling from a component, pass self.view""" + if self.session.custom.enable_activity_logging: + if self.session.props.device.type != 'designer': + end_time = system.date.now() if resource_type == 'page' else None + start_time = self.custom.activityLogger.start_time + pageid = self.custom.activityLogger.pageid + resource = pageid if resource == None else resource + current_page = pageid if current_page == None else current_page + logActivity(self.session, resource_type, resource, current_page, start_time, end_time) + \ No newline at end of file diff --git a/ignition/script-python/activityLog/logger/resource.json b/ignition/script-python/activityLog/logger/resource.json new file mode 100644 index 0000000..7272dd8 --- /dev/null +++ b/ignition/script-python/activityLog/logger/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "ankikarw", + "timestamp": "2023-11-15T18:47:23Z" + }, + "hintScope": 2, + "lastModificationSignature": "ff45baacdd34c3a77f4e85b4e5062dfa3cf52d1adad3b0bbaf876076d70982c8" + } +} \ No newline at end of file diff --git a/ignition/script-python/activityLog/productMetrics/code.py b/ignition/script-python/activityLog/productMetrics/code.py new file mode 100644 index 0000000..acbbb6b --- /dev/null +++ b/ignition/script-python/activityLog/productMetrics/code.py @@ -0,0 +1,223 @@ +from urllib2_aws4auth import aws_urlopen, Request +from urllib2 import HTTPError +from urllib import urlencode +import json +import system +import boto3 +from pprint import pformat + +STAGE = 'prod' +STAGE_CONFIG = { + 'alpha':{ + 'region':'us-east-1', + 'endpoint': 'https://0wuzuy9rx3.execute-api.us-east-1.amazonaws.com/prod/user-activity-logger' + }, + 'beta': { + 'region':'us-east-1', + 'endpoint': 'https://33ymuc1b2a.execute-api.us-east-1.amazonaws.com/prod/user-activity-logger' + }, + 'prod': { + 'region':'us-east-1', + 'endpoint': 'https://ahikprejp4.execute-api.us-east-1.amazonaws.com/prod/user-activity-logger' + } +} +REGION = STAGE_CONFIG.get(STAGE, 'alpha').get('region', 'us-east-1') +SERVICE = 'execute-api' +ENDPOINT = STAGE_CONFIG.get(STAGE, 'alpha').get('endpoint', 'https://0wuzuy9rx3.execute-api.us-east-1.amazonaws.com/prod/user-activity-logger') +LOGGER = system.util.getLogger('productMetrics') + +def openSession(): + CREDS = boto3.Session().get_credentials() + AWS_ACCESS_KEY_ID = CREDS.access_key + AWS_SECRET_ACCESS_KEY = CREDS.secret_key + TOKEN = CREDS.token + + OPENER = aws_urlopen( + AWS_ACCESS_KEY_ID, + AWS_SECRET_ACCESS_KEY, + REGION, + SERVICE, + session_token=TOKEN, + verify=False) + return OPENER + +def formatPayload(payload): + """Formats the payload based on what API expects to receive in the payload + Also adds in some defaults (nulls) for the optional fields in case they are skipped from the payload + Since defaults are not defined to required fields, will throw an error if they are not provided in the payload + Args: + payload (dict):all the fields that need to be sent to the API + + Returns: + dict: dict formatted correctly for the API call + """ + data = { + "project_id": "scada-activity-logger", #key used to log hashed user product metrics in backend, not the name of ignition project. + "stage": payload.get("stage"), + "plugin": "scada_activity_logger", + "payload": { + "username": payload.get("username"), + "session_id": payload.get("session_id"), + "site": payload.get("site"), + "start_time": payload.get("start_time"), + "end_time": payload.get("end_time", None), + "user_UTCoffset": payload.get("user_UTCoffset", None), + "resource_type": payload.get("resource_type"), + "resource": payload.get("resource"), + "current_page": payload.get("current_page"), + "concurrent_users": payload.get("concurrent_users", getConcurrentUsers()) + } + } + return data + +def getConcurrentUsers(): + """Get the number of concurrent user session for the current project + + Returns: + int: number of concurrent users + """ + project_name = system.project.getProjectName() + concurrent_users = len(system.perspective.getSessionInfo()) + return concurrent_users + +def createActivityPayload(viewObj, resource_type, resource = None, current_page= None): + """Creates the activity payload for hashed user product metrics + Typically called from view shutdown event script + Uses the info from the view's custom param named activity_logger and session params to build the payload + + Args: + viewObj: reference to the view (since custom param activity_logger is created on the view). If calling this function from a component pass self.view, if calling from view event scripts, pass self + resource_type (string): page/session/click + resource (string, optional): The resource that user interacted with. page name if interaction was with a page, feature/button name if it was a user click type interaction. Defaults to None. + current_page (string, optional): Page name that the user is on when the interaction takes place. Defaults to None. + + Returns: + dict: payload that needs to be formatted before sending to the API + """ + if viewObj.session.custom.product_metrics.enable and viewObj.session.props.device.type != 'designer': + # since viewObj is a reference to the view, viewObj.session is reference to session + session = viewObj.session + stage = session.props.gateway.address + user = session.props.auth.user.userName + session_id = session.props.id + site = session.custom.fc + start_time = system.date.format(viewObj.custom.activityLogger.start_time, 'yyyy-MM-dd HH:mm:ss') + end_time = None + user_UTCoffset = session.props.device.timezone.utcOffset + concurrent_users = getConcurrentUsers() + if resource_type == 'page': + end_time = system.date.format(system.date.now(), 'yyyy-MM-dd HH:mm:ss') + try: + pageid = viewObj.custom.activityLogger.pageid + resource = pageid if resource == None else resource + current_page = pageid if current_page == None else current_page + except: + pass + if resource_type == 'click': + start_time = system.date.format(system.date.now(), 'yyyy-MM-dd HH:mm:ss') + end_time = None + try: + pageid = viewObj.custom.activityLogger.pageid + # resource = pageid if resource == None else resource + current_page = pageid if current_page == None else current_page + except: + pass + + payload = { + "stage": stage, + "username": user, + "session_id": session_id, + "site": site, + "start_time": start_time, + "end_time": end_time, + "resource_type": resource_type, + "resource": resource, + "current_page": current_page, + "user_UTCoffset": user_UTCoffset, + "concurrent_users": concurrent_users + } + activityPayload = formatPayload(payload) + return activityPayload + else: + return None + +def callActivityLoggerAPI(activityPayload): + """Makes a post api call with the provided payload to log hashed user product metrics + Handles converting the payload from dict to json + + Args: + activityPayload (dict): Final payload that needs to be sent to the API + Function will convert the payload to json + """ + if activityPayload: + opener = openSession() + params = activityPayload + payload = json.dumps(params) + method = 'POST' + # in the headers the Ignition session username (session.props.auth.user.userName) must be supplied as 'X-Ignition-User' + headers = { + 'Content-type': 'application/json', + } + req = Request(url=ENDPOINT, method=method, data=payload, headers=headers) + # open the request and process the read + try: + resp = opener(req) + response = json.loads(resp.read()) + error = None + except HTTPError, e: + error = str(e) + response = None + system.perspective.print(error) + LOGGER.info(error) + return {'error': error, 'response':response } + +def callLogger(viewObj, resource_type, resource = None, current_page= None): + """Combines the createActivityPayload and callActivityLoggerAPI to log hashed user product metrics + Typically called from view shutdown event script + Uses the info from the view's custom param named activity_logger and session params to build the payload + """ + activityPayload = createActivityPayload(viewObj, resource_type, resource, current_page) + if activityPayload: + callActivityLoggerAPI(activityPayload) + + + +def testapi(): + print STAGE + user = 'ankikarw' + opener = openSession() + params = { + "project_id": "scada-activity-logger", + "stage": "api test alpha", + "plugin": "scada_activity_logger", + "payload": { + "username": "user", + "session_id": "1234567989", + "site": "EWR4", + "start_time": "2023-11-06 10:45:25", + "end_time": "2023-11-06 10:57:18", + "user_UTCoffset": "-8", + "resource_type": "page", + "resource": "home", + "current_page": "home", + "concurrent_users": "5" + } + } + payload = json.dumps(params) + method = 'POST' + headers = { + 'Content-type': 'application/json', + } + req = Request(url=ENDPOINT, method=method, data=payload, headers=headers) + # open the request and process the read + try: + resp = opener(req) + response = json.loads(resp.read()) + error = None + print response + except HTTPError, e: + error = str(e) + response = None + print error + LOGGER.info(error) + return {'error': error, 'response':response } \ No newline at end of file diff --git a/ignition/script-python/activityLog/productMetrics/resource.json b/ignition/script-python/activityLog/productMetrics/resource.json new file mode 100644 index 0000000..90d44d1 --- /dev/null +++ b/ignition/script-python/activityLog/productMetrics/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "ankikarw", + "timestamp": "2024-04-01T21:05:57Z" + }, + "hintScope": 2, + "lastModificationSignature": "31ab27a5d94875f5bfa04ec4fc85059f9dd19c44fc124bd1c20aaa35b9f54ab8" + } +} \ No newline at end of file diff --git a/ignition/script-python/alarms/alarm_count/code.py b/ignition/script-python/alarms/alarm_count/code.py new file mode 100644 index 0000000..f8810a1 --- /dev/null +++ b/ignition/script-python/alarms/alarm_count/code.py @@ -0,0 +1,24 @@ +def get_count(whid, alarm_data): + device_count = {} + provider = "[%s_SCADA_TAG_PROVIDER]" % (whid) + int_to_priority ={"5":"Critical", "4":"High", "3":"Medium", + "2":"Low", "1":"Diagnostic"} + for k,v in alarm_data.items(): + source_id = k + device_id = source_id.split("/")[0] + alarm_data = v + priority = str(v["priority"]) + priority_string = int_to_priority.get(priority, "Unknown") + check = device_count.get(device_id) + if check == None: + device_count[device_id] = {"Critical":0, "High":0, "Medium":0, "Low":0, "Diagnostic":0, "Unknown":0} + device_count[device_id][priority_string]+=1 + else: + device_count[device_id][priority_string]+=1 + counts_encoded = system.util.jsonEncode(device_count) + system.tag.writeAsync([provider+"System/device_count"],[counts_encoded]) + + + + + diff --git a/ignition/script-python/alarms/alarm_count/resource.json b/ignition/script-python/alarms/alarm_count/resource.json new file mode 100644 index 0000000..f3a70d3 --- /dev/null +++ b/ignition/script-python/alarms/alarm_count/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-05-31T14:39:36Z" + }, + "lastModificationSignature": "4424531aba455fb826ba21128ceb3ba9ad7370463c419805111a43f139a5acc1", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/alarms/alarm_filters/code.py b/ignition/script-python/alarms/alarm_filters/code.py new file mode 100644 index 0000000..8aa1a0f --- /dev/null +++ b/ignition/script-python/alarms/alarm_filters/code.py @@ -0,0 +1,64 @@ +def main_alarm_table(): + """ + Returns alarms states to filter + the main alarm table + + Args: + None + + Returns: + Returns a list of filters. + + Raises: + None + """ + return["Active", "Not Active"] + +def shelved_alarm_table(): + """ + Returns alarms states to filter + the shelved alarm table + + Args: + None + + Returns: + Returns a list of filters. + + Raises: + None + """ + return["Shelved"] + +def docked_alarm_table(): + """ + Returns alarms states to filter + the docked alarm table + + Args: + None + + Returns: + Returns a list of filters. + + Raises: + None + """ + return["Active", "Not Active", "Shelved"] + +def information_alarm_table(): + """ + Returns alarms states to filter + the information pop up + alarm table. + + Args: + None + + Returns: + Returns a list of filters. + + Raises: + None + """ + return["Active", "Not Active", "Shelved"] diff --git a/ignition/script-python/alarms/alarm_filters/resource.json b/ignition/script-python/alarms/alarm_filters/resource.json new file mode 100644 index 0000000..9cfe0bc --- /dev/null +++ b/ignition/script-python/alarms/alarm_filters/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T22:54:32Z" + }, + "lastModificationSignature": "5c3d5b7c302f499524327c0c42c520232767427c5cebcbc650ac00a99a400784", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/alarms/alarm_state/code.py b/ignition/script-python/alarms/alarm_state/code.py new file mode 100644 index 0000000..a6ea197 --- /dev/null +++ b/ignition/script-python/alarms/alarm_state/code.py @@ -0,0 +1,32 @@ +def get_alarm_state(state): + """ + This function returns a string representing the current alarm state from + a state argument enum 1 to 7. + Args: + state: Enum for current alarm state. + Returns: + String representing current alarm state. + + Raises: + KeyError: None. + """ + if state == 0: + return "Not Active" + elif state == 1: + return "Active" + elif state == 2: + return "Shelved" +# elif state == 4: +# return "Return to unacknowledged" +# elif state == 5: +# return "Shelved state" +# elif state == 6: +# return "Suppressed-by-design" +# elif state == 7: +# return "Out-of-service state" + else: + return "Unknown" + + + + diff --git a/ignition/script-python/alarms/alarm_state/resource.json b/ignition/script-python/alarms/alarm_state/resource.json new file mode 100644 index 0000000..294cad8 --- /dev/null +++ b/ignition/script-python/alarms/alarm_state/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T07:50:20Z" + }, + "lastModificationSignature": "d5ccb235feb6f908e00e4cbd66712e8625cd48650c1c4b2807145cafb198047c", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/alarms/alarm_tables/code.py b/ignition/script-python/alarms/alarm_tables/code.py new file mode 100644 index 0000000..d11dd64 --- /dev/null +++ b/ignition/script-python/alarms/alarm_tables/code.py @@ -0,0 +1,195 @@ +import time +from datetime import datetime +startTime = datetime.now() + +def convert(duration): + current_seconds = round(time.time()) + seconds_duration = (current_seconds - (duration/1000)) + m, s = divmod(seconds_duration, 60) + h, m = divmod(m, 60) + return seconds_duration + + +def get_timestamp(duration): + timestamp = system.date.fromMillis(duration) + return timestamp + +def check_device_in_device_list(device, device_list): + if len(device_list)== 0: + return True + for i in device_list: + if device.startswith(i): + return True + return False + +def edit_alarm_id(alarm_id): + new_alarm_id = alarm_id.replace("/", " / ") + return new_alarm_id + +def create_shelve_key(source_id, alarm_id): + """ + Creates a formatted key as Ignition ui + wont allow "/" and spaces to be stored as + key values. Formatting allows easy conversion + back to the origional sourceId and message string. + + Args: + source_id: The sourceId of the alarm. + message: The alarm message. + + Returns: + The formatted key.. + + Raises: + None. + """ + source_to_check = source_id.replace("/", "---") + key_to_check = source_to_check + "----" + str(alarm_id) + return key_to_check + +def unformat_shelve_key(shelved_key): + shelved_items = shelved_key.split("----") + source_to_check = shelved_items[0].replace("---", "/") + alarm_id = int(shelved_items[1]) + return source_to_check, alarm_id + + +def check_alarm_in_shelved_alarms(source_id, message, alarms_to_shelve): + key_to_check = create_shelve_key(source_id, message) + if key_to_check in alarms_to_shelve: + return key_to_check + return False + +def get_alarm_table(self, active_alarms, severity_filters, no_filter, + device_list, alarm_states, alt_colour, table_type): + alarms_data = [] + alarms_critical = [] + alarms_high = [] + alarms_medium = [] + alarms_low = [] + alarms_diagnostic = [] + alarms_disconnected = [] + alarm_temp_dict = {} + shelved_alarms_to_keep = {} + unshelved_alarms_to_keep = {} + shelve_alarms_dict = self.custom.alarms_to_shelve + unshelve_alarms_dict = self.custom.alarms_to_unshelve + if alt_colour: + style_props_critical = {"classes":"Alarms-Styles/Alt-Colours/Critical"} + style_props_high = {"classes":"Alarms-Styles/Alt-Colours/High"} + style_props_medium = {"classes":"Alarms-Styles/Alt-Colours/Medium"} + style_props_low = {"classes":"Alarms-Styles/Alt-Colours/Low"} + style_props_diagnostic = {"classes":"Alarms-Styles/Alt-Colours/Diagnostic"} + style_props_disconnected = {"classes":"Alarms-Styles/NoAlarm-Black"} + + else: + style_props_critical = {"classes":"Alarms-Styles/Critical"} + style_props_high = {"classes":"Alarms-Styles/High"} + style_props_medium = {"classes":"Alarms-Styles/Medium"} + style_props_low = {"classes":"Alarms-Styles/Low"} + style_props_diagnostic = {"classes":"Alarms-Styles/Diagnostic"} + style_props_disconnected = {"classes":"Alarms-Styles/NoAlarm-Black"} + + for i in active_alarms: + source_id = active_alarms[i].get("sourceId","Unknown") + alarm_id = active_alarms[i].get("id","Unknown") + severity = active_alarms[i].get("priority", 0) + family_type= active_alarms[i].get("type", 0) + site_id = active_alarms[i].get("siteId", "Unknown") + state = active_alarms[i].get("state", "Unknown") + state = alarms.alarm_state.get_alarm_state(state) + duration = active_alarms[i].get("timestamp", 0) + time_stamp = get_timestamp(duration) + active_duration = convert(duration) + message = active_alarms[i].get("message", "Unknown") + expiration_epoch = active_alarms[i].get("shelveExpiryEpoch") + duration_in_minutes = active_alarms[i].get("durationMinutes") + family_type_Dict={'1':'Jam','2':'Safety /Emergency','3':'Power circuit','4':'Communication', + '5':'Drive/Motor','6':'Pneumatic','7':'Mechanical','9':'Operational','10':'Scanner', + '11':'Controller','12':'Unexpected Container','20':'Miscellaneous','0':'Undefined'} + type_description= family_type_Dict.get(str(family_type)) + + if expiration_epoch != None: + expiration = system.date.fromMillis(expiration_epoch * 1000) + else: + expiration = "0" + + device_in_list = check_device_in_device_list(source_id, device_list) + if (int(severity) in severity_filters or no_filter == True) and ( + device_in_list == True and state in alarm_states): + if str(active_alarms[i].get("priority")) == "5": + style_class = style_props_critical + severity = "5. Critical" + key = "Critical" + alarm_list = alarms_critical + + elif str(active_alarms[i].get("priority")) == "4": + style_class = style_props_high + severity = "4. High" + key = "High" + alarm_list = alarms_high + + elif str(active_alarms[i].get("priority")) == "3": + style_class = style_props_medium + severity = "3. Medium" + key = "Medium" + alarm_list = alarms_medium + + elif str(active_alarms[i].get("priority")) == "2": + style_class = style_props_low + severity = "2. Low" + key = "Low" + alarm_list = alarms_low + + elif str(active_alarms[i].get("priority")) == "1": + style_class = style_props_diagnostic + severity = "1. Diagnostic" + key = "Diagnostic" + alarm_list = alarms_diagnostic + + elif str(active_alarms[i].get("priority")) == "6": + style_class = style_props_disconnected + severity = "Disconnected" + key = "Disconnected" + alarm_list = alarms_disconnected + + else: + style_class = style_props_diagnostic + severity = "Unknown" + key = "Diagnostic" + alarm_list = alarms_diagnostic + + if table_type == "Docked-East": + source_id = edit_alarm_id(source_id) + + shelve_alarm_id = check_alarm_in_shelved_alarms(source_id, alarm_id, shelve_alarms_dict) + if shelve_alarm_id: + shelved_alarms_to_keep[shelve_alarm_id] = "" + shelve_alarm = True + else: + shelve_alarm = False + + unshelve_alarm_id = check_alarm_in_shelved_alarms(source_id, alarm_id, unshelve_alarms_dict) + if unshelve_alarm_id: + unshelved_alarms_to_keep[unshelve_alarm_id] = "" + unshelve_alarm = True + else: + unshelve_alarm = False + + row = row_builder.build_row( SourceId = source_id, Priority = severity, Type = type_description, + Timestamp = time_stamp, State = state, + Message = message, Expiration = expiration, + Duration = active_duration, Alarm_id = alarm_id, Shelve = shelve_alarm, + Unshelve = unshelve_alarm, StyleClass = style_class) + alarm_list.append(row) + + + for k,v in shelve_alarms_dict.items(): + if k not in shelved_alarms_to_keep: + self.custom.alarms_to_shelve.pop(k) + + for k,v in unshelve_alarms_dict.items(): + if k not in unshelved_alarms_to_keep: + self.custom.alarms_to_unshelve.pop(k) + + return alarms_critical + alarms_high + alarms_medium + alarms_low + alarms_diagnostic + alarms_disconnected diff --git a/ignition/script-python/alarms/alarm_tables/resource.json b/ignition/script-python/alarms/alarm_tables/resource.json new file mode 100644 index 0000000..0a37b7b --- /dev/null +++ b/ignition/script-python/alarms/alarm_tables/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "vivsampa", + "timestamp": "2024-04-18T12:23:11Z" + }, + "lastModificationSignature": "d76f1f38b8db51a7eb7091ae65e259be7af183ce318f3f4f43588c24b9bfb548", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/alarms/shelve/code.py b/ignition/script-python/alarms/shelve/code.py new file mode 100644 index 0000000..3f2a8d7 --- /dev/null +++ b/ignition/script-python/alarms/shelve/code.py @@ -0,0 +1,31 @@ +def get_alarms_to_shelve(self): + """This function is used to perform the shelving function on + single or multiple alarms. It receives an alarm data dictionary + from a row in the alarm table and generates a shelving dict to trigger + a tag change script on the gateway. + + Args: + self: Reference to the component that is calling this function + + Returns: + Executes the shelving function. Does not return any results. + + Raises: + KeyError: Raises an exception. + """ + + selected_rows = self.custom.alarms_to_shelve + shelve_time = self.props.value + alarms_to_shelve = [] + messages_to_shelve = [] + for i in selected_rows: +# alarm_id = i.get("AlarmId") + alarm_id = i.get("value",{}).get("SourceId",{}).get("value") + alarm_id = alarm_id.replace(" ", "") + message = i.get("value",{}).get("Alarm_id",{}).get("value") + alarms_to_shelve.append(alarm_id) + messages_to_shelve.append(message) + duration = shelve_time + self.props.value = "" + return alarms_to_shelve ,messages_to_shelve, duration + diff --git a/ignition/script-python/alarms/shelve/resource.json b/ignition/script-python/alarms/shelve/resource.json new file mode 100644 index 0000000..f40b5ab --- /dev/null +++ b/ignition/script-python/alarms/shelve/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-05-15T15:15:28Z" + }, + "lastModificationSignature": "4999a5bd3ae82be98db5f46a1b96827aca4962c94f256df294706e2a92927628", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/config/project_config/code.py b/ignition/script-python/config/project_config/code.py new file mode 100644 index 0000000..c494368 --- /dev/null +++ b/ignition/script-python/config/project_config/code.py @@ -0,0 +1,124 @@ +import re +import os +import json +import sys +#Stores the page configuration for the project. +#This global variable is accesible form all gateway scoped events using "." notation +#congig.project_config.global_project_page_ids +global_project_page_ids = {} + + + +def get_project_config(): + """ + Function searches through the project directory Detailed-Views. + It looks for all the source ids on each Detailed-View and returns a + Dict with source ids as the keys and page ids as the values. + + Args: + param1: self. refrence to the object being called. + param2: source_id. The source_id of the alarm. + + Returns: + N/A. + + Raises: + KeyError: Will log an error message to the console if the basepath is not found. + logger = {whid}_get_project_config + """ + if not global_project_page_ids: + try: + basePath = os.getcwd().replace('\\','/') + '/data/projects/' + system.util.getProjectName() + '/com.inductiveautomation.perspective/views/Detailed-Views' + files = os.listdir(basePath) + files_found = True + except: + whid = system.tag.readBlocking("Configuration/FC")[0].value + logger = system.util.getLogger("%s-get_project_config" % (whid)) + exc_type, exc_obj, tb = sys.exc_info() + lineno = tb.tb_lineno +# logger.error("Error: %s, %s, %s" % (lineno, exc_type, exc_obj)) #JCM + files_found = False + if files_found: + for i in files: + jsonPath = basePath+'/'+str(i)+'/view.json' + with open(jsonPath, 'r') as f: + data= f.read() + obj = json.loads(data) + for child in obj['root']['children']: + tag_props = child.get("props",{}).get("params", {}).get("tagProps") + if tag_props: + source_id = tag_props[0] + global global_project_page_ids + global_project_page_ids[source_id] = i + +def open_pop_up(message): + error_message = message + system.perspective.openPopup("ErrorPopUP", "PopUp-Views/Error", + params ={"Error_message":error_message}, + showCloseIcon = False, modal = True, + viewportBound = True, + draggable = False, + overlayDismiss = True + ) + + + + +def navigate_to_url(self, source_id, page_id): + url_to_navigate = "/DetailedView/%s/%s" % (page_id, page_id) + navigation.amzl_navigation.set_session_variables(self, source_id, False) + system.perspective.navigate(page = url_to_navigate) + +def source_id_lookup(self, source_id): + """ + This function looks for the source_id in + the global_project_page_ids variable. + If found it returns the corrresponding page id. + If no page id is found it will search up the hierachy + of the source_id until it finds a match. It will then + navigate the user to the correct page and set the session + custom variable search_id. + + Args: + param1: self. refrence to the object being called. + param2: source_id. The source_id of the alarm. + + Returns: + N/A. + + Raises: + KeyError: N/A. + """ + logger = system.util.getLogger("Naviagtion function") +# logger.info(str(global_project_page_ids)) + page_id = global_project_page_ids.get(source_id) + found = False + if page_id: + found = True + navigate_to_url(self, source_id, page_id) + else: + items = source_id.split("/") + length_of_items = len(items)-1 + while length_of_items > 0: + items.pop() + source_id = "/".join(items) + page_id = global_project_page_ids.get(source_id) + if page_id: + found = True + navigate_to_url(self, source_id, page_id) + break + length_of_items -= 1 + if not found: + open_pop_up("No page id found") + +def get_child_scada_projects(): + """ + This function returns an alphabetically sorted list of + child SCADA projects, that inherit the SCADA_PERSPECTIVE_PARENT_PROJECT. + Each of these projects follow the naming convention "{WHID}_SCADA" + + :return: List[str]; List of project names on gateway + """ + pattern = '[A-Z]{3}[0-9]|K[A-Z]{3}_SCADA' + all_projects = system.project.getProjectNames() + return sorted([x for x in all_projects if re.match(pattern, x)]) diff --git a/ignition/script-python/config/project_config/resource.json b/ignition/script-python/config/project_config/resource.json new file mode 100644 index 0000000..b99d888 --- /dev/null +++ b/ignition/script-python/config/project_config/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:22Z" + }, + "hintScope": 2, + "lastModificationSignature": "3f2ca11462a2e171e0c7bd3e98b57649d6d7286e707957fb93ff6087a9ff1b58" + } +} \ No newline at end of file diff --git a/ignition/script-python/helper/code.py b/ignition/script-python/helper/code.py new file mode 100644 index 0000000..7b9f3df --- /dev/null +++ b/ignition/script-python/helper/code.py @@ -0,0 +1,284 @@ +class helper: + @staticmethod + def list_of_dict_to_dataset(dict_data,dict_column): #dict_data and dict_column are lists of dictionaries + import pprint + #get keys in the first dictionary in the list + #This is used to ensure only real fields are used in the column + if len(dict_data) != 0 and len(dict_column) != 0: + if isinstance(dict_data[0], dict) and isinstance(dict_column[0], dict): + pass + else: + raise TypeError('Dictionary','The items in lists are not Dictionaries.') + else: + raise TypeError('List','List provided is empty') + test = dict_data[0] + pprint.pprint(test) + d_keys = dict_data[0].keys() + + #create the column headers from provided dict_column + #but only if the column name is used as a dict in the data. + column_header = [] + pprint.pprint(dict_column) + for row in dict_column: + if row['field'] in d_keys: + column_header.append(row['field']) + pprint.pprint(column_header) + # create rows used as final list of lists for conversion to dataset + rows = [] + for di in dict_data: + #create individual row + row = [] + for column in column_header: + if di.has_key(column): + row.append(di[column]) + else: + row.append('') + #append each row to rows so all data is captured in a list of lists. + rows.append(row) + + #screate dataset from header and rows of data + dataset = system.dataset.toDataSet(column_header,rows) + return({'basic_dataset':dataset}) + + + + @staticmethod + def sanitize_tree(element): + """ + Arguments: + element: array/list or dict to be sanitized (remove Java "object wrappers") + Returns: + element: sanitized input array/list/dict + Usage: + from helper.helper import sanitize_tree + sanitizedTableData = sanitize_tree(myTable.props.data) + + ## This function loops recursively over a component property and converts all + ## siblings and children to base elements + """ + if hasattr(element, '__iter__'): + if hasattr(element, 'keys'): + return dict((helper.string_decode(k), helper.sanitize_tree(helper.string_decode(element[k]))) for k in element.keys()) + else: + return list(helper.sanitize_tree(helper.string_decode(x)) for x in element) + return element + + + + @staticmethod + def dataset_to_dict(dataset): #provide a basicdataset as input + #verify basic dataset was passed in + string_type = str(type(dataset)) + if string_type != "": + raise TypeError('Dataset','expected BaiscDataset type received %s'%(string_type)) + else: + raw_dataset = system.dataset.toPyDataSet(dataset) + #convert from PyDataSet to list of lists and header names. + headers = [((str(col).replace(' ','')).replace('_','')) for col in raw_dataset.getColumnNames()] + raw_dataset = [[col for col in row] for row in raw_dataset] + + #create needed empty lists to put dictionaries in + col_data = [] + data_data = [] + #create column names for column field of a table + for col in headers: + col_data.append({'field':col, + 'visible': True, + 'editable':False, + 'render':'auto', + 'justify':'auto', + 'align':'center', + 'resizable':True, + 'sortable':True, + 'sort':'none', + 'boolean':'checkbox', + 'number':'value', + 'numberFormat': '0,0.##', + 'dateFormat':'MM/DD/YYYY' + }) + #Create Data dictionaries used for data field of a table + data_counter = 0 + for row in raw_dataset: + data = {} + for col_num in range(len(row)): + data[headers[col_num]] = row[col_num] + data_data.append(data) + data_counter = data_counter+1 + #pass out list of dictionary, list of dictionary, string + return({'data':data_data,'column':col_data}) + + @staticmethod + def xyChartTransform(ds=None, columns=None): + ## This function is for use with the XY chart in Perspective + ## This component requires an array of dictionaries for the chart data structure, rather than an Ignition dataset + ## Each dict item should have the format of: {'Column_X': valueX, 'Column_Y': valueY} + ## ds = Ignition dataset, such as that returned by a SQL query binding + ## columns = list of column names to be included in the array of dicts returned by function. + ## NOTE: the first column name listed will be the X axis + ## If no column list passed in, the function will grab all names from the dataset + + ## NOTE: This function will return every column/value in the dataset as a dict key + rows = [] + if ds is None: + return rows ## return empty array if no dataset passed in + try: + data = system.dataset.toPyDataSet(ds) ## convert to python dataset + if columns is None: + columns = system.dataset.getColumnHeaders(ds) ## extract column names from dataset + for row in data: ## Loop over python dataset + d = {} ## initialize empty dictionary for each row + for c in columns: ## loop over column list + d[c] = row[c] ## add key for each column as key and assign value + rows.append(d) ## append new row + return rows + except: + return rows + + @staticmethod + def string_decode(v): + """ + Arguments: + v: value to be decoded (ignore if not unicode string) + Returns: + v: decoded value + Usage: + from helper.helper import string_decode + my_unicode_string = (u'hello world') + decoded_string = string_decode(my_unicode_string) + + ## This function is a helper for the sanitize_tree function, normally + """ + # vscode pylint v2.7.* will complain about this but it works, also works in Ignition v.8.1.* + if isinstance(v, unicode): + # replace any nasty em- or en-dashes with a more sane '-' short dash + # this should avoid most of the nested try:except: blocks below + if u'\u2013' in v: v = v.replace(u'\u2013', '-') + try: v = str(v) + except: + import traceback + from loggerConfig import getLogger + logger = getLogger('sanitize_tree_string_decode') + logger.warn(traceback.format_exc()) + try: + v = v.encode('utf-8') + v = str(v) + except: + logger.warn(traceback.format_exc()) + try: v.encode('ascii', 'ignore') + except: + logger.warn(traceback.format_exc()) + try: v = repr(v) + except: + logger.warn(traceback.format_exc()) + return v + return v + + @staticmethod + def centerJustifyTableColumns(columns=[]): + """ + ## This method takes a table column config object (array of dicts) and returns it with all columns and their headers set to center justified + Arguments: + columns: [array of dict] table column configuration + Returns: + columns: [array of dict] table column config, with all columns/headers center justified + Usage: + from helper.helper import centerJustifyTableColumns + myTable.props.columns = centerJustifyTableColumns(myTable.props.columns) + """ + try: + for column in columns: + try: + column['justify'] = 'center' + column['header']['justify'] = 'center' + except: continue + except: pass + return columns + + @staticmethod + def get_dropdown_options_from_dataset(ds=None, value_column=None, label_column=None): + """ + This method takes an ignition dataset object, and a name or index for "value" and "label" columns + and returns an array of dict objects for each row to use in the binding of perspective dropdown "options" prop. + Arguments: + ds: Ignition dataset object, ie from named SQL query + value_column: [string or integer] if string, the name of the column to represent the value when option is selected. + if integer, the column index for the value + label_column: [string or integer] if string, the name of the column to represent the label (display) for option selection. + if integer, the column index for the label + Returns: [{ + value: value to be assigned to dropdown "value" property when options selection + label: value to be displayed in the dropdown for each option + }] + Usage: + # in a script transform on the dropdown.props.options binding + from helper.helper import get_dropdown_options_from_dataset + options = get_dropdown_options_from_dataset( + ds=value, # from property/query binding above this transform + value_column='my_value_column_name', + label_column='my_label_column_name + ) + return options + """ + # Check required arguments for null values + if ds is None: + msg = 'No dataset passed in' + return {'error': msg} + if value_column is None: + msg = 'No value_column name or index passed in' + return {'error': msg} + if label_column is None: + msg = 'No label_column name or index passed in' + return {'error': msg} + # convert the ignition dataset to python dataset to iterate over + try: data = system.dataset.toPyDataSet(ds) + except: + import traceback + msg = 'Error converting dataset to python data: %s' % traceback.format_exc() + return {'error': msg} + # grab the column headers from input dataset + headers = system.dataset.getColumnHeaders(ds) + # verify both the value and label columns are in the list of column headers, if passed in as strings + # if passed in as integer indexes, make sure they are valid + if isinstance(value_column, str): + if value_column not in headers: + msg = 'value_column (%s) not in dataset column headers!' % value_column + return {'error': msg} + elif isinstance(value_column, int): + if value_column not in range(len(headers)): + msg = 'value_column index (%d) not valid!' % value_column + return {'error': msg} + else: # if not string or integer, invalid type + msg = 'invalid type for value_column (%s). Must be integer or string' % type(value_column) + return {'error': msg} + if isinstance(label_column, str): + if label_column not in headers: + msg = 'label_column (%s) not in dataset column headers!' % label_column + return {'error': msg} + elif isinstance(label_column, int): + if label_column not in range(len(headers)): + msg = 'label_column index (%d) not valid!' % label_column + return {'error': msg} + else: # if not string or integer, invalid type + msg = 'invalid type for label_column (%s). Must be integer or string' % type(label_column) + return {'error': msg} + # if passed all verification checks, build array of objects representing label/value pairs for each dataset row + options = [{'value': row[value_column], 'label': row[label_column]} for row in data] + return options + + @staticmethod + def keys_exists(element, *keys): + ''' + Check if *keys (nested) exists in `element` (dict). + ''' + if not isinstance(element, dict): + raise AttributeError('keys_exists() expects dict as first argument.') + if len(keys) == 0: + raise AttributeError('keys_exists() expects at least two arguments, one given.') + + _element = element + for key in keys: + try: + _element = _element[key] + except KeyError: + return False + return True \ No newline at end of file diff --git a/ignition/script-python/helper/resource.json b/ignition/script-python/helper/resource.json new file mode 100644 index 0000000..d845a1d --- /dev/null +++ b/ignition/script-python/helper/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "f83e7a75f7aafd346edb74d77981cf717264d8fae2d1598f67e02c3cfa4a7a53", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/import_file/csv/code.py b/ignition/script-python/import_file/csv/code.py new file mode 100644 index 0000000..3ee54c4 --- /dev/null +++ b/ignition/script-python/import_file/csv/code.py @@ -0,0 +1,20 @@ +def csv_import(): + """ + Opens a file and returns the data as a list . + + Args: + + Returns: + the .csv as a nested list. + + Raises: + KeyError: Raises an exception. + """ + newFile = system.file.openFile('gif') + +# with open(newFile,"r") as f: +# csv_reader = csv.reader(f) +# device_list = [] +# for line in csv_reader: +# device_list.append(line) +# return device_list diff --git a/ignition/script-python/import_file/csv/resource.json b/ignition/script-python/import_file/csv/resource.json new file mode 100644 index 0000000..2e2a7f1 --- /dev/null +++ b/ignition/script-python/import_file/csv/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "sipearso", + "timestamp": "2021-11-26T15:18:29Z" + }, + "lastModificationSignature": "6929af8e56e47d6eeb289eed7413e7e319c62d47344086b8a1a96ffa31f37370" + } +} \ No newline at end of file diff --git a/ignition/script-python/loggerConfig/code.py b/ignition/script-python/loggerConfig/code.py new file mode 100644 index 0000000..79e3b5d --- /dev/null +++ b/ignition/script-python/loggerConfig/code.py @@ -0,0 +1,34 @@ +import logging + +LOGGING_MAP_IDE = { + 'critical': {'level': logging.CRITICAL, 'value': 50}, + 'error': {'level': logging.ERROR, 'value': 40}, + 'warning': {'level': logging.WARNING, 'value': 30}, + 'info': {'level': logging.INFO, 'value': 20}, + 'debug': {'level': logging.DEBUG, 'value': 10}, + 'trace': {'level': 5, 'value': 5}, + 'notset': {'level': logging.NOTSET, 'value': 0} +} + +LOG_LEVELS = ['trace', 'debug', 'info', 'warn', 'error'] ## these are the valid logging levels for use with Ignition system.util.setLoggingLevel() function + +def getLoggerIDE(name='', level='info'): + ## insure basic logging is set-up + logging.basicConfig() + ## Grab a logger object for the given name + logger = logging.getLogger(name) + if level and level in LOGGING_MAP_IDE: + level = LOGGING_MAP_IDE[level]['level'] + logger.setLevel(level) + ## Check if any handler exists for this logger, if not, create a basic handler config. + ## TODO: Add a functionality to customize handlers, particularly for writing to Ignition gateway console or system.perspective.print() etc + # if not len(logger.handlers): logging.basicConfig() + return(logger) + +def getLogger(name='', level=None): + ## Grab a logger object for the given name from the Ignition system.util function + logger = None + if name not in ['', None]: logger = system.util.getLogger(name) + ## if logger created, level arg passed in and valid, set the logging level accordingly + if logger and level and level in LOG_LEVELS: system.util.setLoggingLevel(name, level) + return(logger) diff --git a/ignition/script-python/loggerConfig/resource.json b/ignition/script-python/loggerConfig/resource.json new file mode 100644 index 0000000..1542cce --- /dev/null +++ b/ignition/script-python/loggerConfig/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "duscoope", + "timestamp": "2024-01-19T19:06:21Z" + }, + "lastModificationSignature": "b0c9181a49b45a86f9fd17854ef70aa83ac317ab32d909d8d1004241e8f94cd6", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/messaging/message_handler/code.py b/ignition/script-python/messaging/message_handler/code.py new file mode 100644 index 0000000..b0112aa --- /dev/null +++ b/ignition/script-python/messaging/message_handler/code.py @@ -0,0 +1,147 @@ +def send_message(**kwargs): + fc = system.tag.readBlocking("Configuration/FC")[0].value + payload = kwargs + message_type = kwargs.get("message_type") + scope = kwargs.get("scope") + source = kwargs.get("source") + try: + system.perspective.sendMessage(message_type, payload = payload, scope = scope) + except: + system.perspective.print(source, destination="client") + +def update_device_filters(devices): + payload= {} + payload["data"] = devices + system.perspective.sendMessage("update-device-filters", payload = payload, scope = "page") + +def reset_historical_filters(action): + payload = {} + payload["data"] = action + system.perspective.sendMessage("reset-historical-filters", payload = payload, scope = "page") + +def update_source_id_filters(source_ids): + payload= {} + payload["data"] = source_ids + system.perspective.sendMessage("update-source_id-filters", payload = payload, scope = "page") + +def send_http_response_code(response): + payload= {} + payload["response"] = response + system.perspective.sendMessage("http-response-code", payload = payload, scope = "page") + +def update_historical(historical_data): + payload= {} + payload["data"] = historical_data + system.perspective.sendMessage("update-historical-data", payload = payload, scope = "page") + +def update_historical_first_request(historical_data): + payload = {} + payload["data"] = historical_data + payload["initial_data"] = historical_data + system.perspective.sendMessage("update-first-request", payload = payload, scope = "page") + +def load_initial_data(request): + #Pass a boolean to load the initial dataset. + payload = {} + payload["data"] = request + system.perspective.sendMessage("load_initial_data", payload = payload, scope = "page") + +def update_token_array(token_array): + payload = {} + payload["data"] = token_array + system.perspective.sendMessage("update-token-array", payload = payload, scope = "page") + +def show_historical_filters(action): + payload = {} + payload["data"] = action + system.perspective.sendMessage("show-historical-filters", + payload = payload, scope = "page") + +def update_initial_token(number): + payload = {} + payload["data"] = number + system.perspective.sendMessage("update-initial-tokens", payload = payload, scope = "page") + +def set_source_filters(self): + filters = self.props.value + payload = {} + payload["data"] = filters + system.perspective.sendMessage("set-source-filters", payload = payload, + scope = "page") + + +def set_type_filters(self): + filters = self.props.value + payload = {} + payload["data"] = filters + system.perspective.sendMessage("set-type-filters", payload = payload, + scope = "page") + +def set_priority_filters(self): + filters = self.props.value + payload = {} + payload["data"] = filters + system.perspective.sendMessage("set-priority-filters", payload = payload, + scope = "page") + +def set_device_filters(self): + filters = self.props.value + payload = {} + payload["data"] = filters + system.perspective.sendMessage("set-device-filters", payload = payload, + scope = "page") + +def set_message_filters(self): + filters = self.props.value + payload = {} + payload["data"] = filters + system.perspective.sendMessage("set-message-filters", payload = payload, + scope = "page") + +def set_time_from_filters(self): + "This filter sets the time from for history" + time = self.props.value + utc_offset = -self.session.props.device.timezone.utcOffset + #time = system.date.addHours(time, utc_offset) + epoch = system.date.toMillis(time) + payload = {} + payload["data"] = epoch + system.perspective.sendMessage("set-from-filters", payload = payload, + scope = "page") + +def set_time_to_filters(self): + "This filter sets the time to for history" + time = self.props.value + utc_offset = -self.session.props.device.timezone.utcOffset + #time = system.date.addHours(time, utc_offset) + epoch = system.date.toMillis(time) + payload = {} + payload["data"] = epoch + system.perspective.sendMessage("set-to-filters", payload = payload, + scope = "page") + +def set_duration_filters(self): + filters = self.props.value + ms = filters * 1000 + payload = {} + payload["data"] = ms + system.perspective.sendMessage("set-duration-filters", payload = payload, + scope = "page") + +def update_page_number(page): + payload = {} + payload["data"] = page + system.perspective.sendMessage("update-page-number", payload = payload, + scope = "page") + +def update_client_id(client_id): + payload = {} + payload["data"] = client_id + system.perspective.sendMessage("update-client-id", payload = payload, + scope = "page") + +#Generic message handler scoped at view level +def view_message_handler(message, message_type): + payload = {} + payload["data"] = message + system.perspective.sendMessage(message_type, payload, scope = "view") diff --git a/ignition/script-python/messaging/message_handler/resource.json b/ignition/script-python/messaging/message_handler/resource.json new file mode 100644 index 0000000..9ef72ee --- /dev/null +++ b/ignition/script-python/messaging/message_handler/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2024-04-30T16:44:47Z" + }, + "lastModificationSignature": "c6b459db3b4cb417620855a627b84b17ff716b73f28525d33b971e2d3774929b", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/navigation/additional_view/code.py b/ignition/script-python/navigation/additional_view/code.py new file mode 100644 index 0000000..c3bf108 --- /dev/null +++ b/ignition/script-python/navigation/additional_view/code.py @@ -0,0 +1,20 @@ +def navigate_to_additional_view(self): + """ + This function is used to navigate to a page from a navigation button. + This function can be used on any button that has a property called "self.custom.page_id" + which is the target page for the button. + Args: + self: Refrence to the object that is invoking this function. + + Returns: + This is a description of what is returned. + + Raises: + KeyError: Raises an exception. + """ + + page_id = self.custom.page_id + plc = page_id.split("-")[0] + url_to_navigate = "/DetailedView/%s/%s" % (page_id, plc) + system.perspective.navigate(page = url_to_navigate) + diff --git a/ignition/script-python/navigation/additional_view/resource.json b/ignition/script-python/navigation/additional_view/resource.json new file mode 100644 index 0000000..ec44d7f --- /dev/null +++ b/ignition/script-python/navigation/additional_view/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-04-14T12:54:34Z" + }, + "lastModificationSignature": "95a343bcc6337fdd4591df3976fcc5e4d91376ffb0f4607b3a202f4a069de78a" + } +} \ No newline at end of file diff --git a/ignition/script-python/navigation/alarm_navigation/code.py b/ignition/script-python/navigation/alarm_navigation/code.py new file mode 100644 index 0000000..939193b --- /dev/null +++ b/ignition/script-python/navigation/alarm_navigation/code.py @@ -0,0 +1,79 @@ +def set_session_variables(self, search_id, device_search_id): + """ + chnaged from:(self, search_id, device_search_id, plc_tag_path, display_cc, detailed_view) + This function is used to set the custom session variables in the perspective session. + + Args: + self: This is a reference to the object that is calling this function. + search_id: Type string, this should be a UDT name. + device_search_id: Type string, display path of the alarm. + Returns: + None. + + Raises: + None. + """ + self.session.custom.searchId = search_id + self.session.custom.deviceSearchId = device_search_id + +def navigate_to_alarm(self, event): + """ + This function is used to navigate to a detailed view when double + clicking a row in the active alarm table. It takes the Ignition alarm id + to return the alarm information from the "System/ActiveAlarms" tag. + + Args: + self: This is a reference to the object that is clicked on the screen. + event: This is a reference to the event that is clicked on the screen. + Returns: + None. + + Raises: + None. + """ + alarm_id = event.value.get("AlarmId") + tags_to_read = system.tag.readBlocking(["Configuration/DetailedViews","System/ActiveAlarms"]) + pages_decoded = system.util.jsonDecode(tags_to_read[0].value) + active_alarms = system.util.jsonDecode(tags_to_read[1].value) + UDT = active_alarms.get(alarm_id,{}).get("UDT_tag") + bit_position = active_alarms.get(alarm_id,{}).get("bitPosition") + name = active_alarms.get(alarm_id,{}).get("Name") + page_id = active_alarms.get(alarm_id,{}).get("PageId","None") + page = UDT.split("_")[0] + + if page_id != "None" and len(page_id)>0: + page_id = page_id.split("-")[0] + udt_to_read = "%s/Parameters.AREA" % (page_id) + else: + udt_to_read = "%s/Parameters.AREA" % (page) + system.perspective.print(udt_to_read) + read_area = system.tag.readBlocking([udt_to_read]) + area = read_area[0].value + + page_name = "/"+page + display_path = active_alarms.get(alarm_id,{}).get("DisplayPath") + check_keys = pages_decoded.get(page,0) + + if page_id != "None" and page_id != "": + page = page_id.split("-")[0] + url_to_navigate = "/DetailedView/%s/%s" % (page_id, page) + set_session_variables(self, UDT, display_path) + system.perspective.navigate(page = url_to_navigate) + system.perspective.sendMessage("plc-to-display", payload = {"device":page_id, "show_controls":True, "area":area}, scope = "page") + + elif check_keys != 0: + set_session_variables(self, UDT, display_path) + url_to_navigate = "/DetailedView/%s/%s" % (page, page) + system.perspective.navigate(page = url_to_navigate ) + system.perspective.sendMessage("plc-to-display", payload = {"device":page, "show_controls":True, "area":area}, scope = "page") + + else: + for i in pages_decoded: + page_list = pages_decoded[i] + if page in page_list: + set_session_variables(self, UDT, display_path) + url_to_navigate = "/DetailedView/%s/%s" % (i,i) + system.perspective.navigate(page = url_to_navigate) + system.perspective.sendMessage("plc-to-display", payload = {"device":i, "show_controls":True, "area":area}, scope = "page") + + diff --git a/ignition/script-python/navigation/alarm_navigation/resource.json b/ignition/script-python/navigation/alarm_navigation/resource.json new file mode 100644 index 0000000..1102e36 --- /dev/null +++ b/ignition/script-python/navigation/alarm_navigation/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-04-20T12:41:24Z" + }, + "lastModificationSignature": "2bd699e68d4a5dcf42381ba911dabc030ac92a81833a5ccb29c60755c7aff184" + } +} \ No newline at end of file diff --git a/ignition/script-python/navigation/amzl_navigation/code.py b/ignition/script-python/navigation/amzl_navigation/code.py new file mode 100644 index 0000000..636cdc5 --- /dev/null +++ b/ignition/script-python/navigation/amzl_navigation/code.py @@ -0,0 +1,65 @@ +def set_session_variables(self, search_id, covert): + """ + chnaged from:(self, search_id, device_search_id, plc_tag_path, display_cc, detailed_view) + This function is used to set the custom session variables in the perspective session. + + Args: + self: This is a reference to the object that is calling this function. + search_id: Type string, this should be a UDT name. + device_search_id: Type string, display path of the alarm. + Returns: + None. + + Raises: + None. + """ + self.session.custom.searchId = search_id + self.session.custom.covert = covert + + +def navigate_to_alarm(self, mhe_id): + """ + This function is used to navigate to the location of an alarm within SCADA + + Args: + self: This is a reference to the object that is clicked on the screen. + event: This is a reference to the event that is clicked on the screen. + Returns: + None. + + Raises: + Logs and error to the gateway if the Config/cfg tag is not found + or the LinkToPage field is empty. + """ + + config = "%s/Config/cfg" % (mhe_id) + tags_to_read = system.tag.readBlocking(["Configuration/FC", "Configuration/DetailedViews"]) + tag_provider = "[%s_SCADA_TAG_PROVIDER]" % (tags_to_read[0].value) + tags_config = system.tag.readBlocking([tag_provider + config]) + tag_config_value = system.util.jsonDecode(tags_config[0].value) + if tag_config_value: + link_to_page = tag_config_value.get("LinkToPage") + if link_to_page == None or len(link_to_page) == 0: + error_message = "No page id found in Cfg tag" + system.perspective.openPopup("ErrorPopUP", "PopUp-Views/Error", + params ={"Error_message":error_message}, + showCloseIcon = False, modal = True, + viewportBound = True, + draggable = False, + overlayDismiss = True + ) + else: + url_to_navigate = "/DetailedView/%s/%s" % (link_to_page, link_to_page) + #Update the session variables to flash the pointers. + set_session_variables(self, mhe_id, False) + system.perspective.navigate(page = url_to_navigate) + else: + error_message = "No cfg tag found" + system.perspective.openPopup("ErrorPopUP", "PopUp-Views/Error", + params ={"Error_message":error_message}, + showCloseIcon = False, modal = True, + viewportBound = True, + draggable = False, + overlayDismiss = True + ) + diff --git a/ignition/script-python/navigation/amzl_navigation/resource.json b/ignition/script-python/navigation/amzl_navigation/resource.json new file mode 100644 index 0000000..45e2965 --- /dev/null +++ b/ignition/script-python/navigation/amzl_navigation/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-07-18T13:39:02Z" + }, + "lastModificationSignature": "4c39cb637d43f3f8797c7d9e10244b36976f5ea8cae9783abba82fb2114fd142", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/navigation/basic_navigation/code.py b/ignition/script-python/navigation/basic_navigation/code.py new file mode 100644 index 0000000..65db1c1 --- /dev/null +++ b/ignition/script-python/navigation/basic_navigation/code.py @@ -0,0 +1,15 @@ +def detailed_view(page_id): + """ + This function is used to naviagte to a page from a navigation button + This function takes one parameter "page_id. This is the id of the page + the user wishes to navigate to. + + Args: + page_id : Target page the function will use to navigate to. + Returns: + None. + + Raises: + None. + """ + system.perspective.navigate(page_id) diff --git a/ignition/script-python/navigation/basic_navigation/resource.json b/ignition/script-python/navigation/basic_navigation/resource.json new file mode 100644 index 0000000..345e20d --- /dev/null +++ b/ignition/script-python/navigation/basic_navigation/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-03-01T15:56:08Z" + }, + "lastModificationSignature": "b0abc07e802ede432f83090730e0b6a126d928ec051bcbf03bd673486ff4d147" + } +} \ No newline at end of file diff --git a/ignition/script-python/navigation/navigate_to_page/code.py b/ignition/script-python/navigation/navigate_to_page/code.py new file mode 100644 index 0000000..e5bd1aa --- /dev/null +++ b/ignition/script-python/navigation/navigate_to_page/code.py @@ -0,0 +1,50 @@ +def detailed_view(self, tag_name, device_id, area): + """ + This function is used to naviagte to a detailed view + For example an on click event of a component. + The input paramter array to the component contains a reference to the PLC. + Detail view display all devices and equipement connected to a particular PLC. + The PLC ID is looked up in the "Configuration/DetailedViews" dictionary. + if found it navigates to the detailed view of the page_name {/}. + + Args: + self: This is a reference to the object that is clicked on the screen. + tag_name: Hold information on the particular event that call this function. + area : The area within the FC + Returns: + None. + + Raises: + None. + """ + device = tag_name.split("_") + device = device[0] + # Example: page_name = /F01 + pages = system.tag.readBlocking(["Configuration/DetailedViews"]) + pages_value = pages[0].value + pages_decoded = system.util.jsonDecode(pages_value) + for view , devices in pages_decoded.items(): + if device in devices: + self.session.custom.searchId = tag_name + self.session.custom.deviceSearchId = device_id + system.perspective.sendMessage("plc-to-display", payload = {"device":view,"show_controls":True,"area":area}, scope = "page") + url_to_navigate = "/DetailedView/%s/%s" % (view, view) + system.perspective.navigate(page = url_to_navigate) + return + +def navigate_to_deatiled_view(source): + page_id = config.project_config.get_project_config.global_project_page_ids.get(source) + if page_id: + url_to_navigate = "/DetailedView/%s/%s" % (page_id, page_id) + navigation.amzl_navigation.set_session_variables(self, page_id, False) + system.perspective.navigate(page = url_to_navigate) + elif not page_id: + data = source.split("/") + pass + + + + + + + \ No newline at end of file diff --git a/ignition/script-python/navigation/navigate_to_page/resource.json b/ignition/script-python/navigation/navigate_to_page/resource.json new file mode 100644 index 0000000..0b7bee6 --- /dev/null +++ b/ignition/script-python/navigation/navigate_to_page/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-06-04T19:02:35Z" + }, + "lastModificationSignature": "6b4a200928f142532837640b703b340cb01b94fcbcff9c3b0fe4282a61933153", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/navigation/search/code.py b/ignition/script-python/navigation/search/code.py new file mode 100644 index 0000000..078717c --- /dev/null +++ b/ignition/script-python/navigation/search/code.py @@ -0,0 +1,44 @@ +def generate_tag_config(self,event): + """This function generates the tag config in the search window. + + Args: + self: A reference to the object that is invoking this function. + event: A reference to the event object that is being called by this function.. + + Returns: + This is a description of what is returned. + + Raises: + None. + + """ + + tag = event.value.get("Tags") + fc = system.tag.read("Configuration/FC").value + path ="[%s_SCADA_TAG_PROVIDER]%s/OPC/" % (fc, tag) + results = system.tag.browse( path = path) + tag_list = results.getResults() + data = [i["fullPath"] for i in tag_list] + table_data = [] + for i in data: + config = system.tag.getConfiguration(i) + alarms = [x.get("alarms") for x in config] + try: + for alarm in alarms: + for x in alarm: +# replace = "[%s_SCADA_TAG_PROVIDER]" % (fc) + system.perspective.print(x) + full_path = str(i) + name = x.get("name") + additional_info = x.get("AdditionalInfo") + priority = x.get("priority") + bit_position = x.get("bitPosition") + row = row_builder.build_row(FullPath = full_path, AdditionalInfo = additional_info, + Priority = priority, Name = name, StyleClass = {"classes":"Alarms-Styles/NoAlarms"}) + table_data.append(row) + except: + system.perspective.print("object not iterable") +# self.getSibling("Table_0").props.data = table_data + payload = {} + payload["table_data"] = table_data + system.perspective.sendMessage("build-tag-config", payload = payload, scope = "view") diff --git a/ignition/script-python/navigation/search/resource.json b/ignition/script-python/navigation/search/resource.json new file mode 100644 index 0000000..541031d --- /dev/null +++ b/ignition/script-python/navigation/search/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-06-09T07:46:52Z" + }, + "lastModificationSignature": "59da7b166236816a76c9ea84f8e2c791a5ac6750b3a1757cec091de830ebd777", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/navigation/show_alarms/code.py b/ignition/script-python/navigation/show_alarms/code.py new file mode 100644 index 0000000..ffedf84 --- /dev/null +++ b/ignition/script-python/navigation/show_alarms/code.py @@ -0,0 +1,34 @@ +def show_alarm_from_docked_window(self,event): + #Get the alarm properties from the alarm object. + """ + Displays the currently active alarm from the south docked alarm table in the detailed view. + If the alarm is on a different page to the current page the function will navigate the user + to the correct page and show the alarm. + + Args: + self: Refrence to the object thats invoking this function. + event: Refrence to the event that is invoking this function. + + Returns: + The fucntion doses not return any values. + + Raises: + KeyError: None + """ + + + alarm_id = event.value.get("AlarmId") + tags_to_read = system.tag.readBlocking(["System/ActiveAlarms"]) + active_alarms = system.util.jsonDecode(tags_to_read[0].value) + UDT = active_alarms.get(alarm_id,{}).get("UDT_tag") + plc = UDT.split("_")[0] + name = active_alarms.get(alarm_id,{}).get("Name") + page_id = active_alarms.get(alarm_id,{}).get("PageId","None") + display_path = active_alarms.get(alarm_id,{}).get("DisplayPath") + + #Set the session custom variables to highlight the selected alarm. + self.session.custom.searchId = UDT + self.session.custom.deviceSearchId = display_path + + url_to_navigate = "/DetailedView/%s/%s" % (page_id, plc) + system.perspective.navigate(page = url_to_navigate) diff --git a/ignition/script-python/navigation/show_alarms/resource.json b/ignition/script-python/navigation/show_alarms/resource.json new file mode 100644 index 0000000..c66dbde --- /dev/null +++ b/ignition/script-python/navigation/show_alarms/resource.json @@ -0,0 +1,16 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-04-14T12:55:43Z" + }, + "lastModificationSignature": "ea96ebccb9995e064092cc863c89afe10a2a6d97617fd7eb579497b1e09fd37f" + } +} \ No newline at end of file diff --git a/ignition/script-python/notifyTool/DeleteFromDynamo/code.py b/ignition/script-python/notifyTool/DeleteFromDynamo/code.py new file mode 100644 index 0000000..c47d627 --- /dev/null +++ b/ignition/script-python/notifyTool/DeleteFromDynamo/code.py @@ -0,0 +1,122 @@ +from urllib2_aws4auth import aws_urlopen, Request +from urllib2 import HTTPError +from urllib import urlencode +import json +import system +import boto3 +from pprint import pformat + +REGION ='us-west-2' + + +def openSession(): + CREDS = boto3.Session().get_credentials() + AWS_ACCESS_KEY_ID = CREDS.access_key + AWS_SECRET_ACCESS_KEY = CREDS.secret_key + TOKEN = CREDS.token + CREDSRETURN = {'AccessKeyId':AWS_ACCESS_KEY_ID, + 'SecretAccessKey':AWS_SECRET_ACCESS_KEY, + 'SessionToken':TOKEN} +# OPENER = aws_urlopen( +# AWS_ACCESS_KEY_ID, +# AWS_SECRET_ACCESS_KEY, +# REGION, +# SERVICE, +# session_token=TOKEN, +# verify=False) +# return OPENER + + return CREDSRETURN + + +def DynamoDeleter(PrimaryKey, publish): + import json + from pprint import pformat + import boto3 + from datetime import datetime + from decimal import Decimal + import time + + LOGGER = system.util.getLogger('notify_to_dynamodb_log') + + # Get STAGE variable + roleArn = 'arn:aws:iam::533266954132:role/ignition_to_aws_scada_notify' + STAGE = 'beta' + # Make sure STAGE is valid. no gamma stage configured + if STAGE not in ['alpha', 'beta', 'gamma', 'prod']: + STAGE = 'beta' + if STAGE == 'gamma': + STAGE = 'beta' + + STAGE_CONFIG = { + 'alpha':{ + 'region' : 'us-west-2', + 'roleArn' : roleArn, + 'tableName' : 'NotificationsEntries' + }, + 'beta': { + 'region':'us-west-2', + 'roleArn': roleArn, + 'tableName' : 'NotificationsEntries' + + }, + 'prod': { + 'region':'us-west-2', + 'roleArn': roleArn, + 'tableName' : 'NotificationsEntries' + } + } + + + # create sts session to get credentials from EC2 + sts_client = boto3.client('sts') + region_name = STAGE_CONFIG.get(STAGE, 'alpha').get('region', 'us-west-2') + + assume_role_response = sts_client.assume_role( + RoleArn = STAGE_CONFIG.get(STAGE, 'beta').get('roleArn', roleArn), + RoleSessionName = 'AssumeRole' + ) + + temp_credentials = assume_role_response['Credentials'] + + # create session using the temp creds + b3_session = boto3.Session( + aws_access_key_id = temp_credentials['AccessKeyId'], + aws_secret_access_key = temp_credentials['SecretAccessKey'], + aws_session_token = temp_credentials['SessionToken'], + region_name = 'us-west-2', + ) + + # create a dynamodb session + dynamodb = b3_session.resource('dynamodb') + table = dynamodb.Table(STAGE_CONFIG.get(STAGE, 'beta').get('tableName', 'NotificationsEntries')) +# response = client.scan( +# TableName='string', +# IndexName='string', +# AttributesToGet=[ +# 'string', +# ], +# Limit=123, + + # write data directly to dynamodb table + try: + response = table.delete_item(Key={ + 'PrimaryKey': PrimaryKey, + "publish": publish + }, + ConditionExpression="attribute_exists (PrimaryKey)") +# response = table.scan(ProjectionExpression="PrimaryKey, publish, expire, title") +# TableName='NotificationsEntries', +# IndexName='publish', +## ProjectionExpression =['publish', 'expire', 'title'], +# Limit=123) +# system.perspective.print(response) + system.perspective.print('Delete from NotificationsEntries DynamoDB Table Successful') + except Exception as e: + system.perspective.print('Delete from NotificationsEntries DynamoDB Table NOT Successful') + system.perspective.print(str(e)) + LOGGER.error(str(e)) + + + return response + \ No newline at end of file diff --git a/ignition/script-python/notifyTool/DeleteFromDynamo/resource.json b/ignition/script-python/notifyTool/DeleteFromDynamo/resource.json new file mode 100644 index 0000000..2e77ba2 --- /dev/null +++ b/ignition/script-python/notifyTool/DeleteFromDynamo/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-05-07T17:12:34Z" + }, + "hintScope": 2, + "lastModificationSignature": "f31b7f4dd5820a1d36a179dfdf9d6ddb41dd207de400a1b909aa0f42af89727a" + } +} \ No newline at end of file diff --git a/ignition/script-python/notifyTool/ReadFromDynamo/code.py b/ignition/script-python/notifyTool/ReadFromDynamo/code.py new file mode 100644 index 0000000..d4c5f78 --- /dev/null +++ b/ignition/script-python/notifyTool/ReadFromDynamo/code.py @@ -0,0 +1,118 @@ +from urllib2_aws4auth import aws_urlopen, Request +from urllib2 import HTTPError +from urllib import urlencode +import json +import system +import boto3 +from pprint import pformat + +REGION ='us-west-2' + + +def openSession(): + CREDS = boto3.Session().get_credentials() + AWS_ACCESS_KEY_ID = CREDS.access_key + AWS_SECRET_ACCESS_KEY = CREDS.secret_key + TOKEN = CREDS.token + CREDSRETURN = {'AccessKeyId':AWS_ACCESS_KEY_ID, + 'SecretAccessKey':AWS_SECRET_ACCESS_KEY, + 'SessionToken':TOKEN} +# OPENER = aws_urlopen( +# AWS_ACCESS_KEY_ID, +# AWS_SECRET_ACCESS_KEY, +# REGION, +# SERVICE, +# session_token=TOKEN, +# verify=False) +# return OPENER + + return CREDSRETURN + + +def DynamoReader(): + import json + from pprint import pformat + import boto3 + from datetime import datetime + from decimal import Decimal + import time + + LOGGER = system.util.getLogger('notify_to_dynamodb_log') + + # Get STAGE variable + roleArn = 'arn:aws:iam::533266954132:role/ignition_to_aws_scada_notify' + STAGE = 'beta' + # Make sure STAGE is valid. no gamma stage configured + if STAGE not in ['alpha', 'beta', 'gamma', 'prod']: + STAGE = 'beta' + if STAGE == 'gamma': + STAGE = 'beta' + + STAGE_CONFIG = { + 'alpha':{ + 'region' : 'us-west-2', + 'roleArn' : roleArn, + 'tableName' : 'NotificationsEntries' + }, + 'beta': { + 'region':'us-west-2', + 'roleArn': roleArn, + 'tableName' : 'NotificationsEntries' + + }, + 'prod': { + 'region':'us-west-2', + 'roleArn': roleArn, + 'tableName' : 'NotificationsEntries' + } + } + + + # create sts session to get credentials from EC2 + sts_client = boto3.client('sts') + region_name = STAGE_CONFIG.get(STAGE, 'alpha').get('region', 'us-west-2') + + assume_role_response = sts_client.assume_role( + RoleArn = STAGE_CONFIG.get(STAGE, 'beta').get('roleArn', roleArn), + RoleSessionName = 'AssumeRole' + ) + + temp_credentials = assume_role_response['Credentials'] + + # create session using the temp creds + b3_session = boto3.Session( + aws_access_key_id = temp_credentials['AccessKeyId'], + aws_secret_access_key = temp_credentials['SecretAccessKey'], + aws_session_token = temp_credentials['SessionToken'], + region_name = 'us-west-2', + ) + + # create a dynamodb session + dynamodb = b3_session.resource('dynamodb') + table = dynamodb.Table(STAGE_CONFIG.get(STAGE, 'beta').get('tableName', 'NotificationsEntries')) +# response = client.scan( +# TableName='string', +# IndexName='string', +# AttributesToGet=[ +# 'string', +# ], +# Limit=123, + + # write data directly to dynamodb table + try: + response = table.scan() +# response = table.scan(ProjectionExpression="PrimaryKey, publish, expire, title") +# TableName='NotificationsEntries', +# IndexName='publish', +## ProjectionExpression =['publish', 'expire', 'title'], +# Limit=123) +# system.perspective.print(response) + system.perspective.print('Read from NotificationsEntries DynamoDB Table Successful') + except Exception as e: + system.perspective.print('Read from NotificationsEntries DynamoDB Table NOT Successful') + system.perspective.print(str(e)) + LOGGER.error(str(e)) + + + return response + \ No newline at end of file diff --git a/ignition/script-python/notifyTool/ReadFromDynamo/resource.json b/ignition/script-python/notifyTool/ReadFromDynamo/resource.json new file mode 100644 index 0000000..237d874 --- /dev/null +++ b/ignition/script-python/notifyTool/ReadFromDynamo/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-05-07T17:12:34Z" + }, + "hintScope": 2, + "lastModificationSignature": "0bf728fdee031f6a6d1af399883757bb3355293a5ab332a5b017d709e3c607d8" + } +} \ No newline at end of file diff --git a/ignition/script-python/notifyTool/WriteToDynamo/code.py b/ignition/script-python/notifyTool/WriteToDynamo/code.py new file mode 100644 index 0000000..eed4f35 --- /dev/null +++ b/ignition/script-python/notifyTool/WriteToDynamo/code.py @@ -0,0 +1,103 @@ +from urllib2_aws4auth import aws_urlopen, Request +from urllib2 import HTTPError +from urllib import urlencode +import json +import system +import boto3 +from pprint import pformat + +REGION ='us-west-2' + + +def openSession(): + CREDS = boto3.Session().get_credentials() + AWS_ACCESS_KEY_ID = CREDS.access_key + AWS_SECRET_ACCESS_KEY = CREDS.secret_key + TOKEN = CREDS.token + CREDSRETURN = {'AccessKeyId':AWS_ACCESS_KEY_ID, + 'SecretAccessKey':AWS_SECRET_ACCESS_KEY, + 'SessionToken':TOKEN} +# OPENER = aws_urlopen( +# AWS_ACCESS_KEY_ID, +# AWS_SECRET_ACCESS_KEY, +# REGION, +# SERVICE, +# session_token=TOKEN, +# verify=False) +# return OPENER + + return CREDSRETURN + + +def DynamoWriter(payload): + import json + from pprint import pformat + import boto3 + from datetime import datetime + from decimal import Decimal + import time + + LOGGER = system.util.getLogger('notify_to_dynamodb_log') + roleArn = 'arn:aws:iam::533266954132:role/ignition_to_aws_scada_notify' + # Get STAGE variable + + STAGE = 'alpha' + # Make sure STAGE is valid. no gamma stage configured + if STAGE not in ['alpha', 'beta', 'gamma', 'prod']: + STAGE = 'beta' + if STAGE == 'gamma': + STAGE = 'beta' + + STAGE_CONFIG = { + 'alpha':{ + 'region' : 'us-west-2', + 'roleArn' : roleArn, + 'tableName' : 'NotificationsEntries' + }, + 'beta': { + 'region':'us-west-2', + 'roleArn': roleArn, + 'tableName' : 'NotificationsEntries' + + }, + 'prod': { + 'region':'us-west-2', + 'roleArn': roleArn, + 'tableName' : 'NotificationsEntries' + } + } + + + # create sts session to get credentials from EC2 + sts_client = boto3.client('sts') + region_name = STAGE_CONFIG.get(STAGE, 'beta').get('region', 'us-west-2') + + assume_role_response = sts_client.assume_role( + RoleArn = STAGE_CONFIG.get(STAGE, 'alpha').get('roleArn',roleArn), + RoleSessionName = 'AssumeRole' + ) +# arn:aws:iam::905418448057:role/ignition_to_aws_scada_notify + temp_credentials = assume_role_response['Credentials'] + + # create session using the temp creds + b3_session = boto3.Session( + aws_access_key_id = temp_credentials['AccessKeyId'], + aws_secret_access_key = temp_credentials['SecretAccessKey'], + aws_session_token = temp_credentials['SessionToken'], + region_name = 'us-west-2', + ) + + # create a dynamodb session + dynamodb = b3_session.resource('dynamodb') + table = dynamodb.Table(STAGE_CONFIG.get(STAGE, 'beta').get('tableName', 'NotificationsEntries')) + + + # write data directly to dynamodb table + try: + response = table.put_item(TableName='NotificationsEntries',Item= payload) +# system.perspective.print(response) + system.perspective.print('Write to NotificationsEntries DynamoDB Table Successful') + except Exception as e: + system.perspective.print('Write to NotificationsEntries DynamoDB Table NOT Successful') + system.perspective.print(str(e)) + LOGGER.error(str(e)) \ No newline at end of file diff --git a/ignition/script-python/notifyTool/WriteToDynamo/resource.json b/ignition/script-python/notifyTool/WriteToDynamo/resource.json new file mode 100644 index 0000000..41d0ef5 --- /dev/null +++ b/ignition/script-python/notifyTool/WriteToDynamo/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "cojonas", + "timestamp": "2024-05-07T17:12:34Z" + }, + "hintScope": 2, + "lastModificationSignature": "c411bbfc258390819ff2ff33d88fb7670f9c87e6123d16407cca432c018219d0" + } +} \ No newline at end of file diff --git a/ignition/script-python/row_builder/code.py b/ignition/script-python/row_builder/code.py new file mode 100644 index 0000000..2c04f42 --- /dev/null +++ b/ignition/script-python/row_builder/code.py @@ -0,0 +1,32 @@ +def build_row(**kwargs): + """ + Args: + Any number of arguments using kwargs key = value format. + Key StyleClass is used for adding formatting to the row. + StyleClass = {classes:value} + Returns: + A python dict with style formatting for perspective tables.. + + Raises: + KeyError: Raises an exception. + """ + row = {} + column ={} + for key,value in kwargs.items(): + if key != "StyleClass": + column[key]={"value":value} + row["value"]=column + style_class = kwargs.get("StyleClass") + row["style"] = style_class + return row + +def build_row_with_view(**kwargs): + row = {} + column ={} + for key,value in kwargs.items(): + if key != "StyleClass": + column[key]= value + row["value"]=column + style_class = kwargs.get("StyleClass") + row["style"] = style_class + return row diff --git a/ignition/script-python/row_builder/resource.json b/ignition/script-python/row_builder/resource.json new file mode 100644 index 0000000..4552604 --- /dev/null +++ b/ignition/script-python/row_builder/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2022-12-21T07:40:23Z" + }, + "lastModificationSignature": "7561ccc077472f2eee9a87ac7b46fbf9164c2c543aed768922fcb0ff954130b7", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/state/state_tables/code.py b/ignition/script-python/state/state_tables/code.py new file mode 100644 index 0000000..a188a79 --- /dev/null +++ b/ignition/script-python/state/state_tables/code.py @@ -0,0 +1,44 @@ +def get_state_table(active_states): + faulted = [] + stopped = [] + running = [] + style_class = {} + state_lookup = {1:"Faulted", 2:"Stopped", 3:"Running"} + for i in active_states: + source_id = i + time_stamp = active_states[i].get("timestamp","Unknown") + time_stamp_converted = alarms.alarm_tables.get_timestamp(time_stamp) + state = active_states[i].get("state","Unknown") + if time_stamp !=("Unknown"): + duration = alarms.alarm_tables.convert(int(time_stamp)) + else: + duration = 0 + state_list = [] + if state == 3: + state_list = running + style_class = {"classes":"State-Styles/State5"} + state = state_lookup.get(state, 6) + elif state == 2: + state_list = stopped + style_class = {"classes":"State-Styles/State2"} + state = state_lookup.get(state, 6) + elif state == 1: + state_list = faulted + style_class = {"classes":"State-Styles/State1"} + state = state_lookup.get(state, 6) + else: + pass + + state_row = row_builder.build_row_with_view(SourceId = source_id, + TimeStamp = time_stamp_converted, + Duration = duration, + State = state, + StyleClass = style_class ) + state_list.append(state_row) + + return faulted + stopped + running + + + + + diff --git a/ignition/script-python/state/state_tables/resource.json b/ignition/script-python/state/state_tables/resource.json new file mode 100644 index 0000000..13d14df --- /dev/null +++ b/ignition/script-python/state/state_tables/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-05-18T14:59:36Z" + }, + "lastModificationSignature": "28ca2cd3be7c8d95d39f209ee5d7f374636aadd767fdbca9ae719fc7910010c2", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/ignition/script-python/tags/tag_utilities/code.py b/ignition/script-python/tags/tag_utilities/code.py new file mode 100644 index 0000000..477561f --- /dev/null +++ b/ignition/script-python/tags/tag_utilities/code.py @@ -0,0 +1,38 @@ +def get_devices(fc): + tag_path = "[%s_SCADA_TAG_PROVIDER]Configuration/DetailedViews" % (fc) + tags_to_read = system.tag.readBlocking([tag_path]) + devices = system.util.jsonDecode(tags_to_read[0].value) + device_list = [] + for k,v in devices.items(): + for i in v: + device_list.append(i) + return(device_list) + +def reset_disconnect_tags(whid, device_list): + tags_to_write = [] + values_to_write = [] + for i in device_list: + tag_path = "[%s_SCADA_TAG_PROVIDER]%s/DCN" % (whid, i) + tags_to_write.append(tag_path) + values_to_write.append(0) + system.tag.writeAsync(tags_to_write, values_to_write) + +def get_tag_paths(fc): + tags_to_read = system.tag.readBlocking(["Configuration/FC"]) + fc = tags_to_read[0].value + results = system.tag.browse(path ="["+fc+"_SCADA_TAG_PROVIDER]", filter = {"recursive":True, "tagType": "Folder"}) + tag_list = results.getResults() + source_list = [] + items_to_exclude = ["Configuration", "System","_types_"] + for i in tag_list: + full_path = str(i["fullPath"]) + try: + source_id = full_path.split("]")[1] + except IndexError: + continue + if source_id not in items_to_exclude: + item_to_add = {"value": source_id, "label": source_id} + source_list.append(item_to_add) + return(source_list) + + diff --git a/ignition/script-python/tags/tag_utilities/resource.json b/ignition/script-python/tags/tag_utilities/resource.json new file mode 100644 index 0000000..c0db7b4 --- /dev/null +++ b/ignition/script-python/tags/tag_utilities/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "A", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "code.py" + ], + "attributes": { + "lastModification": { + "actor": "pllincol", + "timestamp": "2023-08-21T08:18:33Z" + }, + "lastModificationSignature": "84cf83bd1052e2d8d59a9f85a87d2dedc4eea3fe70308691716f48fe2d6f1bae", + "hintScope": 2 + } +} \ No newline at end of file diff --git a/project.json b/project.json new file mode 100644 index 0000000..b31952d --- /dev/null +++ b/project.json @@ -0,0 +1,6 @@ +{ + "title": "SCADA_PERSPECTIVE_PARENT_PROJECT_20250408075745", + "description": "", + "enabled": false, + "inheritable": true +} \ No newline at end of file