From 37d47123af902670f8f5c1a10bb3ca33a5424995 Mon Sep 17 00:00:00 2001 From: nika Date: Thu, 1 May 2025 00:04:09 -0700 Subject: [PATCH] Added resources files --- ...7531374857e61a79ba2f3702eed003fec8e5ebca75 | 879 + ...f3a9355e10fa2b780788d8c300891b9c362677bec5 | 58 + ...81ecdc727b57aa3e79d6bccfcb0d45bc5e852d970d | 2384 ++ ...119e045b037519a884c95c9d67f8aaac15a9d62925 | 244 + ...8a4ab13f21fd8d861fe742ebe9681e4d59ba7f2cb0 | 20 + ...cd23d9842d97260e89d8d6d32510a03b987698cc8f | 66 + ...e500b426eef055d5e4d22d459289e1af0d0de4fd43 | 371 + ...4d1b171d4ab9739b378680f90bae58fb1432b166f3 | 773 + ...2cbf7ce1859be65497449d13ca4b1c5b7197e0c46b | 97 + ...189bd1ace2581d5d6372ed5710b1c87ebbbf7c7545 | 14 + ...088ab17ad9317455b2917a8ad912cea990ba8f8bb9 | 2890 ++ ...70449ed0f8d58c4ef308b347fd50167de46fbfb5ab | 710 + ...ad8403717f2088cf034acb82de543ed60018556a8f | 648 + ...4609b13cb5627c09828751043f6db5f1a76bd1662b | 58 + ...7476de67a430addad65c14ec5dd55886c7b32462b1 | 96 + ...11bd54bf09c26a6f856903d01256ca193336161a78 | 2897 ++ ...67e60b14826f323336f85035614135d2cf7be39d0c | 76 + ...567b468d2d01f64ffab98c30b8236d53b54aff3bfd | 4007 ++ ...32f8dba5feda070be623186330d2d94a62a23f3f34 | 4019 ++ ...4d00912426a69a5c06bc6185c60d0c0458b8016101 | 108 + ...e895c0d2ee6f75a3fba68fff9ac92ec5bb475ad6e7 | 65 + ...1254abff7ea2c843faa9df618060bb05d566b183db | 11 + ...11812dfcf77944fd34cf91dbda04dcc15df6bb746e | 155 + ...2e093150450a0e43993714ac6fd536ac5c98043ec9 | 21 + ...1938949f814b9d1e3f489be03715ba3b8ab954a95f | 34 + ...c44593125874b6a3925337f3e36af1c1da29bbfc56 | 431 + ...7687f2f14870bd4d82ec43ae8d16abc0c83a3154ab | 1978 + ...aaa63a07d1570def6619be8c1f13caad25fa5f842c | 118 + ...68416da5e99f3bf56908f95805029fbdff38c83279 | 151 + ...26248a8e1f6a0d92706470a5b8feba47753e95f409 | 54 + ...ce8355a8cf8842ac856c77c4b80fab00924cf19ea0 | 1123 + ...c2b4a0d24464d4e4d0168fce41970982de365f2d63 | 551 + ...59e75f72a65c4b4c3369b412455c88430394145bc8 | 211 + ...91fe43b62865e78746e5ad859e8a99fa6e585ac096 | 141 + ...bffaa6b66e07a3bd3b94f6aeee3790fc1fb9a67d14 | 894 + ...6abcec96b73bbd5eddc8a2a1ac78dd7201fd3adde9 | 318 + ...4d645ec3724e879a90c650ff48029ca5faa7941a74 | 656 + ...45d17819be0c10ce1b21edfad1902afe39345a8c75 | 101 + ...b25c84db754a5741e974dac2f92f14ba264277a188 | 44 + ...6a2a8abc36bcb1a3b35105dc11b3446ebe8b984bf0 | 55 + ...bead24822d6710150bc68f63cd7a236fa65e803a94 | 227 + ...e523c90319b1873771a8688690494674da2c440d20 | 522 + ...7869fa8cbacb6b2c24236e294e9cc80940f4a623fd | 1281 + ...236ed50612b6f69ab326cd08abbe7d491dc36009dc | 237 + ...e8841824b687613d0fa3c5ef5874284333ab6c6b1f | 59 + ...89577044177605c03a472d2b8424432619ccd14d74 | 64 + ...b13d93b919d46e6b503f7839a14349181705f7ece7 | 223 + ...1619e39ac89175e0e77bd37b369c22a639f0a749da | 129 + ...83b1edd8807e32151b2f11bd82846794df6cbc3fbc | 687 + ...a46b316a1448715f38c7e8661b82ee501fd58a6617 | 127 + ...4513e9eee84140ec1b6e66fbfb3a9afc2a8304b103 | 2552 ++ ...36d81f0af4928c78625bc8c6a5b1cac59053d1d5c2 | 97 + ...840d0e5a25489054133253b78819f314cf0c6b77bc | 32 + ...3505ad73912584071db894d39cfeb7397a2eb652a4 | 99 + ...2175f95ec8aed9fc4f1c4a2fc14e9ba9c7bb220ecf | 4867 +++ ...dc0bc96445fe060f31428d78def85d2f5521fad4be | 497 + ...52b3f7fc60a2baa58e22ad75ea896e22ac63484702 | 293 + ...4959c68e8e3fb7a601e861a7eacb14122ea87fb9bf | 1021 + ...5bc4e0fd92c3bdb1231ef074d4664f340803b90a6a | 2408 ++ ...47ace3e588941afd07466a7e3640a901c3b301b639 | 34 + ...de600018a7d9c850998ea62dd867f6ecbe3ba78299 | 1142 + ...bfb9984738f70b26cab08de1434322ab859e124d25 | 1954 + ...2c5edf93ecaa98e70c92d329e785a337234e25c0a3 | 122 + ...20e7c017c70b50412f196b674e6a3e0f2d8fa96394 | 64 + ...a4e34dc3084c281851659c09bb6b07ea9990a9489c | Bin 0 -> 68531 bytes ...d166d1973282d63f0eda97b3d5b1687d1caad6d73a | 155 + ...d03594f586f30b43a38c7a102217e21c886efc5ba8 | 228 + ...341634c63d728f365778be52dc13cb10e223ef6e27 | 237 + ...1013884908056891fe088c1ac26260fcee9b74d655 | 53 + ...13c4a20761adbc7b92fa59627226b61e3bea1d27eb | 578 + ...9e6c7ac82a29fec61dd5a680f117c35e038a58c6e6 | 68 + ...276ba3ab85dca61988c709f81a5bc50a63061f474a | 302 + ...03d3c8f90f48afbaa1e55c24befaaa23562cb3dae9 | 32 + ...0f5437b9f45078c73693e2d1dd0279ffd7195c7876 | 83 + ...b8db88a6ee8ee8a203cc8f99abf5afa9ba51ccbe18 | 1041 + ...bed22782dbecd6276fffc6641f5df6aab6da17a498 | 736 + ...c1c52bde521e45cc1ecfdac6de87391db78154fa5b | 113 + ...8e61936d0fbfb8027cd9219da4a6a9f62a6889b211 | 184 + ...6f74d0e52a9bf269d91fdceeb8ca1838a98adaa23b | 787 + ...7ed1dabb88bc410b8d65e4369d7eb8d577097b2f04 | 19 + ...91e07d00d0ad324d98e0b10700328928faee3a76a8 | 50 + ...2282c5f5f35b87a14c7b69bc0e77d3b5e431b2404d | 555 + ...78180e4a1ae337e27542c023b8a1aa887e691a6a4f | 172 + ...5953dfe4ce1d62f8529ec9fe361980e756b18e7334 | 44 + ...e66bdf36e333dbb842c25afd4b0e46dbd1275e4b86 | 1808 + ...25743d1e72f4eb1aef7c93d2dcf834118f3e44094c | 628 + ...2903df7d65959ec40b6ddb07c44c91f662107b3f45 | 1099 + ...1508d23daea2f6a5f194ecbe53070d1a8a76811ae7 | 792 + ...8c4be2ad8e0ad03f84d49ac4610c46362d9bea8e35 | 1001 + ...2ef617f37fbf195808c7f1088efc3b71b762899cdb | 931 + ...7f71d8ab3bb047283c0bf2ed762b058176e7fae368 | 125 + ...bb5c17b88931efdba779935cbf80fc0001fd06231c | 918 + ...de5d63a5f74f3f53ab3341d654385637b748dbb299 | 732 + ...7ee76c68adb28cc399e1a2de5deccd9b833f380529 | 897 + ...e9d8bf74344846c0fc72868b56461bf4dc16bc1ce1 | Bin 0 -> 35897 bytes ...5479f33ff9a2d24a56fba4b0e26d9885dc12a1c55d | 727 + ...e1ec9931968d0b4839bcc2846ac421501b216b1dc5 | 115 + ...f24fdbe06aebb10794f4f12074d348332028f370be | 954 + ...07a493e2e3f67706e5f26f998287c5686e76cc3ce6 | 614 + ...9d26d5bcbd3d3039c94d7ab5ef9862e472f348c064 | 627 + ...d63a6d802e4022b8f103e410e7cd32062335e28b6c | 204 + ...928fe30d0ea335f5f93e1169d80982a08c6885f2bb | 122 + ...9d69bd4a2b937933dffd4277f006ebbbd9adfa987f | 1104 + ...7413d4ccb1238ce1fe92867759be4b32deb2168fc0 | 571 + ...67b2a1f043248e62c5b1cdc8bb3e1f667c1c34285e | 147 + ...cceb6213d967692d999e249f1ef541e136def3e6bb | 151 + ...0238ae1df705e1853f3ea7a0aa65fc3e50c5ea6554 | 522 + ...3dfc8ad37c024c9da19efa0bee9fa0c4fc5b9206fc | 367 + ...de3bf6e4fa02a9a6419c20f6aa46e56eec4bb95233 | 21 + ...d21f89af967724d20db932fd0ababfc5669d7de006 | 456 + ...d1df785b6267a4b23e03c626098e46c4874e06667a | 479 + ...59d7a4c7c10bb27c718ed6b84ca703148dd1155a54 | 198 + ...22f18df666aeb6e50ca464af9ca6b995567cffe0a3 | 147 + ...0593af33f20cab7e631679d4e45ad1f3de9bf5a675 | 15 + ...f6aa17f005237ed6b4228f2904a073cbb2266127f4 | 5771 +++ ...0429c6f6b766f0c5e41d0dd322bc0f36d8226b0835 | 146 + ...1044d366a4c0285ea0782a052efddefd1c92a4f775 | 16 + ...758b9c05087ed06d005cde05b8bc1cfa16044745f9 | 24 + ...9420c54df03e86df7581eba71fb5d0c2e3dc232465 | 555 + ...761dacf0f3110ca2bcb73dc3a3c8f39e7125288a40 | 138 + ...0912a99091165d710028eece07f326a43ddc0d4519 | 82 + ...f858add9e565d2899b1039c2b45b3372d65d721dea | 589 + ...b9bdd4ed9fa870348b6bfadba5cc54090120e32dd7 | 24 + ...0226dd94e4e97b66f75f825c3ba98bfed99636bf14 | 396 + ...9b8660339b6342542c41225fb5c32cd8c520a6e4a9 | 97 + ...31c49ca4b6e37a7ca525f43f79a69bca0375c49054 | 155 + ...b40ed349b7b53d05c1b63ab602af4bc9bf4a6b920c | 239 + ...192981aa28154ccb002069f777c5bb4ccb122a790c | 262 + ...d39e14bfa47c192f36cf0660e7e89a645876f9d7ce | 376 + ...374cbdf2c0ec8ae553628c505827deed1f11334b45 | 105 + ...93cdd6e2889fa105acb682cb79b33c54650af81e32 | 431 + ...c6198d548265adc9416164f324578fc0fb9ca564e7 | 284 + ...be945efa2396161f6bfc5e42d4730e68bbe8583ae6 | 485 + ...80034e3385e63ea872b4ea8a2e1989d2137d8a0cb4 | 280 + ...bad38d1ff163ee10ecb33ecdeaf78e0eacad06a635 | 84 + ...a0e015029503465a25ad5e55c1b21f9ae5ef236c37 | 53 + ...311f1e05a6334e208b9ae9cf97953d22797683e8f0 | 87 + ...26b103a301a1ad0e1f7cfefd57069aabdde5f52125 | 537 + ...dfd3010fe62dc0784d7462d058f66a5f815c0cdbee | 141 + ...c2479f41f5c0fa75abacb3765f25e6fd7685843c51 | 33 + ...f14705b79eb518cbf5bffbb9f5c06c58db21da97d0 | 195 + ...f50ea36ed5c8e673223a645c30d37d2cf710618307 | 31 + ...d47d7dfdf33c9c1e2d9ea314ef4da20d737cb47dfa | 249 + ...95a6f8e6da15a4c18dd7fc01427a4a8f89bc682347 | 124 + ...80af1f3c9636949e7513d33bde648ca52f0cbed5aa | 3875 ++ ...e214da74f4153de48ed328e120e5e9d8e03ca7d1bd | 157 + ...ad014c39166ded430ffe7e6cca4437c1357918f0fb | 273 + ...36f44766cca5b6ab47d090bebd4fba4dc7aeaa0d79 | 31 + ...ded5d8ec72aee9e59c27e91777620b6abf4369eba0 | 623 + ...c49e19fa5bce4b6aa5c7f124c055a472c33d2870b8 | 65 + ...eeb53d56385d4f7a51e7558316a9751ba945e7d4fa | 709 + ...51d735a8374f1d121aa37343d49e9348f372274c80 | 55 + ...1d3c924ee99f6268088fa46c0662acd0fb8536cbed | 888 + ...3b4e048519812922ee590ba6f9cf4b7b2e48bb9067 | 887 + ...a7ea05d12dc0cf52d80c38a3e867f8e80031bd6605 | 954 + ...931fae805de0093324f335ed6ddf158d7279201696 | 9 + ...ad1007ae0527e2622234a713d83e9aaadad1356a1d | 46 + ...4cf5a3d1154be8255001d7e2c911a4cde4ecae7660 | 238 + ...61c1d3713af4f539c5474c80f0361a11ecab3753ed | 778 + ...e219434ecca96644049abb47cecf8ee7d47e0ab989 | 7467 ++++ ...0a22701fce17641f213e8abb34a7b100b4769d6094 | 387 + ...7b450745034e520bf70267d4902135376199c71020 | 103 + ...a77ba40354c9c2764cc3e4452566d0627ee1866540 | 1139 + ...337eaf2f806ad745fba0c7574d7324a8211da1daa8 | 4965 +++ ...16629393c301387966fc7a45bed1b1f59fc77a3ea6 | 1004 + ...97b74def4ea0cc89909b37b7f5b24b0374cfe5e82c | 43 + ...acdb0cd3266270ea1f10bfd8d887acc680684330f3 | 171 + ...007a9eddfea32f8f26cfbcd6f142b5f25e0b1bbef4 | 525 + ...2e5f2823c932005ad3aae5d92f9f4e1261ecf02779 | 176 + ...8adcb05fffa8749282f875208d51620246c35a275b | 213 + ...d6cef94489983aa4d09918d19cf51b1c404b336a5a | 659 + ...081a9e370cd4b333847ed64e467eaea20107dfd45f | 212 + ...2341570349d38a8af60b32c5f2df30e94e85481829 | 66 + ...07491cddc436842c662b2a476ed260ab6480e6f802 | 749 + ...b1ebd6396ee31f95391dfcec6a6c9bdce2b0feeb2c | 16 + ...2f628ea0e776153887385d65cc78ffa17a0256ae50 | 17 + ...5fc3249a35b03f7ec252118c7088c1c1b1a67dc5da | 1713 + ...681270f4f28a57cd7a86ed3420c3bf00f883aedd18 | 15 + ...03fcd22f594869eb74e10512fb9921745939d15aea | 6459 +++ ...6f3c512eaece1450eb4666090c905a5902048894f5 | 58 + ...83bec3d20863d75dc3281c96429026bd570e3e5096 | 123 + ...1e10f352026a2a9faf34c4080472f93d873fff24ef | 598 + ...279984cfbd07bf26ff984ce5c2f7ded3790a5d9e01 | 32559 ++++++++++++++++ ...4ebdd865636602a406515a0675ab107077200027de | 604 + ...a88bb9b2be7023eb5dc810493408a4e84de3449533 | 2092 + ...37a881f97ef158c19691e2ddb796445dbf7c0a8907 | 242 + ...4f9dbe6e6719fa42104f9af2b09510aa687271bdcb | 608 + ...f0bd39f0f8307e19dd83b3eb33273fba9bae71bcc2 | 20 + ...5d0acc56c56ec013fcb9599bee77a4ede5d0a736c0 | 932 + ...fd4954ed57caa2d28029fa9f1fd2773883b6c220b4 | 223 + ...7e4861d9c9f6bae677fc95ee989c745446fe21e81c | 162 + ...76e38f473727a14b9a3c3f988622e66fcbf512e0f0 | 449 + ...d16e72e68a578b08a30a478d02043f65889d0e95b7 | 77 + ...b4a6b301df01bd132a858e4528aec01314fa64f23c | 175 + ...5060946d737d800763ec4042e5420036da853e6e83 | 92 + ...625aaf6c810d8855f4b72ad7109ef749e83826e5ed | 592 + ...009bececc021201860c0d8e5ebb61fba41f03404b9 | 46 + ...c35605e54a6dcfd86715ad2aee42aaa98d3f82eb49 | 198 + ...a1e7d2263468243816556b6cfe6646a62331b5d03f | 58 + ...f2effd2d4b0e070da43f2bd770412a83809e7adaae | 99 + ...3a801158bdb9addb99abef44072bbc76b3f7084f27 | 225 + ...357a3e21442f739358a5c11a1f2dd0a361019522db | 586 + ...5628438c565acf06c55768fc5efae3ea76bab5d5f6 | 66 + ...82706157752717edf84d93bb989228d9bc70290df1 | 110 + ...ceecf2a576cba1a878a71d9f8a3a6f2a76352ab8b5 | 55 + ...478e73566b8dcebefae92a941201af13193b8b3e3d | 144 + ...b3eeb0e2d1fb98156e006f8c8a04fad2f41e616456 | Bin 0 -> 65692 bytes ...6a30f63af84c801dfa9796882a561e1053add3b50e | 70 + ...539ec4dde85a924b567ed0fa37164e0fc5427f3c04 | 92 + ...a0cf2b2ca7096dc2c783f2ac77712aa54c1a47274f | 59 + ...bf170923e9fb7b4fa041cc92a3b808c16aeb271376 | 59 + ...c3771747e40b3abdd9beeee40b798005cff1d3fc3b | 79 + ...2170c18b017f4837f61a31444a04ec3f31583c2cdf | 31 + ...38c07c71982c00f5fa23502f2de61260a79440f679 | Bin 0 -> 27719 bytes ...53eb31501aa66be46696c98e8cdbf25895865b9531 | 603 + ...9681354b7137434aa5b7612cc7c6b289ceddb709da | 447 + .../MCM02 Fluid Inbound/resource.json | 17 + .../MCM02 Fluid Inbound/thumbnail.png | Bin 0 -> 27719 bytes .../MCM03 Fluid Inbound/resource.json | 17 + .../MCM03 Fluid Inbound/thumbnail.png | Bin 0 -> 68531 bytes .../resource.json | 17 + .../thumbnail.png | Bin 0 -> 35897 bytes .../resource.json | 17 + .../thumbnail.png | Bin 0 -> 65692 bytes 224 files changed, 158551 insertions(+) create mode 100644 .resources/00465cd706cb99c615b3d77531374857e61a79ba2f3702eed003fec8e5ebca75 create mode 100644 .resources/008b076aa34e576666a1e6f3a9355e10fa2b780788d8c300891b9c362677bec5 create mode 100644 .resources/01b912eeeee2450e80ce0781ecdc727b57aa3e79d6bccfcb0d45bc5e852d970d create mode 100644 .resources/0315dfc7c08ccad40376f6119e045b037519a884c95c9d67f8aaac15a9d62925 create mode 100644 .resources/046e3cbac024588f2665518a4ab13f21fd8d861fe742ebe9681e4d59ba7f2cb0 create mode 100644 .resources/0470e3a8c0d099d79f0822cd23d9842d97260e89d8d6d32510a03b987698cc8f create mode 100644 .resources/04c5391f149636bfe825f8e500b426eef055d5e4d22d459289e1af0d0de4fd43 create mode 100644 .resources/06061d5d51b783f7cabb8a4d1b171d4ab9739b378680f90bae58fb1432b166f3 create mode 100644 .resources/090492664ed81c88bd43d52cbf7ce1859be65497449d13ca4b1c5b7197e0c46b create mode 100644 .resources/09983386d04a07dc158b22189bd1ace2581d5d6372ed5710b1c87ebbbf7c7545 create mode 100644 .resources/0bc3fc19061281e52b5a57088ab17ad9317455b2917a8ad912cea990ba8f8bb9 create mode 100644 .resources/0c7e83d6f31dc3848078dd70449ed0f8d58c4ef308b347fd50167de46fbfb5ab create mode 100644 .resources/0c9684b4844f82688d9a37ad8403717f2088cf034acb82de543ed60018556a8f create mode 100644 .resources/0e722f437444f24293370b4609b13cb5627c09828751043f6db5f1a76bd1662b create mode 100644 .resources/0f2627f4b1cf15524113587476de67a430addad65c14ec5dd55886c7b32462b1 create mode 100644 .resources/0f300f4e46cb286ed0a05911bd54bf09c26a6f856903d01256ca193336161a78 create mode 100644 .resources/0f870f7235a745a7c0e41467e60b14826f323336f85035614135d2cf7be39d0c create mode 100644 .resources/11499d6a5a1a060cb03ca6567b468d2d01f64ffab98c30b8236d53b54aff3bfd create mode 100644 .resources/120511ddd15abba403e8af32f8dba5feda070be623186330d2d94a62a23f3f34 create mode 100644 .resources/122e687bc2e1a9454557314d00912426a69a5c06bc6185c60d0c0458b8016101 create mode 100644 .resources/159bec16f87bfac327073de895c0d2ee6f75a3fba68fff9ac92ec5bb475ad6e7 create mode 100644 .resources/166f3bad8fccdb86198dd71254abff7ea2c843faa9df618060bb05d566b183db create mode 100644 .resources/16c11692b6966337faf66111812dfcf77944fd34cf91dbda04dcc15df6bb746e create mode 100644 .resources/1a67cf29366ddc4c9abeb92e093150450a0e43993714ac6fd536ac5c98043ec9 create mode 100644 .resources/1b05fe73f219f95148344b1938949f814b9d1e3f489be03715ba3b8ab954a95f create mode 100644 .resources/1b46a7e5d3227a109e6cf5c44593125874b6a3925337f3e36af1c1da29bbfc56 create mode 100644 .resources/1be6fbc47dc087ab9174d27687f2f14870bd4d82ec43ae8d16abc0c83a3154ab create mode 100644 .resources/1c5aa327a910a2aa5eaf95aaa63a07d1570def6619be8c1f13caad25fa5f842c create mode 100644 .resources/1c98f8f79b5dd8c3057c8b68416da5e99f3bf56908f95805029fbdff38c83279 create mode 100644 .resources/1cdee86d0bd49bb495e04026248a8e1f6a0d92706470a5b8feba47753e95f409 create mode 100644 .resources/1d8c466236681823083135ce8355a8cf8842ac856c77c4b80fab00924cf19ea0 create mode 100644 .resources/1dd7015b65e8a1c2f28848c2b4a0d24464d4e4d0168fce41970982de365f2d63 create mode 100644 .resources/1ea7dfdb49968e59e944bc59e75f72a65c4b4c3369b412455c88430394145bc8 create mode 100644 .resources/1ec7206cf9f00d16bfed1891fe43b62865e78746e5ad859e8a99fa6e585ac096 create mode 100644 .resources/1edd25f4f17bbf4964cd66bffaa6b66e07a3bd3b94f6aeee3790fc1fb9a67d14 create mode 100644 .resources/24f26035a2dbaef6cc5fad6abcec96b73bbd5eddc8a2a1ac78dd7201fd3adde9 create mode 100644 .resources/25313293b4a91dc75c10134d645ec3724e879a90c650ff48029ca5faa7941a74 create mode 100644 .resources/2556d6a6a86d0c8d9d427845d17819be0c10ce1b21edfad1902afe39345a8c75 create mode 100644 .resources/2638e4b0b80aa25c57788fb25c84db754a5741e974dac2f92f14ba264277a188 create mode 100644 .resources/27f9e112656215c5e81d106a2a8abc36bcb1a3b35105dc11b3446ebe8b984bf0 create mode 100644 .resources/287526ad50c3469bb2006dbead24822d6710150bc68f63cd7a236fa65e803a94 create mode 100644 .resources/28fbdf24361839b5c83803e523c90319b1873771a8688690494674da2c440d20 create mode 100644 .resources/2911e2416b3f9d9186e3167869fa8cbacb6b2c24236e294e9cc80940f4a623fd create mode 100644 .resources/2a7a3249da8cbed5b66601236ed50612b6f69ab326cd08abbe7d491dc36009dc create mode 100644 .resources/2cfc779230abacc2313e22e8841824b687613d0fa3c5ef5874284333ab6c6b1f create mode 100644 .resources/2de74f61b1e49a57ebb2b489577044177605c03a472d2b8424432619ccd14d74 create mode 100644 .resources/2eccb0861244a6617c828bb13d93b919d46e6b503f7839a14349181705f7ece7 create mode 100644 .resources/2efd45bc558539681ac57c1619e39ac89175e0e77bd37b369c22a639f0a749da create mode 100644 .resources/2f718abedae377af5f5ce883b1edd8807e32151b2f11bd82846794df6cbc3fbc create mode 100644 .resources/2f96e52786e432090b8f7ca46b316a1448715f38c7e8661b82ee501fd58a6617 create mode 100644 .resources/305f65f7f346d9c6d9e49f4513e9eee84140ec1b6e66fbfb3a9afc2a8304b103 create mode 100644 .resources/30d1cc4c95f6031666b3d236d81f0af4928c78625bc8c6a5b1cac59053d1d5c2 create mode 100644 .resources/334448723737520c043f72840d0e5a25489054133253b78819f314cf0c6b77bc create mode 100644 .resources/3546e8f9ea2622403584b03505ad73912584071db894d39cfeb7397a2eb652a4 create mode 100644 .resources/36ffe3b88ac704181645812175f95ec8aed9fc4f1c4a2fc14e9ba9c7bb220ecf create mode 100644 .resources/374a387b6fbed5b6f90fdddc0bc96445fe060f31428d78def85d2f5521fad4be create mode 100644 .resources/39ad9288b6a75113302b7d52b3f7fc60a2baa58e22ad75ea896e22ac63484702 create mode 100644 .resources/39c1efa0540ced11e009464959c68e8e3fb7a601e861a7eacb14122ea87fb9bf create mode 100644 .resources/3a9b20c8045394086dffad5bc4e0fd92c3bdb1231ef074d4664f340803b90a6a create mode 100644 .resources/3accd52b8292fb20b1b73347ace3e588941afd07466a7e3640a901c3b301b639 create mode 100644 .resources/3c78ab939d40b94a06dbbbde600018a7d9c850998ea62dd867f6ecbe3ba78299 create mode 100644 .resources/3e272246cdb301f8b5b5f0bfb9984738f70b26cab08de1434322ab859e124d25 create mode 100644 .resources/3fc26b8576cccec41d223f2c5edf93ecaa98e70c92d329e785a337234e25c0a3 create mode 100644 .resources/416f484acb7c2bb270e44620e7c017c70b50412f196b674e6a3e0f2d8fa96394 create mode 100644 .resources/41d31bd4f2c0d3b7560a4ca4e34dc3084c281851659c09bb6b07ea9990a9489c create mode 100644 .resources/42b29129359d71758c6b77d166d1973282d63f0eda97b3d5b1687d1caad6d73a create mode 100644 .resources/4385abed72f5c583cd6f2fd03594f586f30b43a38c7a102217e21c886efc5ba8 create mode 100644 .resources/443d03f0109551b4915586341634c63d728f365778be52dc13cb10e223ef6e27 create mode 100644 .resources/44809c60ce6b1d20165fa01013884908056891fe088c1ac26260fcee9b74d655 create mode 100644 .resources/44e420821bf96d9661f3ed13c4a20761adbc7b92fa59627226b61e3bea1d27eb create mode 100644 .resources/4559f6bf8ba022ad4384a09e6c7ac82a29fec61dd5a680f117c35e038a58c6e6 create mode 100644 .resources/45fe4d5f2d21e947305533276ba3ab85dca61988c709f81a5bc50a63061f474a create mode 100644 .resources/46b4c8196ff5162f0b038003d3c8f90f48afbaa1e55c24befaaa23562cb3dae9 create mode 100644 .resources/4781903f83834e30d70bf70f5437b9f45078c73693e2d1dd0279ffd7195c7876 create mode 100644 .resources/48ce87b0ca980bfd922e0eb8db88a6ee8ee8a203cc8f99abf5afa9ba51ccbe18 create mode 100644 .resources/4a18d79a3ff1de118ea1fbbed22782dbecd6276fffc6641f5df6aab6da17a498 create mode 100644 .resources/4a27a37dea61019ff02dffc1c52bde521e45cc1ecfdac6de87391db78154fa5b create mode 100644 .resources/4ecd8421e154eb8d21bc548e61936d0fbfb8027cd9219da4a6a9f62a6889b211 create mode 100644 .resources/4f3e3fb0d6f55c6adb610e6f74d0e52a9bf269d91fdceeb8ca1838a98adaa23b create mode 100644 .resources/4f590e8f4487d768de425d7ed1dabb88bc410b8d65e4369d7eb8d577097b2f04 create mode 100644 .resources/4fbb69ea85f006e7d0648f91e07d00d0ad324d98e0b10700328928faee3a76a8 create mode 100644 .resources/4fef3d35477dce7ea49dd22282c5f5f35b87a14c7b69bc0e77d3b5e431b2404d create mode 100644 .resources/52a803e7dbe79a31a2e4c178180e4a1ae337e27542c023b8a1aa887e691a6a4f create mode 100644 .resources/52c94ff315f93f8e443d975953dfe4ce1d62f8529ec9fe361980e756b18e7334 create mode 100644 .resources/534a3270419edec362e021e66bdf36e333dbb842c25afd4b0e46dbd1275e4b86 create mode 100644 .resources/53daed53ca82ef50c0d1a825743d1e72f4eb1aef7c93d2dcf834118f3e44094c create mode 100644 .resources/545b8b1b41e1010ab5ae392903df7d65959ec40b6ddb07c44c91f662107b3f45 create mode 100644 .resources/57911d9c8a0aabb323809e1508d23daea2f6a5f194ecbe53070d1a8a76811ae7 create mode 100644 .resources/5db7b323b176ec0c9600548c4be2ad8e0ad03f84d49ac4610c46362d9bea8e35 create mode 100644 .resources/60efdd795e408c10e447f12ef617f37fbf195808c7f1088efc3b71b762899cdb create mode 100644 .resources/6129b02fa079d41edaf9997f71d8ab3bb047283c0bf2ed762b058176e7fae368 create mode 100644 .resources/66e70b3df18ccf7b625c78bb5c17b88931efdba779935cbf80fc0001fd06231c create mode 100644 .resources/696c6536ed1424a5882e25de5d63a5f74f3f53ab3341d654385637b748dbb299 create mode 100644 .resources/6baa4d757e7ae772648da57ee76c68adb28cc399e1a2de5deccd9b833f380529 create mode 100644 .resources/6c17ddcad7c68dc7c160e4e9d8bf74344846c0fc72868b56461bf4dc16bc1ce1 create mode 100644 .resources/6e68c94742f2d88bc49ec65479f33ff9a2d24a56fba4b0e26d9885dc12a1c55d create mode 100644 .resources/6fc287161b4a45507a2342e1ec9931968d0b4839bcc2846ac421501b216b1dc5 create mode 100644 .resources/714326548c55526266be11f24fdbe06aebb10794f4f12074d348332028f370be create mode 100644 .resources/71f8506be9076cc7dd756b07a493e2e3f67706e5f26f998287c5686e76cc3ce6 create mode 100644 .resources/734efa3652ca169af9acd59d26d5bcbd3d3039c94d7ab5ef9862e472f348c064 create mode 100644 .resources/74152d7e2cb159bbffb64ed63a6d802e4022b8f103e410e7cd32062335e28b6c create mode 100644 .resources/75dd16cb25a3bcece01ca5928fe30d0ea335f5f93e1169d80982a08c6885f2bb create mode 100644 .resources/77dc8910ab440f9e7ae3ba9d69bd4a2b937933dffd4277f006ebbbd9adfa987f create mode 100644 .resources/780825d85de900b059b5807413d4ccb1238ce1fe92867759be4b32deb2168fc0 create mode 100644 .resources/7c672b1aaab2347134048467b2a1f043248e62c5b1cdc8bb3e1f667c1c34285e create mode 100644 .resources/7ce24de31a792785a8519fcceb6213d967692d999e249f1ef541e136def3e6bb create mode 100644 .resources/7e1a4cc36f0a459267860d0238ae1df705e1853f3ea7a0aa65fc3e50c5ea6554 create mode 100644 .resources/7e49f2b3928b1313ccc4f33dfc8ad37c024c9da19efa0bee9fa0c4fc5b9206fc create mode 100644 .resources/7ec3d670cd904a32010acede3bf6e4fa02a9a6419c20f6aa46e56eec4bb95233 create mode 100644 .resources/7fdd96095f08dbc1a62c91d21f89af967724d20db932fd0ababfc5669d7de006 create mode 100644 .resources/814b68e97d82aff8c094dbd1df785b6267a4b23e03c626098e46c4874e06667a create mode 100644 .resources/840cd1bcdcfbfd0f6b613b59d7a4c7c10bb27c718ed6b84ca703148dd1155a54 create mode 100644 .resources/8644181828f65e97d2999122f18df666aeb6e50ca464af9ca6b995567cffe0a3 create mode 100644 .resources/893636a3101d99e74481180593af33f20cab7e631679d4e45ad1f3de9bf5a675 create mode 100644 .resources/89e8d0518adc7b877f117ff6aa17f005237ed6b4228f2904a073cbb2266127f4 create mode 100644 .resources/8accdd98bfd11bededc8d40429c6f6b766f0c5e41d0dd322bc0f36d8226b0835 create mode 100644 .resources/8ae2f2d3e126f6f11883ca1044d366a4c0285ea0782a052efddefd1c92a4f775 create mode 100644 .resources/8b21cb94fdd864f689b817758b9c05087ed06d005cde05b8bc1cfa16044745f9 create mode 100644 .resources/8b30cb94d641c2385d566c9420c54df03e86df7581eba71fb5d0c2e3dc232465 create mode 100644 .resources/8cd9e1f19cc72affbb2078761dacf0f3110ca2bcb73dc3a3c8f39e7125288a40 create mode 100644 .resources/8ddc6c539ed4b014833ef10912a99091165d710028eece07f326a43ddc0d4519 create mode 100644 .resources/8e976e66614ca0574983c6f858add9e565d2899b1039c2b45b3372d65d721dea create mode 100644 .resources/8fdc3c86f295f5f0adbfd5b9bdd4ed9fa870348b6bfadba5cc54090120e32dd7 create mode 100644 .resources/90c168f2da462905fb567e0226dd94e4e97b66f75f825c3ba98bfed99636bf14 create mode 100644 .resources/93912b2ca6fbfd11077ba29b8660339b6342542c41225fb5c32cd8c520a6e4a9 create mode 100644 .resources/93bccd01338ea80e459fd431c49ca4b6e37a7ca525f43f79a69bca0375c49054 create mode 100644 .resources/966937954daefcc3da8fa2b40ed349b7b53d05c1b63ab602af4bc9bf4a6b920c create mode 100644 .resources/96f1908d88057ded84eab1192981aa28154ccb002069f777c5bb4ccb122a790c create mode 100644 .resources/97699c0519d0e238c01e01d39e14bfa47c192f36cf0660e7e89a645876f9d7ce create mode 100644 .resources/97863ff34fb93495d76f65374cbdf2c0ec8ae553628c505827deed1f11334b45 create mode 100644 .resources/9854a491c7c889c1b51d5593cdd6e2889fa105acb682cb79b33c54650af81e32 create mode 100644 .resources/9a91c9b0da1f454bb77175c6198d548265adc9416164f324578fc0fb9ca564e7 create mode 100644 .resources/9bbc5d5b3801b16d07e4bcbe945efa2396161f6bfc5e42d4730e68bbe8583ae6 create mode 100644 .resources/9c6243872d01b8d4c6f5d480034e3385e63ea872b4ea8a2e1989d2137d8a0cb4 create mode 100644 .resources/9e2cbc5851523fa1e6c52dbad38d1ff163ee10ecb33ecdeaf78e0eacad06a635 create mode 100644 .resources/9ffb6d296b657b2217a535a0e015029503465a25ad5e55c1b21f9ae5ef236c37 create mode 100644 .resources/a00e2564e93fa9e6fbd795311f1e05a6334e208b9ae9cf97953d22797683e8f0 create mode 100644 .resources/a1d881bea6a6c85e0e7e5826b103a301a1ad0e1f7cfefd57069aabdde5f52125 create mode 100644 .resources/a351e2a124db0fe74886b7dfd3010fe62dc0784d7462d058f66a5f815c0cdbee create mode 100644 .resources/a4005cc3c6f7c97f9823e7c2479f41f5c0fa75abacb3765f25e6fd7685843c51 create mode 100644 .resources/a614044f01c3d51d89c6dcf14705b79eb518cbf5bffbb9f5c06c58db21da97d0 create mode 100644 .resources/a70d5e4d2b96ac0c853db9f50ea36ed5c8e673223a645c30d37d2cf710618307 create mode 100644 .resources/ac901d7957bc85ea1acc2dd47d7dfdf33c9c1e2d9ea314ef4da20d737cb47dfa create mode 100644 .resources/ad8099bb47552ada05968195a6f8e6da15a4c18dd7fc01427a4a8f89bc682347 create mode 100644 .resources/adab22a32349343ad93c1380af1f3c9636949e7513d33bde648ca52f0cbed5aa create mode 100644 .resources/adbd026cb7c486b2fdc49ae214da74f4153de48ed328e120e5e9d8e03ca7d1bd create mode 100644 .resources/ae7bd53c73ac75514cea21ad014c39166ded430ffe7e6cca4437c1357918f0fb create mode 100644 .resources/aee6a0d16f9b5364e9327d36f44766cca5b6ab47d090bebd4fba4dc7aeaa0d79 create mode 100644 .resources/b075120ed231a18b3a400bded5d8ec72aee9e59c27e91777620b6abf4369eba0 create mode 100644 .resources/b0b612af32dc9e46160dccc49e19fa5bce4b6aa5c7f124c055a472c33d2870b8 create mode 100644 .resources/b2a892a9a1575eba189706eeb53d56385d4f7a51e7558316a9751ba945e7d4fa create mode 100644 .resources/b3282887ace7d6fda2cb5651d735a8374f1d121aa37343d49e9348f372274c80 create mode 100644 .resources/b352173c988e0ef0bec6fc1d3c924ee99f6268088fa46c0662acd0fb8536cbed create mode 100644 .resources/b386b14f5113800be826af3b4e048519812922ee590ba6f9cf4b7b2e48bb9067 create mode 100644 .resources/b4263577e6c6c97c83d07aa7ea05d12dc0cf52d80c38a3e867f8e80031bd6605 create mode 100644 .resources/b559c48eacc55053855683931fae805de0093324f335ed6ddf158d7279201696 create mode 100644 .resources/b6b41b08ae1f50d2483c77ad1007ae0527e2622234a713d83e9aaadad1356a1d create mode 100644 .resources/b6c6e2da5556b83dfb30654cf5a3d1154be8255001d7e2c911a4cde4ecae7660 create mode 100644 .resources/b70e3dbbe704d1c2a42aee61c1d3713af4f539c5474c80f0361a11ecab3753ed create mode 100644 .resources/b85aab4af251fffae5184ce219434ecca96644049abb47cecf8ee7d47e0ab989 create mode 100644 .resources/ba37b574b3838b53f0161f0a22701fce17641f213e8abb34a7b100b4769d6094 create mode 100644 .resources/ba3c312a4e2be0fa7930407b450745034e520bf70267d4902135376199c71020 create mode 100644 .resources/bba4b1de48612f08ad6e51a77ba40354c9c2764cc3e4452566d0627ee1866540 create mode 100644 .resources/bbb999bd7836e6de7f19b8337eaf2f806ad745fba0c7574d7324a8211da1daa8 create mode 100644 .resources/bbc617038466d1e05aa30b16629393c301387966fc7a45bed1b1f59fc77a3ea6 create mode 100644 .resources/bbf929ac0021efb4bc4b3697b74def4ea0cc89909b37b7f5b24b0374cfe5e82c create mode 100644 .resources/c06f2a883a677a3f4c8e59acdb0cd3266270ea1f10bfd8d887acc680684330f3 create mode 100644 .resources/c0f488c45609f57c5f3e2f007a9eddfea32f8f26cfbcd6f142b5f25e0b1bbef4 create mode 100644 .resources/c2fdbe76dd00b5773fa7b62e5f2823c932005ad3aae5d92f9f4e1261ecf02779 create mode 100644 .resources/c3308ec23c1ce79b763dd78adcb05fffa8749282f875208d51620246c35a275b create mode 100644 .resources/c418c29d4d751adbafbbdad6cef94489983aa4d09918d19cf51b1c404b336a5a create mode 100644 .resources/c55a611e69770bd8b888eb081a9e370cd4b333847ed64e467eaea20107dfd45f create mode 100644 .resources/c67d3a171e6dea9dbc310a2341570349d38a8af60b32c5f2df30e94e85481829 create mode 100644 .resources/c6f640b4cf5d49bd397a1b07491cddc436842c662b2a476ed260ab6480e6f802 create mode 100644 .resources/c76ea0cbc53b199318612ab1ebd6396ee31f95391dfcec6a6c9bdce2b0feeb2c create mode 100644 .resources/c83cbc9eaa22734f2bd1b02f628ea0e776153887385d65cc78ffa17a0256ae50 create mode 100644 .resources/c92eef8cc54fbbf4ed0ad05fc3249a35b03f7ec252118c7088c1c1b1a67dc5da create mode 100644 .resources/c974afaba5e478536e7dbc681270f4f28a57cd7a86ed3420c3bf00f883aedd18 create mode 100644 .resources/c978307aa5bca3d30e1d0203fcd22f594869eb74e10512fb9921745939d15aea create mode 100644 .resources/cb256c897d139582c611d76f3c512eaece1450eb4666090c905a5902048894f5 create mode 100644 .resources/cb7fed479e2ef8b5bfa6fa83bec3d20863d75dc3281c96429026bd570e3e5096 create mode 100644 .resources/cbfa32673e62fbc4b2e33c1e10f352026a2a9faf34c4080472f93d873fff24ef create mode 100644 .resources/cca63b54da8169908a9315279984cfbd07bf26ff984ce5c2f7ded3790a5d9e01 create mode 100644 .resources/cf4987352a124269b11edd4ebdd865636602a406515a0675ab107077200027de create mode 100644 .resources/d2dae318191273603a3599a88bb9b2be7023eb5dc810493408a4e84de3449533 create mode 100644 .resources/d37d5e6af4dd2f99913eb137a881f97ef158c19691e2ddb796445dbf7c0a8907 create mode 100644 .resources/d55e91df2df4723d752b8c4f9dbe6e6719fa42104f9af2b09510aa687271bdcb create mode 100644 .resources/d5b60f140f35d0d0d1fc62f0bd39f0f8307e19dd83b3eb33273fba9bae71bcc2 create mode 100644 .resources/d67eb06636d3eb035cbb1b5d0acc56c56ec013fcb9599bee77a4ede5d0a736c0 create mode 100644 .resources/d7e3fba185cda2cee2757dfd4954ed57caa2d28029fa9f1fd2773883b6c220b4 create mode 100644 .resources/d8c69bd5cd8e681b3be6c77e4861d9c9f6bae677fc95ee989c745446fe21e81c create mode 100644 .resources/d8e53bc702c7f3592644d976e38f473727a14b9a3c3f988622e66fcbf512e0f0 create mode 100644 .resources/d93480cbfa2afd230facfad16e72e68a578b08a30a478d02043f65889d0e95b7 create mode 100644 .resources/da88dc7575ce5efb167e87b4a6b301df01bd132a858e4528aec01314fa64f23c create mode 100644 .resources/da8f4e9dfbe74aca9aec175060946d737d800763ec4042e5420036da853e6e83 create mode 100644 .resources/db3da19cb91486723ef56f625aaf6c810d8855f4b72ad7109ef749e83826e5ed create mode 100644 .resources/dea7932db96c559d51ad7c009bececc021201860c0d8e5ebb61fba41f03404b9 create mode 100644 .resources/e3431e02044c57f72c19d6c35605e54a6dcfd86715ad2aee42aaa98d3f82eb49 create mode 100644 .resources/e4bf8842b5470c56b2aed8a1e7d2263468243816556b6cfe6646a62331b5d03f create mode 100644 .resources/e9916de03659b699d08cb9f2effd2d4b0e070da43f2bd770412a83809e7adaae create mode 100644 .resources/ea24da0df5f485c7a346683a801158bdb9addb99abef44072bbc76b3f7084f27 create mode 100644 .resources/eb758cdb36fd46a553dab5357a3e21442f739358a5c11a1f2dd0a361019522db create mode 100644 .resources/eb9370d16e98d1db6b91815628438c565acf06c55768fc5efae3ea76bab5d5f6 create mode 100644 .resources/ec3ed5eeb9e098fcd8b05982706157752717edf84d93bb989228d9bc70290df1 create mode 100644 .resources/ecf83ef8e6b9b40a2bfffaceecf2a576cba1a878a71d9f8a3a6f2a76352ab8b5 create mode 100644 .resources/f25db8a7e193566e4aba05478e73566b8dcebefae92a941201af13193b8b3e3d create mode 100644 .resources/f4539402aa21da5382cea4b3eeb0e2d1fb98156e006f8c8a04fad2f41e616456 create mode 100644 .resources/f4c38273fb2603da1c473d6a30f63af84c801dfa9796882a561e1053add3b50e create mode 100644 .resources/f8d453d8712da31502743c539ec4dde85a924b567ed0fa37164e0fc5427f3c04 create mode 100644 .resources/f8eebc5822dfa476860805a0cf2b2ca7096dc2c783f2ac77712aa54c1a47274f create mode 100644 .resources/f8f5e9b87f063b850c22b6bf170923e9fb7b4fa041cc92a3b808c16aeb271376 create mode 100644 .resources/f91a4fcd0ab7693c84cbeec3771747e40b3abdd9beeee40b798005cff1d3fc3b create mode 100644 .resources/fa6a79c476ed4b2e3b249c2170c18b017f4837f61a31444a04ec3f31583c2cdf create mode 100644 .resources/fb720f4eb1ccebcc59488638c07c71982c00f5fa23502f2de61260a79440f679 create mode 100644 .resources/fbe73f50381bfde30f039153eb31501aa66be46696c98e8cdbf25895865b9531 create mode 100644 .resources/fc5d895182b05bf59f20009681354b7137434aa5b7612cc7c6b289ceddb709da create mode 100644 SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM02 Fluid Inbound/resource.json create mode 100644 SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM02 Fluid Inbound/thumbnail.png create mode 100644 SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM03 Fluid Inbound/resource.json create mode 100644 SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM03 Fluid Inbound/thumbnail.png create mode 100644 SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM04 Sorter Destination, chutes and Bypass/resource.json create mode 100644 SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM04 Sorter Destination, chutes and Bypass/thumbnail.png create mode 100644 SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM05 Sorter Destination, chutes and Bypass/resource.json create mode 100644 SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM05 Sorter Destination, chutes and Bypass/thumbnail.png diff --git a/.resources/00465cd706cb99c615b3d77531374857e61a79ba2f3702eed003fec8e5ebca75 b/.resources/00465cd706cb99c615b3d77531374857e61a79ba2f3702eed003fec8e5ebca75 new file mode 100644 index 0000000..9c230b5 --- /dev/null +++ b/.resources/00465cd706cb99c615b3d77531374857e61a79ba2f3702eed003fec8e5ebca75 @@ -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/.resources/008b076aa34e576666a1e6f3a9355e10fa2b780788d8c300891b9c362677bec5 b/.resources/008b076aa34e576666a1e6f3a9355e10fa2b780788d8c300891b9c362677bec5 new file mode 100644 index 0000000..016aab8 --- /dev/null +++ b/.resources/008b076aa34e576666a1e6f3a9355e10fa2b780788d8c300891b9c362677bec5 @@ -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/.resources/01b912eeeee2450e80ce0781ecdc727b57aa3e79d6bccfcb0d45bc5e852d970d b/.resources/01b912eeeee2450e80ce0781ecdc727b57aa3e79d6bccfcb0d45bc5e852d970d new file mode 100644 index 0000000..663dc76 --- /dev/null +++ b/.resources/01b912eeeee2450e80ce0781ecdc727b57aa3e79d6bccfcb0d45bc5e852d970d @@ -0,0 +1,2384 @@ +{ + "custom": { + "currentTab": "value" + }, + "params": { + "Tab_ID": null, + "Table": null + }, + "propConfig": { + "custom.currentTab": { + "binding": { + "config": { + "path": "/root/Header.custom.currentTab" + }, + "type": "property" + }, + "persistent": true + }, + "params.Tab_ID": { + "binding": { + "config": { + "path": "/root/Status_tab.props.currentTabIndex" + }, + "type": "property" + }, + "paramDirection": "output", + "persistent": true + }, + "params.Table": { + "binding": { + "config": { + "path": "/root/Status_tab.meta.name" + }, + "type": "property" + }, + "paramDirection": "output", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 930, + "width": 1920 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Content" + }, + "position": { + "height": 894, + "width": 1920, + "x": -1.0147699, + "y": 38 + }, + "propConfig": { + "props.path": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.custom.currentTab" + }, + "type": "property" + } + } + }, + "type": "ia.display.view" + }, + { + "children": [ + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.custom.currentTab \u003d self.props.value" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Dropdown" + }, + "position": { + "grow": 1 + }, + "props": { + "options": [ + { + "label": "MCM01", + "value": "Detailed-Views/MCM01 Bulk Inbound" + }, + { + "label": "MCM02-MCM03", + "value": "Detailed-Views/MCM02-MCM03 Fluid Inbound" + }, + { + "label": "MCM04-MCM05", + "value": "Detailed-Views/MCM02-MCM03 Fluid Inbound" + } + ], + "placeholder": { + "text": "Select view" + }, + "search": { + "enabled": false + }, + "style": { + "backgroundColor": "#C4D0D5", + "borderStyle": "none" + }, + "value": 3 + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Button" + }, + "position": { + "basis": "80px", + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#C4D0D5", + "borderStyle": "none" + }, + "text": "Lane Status", + "textStyle": { + "color": "#000000", + "fontWeight": "lighter" + } + }, + "type": "ia.input.button" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tself.parent.custom.currentTab \u003d \"Windows/Tabs/Lane Status\"" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Lane Status" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#C4D0D5" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Button" + }, + "position": { + "basis": "80px", + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#C4D0D5", + "borderStyle": "none" + }, + "text": "Scanner History", + "textStyle": { + "color": "#000000", + "fontWeight": "lighter" + } + }, + "type": "ia.input.button" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tself.parent.custom.currentTab \u003d \"Windows/Tabs/Scanner History\"" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Scanner History" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#C4D0D5" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Button5" + }, + "position": { + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#C4D0D5" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Button6" + }, + "position": { + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#C4D0D5" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Button7" + }, + "position": { + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#C4D0D5" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Button8" + }, + "position": { + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#C4D0D5" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Button9" + }, + "position": { + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#C4D0D5" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Button10" + }, + "position": { + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#C4D0D5" + } + }, + "type": "ia.container.flex" + } + ], + "custom": { + "currentTab": "value" + }, + "meta": { + "name": "Header" + }, + "position": { + "height": 40, + "width": 1920 + }, + "type": "ia.container.flex" + }, + { + "custom": { + "debug": [ + [ + "2020-03-24 03:58:00", + 83.44392609984358, + 93.58514404296875, + 71.81086730957031 + ], + [ + "2020-03-24 03:59:00", + 83.35893577107669, + 106.05998229980469, + 72.54214477539062 + ], + [ + "2020-03-24 04:00:00", + 83.2739454423098, + 102.124267578125, + 72.18306732177734 + ], + [ + "2020-03-24 04:01:00", + 83.26998772600022, + 104.7994155883789, + 72.2726821899414 + ], + [ + "2020-03-24 04:02:00", + 83.09998708000028, + 110.67745971679688, + 72.70557403564453 + ], + [ + "2020-03-24 04:03:00", + 82.95057846075277, + 110.90865325927734, + 72.86494445800781 + ], + [ + "2020-03-24 04:04:00", + 82.87408810123425, + 111.18544006347656, + 72.739990234375 + ], + [ + "2020-03-24 04:05:00", + 82.79759774171573, + 110.57137298583984, + 72.47943878173828 + ], + [ + "2020-03-24 04:06:00", + 82.72110738219722, + 111.59486389160156, + 72.50711059570312 + ], + [ + "2020-03-24 04:07:00", + 82.6446170226787, + 110.79205322265625, + 72.84617614746094 + ], + [ + "2020-03-24 04:08:00", + 82.56812666316019, + 112.36724853515625, + 72.59688568115234 + ], + [ + "2020-03-24 04:09:00", + 82.49163630364167, + 111.96199035644531, + 71.75237274169922 + ], + [ + "2020-03-24 04:10:00", + 82.41514594412317, + 114.09909057617188, + 72.87260437011719 + ], + [ + "2020-03-24 04:11:00", + 82.33865558460465, + 113.22314453125, + 72.4264144897461 + ], + [ + "2020-03-24 04:12:00", + 82.26216522508614, + 112.67841339111328, + 72.77767944335938 + ], + [ + "2020-03-24 04:13:00", + 82.18567486556762, + 109.4883041381836, + 73.2457504272461 + ], + [ + "2020-03-24 04:14:00", + 82.1091845060491, + 109.47913360595703, + 72.0219955444336 + ], + [ + "2020-03-24 04:15:00", + 82.03269414653059, + 109.40910339355469, + 72.11457061767578 + ], + [ + "2020-03-24 04:16:00", + 81.95620378701207, + 108.2085189819336, + 73.03665924072266 + ], + [ + "2020-03-24 04:17:00", + 81.87971342749356, + 109.74492645263672, + 72.89605712890625 + ], + [ + "2020-03-24 04:18:00", + 81.80322306797505, + 110.48381042480469, + 72.340087890625 + ], + [ + "2020-03-24 04:19:00", + 81.72673270845654, + 110.1125259399414, + 72.04779815673828 + ], + [ + "2020-03-24 04:20:00", + 81.65024234893802, + 110.58039855957031, + 72.02574157714844 + ], + [ + "2020-03-24 04:21:00", + 81.5737519894195, + 111.26719665527344, + 72.68399810791016 + ], + [ + "2020-03-24 04:22:00", + 81.57001033599973, + 111.0679931640625, + 72.2317123413086 + ], + [ + "2020-03-24 04:23:00", + 81.40001291999972, + 111.84290313720703, + 73.5782470703125 + ], + [ + "2020-03-24 04:24:00", + 81.22444354734957, + 111.08856201171875, + 74.54239654541016 + ], + [ + "2020-03-24 04:25:00", + 81.13445335130304, + 110.7277603149414, + 73.62892150878906 + ], + [ + "2020-03-24 04:26:00", + 81.04446315525652, + 110.72388458251953, + 74.79293823242188 + ], + [ + "2020-03-24 04:27:00", + 80.95447295921001, + 113.21517944335938, + 73.95577239990234 + ], + [ + "2020-03-24 04:28:00", + 80.86448276316348, + 112.6423568725586, + 74.46560668945312 + ], + [ + "2020-03-24 04:29:00", + 80.77449256711697, + 113.47187805175781, + 75.20769500732422 + ], + [ + "2020-03-24 04:30:00", + 80.68450237107044, + 113.81484985351562, + 74.11184692382812 + ], + [ + "2020-03-24 04:31:00", + 80.59451217502392, + 110.26861572265625, + 73.92262268066406 + ], + [ + "2020-03-24 04:32:00", + 80.50452197897741, + 109.19113159179688, + 74.61058807373047 + ], + [ + "2020-03-24 04:33:00", + 80.41453178293088, + 108.94200134277344, + 74.5039291381836 + ], + [ + "2020-03-24 04:34:00", + 80.32454158688437, + 109.96826934814453, + 74.46529388427734 + ], + [ + "2020-03-24 04:35:00", + 80.23455139083784, + 81.94364929199219, + 73.67473602294922 + ], + [ + "2020-03-24 04:36:00", + 80.14456119479132, + 23.80181121826172, + 73.68876117466887 + ], + [ + "2020-03-24 04:37:00", + 80.0545709987448, + 1.4474921226501465, + 73.68912506103516 + ], + [ + "2020-03-24 04:38:00", + 79.96458080269828, + 4.1637725830078125, + 73.72541046142578 + ], + [ + "2020-03-24 04:39:00", + 79.87459060665176, + 26.945161819458008, + 74.61903381347656 + ], + [ + "2020-03-24 04:40:00", + 79.87000710599979, + 34.11628341674805, + 73.51866149902344 + ], + [ + "2020-03-24 04:41:00", + 79.70000645999983, + 27.773473739624023, + 74.04241180419922 + ], + [ + "2020-03-24 04:42:00", + 79.60965611151889, + 27.49029541015625, + 73.1905517578125 + ], + [ + "2020-03-24 04:43:00", + 79.56329763722199, + 34.070072174072266, + 73.98297882080078 + ], + [ + "2020-03-24 04:44:00", + 79.5169391629251, + 33.60432052612305, + 74.68580627441406 + ], + [ + "2020-03-24 04:45:00", + 79.4705806886282, + 33.17567825317383, + 73.96578216552734 + ], + [ + "2020-03-24 04:46:00", + 79.42422221433131, + 33.235443115234375, + 74.14202880859375 + ], + [ + "2020-03-24 04:47:00", + 79.37786374003441, + 33.624229431152344, + 73.29328918457031 + ], + [ + "2020-03-24 04:48:00", + 79.33150526573752, + 33.59697723388672, + 73.17694091796875 + ], + [ + "2020-03-24 04:49:00", + 79.28514679144062, + 33.403076171875, + 73.81486511230469 + ], + [ + "2020-03-24 04:50:00", + 79.23878831714373, + 33.89695739746094, + 74.30374145507812 + ], + [ + "2020-03-24 04:51:00", + 79.19242984284683, + 32.8265266418457, + 74.06024169921875 + ], + [ + "2020-03-24 04:52:00", + 79.14607136854994, + 48.27207946777344, + 73.2079086303711 + ], + [ + "2020-03-24 04:53:00", + 79.09971289425305, + 74.11988830566406, + 72.95736694335938 + ], + [ + "2020-03-24 04:54:00", + 79.05335441995615, + 85.12024688720703, + 73.62250518798828 + ], + [ + "2020-03-24 04:55:00", + 79.00699594565926, + 89.70301055908203, + 72.9462661743164 + ], + [ + "2020-03-24 04:56:00", + 78.96063747136236, + 98.89726257324219, + 72.34540557861328 + ], + [ + "2020-03-24 04:57:00", + 78.91427899706547, + 104.57252502441406, + 73.3578872680664 + ], + [ + "2020-03-24 04:58:00", + 78.86792052276857, + 103.37727355957031, + 73.94607543945312 + ], + [ + "2020-03-24 04:59:00", + 78.82156204847168, + 103.06717681884766, + 72.9709701538086 + ], + [ + "2020-03-24 05:00:00", + 78.77520357417478, + 102.50790405273438, + 74.46186065673828 + ], + [ + "2020-03-24 05:01:00", + 78.72884509987789, + 102.56554412841797, + 72.30302429199219 + ], + [ + "2020-03-24 05:02:00", + 78.68248662558099, + 100.72061157226562, + 73.90963745117188 + ], + [ + "2020-03-24 05:03:00", + 78.6361281512841, + 84.94855499267578, + 72.5624771118164 + ], + [ + "2020-03-24 05:04:00", + 78.5897696769872, + 73.80229949951172, + 72.40718078613281 + ], + [ + "2020-03-24 05:05:00", + 78.54341120269031, + 66.7529296875, + 73.5855941772461 + ], + [ + "2020-03-24 05:06:00", + 78.49705272839341, + 58.3730354309082, + 73.1899185180664 + ], + [ + "2020-03-24 05:07:00", + 78.45069425409652, + 54.12462615966797, + 73.07763671875 + ], + [ + "2020-03-24 05:08:00", + 78.40433577979962, + 51.171958923339844, + 73.19320678710938 + ], + [ + "2020-03-24 05:09:00", + 78.35797730550273, + 48.614585876464844, + 72.81364440917969 + ], + [ + "2020-03-24 05:10:00", + 78.31161883120583, + 55.98033905029297, + 74.0353775024414 + ], + [ + "2020-03-24 05:11:00", + 78.26526035690894, + 55.769962310791016, + 74.27434539794922 + ], + [ + "2020-03-24 05:12:00", + 78.21890188261204, + 55.67626190185547, + 72.99474334716797 + ], + [ + "2020-03-24 05:13:00", + 78.17254340831515, + 53.84586715698242, + 73.18851470947266 + ], + [ + "2020-03-24 05:14:00", + 78.17000064599996, + 49.15884017944336, + 72.83944702148438 + ], + [ + "2020-03-24 05:15:00", + 78, + 48.674129486083984, + 72.74655151367188 + ], + [ + "2020-03-24 05:16:00", + 77.9366887710829, + 48.823998987048924, + 73.24293518066406 + ], + [ + "2020-03-24 05:17:00", + 77.90413912638326, + 48.8282470703125, + 72.28050994873047 + ], + [ + "2020-03-24 05:18:00", + 77.87158948168361, + 49.756980895996094, + 72.88276672363281 + ], + [ + "2020-03-24 05:19:00", + 77.83903983698399, + 49.47259521484375, + 73.35757446289062 + ], + [ + "2020-03-24 05:20:00", + 77.80649019228434, + 49.850311279296875, + 73.20963287353516 + ], + [ + "2020-03-24 05:21:00", + 77.77394054758471, + 49.637855529785156, + 72.9081039428711 + ], + [ + "2020-03-24 05:22:00", + 77.74139090288507, + 49.61250305175781, + 72.93186950683594 + ], + [ + "2020-03-24 05:23:00", + 77.70884125818544, + 48.27946090698242, + 74.17268371582031 + ], + [ + "2020-03-24 05:24:00", + 77.6762916134858, + 48.74678421020508, + 73.15660858154297 + ], + [ + "2020-03-24 05:25:00", + 77.64374196878616, + 48.357120513916016, + 72.6622543334961 + ], + [ + "2020-03-24 05:26:00", + 77.61119232408653, + 49.31953430175781, + 72.34400177001953 + ], + [ + "2020-03-24 05:27:00", + 77.57864267938689, + 49.709964752197266, + 72.97113037109375 + ], + [ + "2020-03-24 05:28:00", + 77.54609303468726, + 50.2484130859375, + 72.39154052734375 + ], + [ + "2020-03-24 05:29:00", + 77.51354338998762, + 50.60381317138672, + 72.06515502929688 + ], + [ + "2020-03-24 05:30:00", + 77.48099374528799, + 50.00936508178711, + 56.87029266357422 + ], + [ + "2020-03-24 05:31:00", + 77.44844410058835, + 49.875885009765625, + 16.654312133789062 + ], + [ + "2020-03-24 05:32:00", + 77.4158944558887, + 48.563663482666016, + 18.19554901123047 + ], + [ + "2020-03-24 05:33:00", + 77.38334481118908, + 48.847572326660156, + 18.055583953857422 + ], + [ + "2020-03-24 05:34:00", + 77.35079516648943, + 48.35354232788086, + 18.378847122192383 + ], + [ + "2020-03-24 05:35:00", + 77.3182455217898, + 48.75905990600586, + 17.62409782409668 + ], + [ + "2020-03-24 05:36:00", + 77.28569587709016, + 48.05728530883789, + 18.058086395263672 + ], + [ + "2020-03-24 05:37:00", + 77.25314623239053, + 54.909175872802734, + 17.759536743164062 + ], + [ + "2020-03-24 05:38:00", + 77.22059658769089, + 54.575439453125, + 17.888395309448242 + ], + [ + "2020-03-24 05:39:00", + 77.18804694299125, + 55.046234130859375, + 18.210878372192383 + ], + [ + "2020-03-24 05:40:00", + 77.15549729829162, + 54.0140495300293, + 17.824277877807617 + ], + [ + "2020-03-24 05:41:00", + 77.12294765359198, + 53.690467834472656, + 18.451248168945312 + ], + [ + "2020-03-24 05:42:00", + 77.09039800889235, + 53.07158279418945, + 18.209468841552734 + ], + [ + "2020-03-24 05:43:00", + 77.05784836419271, + 53.31936264038086, + 18.179603576660156 + ], + [ + "2020-03-24 05:44:00", + 77.02529871949308, + 53.26475143432617, + 18.342716217041016 + ], + [ + "2020-03-24 05:45:00", + 76.99274907479344, + 51.945220947265625, + 18.539770126342773 + ], + [ + "2020-03-24 05:46:00", + 76.9601994300938, + 51.81389617919922, + 18.015705108642578 + ], + [ + "2020-03-24 05:47:00", + 76.92764978539417, + 51.123085021972656, + 17.368398666381836 + ], + [ + "2020-03-24 05:48:00", + 76.89510014069452, + 51.4550666809082, + 18.14003562927246 + ], + [ + "2020-03-24 05:49:00", + 76.8625504959949, + 50.60249710083008, + 18.289703369140625 + ], + [ + "2020-03-24 05:50:00", + 76.83000085129525, + 50.91603088378906, + 18.2962646484375 + ], + [ + "2020-03-24 05:51:00", + 76.79745120659562, + 53.06449508666992, + 18.563539505004883 + ], + [ + "2020-03-24 05:52:00", + 76.76490156189598, + 54.72663497924805, + 18.568862915039062 + ], + [ + "2020-03-24 05:53:00", + 76.73235191719634, + 54.90778732299805, + 18.28094482421875 + ], + [ + "2020-03-24 05:54:00", + 76.69980227249671, + 53.92911911010742, + 18.02821159362793 + ], + [ + "2020-03-24 05:55:00", + 76.66725262779707, + 53.20056915283203, + 21.20859718322754 + ], + [ + "2020-03-24 05:56:00", + 76.63470298309744, + 53.7746696472168, + 70.31324768066406 + ], + [ + "2020-03-24 05:57:00", + 76.6021533383978, + 54.07472610473633, + 73.2507553100586 + ], + [ + "2020-03-24 05:58:00", + 76.56960369369816, + 53.80739974975586, + 73.81517791748047 + ], + [ + "2020-03-24 05:59:00", + 76.53705404899853, + 53.748661041259766, + 73.31723022460938 + ], + [ + "2020-03-24 06:00:00", + 76.50450440429888, + 54.74142837524414, + 72.85430145263672 + ], + [ + "2020-03-24 06:01:00", + 76.47195475959926, + 56.06607437133789, + 73.29580688476562 + ], + [ + "2020-03-24 06:02:00", + 76.46999418600018, + 55.171714782714844, + 72.67166195723287 + ], + [ + "2020-03-24 06:03:00", + 76.29999354000017, + 55.41927719116211, + 72.6522445678711 + ], + [ + "2020-03-24 06:04:00", + 76.17097911658006, + 55.45018005371094, + 73.24137115478516 + ], + [ + "2020-03-24 06:05:00", + 76.10446483646761, + 55.66059112548828, + 72.9041976928711 + ], + [ + "2020-03-24 06:06:00", + 76.03795055635517, + 49.595481872558594, + 73.65878295898438 + ], + [ + "2020-03-24 06:07:00", + 75.97143627624271, + 47.00128173828125, + 72.86134338378906 + ], + [ + "2020-03-24 06:08:00", + 75.90492199613027, + 47.58378601074219, + 72.69776153564453 + ], + [ + "2020-03-24 06:09:00", + 75.83840771601783, + 49.07365417480469, + 72.17729187011719 + ], + [ + "2020-03-24 06:10:00", + 75.77189343590538, + 56.555606842041016, + 72.93250274658203 + ], + [ + "2020-03-24 06:11:00", + 75.70537915579293, + 56.26713180541992, + 72.06671905517578 + ], + [ + "2020-03-24 06:12:00", + 75.63886487568048, + 55.18650817871094, + 73.08904266357422 + ], + [ + "2020-03-24 06:13:00", + 75.57235059556804, + 48.025177001953125, + 73.17881774902344 + ], + [ + "2020-03-24 06:14:00", + 75.50583631545558, + 47.967350006103516, + 73.10953521728516 + ], + [ + "2020-03-24 06:15:00", + 75.43932203534314, + 49.351463317871094, + 72.9697265625 + ], + [ + "2020-03-24 06:16:00", + 75.3728077552307, + 57.63689041137695, + 73.93919372558594 + ], + [ + "2020-03-24 06:17:00", + 75.30629347511824, + 51.609039306640625, + 73.03306579589844 + ], + [ + "2020-03-24 06:18:00", + 75.2397791950058, + 49.73860549926758, + 73.2399673461914 + ], + [ + "2020-03-24 06:19:00", + 75.17326491489335, + 50.75581359863281, + 72.73904418945312 + ], + [ + "2020-03-24 06:20:00", + 75.1067506347809, + 50.66218566894531, + 72.50445556640625 + ], + [ + "2020-03-24 06:21:00", + 75.04023635466845, + 50.81214141845703, + 72.9201431274414 + ], + [ + "2020-03-24 06:22:00", + 74.97372207455601, + 51.4454231262207, + 72.74983978271484 + ], + [ + "2020-03-24 06:23:00", + 74.90720779444355, + 51.69704055786133, + 72.99396514892578 + ], + [ + "2020-03-24 06:24:00", + 74.84069351433111, + 51.35186767578125, + 73.40730285644531 + ], + [ + "2020-03-24 06:25:00", + 74.77417923421866, + 50.72081756591797, + 72.23859405517578 + ], + [ + "2020-03-24 06:26:00", + 74.76998772600024, + 50.91818618774414, + 73.011474609375 + ], + [ + "2020-03-24 06:27:00", + 74.59998708000028, + 50.9371452331543, + 73.52397918701172 + ], + [ + "2020-03-24 06:28:00", + 74.47115968724424, + 51.061458587646484, + 73.56307220458984 + ], + [ + "2020-03-24 06:29:00", + 74.40464696005053, + 50.900325775146484, + 73.50645446777344 + ], + [ + "2020-03-24 06:30:00", + 74.33813423285682, + 51.356689453125, + 73.11031341552734 + ], + [ + "2020-03-24 06:31:00", + 74.2716215056631, + 51.44089126586914, + 74.34957122802734 + ], + [ + "2020-03-24 06:32:00", + 74.2051087784694, + 51.28786849975586, + 73.98580169677734 + ], + [ + "2020-03-24 06:33:00", + 74.13859605127568, + 51.93085537607588, + 72.36542510986328 + ], + [ + "2020-03-24 06:34:00", + 74.07208332408197, + 51.952125549316406, + 72.51180267333984 + ], + [ + "2020-03-24 06:35:00", + 74.00557059688826, + 57.87371063232422, + 73.43373107910156 + ], + [ + "2020-03-24 06:36:00", + 73.93905786969457, + 80.50335693359375, + 73.54712677001953 + ], + [ + "2020-03-24 06:37:00", + 73.87254514250085, + 86.00247192382812, + 73.6276626586914 + ], + [ + "2020-03-24 06:38:00", + 73.80603241530714, + 92.10163116455078, + 73.07763671875 + ], + [ + "2020-03-24 06:39:00", + 73.73951968811343, + 92.22298431396484, + 72.73919677734375 + ], + [ + "2020-03-24 06:40:00", + 73.67300696091972, + 91.8537368774414, + 72.59422302246094 + ], + [ + "2020-03-24 06:41:00", + 73.60649423372601, + 91.79039764404297, + 72.58702850341797 + ], + [ + "2020-03-24 06:42:00", + 73.5399815065323, + 92.08602905273438, + 73.7885971069336 + ], + [ + "2020-03-24 06:43:00", + 73.47346877933859, + 92.87781524658203, + 72.7099609375 + ], + [ + "2020-03-24 06:44:00", + 73.40695605214488, + 96.19808197021484, + 73.00537872314453 + ], + [ + "2020-03-24 06:45:00", + 73.34044332495118, + 96.97959899902344, + 73.0341567993164 + ], + [ + "2020-03-24 06:46:00", + 73.27393059775747, + 92.9488296508789, + 73.91197967529297 + ], + [ + "2020-03-24 06:47:00", + 73.20741787056376, + 93.09352111816406, + 72.77579498291016 + ], + [ + "2020-03-24 06:48:00", + 73.14090514337005, + 91.96395111083984, + 71.88639831542969 + ], + [ + "2020-03-24 06:49:00", + 73.07439241617634, + 92.7508773803711, + 73.19898986816406 + ], + [ + "2020-03-24 06:50:00", + 73.07001033599973, + 91.7613525390625, + 73.58168029785156 + ], + [ + "2020-03-24 06:51:00", + 72.90001291999972, + 90.88325500488281, + 73.70819854736328 + ], + [ + "2020-03-24 06:52:00", + 72.74429166862062, + 90.33417510986328, + 72.71105194091797 + ], + [ + "2020-03-24 06:53:00", + 72.66377465236994, + 95.02799224853516, + 75.33968353271484 + ], + [ + "2020-03-24 06:54:00", + 72.58325763611924, + 96.9925308227539, + 74.09574890136719 + ], + [ + "2020-03-24 06:55:00", + 72.50274061986855, + 96.695068359375, + 73.8018798828125 + ], + [ + "2020-03-24 06:56:00", + 72.42222360361787, + 95.75796508789062, + 74.43511199951172 + ], + [ + "2020-03-24 06:57:00", + 72.34170658736717, + 96.17393493652344, + 74.73851776123047 + ], + [ + "2020-03-24 06:58:00", + 72.26118957111649, + 88.4173812866211, + 75.60273742675781 + ], + [ + "2020-03-24 06:59:00", + 72.1806725548658, + 88.39751434326172, + 74.84156799316406 + ], + [ + "2020-03-24 07:00:00", + 72.1001555386151, + 87.41456604003906, + 74.45763397216797 + ], + [ + "2020-03-24 07:01:00", + 72.01963852236442, + 87.65657806396484, + 73.62500762939453 + ], + [ + "2020-03-24 07:02:00", + 71.93912150611372, + 87.04649353027344, + 75.57865142822266 + ], + [ + "2020-03-24 07:03:00", + 71.85860448986304, + 87.92521667480469, + 74.86284637451172 + ], + [ + "2020-03-24 07:04:00", + 71.77808747361235, + 85.46574401855469, + 74.23040008544922 + ], + [ + "2020-03-24 07:05:00", + 71.69757045736166, + 51.844181060791016, + 73.2090072631836 + ], + [ + "2020-03-24 07:06:00", + 71.61705344111097, + 36.57521057128906, + 74.82296752929688 + ], + [ + "2020-03-24 07:07:00", + 71.53653642486027, + 34.56216812133789, + 74.66110229492188 + ], + [ + "2020-03-24 07:08:00", + 71.45601940860959, + 48.19200897216797, + 73.77107238769531 + ], + [ + "2020-03-24 07:09:00", + 71.3755023923589, + 52.86350631713867, + 74.53269958496094 + ], + [ + "2020-03-24 07:10:00", + 71.37000710599979, + 52.843929290771484, + 73.5987319946289 + ], + [ + "2020-03-24 07:11:00", + 71.20000645999983, + 52.08213424682617, + 74.15689849853516 + ], + [ + "2020-03-24 07:12:00", + 71.03583251441142, + 51.53842544555664, + 73.91010284423828 + ], + [ + "2020-03-24 07:13:00", + 70.95084242170037, + 43.506919860839844, + 73.70914459228516 + ], + [ + "2020-03-24 07:14:00", + 70.86585232898932, + 43.037841796875, + 73.2168197631836 + ], + [ + "2020-03-24 07:15:00", + 70.78086223627825, + 43.77318572998047, + 74.06806182861328 + ], + [ + "2020-03-24 07:16:00", + 70.6958721435672, + 46.766944885253906, + 74.05726623535156 + ], + [ + "2020-03-24 07:17:00", + 70.61088205085615, + 50.872379302978516, + 74.08291625976562 + ], + [ + "2020-03-24 07:18:00", + 70.5258919581451, + 51.395668029785156, + 74.64201354980469 + ], + [ + "2020-03-24 07:19:00", + 70.44090186543403, + 50.60863494873047, + 73.44953155517578 + ], + [ + "2020-03-24 07:20:00", + 70.35591177272298, + 40.730621337890625, + 72.79737854003906 + ], + [ + "2020-03-24 07:21:00", + 70.27092168001192, + 41.385196685791016, + 73.6615982055664 + ], + [ + "2020-03-24 07:22:00", + 70.18593158730087, + 52.25959777832031, + 73.92058563232422 + ], + [ + "2020-03-24 07:23:00", + 70.10094149458982, + 46.88405990600586, + 74.61308288574219 + ], + [ + "2020-03-24 07:24:00", + 70.01595140187875, + 47.141448974609375, + 73.66790870618443 + ], + [ + "2020-03-24 07:25:00", + 69.9309613091677, + 47.107181549072266, + 73.63360595703125 + ], + [ + "2020-03-24 07:26:00", + 69.84597121645665, + 47.4166259765625, + 74.238525390625 + ], + [ + "2020-03-24 07:27:00", + 69.7609811237456, + 46.56296157836914, + 73.82565307617188 + ], + [ + "2020-03-24 07:28:00", + 69.67599103103453, + 46.3474006652832, + 72.98832702636719 + ], + [ + "2020-03-24 07:29:00", + 69.67000064599995, + 47.08136046272777, + 73.30158233642578 + ], + [ + "2020-03-24 07:30:00", + 69.5, + 47.10820770263672, + 73.27828216552734 + ], + [ + "2020-03-24 07:31:00", + 69.32637243713472, + 47.034088134765625, + 73.60092163085938 + ], + [ + "2020-03-24 07:32:00", + 69.23638277037952, + 45.57647705078125, + 73.87054443359375 + ], + [ + "2020-03-24 07:33:00", + 69.1463931036243, + 51.21367645263672, + 72.25328826904297 + ], + [ + "2020-03-24 07:34:00", + 69.0564034368691, + 70.96977996826172, + 73.15692138671875 + ], + [ + "2020-03-24 07:35:00", + 68.96641377011389, + 76.6375961303711, + 72.21951293945312 + ], + [ + "2020-03-24 07:36:00", + 68.87642410335869, + 83.16655731201172, + 74.12545776367188 + ], + [ + "2020-03-24 07:37:00", + 68.78643443660347, + 83.07859802246094, + 72.88916991454134 + ], + [ + "2020-03-24 07:38:00", + 68.69644476984827, + 92.17417907714844, + 72.8433609008789 + ], + [ + "2020-03-24 07:39:00", + 68.60645510309305, + 92.9948959350586, + 73.65784454345703 + ], + [ + "2020-03-24 07:40:00", + 68.51646543633785, + 92.51905822753906, + 72.56232452392578 + ], + [ + "2020-03-24 07:41:00", + 68.42647576958265, + 91.8058090209961, + 73.06637573242188 + ], + [ + "2020-03-24 07:42:00", + 68.33648610282744, + 90.04006958007812, + 72.91545104980469 + ], + [ + "2020-03-24 07:43:00", + 68.24649643607223, + 85.17295837402344, + 73.79078674316406 + ], + [ + "2020-03-24 07:44:00", + 68.15650676931702, + 95.68914794921875, + 72.5380859375 + ], + [ + "2020-03-24 07:45:00", + 68.06651710256182, + 74.87901306152344, + 73.2021255493164 + ], + [ + "2020-03-24 07:46:00", + 67.9765274358066, + 60.12022018432617, + 73.76215362548828 + ], + [ + "2020-03-24 07:47:00", + 67.96999418600018, + 53.05949020385742, + 73.28720092773438 + ], + [ + "2020-03-24 07:48:00", + 67.79999354000017, + 48.9787483215332, + 73.20462799072266 + ], + [ + "2020-03-24 07:49:00", + 67.60342746002077, + 49.55990219116211, + 72.59485626220703 + ], + [ + "2020-03-24 07:50:00", + 67.50143795130171, + 50.27000427246094, + 73.38900756835938 + ], + [ + "2020-03-24 07:51:00", + 67.39944844258264, + 49.79863766947178, + 72.78111267089844 + ], + [ + "2020-03-24 07:52:00", + 67.29745893386358, + 49.78076171875, + 73.90713500976562 + ], + [ + "2020-03-24 07:53:00", + 67.19546942514451, + 50.86861801147461, + 38.183509826660156 + ], + [ + "2020-03-24 07:54:00", + 67.09347991642545, + 51.039466857910156, + 17.961437225341797 + ], + [ + "2020-03-24 07:55:00", + 66.99149040770638, + 51.160526275634766, + 19.09199333190918 + ], + [ + "2020-03-24 07:56:00", + 66.88950089898731, + 50.949893951416016, + 18.68396759033203 + ], + [ + "2020-03-24 07:57:00", + 66.78751139026825, + 51.169769287109375, + 17.29629898071289 + ], + [ + "2020-03-24 07:58:00", + 66.68552188154918, + 50.19011306762695, + 18.370710372924805 + ] + ] + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tdata \u003d []\n\ttable \u003d []\n\n\n\tif self.getSibling(\"Status_tab\").props.currentTabIndex \u003d\u003d 0:\n\t\tresults \u003d self.parent.getChild(\"Status_tab\").getChild(\"Ethernet\").getChild(\"Ethernet\").props.filter.results.data\n\t\tif(len(results) \u003e 0):\n\t\t\theaders \u003d [\"Device Type\", \"Device\", \"IP Address\",\"Status\",\"Current (Amps)\",\"Speed (FPM)\",\"Status Code\", \"Last Status Code\"]\n\t\t\tfor result in results:\n\t\t\t\tdata.append([result[\u0027DeviceType\u0027],result[\u0027Device\u0027],result[\u0027IPAddress\u0027],result[\u0027Status\u0027],result[\u0027CurrentAmps\u0027],result[\u0027SpeedFPM\u0027],result[\u0027StatusCode\u0027],result[\u0027LastStatusCode\u0027]])\n\t\n\t\telse:\n\t\t\ttest_table \u003d system.dataset.toPyDataSet(self.parent.getChild(\"Status_tab\").getChild(\"Ethernet\").getChild(\"Ethernet\").props.data)\n\t\t\theaders \u003d [\"Device Type\", \"Device\", \"IP Address\",\"Status\",\"Current (Amps)\",\"Speed (FPM)\",\"Status Code\", \"Last Status Code\"]\n\t\t\tfor result in test_table:\n\t\t\t\tdata.append([result[\u0027DeviceType\u0027],result[\u0027Device\u0027],result[\u0027IPAddress\u0027],result[\u0027Status\u0027],result[\u0027CurrentAmps\u0027],result[\u0027SpeedFPM\u0027],result[\u0027StatusCode\u0027],result[\u0027LastStatusCode\u0027]])\n\t\t\n\t\ttable \u003d system.dataset.toDataSet(headers, data)\t\n\t\tcsv \u003d system.dataset.toCSV(table,1,0,1)\n\t\tsystem.perspective.download(filename \u003d \u0027Ethernet.csv\u0027, data \u003d csv)\t\n\n\t\n\telif self.getSibling(\"Status_tab\").props.currentTabIndex \u003d\u003d 1:\n\t\tresults \u003d self.parent.getChild(\"Status_tab\").getChild(\"Scanner History\").getChild(\"Scanner History\").props.filter.results.data\n\t\tif(len(results) \u003e 0):\n\t\t\theaders \u003d [\"Date\", \"Sorter\", \"Parcel ID\",\"Scanner\",\"Img ID\",\"Scan Label\",\"Scan Status\",\"Length (in)\",\"Trays (#)\",\"Assigment\",\"Divert Status\",\"Req Dest\",\"Actual Dest\",\"Sort Code\"]\n\t\t\tfor result in results:\n\t\t\t\tdata.append([result[\u0027t_stamp\u0027],result[\u0027SorterName\u0027],result[\u0027ParcelID\u0027],result[\u0027ScannerName\u0027],result[\u0027IMGID\u0027],result[\u0027ScanLabel\u0027],result[\u0027ScanStatus\u0027],result[\u0027Length\u0027],result[\u0027Tray\u0027],result[\u0027AssignmentScanHist\u0027],result[\u0027DivertStatus\u0027],result[\u0027DEST_REQ\u0027],result[\u0027ACTUAL_DEST\u0027],result[\u0027SortCode\u0027]])\n\t\t\t\n\t\telse:\n\t\t\theaders \u003d [\"Date\", \"Sorter\", \"Parcel ID\",\"Scanner\",\"Img ID\",\"Scan Label\",\"Scan Status\",\"Length (in)\",\"Trays (#)\",\"Assigment\",\"Divert Status\",\"Req Dest\",\"Actual Dest\",\"Sort Code\"]\n\t\t\tfor row in self.parent.getChild(\"Status_tab\").getChild(\"Scanner History\").getChild(\"Scanner History\").props.data:\n\t\t\t\tdata.append([row[\u0027value\u0027][\u0027t_stamp\u0027],row[\u0027value\u0027][\u0027SorterName\u0027],row[\u0027value\u0027][\u0027ParcelID\u0027],row[\u0027value\u0027][\u0027ScannerName\u0027],row[\u0027value\u0027][\u0027IMGID\u0027],row[\u0027value\u0027][\u0027ScanLabel\u0027],row[\u0027value\u0027][\u0027ScanStatus\u0027],row[\u0027value\u0027][\u0027Length\u0027],row[\u0027value\u0027][\u0027Tray\u0027],row[\u0027value\u0027][\u0027AssignmentScanHist\u0027],row[\u0027value\u0027][\u0027DivertStatus\u0027],row[\u0027value\u0027][\u0027DEST_REQ\u0027],row[\u0027value\u0027][\u0027ACTUAL_DEST\u0027],row[\u0027value\u0027][\u0027SortCode\u0027]])\n\t\t\t\n\t\ttable \u003d system.dataset.toDataSet(headers, data)\t\n\t\tcsv \u003d system.dataset.toCSV(table,1,0,1)\n\t\tsystem.perspective.download(filename \u003d \u0027Scanner History.csv\u0027, data \u003d csv)\n\t\n\t\n\telif self.getSibling(\"Status_tab\").props.currentTabIndex \u003d\u003d 2:\n\t\tresults \u003d self.parent.getChild(\"Status_tab\").getChild(\"Lane Status\").getChild(\"Lane Status\").props.filter.results.data\n\t\tif(len(results) \u003e 0):\n\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Lane\",\"Full (#)\",\"Jam (#)\",\"Full Duration\",\"Jam Duration\"]\n\t\t\tfor result in results:\n\t\t\t\tdata.append([result[\u0027StartTime\u0027],result[\u0027EndTime\u0027],result[\u0027Lane\u0027],result[\u0027Full_\u0027],result[\u0027Jam_\u0027],result[\u0027FullDuration\u0027],result[\u0027JamDuration\u0027]])\n\t\n\t\telse:\n\t\t\ttest_table \u003d system.dataset.toPyDataSet(self.parent.getChild(\"Status_tab\").getChild(\"Lane Status\").getChild(\"Lane Status\").props.data)\n\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Lane\",\"Full (#)\",\"Jam (#)\",\"Full Duration\",\"Jam Duration\"]\n\t\t\tfor result in test_table:\n\t\t\t\tdata.append([result[\u0027StartTime\u0027],result[\u0027EndTime\u0027],result[\u0027Lane\u0027],result[\u0027Full_\u0027],result[\u0027Jam_\u0027],result[\u0027FullDuration\u0027],result[\u0027JamDuration\u0027]])\n\t\t\t\n\t\ttable \u003d system.dataset.toDataSet(headers, data)\t\n\t\tcsv \u003d system.dataset.toCSV(table,1,0,1)\n\t\tsystem.perspective.download(filename \u003d \u0027Lane Status.csv\u0027, data \u003d csv)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "ExportToCSV" + }, + "position": { + "height": 25.02, + "width": 120, + "x": 1723.01, + "y": -10.256 + }, + "props": { + "mode": "percent", + "style": { + "classes": "Button_Action", + "marginBottom": "2px", + "marginTop": "16px" + }, + "text": "Export to CSV", + "textStyle": { + "fontFamily": "Arial" + } + }, + "type": "ia.input.button" + }, + { + "children": [ + { + "meta": { + "name": "LPeriod" + }, + "position": { + "basis": "60px" + }, + "props": { + "style": { + "color": "#000000" + }, + "text": "Period:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Period" + }, + "position": { + "basis": "160px" + }, + "props": { + "options": [ + { + "label": "Past 30 Min", + "value": "Past 30 Min" + }, + { + "label": "Past Hour", + "value": "Past Hour" + }, + { + "label": "Past 2 Hour", + "value": "Past 2 Hour" + }, + { + "label": "Past 4 Hour", + "value": "Past 4 Hour" + }, + { + "label": "Past 8 Hour", + "value": "Past 8 Hour" + }, + { + "label": "Current Day", + "value": "Current Day" + }, + { + "label": "Morning", + "value": "Morning" + }, + { + "label": "Daylight", + "value": "Daylight" + }, + { + "label": "Twilight", + "value": "Twilight" + }, + { + "label": "Night", + "value": "Night" + }, + { + "label": "Wrap Down", + "value": "Wrap Down" + }, + { + "label": "Current Sort", + "value": "Current Sort" + }, + { + "label": "Custom", + "value": "Custom" + } + ], + "value": "Past 30 Min" + }, + "type": "ia.input.dropdown" + }, + { + "meta": { + "name": "Spare_0" + }, + "position": { + "basis": "18.1px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Start Date" + }, + "position": { + "basis": "85px" + }, + "props": { + "style": { + "color": "#000000" + }, + "text": "Start Date:" + }, + "type": "ia.display.label" + }, + { + "custom": { + "Selected": "value" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t\n\tself.custom.Selected \u003d self.props.value" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "StartTime" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "{../Period.props.value} \u003d \"Custom\"" + }, + "enabled": false, + "type": "expr" + } + }, + "props.maxDate": { + "binding": { + "config": { + "expression": "now()" + }, + "enabled": false, + "type": "expr" + } + }, + "props.startDate": { + "binding": { + "config": { + "path": "../Period.props.value" + }, + "enabled": false, + "transforms": [ + { + "fallback": "todate(now())", + "inputType": "expression", + "mappings": [ + { + "input": "\"Past 30 Min\"", + "output": "todate(dateFormat(dateArithmetic(now(),-30, \"Minute\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "\"Past Hour\"", + "output": "todate(dateFormat(dateArithmetic(now(),-1, \"Hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "\"Past 2 Hour\"", + "output": "todate(dateFormat(dateArithmetic(now(),-2, \"Hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "\"Past 4 Hour\"", + "output": "todate(dateFormat(dateArithmetic(now(),-4, \"Hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "\"Past 8 Hour\"", + "output": "todate(dateFormat(dateArithmetic(now(),-8, \"Hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "\"Current Day\"", + "output": "todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 00:00:00\"))" + }, + { + "input": "\"Morning\"", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"2:30:00\",\r dateFormat(dateArithmetic(now(0),-1, \"Day\"), \"yyyy-MM-dd 2:30:00\"),todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 2:30:00\")))" + }, + { + "input": "\"Daylight\"", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"7:30:00\", todate(dateFormat(dateArithmetic(now(0),-1, \"Day\"), \"yyyy-MM-dd 7:30:00\")),todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 7:30:00\")))" + }, + { + "input": "\"Twilight\"", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Hours\"), \"HH:mm:ss\")\u003c\"13:00:00\", todate(dateFormat(dateArithmetic(now(0),-1, \"Day\"), \"yyyy-MM-dd 13:00:00\")),todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 13:00:00\")))" + }, + { + "input": "\"Night\"", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"18:30:00\", todate(dateFormat(dateArithmetic(now(0),-1, \"Day\"), \"yyyy-MM-dd 18:30:00\")),todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 18:30:00\")))" + }, + { + "input": "\"Wrap Down\"", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"23:30:00\", todate(dateFormat(dateArithmetic(now(0),-1, \"Day\"), \"yyyy-MM-dd 23:30:00\")),todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 23:30:00\")))" + }, + { + "input": "\"Current Sort\"", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"7:30:00\", todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 2:30:00\")), \r if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"13:00:00\",todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 7:30:00\")),\r if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"18:30:00\",todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 13:00:00\")),\r if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"23:30:00\",todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 18:30:00\")),\r if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"2:30:00\", todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 23:30:00\")),\r todate(dateFormat(dateArithmetic(now(),0, \"Day\"), \"yyyy-MM-dd HH:mm:ss\")))))))" + }, + { + "input": "\"Custom\"", + "output": "{this.props.value}" + } + ], + "outputType": "expression", + "type": "map" + } + ], + "type": "property" + }, + "onChange": { + "enabled": null, + "script": "\t\n\tif self.getSibling(\"Period\").props.value !\u003d \"Custom\":\n\t\tself.props.value \u003d self.props.startDate" + } + }, + "props.value": { + "onChange": { + "enabled": null, + "script": "\t\n\tif system.date.secondsBetween(self.props.value,self.getSibling(\"EndTime\").props.value) \u003e 604800 or system.date.secondsBetween(self.props.value,self.getSibling(\"EndTime\").props.value) \u003c 0:\n\t if system.date.secondsBetween(system.date.addSeconds(self.props.value,604800),system.date.now()) \u003c 0: \n\t self.getSibling(\"EndTime\").props.value \u003d system.date.now()\n\t else:\n\t self.getSibling(\"EndTime\").props.value \u003d system.date.addSeconds(self.props.value,604800)" + } + } + }, + "props": { + "dismissOnSelect": false, + "enabled": false, + "formattedValue": "Apr 25, 2025 2:56 PM", + "formattedValues": { + "date": "Mar 26, 2021", + "datetime": "Mar 26, 2021 12:00 AM", + "time": "12:00 AM" + }, + "maxDate": { + "$": [ + "ts", + 192, + 1745580359823 + ], + "$ts": 1745580359823 + }, + "startDate": { + "$": [ + "ts", + 201, + 1745580368842 + ], + "$ts": 1745578568000 + }, + "value": { + "$": [ + "ts", + 192, + 1745580368842 + ], + "$ts": 1745578568000 + } + }, + "type": "ia.input.date-time-input" + }, + { + "meta": { + "name": "Spare" + }, + "position": { + "basis": "18.1px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "End Date" + }, + "position": { + "basis": "81px" + }, + "props": { + "style": { + "color": "#000000" + }, + "text": "End Date:" + }, + "type": "ia.display.label" + }, + { + "custom": { + "Selected": "value" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t\n\tself.custom.Selected \u003d self.props.value" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "EndTime" + }, + "position": { + "basis": "190px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "{../Period.props.value} \u003d \"Custom\"" + }, + "enabled": false, + "type": "expr" + } + }, + "props.endDate": { + "binding": { + "config": { + "path": "../Period.props.value" + }, + "enabled": false, + "transforms": [ + { + "fallback": "{this.props.value}", + "inputType": "scalar", + "mappings": [ + { + "input": "Past 30 Min", + "output": "todate(dateFormat(dateArithmetic(now(),0, \"Hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "Past Hour", + "output": "todate(dateFormat(dateArithmetic(now(),0, \"hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "Past 2 Hour", + "output": "todate(dateFormat(dateArithmetic(now(),0, \"hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "Past 4 Hour", + "output": "todate(dateFormat(dateArithmetic(now(),0, \"hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "Past 8 Hour", + "output": "todate(dateFormat(dateArithmetic(now(),0, \"hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "Current Day", + "output": "todate(dateFormat(dateArithmetic(now(),0, \"hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "Morning", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"2:30:00\",\r todate(dateFormat(dateArithmetic(now(0),-1, \"Day\"), \"yyyy-MM-dd 7:30:00\")),\r if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"7:30:00\",\r todate(dateFormat(dateArithmetic(now(),0, \"Day\"), \"yyyy-MM-dd HH:mm:ss\")), todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 7:30:00\"))))" + }, + { + "input": "Daylight", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"7:30:00\",\r todate(dateFormat(dateArithmetic(now(0),-1, \"Day\"), \"yyyy-MM-dd 13:00:00\")),\r if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"13:00:00\",\r todate(dateFormat(dateArithmetic(now(),0, \"Day\"), \"yyyy-MM-dd HH:mm:ss\")), todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 13:00:00\"))))" + }, + { + "input": "Twilight", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"13:00:00\",\r todate(dateFormat(dateArithmetic(now(0),-1, \"Day\"), \"yyyy-MM-dd 18:30:00\")),\r if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"18:30:00\",\r todate(dateFormat(dateArithmetic(now(),0, \"Day\"), \"yyyy-MM-dd HH:mm:ss\")), todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 18:30:00\"))))" + }, + { + "input": "Night", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"18:30:00\",\r todate(dateFormat(dateArithmetic(now(0),-1, \"Day\"), \"yyyy-MM-dd 23:30:00\")),\r if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"23:30:00\",\r todate(dateFormat(dateArithmetic(now(),0, \"Day\"), \"yyyy-MM-dd HH:mm:ss\")), todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 23:30:00\"))))" + }, + { + "input": "Wrap Down", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"23:30:00\",\r todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 2:30:00\")),\r if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"2:30:00\",\r todate(dateFormat(dateArithmetic(now(),0, \"Day\"), \"yyyy-MM-dd HH:mm:ss\")), todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 2:30:00\"))))" + }, + { + "input": "Current Sort", + "output": "todate(dateFormat(dateArithmetic(now(),0, \"hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + } + ], + "outputType": "expression", + "type": "map" + } + ], + "type": "property" + }, + "onChange": { + "enabled": null, + "script": "\t\n\tif self.getSibling(\"Period\").props.value !\u003d \"Custom\":\n\t\tself.props.value \u003d self.props.endDate" + } + }, + "props.maxDate": { + "binding": { + "config": { + "expression": "if(dateDiff({../StartTime.props.value},now(),\"day\") \u003c 7, now(),dateArithmetic({../StartTime.props.value}, 7, \"days\"))" + }, + "enabled": false, + "type": "expr" + } + }, + "props.minDate": { + "binding": { + "config": { + "expression": "{../StartTime.props.value}" + }, + "enabled": false, + "type": "expr" + } + } + }, + "props": { + "dismissOnSelect": false, + "enabled": false, + "endDate": { + "$": [ + "ts", + 201, + 1745580379838 + ], + "$ts": 1745580379000 + }, + "formattedValue": "Apr 25, 2025 3:26 PM", + "formattedValues": { + "date": "Mar 29, 2021", + "datetime": "Mar 29, 2021 1:37 PM", + "time": "1:37 PM" + }, + "maxDate": { + "$": [ + "ts", + 192, + 1745580390851 + ], + "$ts": 1745580390851 + }, + "minDate": { + "$": [ + "ts", + 192, + 1745580368842 + ], + "$ts": 1745578568000 + }, + "value": { + "$": [ + "ts", + 192, + 1745580379838 + ], + "$ts": 1745580379000 + } + }, + "type": "ia.input.date-time-input" + } + ], + "custom": { + "EndDate": { + "$": [ + "ts", + 192, + 1745580348821 + ], + "$ts": 1745580348000 + }, + "StartDate": { + "$": [ + "ts", + 192, + 1745580344826 + ], + "$ts": 1745578544000 + } + }, + "meta": { + "name": "Period_not_Global_0", + "visible": 0 + }, + "position": { + "height": 25.02, + "width": 792.96, + "x": 925.68, + "y": 6.252646443481446 + }, + "propConfig": { + "custom.EndDate": { + "binding": { + "config": { + "path": "./EndTime.props.value" + }, + "enabled": false, + "type": "property" + } + }, + "custom.StartDate": { + "binding": { + "config": { + "path": "./StartTime.props.value" + }, + "enabled": false, + "type": "property" + } + }, + "meta.visible": { + "binding": { + "config": { + "expression": "{../Status_tab.props.currentTabIndex} \u003d 1 | {../Status_tab.props.currentTabIndex} \u003d 2" + }, + "enabled": false, + "type": "expr" + } + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Info", + "tooltip": { + "enabled": true, + "location": "bottom-right", + "style": { + "backgroundColor": "#2B2B2BBF", + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": 14, + "textAlign": "left", + "white-space": "pre" + }, + "text": "About: Ethernet\n\nDevice Type - the type of device that uses the ethernet connection.\nDevice - device name.\nIP Address - device IP address on the ethernet network.\nStatus - the state of the device.\nCurrent (Amps) - measured current of the device (if it is VFD).\nSpeed (FPM) - the measured speed of the device (if it is VFD).\nStatus Code - device fault code.\nLast Status Code - previous device fault code." + } + }, + "position": { + "height": 40, + "width": 40, + "x": 1802.99, + "y": 46 + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if ({view.params.Table} \u003d \"Status_tab\" \u0026\u0026 {view.params.Tab_ID} \u003d 0,\r\n\t\"About: Ethernet\"+ \r\n\t\"\\n\"+\r\n\t\"\\n\"+\"Device Type - the type of device that uses the ethernet connection.\"+ \r\n\t\"\\n\"+\"Device - device name.\"+ \r\n\t\"\\n\"+\"IP Address - device IP address on the ethernet network.\"+ \r\n\t\"\\n\"+\"Status - the state of the device.\"+ \r\n\t\"\\n\"+\"Current (Amps) - measured current of the device (if it is VFD).\"+ \r\n\t\"\\n\"+\"Speed (FPM) - the measured speed of the device (if it is VFD).\"+ \r\n\t\"\\n\"+\"Status Code - device fault code.\"+ \r\n\t\"\\n\"+\"Last Status Code - previous device fault code.\",\r\nif ({view.params.Table} \u003d \"Status_tab\" \u0026\u0026 {view.params.Tab_ID} \u003d 1,\r\n\t\"About: Scanner\"+ \r\n\t\"\\n\"+\r\n\t\"\\n\"+\"Time/date stamp - the date the parcel was read.\"+\r\n\t\"\\n\"+\"Sorter - the name of the sorter on which the parcel\u0027s Bar-code was read.\"+\r\n\t\"\\n\"+\"Parcel ID - \"+\r\n\t\"\\n\"+\"Scanner - the name of the scanner that read the Bar-code of the parcel.\"+\r\n\t\"\\n\"+\"Img ID - \"+\r\n\t\"\\n\"+\"Scan Label - bar-code parcels\"+\r\n\t\"\\n\"+\"Scan Status - bar-code parcel scanning quality.\"+\r\n\t\"\\n\"+\"Length (in) - \"+\r\n\t\"\\n\"+\"Trays (#) - \"+\r\n\t\"\\n\"+\"Assignment - the place of preferred sending of the parcel, to which Chute.\"+\r\n\t\"\\n\"+\"Divert Status - status of sent / unsent parcels on Chute.\"+\r\n\t\"\\n\"+\"Requested Destination - possible place where the parcel can come, to which Chute.\"+\r\n\t\"\\n\"+\"Actual Destination - the place where the parcel arrived, which Chute.\"+\r\n\t\"\\n\"+\"Sort Code - Any errors or reasons for unsuccessful diverts (lane full, lane jam, divert disabled, etc.)\",\r\nif ({view.params.Table} \u003d \"Status_tab\" \u0026\u0026 {view.params.Tab_ID} \u003d 2,\r\n\t\"About: Lane Status\"+ \r\n\t\"\\n\"+\r\n\t\"\\n\"+\"Start Timestamp - time of the first fixation by Full or Jam sorter on a certain lane.\"+\r\n\t\"\\n\"+\"End Timestamp - time of the last fixation by Full or Jam sorter on a certain lane.\"+\r\n\t\"\\n\"+\"Lane (#) - the name of the Lane on which Full or Jam was fixed.\"+\r\n\t\"\\n\"+\"Full (#) - the number of Full states on a certain lane.\"+\r\n\t\"\\n\"+\"Jam(#) - the number of Jam states on a certain lane.\"+\r\n\t\"\\n\"+\"Full Duration - the duration of the Full state on a certain lane.\"+\r\n\t\"\\n\"+\"Jam Duration - the duration of the Jam state on a on a certain lane.\"+\r\n\t\"\\n\"+\"50% Full (#) - number of 50% Full states on a on a certain lane.\"+\r\n\t\"\\n\"+\"Disabled (#) - the number of disabled states on a certain lane.\"+\r\n\t\"\\n\"+\"Enabled (#) - the number of enabled states on a certain lane.\",\r\n\"not response\")))" + }, + "enabled": false, + "type": "expr" + } + } + }, + "props": { + "fit": { + "mode": "fill" + }, + "source": "/system/images/MyIcon/question64x64.png", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.display.image" + } + ], + "meta": { + "name": "root" + }, + "position": { + "x": 0, + "y": 0 + }, + "props": { + "style": { + "backgroundColor": "#1A4A5E", + "overflow": "hidden" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/.resources/0315dfc7c08ccad40376f6119e045b037519a884c95c9d67f8aaac15a9d62925 b/.resources/0315dfc7c08ccad40376f6119e045b037519a884c95c9d67f8aaac15a9d62925 new file mode 100644 index 0000000..ce1af37 --- /dev/null +++ b/.resources/0315dfc7c08ccad40376f6119e045b037519a884c95c9d67f8aaac15a9d62925 @@ -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/.resources/046e3cbac024588f2665518a4ab13f21fd8d861fe742ebe9681e4d59ba7f2cb0 b/.resources/046e3cbac024588f2665518a4ab13f21fd8d861fe742ebe9681e4d59ba7f2cb0 new file mode 100644 index 0000000..c3bf108 --- /dev/null +++ b/.resources/046e3cbac024588f2665518a4ab13f21fd8d861fe742ebe9681e4d59ba7f2cb0 @@ -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/.resources/0470e3a8c0d099d79f0822cd23d9842d97260e89d8d6d32510a03b987698cc8f b/.resources/0470e3a8c0d099d79f0822cd23d9842d97260e89d8d6d32510a03b987698cc8f new file mode 100644 index 0000000..f6f7490 --- /dev/null +++ b/.resources/0470e3a8c0d099d79f0822cd23d9842d97260e89d8d6d32510a03b987698cc8f @@ -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/.resources/04c5391f149636bfe825f8e500b426eef055d5e4d22d459289e1af0d0de4fd43 b/.resources/04c5391f149636bfe825f8e500b426eef055d5e4d22d459289e1af0d0de4fd43 new file mode 100644 index 0000000..fd0f4f0 --- /dev/null +++ b/.resources/04c5391f149636bfe825f8e500b426eef055d5e4d22d459289e1af0d0de4fd43 @@ -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/.resources/06061d5d51b783f7cabb8a4d1b171d4ab9739b378680f90bae58fb1432b166f3 b/.resources/06061d5d51b783f7cabb8a4d1b171d4ab9739b378680f90bae58fb1432b166f3 new file mode 100644 index 0000000..7eb98ea --- /dev/null +++ b/.resources/06061d5d51b783f7cabb8a4d1b171d4ab9739b378680f90bae58fb1432b166f3 @@ -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/.resources/090492664ed81c88bd43d52cbf7ce1859be65497449d13ca4b1c5b7197e0c46b b/.resources/090492664ed81c88bd43d52cbf7ce1859be65497449d13ca4b1c5b7197e0c46b new file mode 100644 index 0000000..43a4bf5 --- /dev/null +++ b/.resources/090492664ed81c88bd43d52cbf7ce1859be65497449d13ca4b1c5b7197e0c46b @@ -0,0 +1,97 @@ +{ + "custom": {}, + "params": { + "rowData": { + "Driver": "value" + } + }, + "propConfig": { + "params.rowData": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 36, + "width": 227 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "36px" + }, + "propConfig": { + "props.value": { + "binding": { + "config": { + "path": "view.params.rowData.Driver" + }, + "type": "property" + }, + "onChange": { + "enabled": null, + "script": "\tvalue \u003d currentValue.value\n\tsystem.perspective.print(str(origin))\n\tif value is not None:\n\t\tif \u0027Binding\u0027 not in str(origin):\n\t\t\tmsg \u003d \u0027addtable-dropdown-updaterow\u0027\n\t\t\tHostname \u003d self.view.params.rowData[\u0027Hostname\u0027]\n\t\t\tpayload \u003d\t{\n\t\t\t\t\t\t\u0027value\u0027\t\t: value,\n\t\t\t\t\t\t\u0027Hostname\u0027\t: Hostname\n\t\t\t\t\t\t}\n\t\t\tsystem.perspective.sendMessage(msg, payload)" + } + } + }, + "props": { + "options": [ + { + "label": "S7300", + "value": "S7300" + }, + { + "label": "S7400", + "value": "S7400" + }, + { + "label": "S71200", + "value": "S71200" + }, + { + "label": "S71500", + "value": "S71500" + }, + { + "label": "CompactLogix", + "value": "CompactLogix" + }, + { + "label": "Legacy Allen-Bradley", + "value": "ControlLogix" + }, + { + "label": "ControlLogix", + "value": "ControlLogix" + }, + { + "label": "LogixDriver", + "value": "LogixDriver" + }, + { + "label": "Allen Bradley MicroLogix", + "value": "MicroLogix" + } + ], + "placeholder": { + "text": "Select Driver..." + } + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/09983386d04a07dc158b22189bd1ace2581d5d6372ed5710b1c87ebbbf7c7545 b/.resources/09983386d04a07dc158b22189bd1ace2581d5d6372ed5710b1c87ebbbf7c7545 new file mode 100644 index 0000000..d8ce2fb --- /dev/null +++ b/.resources/09983386d04a07dc158b22189bd1ace2581d5d6372ed5710b1c87ebbbf7c7545 @@ -0,0 +1,14 @@ +{ + "custom": {}, + "params": {}, + "props": {}, + "root": { + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/0bc3fc19061281e52b5a57088ab17ad9317455b2917a8ad912cea990ba8f8bb9 b/.resources/0bc3fc19061281e52b5a57088ab17ad9317455b2917a8ad912cea990ba8f8bb9 new file mode 100644 index 0000000..143c105 --- /dev/null +++ b/.resources/0bc3fc19061281e52b5a57088ab17ad9317455b2917a8ad912cea990ba8f8bb9 @@ -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/.resources/0c7e83d6f31dc3848078dd70449ed0f8d58c4ef308b347fd50167de46fbfb5ab b/.resources/0c7e83d6f31dc3848078dd70449ed0f8d58c4ef308b347fd50167de46fbfb5ab new file mode 100644 index 0000000..6fe6401 --- /dev/null +++ b/.resources/0c7e83d6f31dc3848078dd70449ed0f8d58c4ef308b347fd50167de46fbfb5ab @@ -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/.resources/0c9684b4844f82688d9a37ad8403717f2088cf034acb82de543ed60018556a8f b/.resources/0c9684b4844f82688d9a37ad8403717f2088cf034acb82de543ed60018556a8f new file mode 100644 index 0000000..f28613d --- /dev/null +++ b/.resources/0c9684b4844f82688d9a37ad8403717f2088cf034acb82de543ed60018556a8f @@ -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/.resources/0e722f437444f24293370b4609b13cb5627c09828751043f6db5f1a76bd1662b b/.resources/0e722f437444f24293370b4609b13cb5627c09828751043f6db5f1a76bd1662b new file mode 100644 index 0000000..d554ba8 --- /dev/null +++ b/.resources/0e722f437444f24293370b4609b13cb5627c09828751043f6db5f1a76bd1662b @@ -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/.resources/0f2627f4b1cf15524113587476de67a430addad65c14ec5dd55886c7b32462b1 b/.resources/0f2627f4b1cf15524113587476de67a430addad65c14ec5dd55886c7b32462b1 new file mode 100644 index 0000000..f3228e2 --- /dev/null +++ b/.resources/0f2627f4b1cf15524113587476de67a430addad65c14ec5dd55886c7b32462b1 @@ -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/.resources/0f300f4e46cb286ed0a05911bd54bf09c26a6f856903d01256ca193336161a78 b/.resources/0f300f4e46cb286ed0a05911bd54bf09c26a6f856903d01256ca193336161a78 new file mode 100644 index 0000000..4a97e9a --- /dev/null +++ b/.resources/0f300f4e46cb286ed0a05911bd54bf09c26a6f856903d01256ca193336161a78 @@ -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/.resources/0f870f7235a745a7c0e41467e60b14826f323336f85035614135d2cf7be39d0c b/.resources/0f870f7235a745a7c0e41467e60b14826f323336f85035614135d2cf7be39d0c new file mode 100644 index 0000000..fd3376e --- /dev/null +++ b/.resources/0f870f7235a745a7c0e41467e60b14826f323336f85035614135d2cf7be39d0c @@ -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/.resources/11499d6a5a1a060cb03ca6567b468d2d01f64ffab98c30b8236d53b54aff3bfd b/.resources/11499d6a5a1a060cb03ca6567b468d2d01f64ffab98c30b8236d53b54aff3bfd new file mode 100644 index 0000000..dc4ed85 --- /dev/null +++ b/.resources/11499d6a5a1a060cb03ca6567b468d2d01f64ffab98c30b8236d53b54aff3bfd @@ -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/.resources/120511ddd15abba403e8af32f8dba5feda070be623186330d2d94a62a23f3f34 b/.resources/120511ddd15abba403e8af32f8dba5feda070be623186330d2d94a62a23f3f34 new file mode 100644 index 0000000..d945ec8 --- /dev/null +++ b/.resources/120511ddd15abba403e8af32f8dba5feda070be623186330d2d94a62a23f3f34 @@ -0,0 +1,4019 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "image" + }, + "position": { + "height": 1080, + "width": 1920 + }, + "propConfig": { + "props.source": { + "binding": { + "config": { + "expression": "\"http://127.0.0.1:5500/MCM02-MCM03%20Fluid%20Inbound.svg?var\" + toMillis(now(100))" + }, + "enabled": false, + "type": "expr" + } + } + }, + "props": { + "fit": { + "mode": "fill" + }, + "source": "http://127.0.0.1:5500/MCM02%20Fluid%20Inbound.svg?var1744995181039", + "style": { + "backgroundColor": "#EEEEEE" + } + }, + "type": "ia.display.image" + }, + { + "meta": { + "name": "UL5-5" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 784.941, + "y": 530.635 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL5-5", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL5-6" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 805.234, + "y": 520.013 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL5-6", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL5-7" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 825.983, + "y": 509.145 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL5-7", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL5-9" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 881.402, + "y": 480.85 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL5-9", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL5-8" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 854.545, + "y": 493.732 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL5-8", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL4-8" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 783.798, + "y": 478.505 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL4-8", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL4-6" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 741.288, + "y": 500.14 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL4-6", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL4-7" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 762.767, + "y": 488.343 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL4-7", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL4-5" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 714.32, + "y": 515.056 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL4-5", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL3-9" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 766.158, + "y": 417.365 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL3-9", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL3-7" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 724.469, + "y": 438.449 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL3-7", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL3-8" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 745.948, + "y": 426.652 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL3-8", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL3-6" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 703.439, + "y": 450.076 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL3-6", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL3-5" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 658.06, + "y": 474.747 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL3-5", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL2-5" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 562.571, + "y": 471.427 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL2-5", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL2-6" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 589.986, + "y": 456.235 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL2-6", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL2-7" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 615.253, + "y": 442.233 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL2-7", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL2-8" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 641.872, + "y": 427.508 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL2-8", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL2-9" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 666.716, + "y": 415.894 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL2-9", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL1-4" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 486.796, + "y": 455.829 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL1-4", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL1-5" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 512.437, + "y": 442.362 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL1-5", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL1-6" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 538.896, + "y": 427.637 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL1-6", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL1-7" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 561.677, + "y": 415.823 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL1-7", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL1-3" + }, + "position": { + "height": 20, + "rotate": { + "angle": -50 + }, + "width": 20, + "x": 457.668, + "y": 477.829 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL1-3", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL2-4" + }, + "position": { + "height": 20, + "rotate": { + "angle": -50 + }, + "width": 20, + "x": 531.156, + "y": 493.314 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL2-4", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL3-4" + }, + "position": { + "height": 20, + "rotate": { + "angle": -50 + }, + "width": 20, + "x": 607.337, + "y": 508.189 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL3-4", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL4-4" + }, + "position": { + "height": 20, + "rotate": { + "angle": -50 + }, + "width": 20, + "x": 683.23, + "y": 538.484 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL4-4", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL5-4" + }, + "position": { + "height": 20, + "rotate": { + "angle": -50 + }, + "width": 20, + "x": 758.616, + "y": 552.314 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL5-4", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL1-2" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 452.031, + "y": 681.503 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL1-2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL1-1" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 452.229, + "y": 903.933 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL1-1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL2-2" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 523.635, + "y": 989 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL2-2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL2-3" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 524.507, + "y": 697.462 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL2-3", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL3-2" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 600.216, + "y": 990.66 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL3-2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL3-3" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 601.089, + "y": 714.773 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL3-3", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL5-2" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 752.191, + "y": 989.46 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL5-2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL5-3" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 753.063, + "y": 750.227 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL5-3", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL4-2" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 677.04, + "y": 990.78 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL4-2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL4-3" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 677.912, + "y": 733.062 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL4-3", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL6-2" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 828.514, + "y": 782.576 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL6-2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL6-1" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 828.712, + "y": 1005 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL6-1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL6-3" + }, + "position": { + "height": 20, + "rotate": { + "angle": -50 + }, + "width": 20, + "x": 834.285, + "y": 579.103 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL6-3", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL6-4" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 890.523, + "y": 545.722 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL6-4", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL6-5" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 943.288, + "y": 517.049 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL6-5", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL6-6" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 968.182, + "y": 503.81 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL6-6", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL6-7" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 995.07, + "y": 489.902 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL6-7", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL6-8" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 1017.01, + "y": 478.641 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL6-8", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-6" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 975.774, + "y": 69.9979 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS1-6", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-5A" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 975.925, + "y": 116.62 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS1-5AB", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-4" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 976.353, + "y": 190.573 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS1-4", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-3" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 976.56, + "y": 303.306 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS1-3", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-1" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 719.344, + "y": 397.952 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS1-1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-2" + }, + "position": { + "height": 20, + "rotate": { + "angle": -40 + }, + "width": 20, + "x": 964.561, + "y": 386.85 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS1-2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-1" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 1017.93, + "y": 460.693 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS2-1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-7" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 975.67, + "y": 46.7469 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS1-7", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-8" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 975.784, + "y": 23.3516 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS1-8", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-8_S2" + }, + "position": { + "height": 13, + "width": 13, + "x": 1018.94, + "y": 28.5016 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS5-12_FIO1" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 797.737, + "y": 323.314 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-8_EPC1" + }, + "position": { + "height": 32, + "rotate": { + "angle": 0 + }, + "width": 16, + "x": 956, + "y": 19 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord/UL20-3_EPC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-8_EPC2" + }, + "position": { + "height": 32, + "rotate": { + "angle": 0 + }, + "width": 16, + "x": 999, + "y": 19 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord/UL20-3_EPC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-8_EPC1_Line" + }, + "position": { + "height": 6, + "rotate": { + "angle": 90 + }, + "width": 80, + "x": 924, + "y": 84 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-8_EPC1_End" + }, + "position": { + "height": 30, + "rotate": { + "angle": 0 + }, + "width": 14, + "x": 957, + "y": 126 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-8_EPC2_Line" + }, + "position": { + "height": 6, + "rotate": { + "angle": 90 + }, + "width": 80, + "x": 966, + "y": 84 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-8_EPC2_End" + }, + "position": { + "height": 30, + "rotate": { + "angle": 0 + }, + "width": 14, + "x": 999, + "y": 126 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-1_JR2" + }, + "position": { + "height": 13, + "width": 13, + "x": 945, + "y": 366 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-1_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 724, + "y": 378 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL1-2_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 478, + "y": 525 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL1-1_SS1" + }, + "position": { + "height": 13, + "width": 13, + "x": 456, + "y": 957 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL6-1-SS1" + }, + "position": { + "height": 13, + "width": 13, + "x": 832, + "y": 1058 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL1-1_EPC1_Line" + }, + "position": { + "height": 6, + "rotate": { + "angle": 90 + }, + "width": 200, + "x": 340.608, + "y": 829 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL1-1_EPC1_End" + }, + "position": { + "height": 30, + "rotate": { + "angle": 0 + }, + "width": 14, + "x": 433.303, + "y": 711 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL1-1_EPC1" + }, + "position": { + "height": 32, + "rotate": { + "angle": -180 + }, + "width": 16, + "x": 432.305, + "y": 925 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord/UL20-3_EPC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL1-1_EPC2_Line" + }, + "position": { + "height": 6, + "rotate": { + "angle": 90 + }, + "width": 200, + "x": 385, + "y": 832 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL1-1_EPC2" + }, + "position": { + "height": 32, + "rotate": { + "angle": -180 + }, + "width": 16, + "x": 477, + "y": 925 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord/UL20-3_EPC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL1-1_EPC2_End" + }, + "position": { + "height": 30, + "rotate": { + "angle": 0 + }, + "width": 14, + "x": 478, + "y": 711 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL2-3_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 549, + "y": 534 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL3-3_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 625, + "y": 551 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL4-3_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 702, + "y": 582 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL5-3_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 777, + "y": 595 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL6-3_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 853, + "y": 620 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-1_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 962, + "y": 440.527 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL6-1-EPC1_End" + }, + "position": { + "height": 30, + "rotate": { + "angle": 0 + }, + "width": 14, + "x": 809.3, + "y": 811 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL6-1-EPC1_Line" + }, + "position": { + "height": 6, + "rotate": { + "angle": 90 + }, + "width": 191, + "x": 721.79, + "y": 933.51 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL6-1_EPC1" + }, + "position": { + "height": 32, + "rotate": { + "angle": -180 + }, + "width": 16, + "x": 808.3, + "y": 1025 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord/UL20-3_EPC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL6-1-EPC2" + }, + "position": { + "height": 32, + "rotate": { + "angle": -180 + }, + "width": 16, + "x": 853.3, + "y": 1025 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord/UL20-3_EPC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL6-1-EPC2_Line" + }, + "position": { + "height": 6, + "rotate": { + "angle": 90 + }, + "width": 194, + "x": 764.29, + "y": 929.01 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL6-1-EPC2_End" + }, + "position": { + "height": 30, + "rotate": { + "angle": 0 + }, + "width": 14, + "x": 854.3, + "y": 811 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL1-2-FIO1" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 451.519, + "y": 765.469 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL2-3-FIO1" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 523.894, + "y": 752.47 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL3-3-FIO1" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 600.521, + "y": 742.47 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL4-3-FIO1" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 677.984, + "y": 758.47 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL5-3-FIO1" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 753.186, + "y": 779.47 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL6-2-FIO1" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 829.266, + "y": 846.47 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-5B" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 975.92, + "y": 97.62 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS1-5AB", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "MCM04-MCM5_Button" + }, + "position": { + "height": 46.01, + "width": 292.03, + "x": 1130.7, + "y": 164.453 + }, + "props": { + "params": { + "pageid": "DetailedView/MCM04 \u0026 MCM05 Sorter Destination,chutes and bypass", + "panel_id": "value", + "text": "MCM04 \u0026 MCM05 Sorter Destination,chutes and bypass" + }, + "path": "Custom-Views/Area_Nav_Button" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS1-8_S1" + }, + "position": { + "height": 13, + "width": 13, + "x": 936, + "y": 29 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-7-EPC2_End" + }, + "position": { + "height": 30, + "rotate": { + "angle": 90 + }, + "width": 14, + "x": 1278, + "y": 475 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-7-EPC1_End" + }, + "position": { + "height": 30, + "rotate": { + "angle": 90 + }, + "width": 14, + "x": 1278, + "y": 435.35 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-2" + }, + "position": { + "height": 20, + "rotate": { + "angle": -40 + }, + "width": 20, + "x": 1329.49, + "y": 447.52 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS2-2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-7-EPC2_Line_3" + }, + "position": { + "height": 6, + "rotate": { + "angle": 0 + }, + "width": 32, + "x": 1299, + "y": 486.08 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-7-EPC2_Line_2" + }, + "position": { + "height": 5.6, + "rotate": { + "angle": -40 + }, + "width": 57.23, + "x": 1323.13, + "y": 468.5 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-7-EPC1_Line_2" + }, + "position": { + "height": 6, + "rotate": { + "angle": -40 + }, + "width": 20, + "x": 1313, + "y": 439.43 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-7-EPC1_Line_1" + }, + "position": { + "height": 6, + "rotate": { + "angle": 90 + }, + "width": 123, + "x": 1268.51, + "y": 373.11 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-7-EPC1" + }, + "position": { + "height": 32, + "rotate": { + "angle": 0 + }, + "width": 16, + "x": 1322, + "y": 287.37 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord/UL20-3_EPC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-7_S1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1305, + "y": 298 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-1_JR2" + }, + "position": { + "height": 13, + "width": 13, + "x": 1285, + "y": 411.33 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-7-EPC2_Line_1" + }, + "position": { + "height": 7, + "rotate": { + "angle": 90 + }, + "width": 143, + "x": 1301.04, + "y": 381.27 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-3" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1340.98, + "y": 408.67 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS2-3", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-4A" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1340.94, + "y": 381.14 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS2-4AB", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-4B" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1340.94, + "y": 362.14 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS2-4AB", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-5" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1340.99, + "y": 337.46 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS2-5", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-6" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1341.23, + "y": 314.47 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS2-6", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-7" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1341.35, + "y": 291.76 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS2-7", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-7_S2" + }, + "position": { + "height": 13, + "width": 13, + "x": 1385, + "y": 297.37 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-7-EPC2" + }, + "position": { + "height": 32, + "rotate": { + "angle": 0 + }, + "width": 16, + "x": 1365, + "y": 287.37 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord/UL20-3_EPC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS2-7-EPC1_Line_3" + }, + "position": { + "height": 6, + "rotate": { + "angle": 0 + }, + "width": 16, + "x": 1300, + "y": 446.18 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "root" + }, + "position": { + "x": 42.09710693359375, + "y": 36.40085983276367 + }, + "props": { + "style": { + "backgroundColor": "#FFFFFF" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/.resources/122e687bc2e1a9454557314d00912426a69a5c06bc6185c60d0c0458b8016101 b/.resources/122e687bc2e1a9454557314d00912426a69a5c06bc6185c60d0c0458b8016101 new file mode 100644 index 0000000..f45faa6 --- /dev/null +++ b/.resources/122e687bc2e1a9454557314d00912426a69a5c06bc6185c60d0c0458b8016101 @@ -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/.resources/159bec16f87bfac327073de895c0d2ee6f75a3fba68fff9ac92ec5bb475ad6e7 b/.resources/159bec16f87bfac327073de895c0d2ee6f75a3fba68fff9ac92ec5bb475ad6e7 new file mode 100644 index 0000000..f9a1b0b --- /dev/null +++ b/.resources/159bec16f87bfac327073de895c0d2ee6f75a3fba68fff9ac92ec5bb475ad6e7 @@ -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/.resources/166f3bad8fccdb86198dd71254abff7ea2c843faa9df618060bb05d566b183db b/.resources/166f3bad8fccdb86198dd71254abff7ea2c843faa9df618060bb05d566b183db new file mode 100644 index 0000000..f84957e --- /dev/null +++ b/.resources/166f3bad8fccdb86198dd71254abff7ea2c843faa9df618060bb05d566b183db @@ -0,0 +1,11 @@ +import sys + +def error_handler(whid, logger_name): + logger_name = "%s-%s" % (whid, logger_name) + logger = system.util.getLogger(logger_name) + provider = "[%s_SCADA_TAG_PROVIDER]" % (whid) + exc_type, exc_obj, tb = sys.exc_info() + lineno = tb.tb_lineno + logger.error("Error: %s, %s, %s" % (lineno, exc_type, exc_obj)) + system.tag.writeBlocking([provider + "System/wbsckt_running"], [0]) + \ No newline at end of file diff --git a/.resources/16c11692b6966337faf66111812dfcf77944fd34cf91dbda04dcc15df6bb746e b/.resources/16c11692b6966337faf66111812dfcf77944fd34cf91dbda04dcc15df6bb746e new file mode 100644 index 0000000..55d867a --- /dev/null +++ b/.resources/16c11692b6966337faf66111812dfcf77944fd34cf91dbda04dcc15df6bb746e @@ -0,0 +1,155 @@ +{ + "custom": { + "activityLogger": { + "alt_pageid": "tools", + "start_time": { + "$": [ + "ts", + 192, + 1716471122012 + ], + "$ts": 1716471122012 + } + } + }, + "events": { + "system": { + "onShutdown": { + "config": { + "script": "\tactivityLog.productMetrics.callLogger(self, \u0027page\u0027)" + }, + "scope": "G", + "type": "script" + }, + "onStartup": { + "config": { + "script": "\tself.session.custom.view_in_focus \u003d self.page.props.path\n\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": "{/root.props.currentTabIndex}" + }, + "transforms": [ + { + "code": "\tpageid\u003d self.custom.activityLogger.alt_pageid+\u0027/\u0027+self.getChild(\"root\").props.tabs[value]\n\treturn pageid.replace(\u0027 \u0027,\u0027\u0027)", + "type": "script" + } + ], + "type": "expr" + } + } + }, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "CommissioningTool" + }, + "props": { + "path": "Main-Views/Commissioning Tool/CT_Main" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S3" + }, + "position": { + "tabIndex": 1 + }, + "propConfig": { + "props.params.selected_site": { + "binding": { + "config": { + "path": "session.custom.fc" + }, + "type": "property" + } + } + }, + "props": { + "params": { + "selected_image": null + }, + "path": "Main-Views/S3/manage" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "NotifyTool" + }, + "position": { + "tabIndex": 2 + }, + "props": { + "path": "Main-Views/Notify-Tool/Notify-Main" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "EmbeddedView" + }, + "position": { + "tabIndex": 3 + }, + "props": { + "path": "Main-Views/Config-Tool/MainView" + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "root" + }, + "propConfig": { + "props.currentTabIndex": { + "onChange": { + "enabled": null, + "script": "\ttry:\n\t\tpageid \u003d self.view.custom.activityLogger.alt_pageid + \u0027/\u0027+ self.props.tabs[previousValue.value]\n\t\tpageid \u003d pageid.replace(\u0027 \u0027,\u0027\u0027)\n\t\tpayload \u003d activityLog.productMetrics.createActivityPayload(self.view, \u0027page\u0027, pageid, pageid)\n\t\tif payload:\n\t\t\tself.view.custom.activityLogger.start_time \u003d system.date.now()\n\t\t\tsystem.perspective.sendMessage(\u0027activityLogger-TabChanged\u0027, payload \u003d payload, scope \u003d \u0027page\u0027)\n\texcept:\n\t\tpass" + } + } + }, + "props": { + "currentTabIndex": 3, + "tabs": [ + "CT", + "S3", + "Notify Tool", + "Site Config" + ] + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "activityLogger-TabChanged", + "pageScope": true, + "script": "\t# implement your handler here\n\tif payload:\n\t\tactivityLog.productMetrics.callActivityLoggerAPI(payload)\n", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.container.tab" + } +} \ No newline at end of file diff --git a/.resources/1a67cf29366ddc4c9abeb92e093150450a0e43993714ac6fd536ac5c98043ec9 b/.resources/1a67cf29366ddc4c9abeb92e093150450a0e43993714ac6fd536ac5c98043ec9 new file mode 100644 index 0000000..2b69950 --- /dev/null +++ b/.resources/1a67cf29366ddc4c9abeb92e093150450a0e43993714ac6fd536ac5c98043ec9 @@ -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/.resources/1b05fe73f219f95148344b1938949f814b9d1e3f489be03715ba3b8ab954a95f b/.resources/1b05fe73f219f95148344b1938949f814b9d1e3f489be03715ba3b8ab954a95f new file mode 100644 index 0000000..ffedf84 --- /dev/null +++ b/.resources/1b05fe73f219f95148344b1938949f814b9d1e3f489be03715ba3b8ab954a95f @@ -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/.resources/1b46a7e5d3227a109e6cf5c44593125874b6a3925337f3e36af1c1da29bbfc56 b/.resources/1b46a7e5d3227a109e6cf5c44593125874b6a3925337f3e36af1c1da29bbfc56 new file mode 100644 index 0000000..b9b1bb6 --- /dev/null +++ b/.resources/1b46a7e5d3227a109e6cf5c44593125874b6a3925337f3e36af1c1da29bbfc56 @@ -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/.resources/1be6fbc47dc087ab9174d27687f2f14870bd4d82ec43ae8d16abc0c83a3154ab b/.resources/1be6fbc47dc087ab9174d27687f2f14870bd4d82ec43ae8d16abc0c83a3154ab new file mode 100644 index 0000000..821b5a2 --- /dev/null +++ b/.resources/1be6fbc47dc087ab9174d27687f2f14870bd4d82ec43ae8d16abc0c83a3154ab @@ -0,0 +1,1978 @@ +{ + "custom": {}, + "params": { + "PLCTagPath": "value" + }, + "propConfig": { + "params.PLCTagPath": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 100, + "width": 1920 + } + }, + "root": { + "children": [ + { + "custom": { + "AlarmsToShelve": "{}", + "delay": 2000, + "device": "value", + "run_export": false, + "run_update": false, + "severity_filters": [ + "off", + "off", + "off", + "off", + "off" + ] + }, + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\trow \u003d event.value\n\tmhe_id \u003d row.get(\"SourceId\")\n\tnavigation.amzl_navigation.navigate_to_alarm(self, mhe_id)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Active_Table" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "custom.AlarmsToShelve": { + "onChange": { + "enabled": null, + "script": "\n\tpayload \u003d self.custom.AlarmsToShelve\n\tsystem.perspective.sendMessage(\"alarms-to-shelve\", payload \u003dpayload , scope \u003d \"session\") " + } + }, + "custom.run_export": { + "onChange": { + "enabled": null, + "script": "\trun_export \u003d self.custom.run_export\n\tif run_export:\n\t\tdata \u003d self.props.data\n\t\trow_data \u003d []\n\t\tfor i,j in enumerate(data):\n\t\t\tvalue \u003d j[\"value\"]\n\t\t\tif i \u003d\u003d 0:\n\t\t\t\theader \u003d [item for item in value] \t\n\t\t\trow \u003d [value[item][\"value\"] for item in value]\n\t\t\trow_data.append(row) \n\t\t\n\t\talarms_data \u003d system.dataset.toDataSet(header,row_data)\n\t\thtml_data \u003d system.dataset.dataSetToHTML(1, alarms_data, \"RealTimeAlarms\")\n\t\tsystem.perspective.download(\"myExport.html\",html_data)\n\t\tself.custom.run_export \u003d False" + } + }, + "custom.severity_filters": { + "onChange": { + "enabled": null, + "script": "\tpayload \u003d {}\n\tseverity_filters \u003d self.custom.severity_filters\n\tpayload[\"severity_filters\"] \u003d severity_filters\n\tsystem.perspective.sendMessage(\"button-severity\", payload \u003d payload, scope \u003d \"page\")" + } + }, + "custom.update": { + "binding": { + "config": { + "expression": "now({this.custom.delay})" + }, + "type": "expr" + }, + "onChange": { + "enabled": false, + "script": "\t\n\t\n\tempty_row \u003d row_builder.build_row(DisplayPath \u003d \"\",\n\tDuration \u003d \"\", Severity \u003d \"\",\n\tTimestamp \u003d \"\", AlarmId \u003d \"\",\n\tSource \u003d \"\", StyleClass \u003d {\"classes\":\"Alarms-Styles/Diagnostic\"})\n\tno_filter \u003d False\n\tseverity_filters \u003d self.custom.severity_filters\n\talarm_states \u003d alarms.alarm_filters.docked_alarm_table()\n\t\n\tif severity_filters[0] \u003d\u003d \"off\" and severity_filters[1] \u003d\u003d \"off\" and severity_filters[2] \u003d\u003d \"off\" and severity_filters[3] \u003d\u003d \"off\" and severity_filters[4] \u003d\u003d \"off\":\n\t\tno_filter \u003d True\n\t\n\tif self.custom.run_update and system.tag.exists(\"System/aws_data\"):\n\t\t\n\t\t\n\t\ttags_to_read \u003d system.tag.readBlocking([\"System/aws_data\",\"Configuration/DetailedViews\"])\n\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\tdetailed_view_decoded \u003d system.util.jsonDecode(tags_to_read[1].value)\n\t\tdevice_list \u003d detailed_view_decoded.get(self.custom.device,[])\n\t\tif len(decode_alarm_data) \u003e 0:\n\t\t\talt_colour \u003d self.session.custom.colours.colour_impaired\n\t\t\talarms_data \u003d alarms.alarm_tables.get_alarm_table(decode_alarm_data, severity_filters, no_filter, device_list, alarm_states, alt_colour)\t\t\n\t\t\t\n\t\t\tif len(alarms_data)\u003e0:\n\t\t\t\tself.props.data \u003d alarms_data\n\t\t\t\n\t\t\telse:\n\t\t\t\tself.props.data \u003d [empty_row]\n\t\telse:\n\t\t\tself.props.data \u003d [empty_row]\n\t\t\t\t\n\t\t\t" + } + }, + "props.selection.data": { + "onChange": { + "enabled": null, + "script": "\tpayload \u003d self.props.selection.data\n\tsystem.perspective.sendMessage(\"alarms-to-shelve\", payload \u003d payload, scope \u003d \"view\")" + } + } + }, + "props": { + "cells": { + "allowEditOn": "single-click" + }, + "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": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Message", + "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 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": "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": { + "Duration": { + "value": "97h:57m:18s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Estop activated" + }, + "Priority": { + "value": "4. High" + }, + "SourceId": { + "value": "PLC03 / 30 / S0102" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674233996773 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "Duration": { + "value": "97h:57m:18s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Estop activated" + }, + "Priority": { + "value": "4. High" + }, + "SourceId": { + "value": "PLC03 / 10 / S0101" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674233996773 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "Duration": { + "value": "97h:57m:18s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Estop activated" + }, + "Priority": { + "value": "4. High" + }, + "SourceId": { + "value": "PLC03 / S01 / K0041" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674233996973 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/High" + }, + "value": { + "Duration": { + "value": "98h:40m:48s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Fuse tripped" + }, + "Priority": { + "value": "4. High" + }, + "SourceId": { + "value": "PLC03 / S01 / F0262" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674231386681 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Medium" + }, + "value": { + "Duration": { + "value": "113h:4m:53s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Too many MultiReads in interval at verification scan" + }, + "Priority": { + "value": "3. Medium" + }, + "SourceId": { + "value": "PLC03 / General" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674179541965 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Medium" + }, + "value": { + "Duration": { + "value": "10h:36m:12s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Too many NoReads in interval at verification scan" + }, + "Priority": { + "value": "3. Medium" + }, + "SourceId": { + "value": "PLC02 / General" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674548462720 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Medium" + }, + "value": { + "Duration": { + "value": "97h:57m:18s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Error" + }, + "Priority": { + "value": "3. Medium" + }, + "SourceId": { + "value": "PLC03 / ZM1" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674233996463 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Medium" + }, + "value": { + "Duration": { + "value": "97h:57m:18s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Error" + }, + "Priority": { + "value": "3. Medium" + }, + "SourceId": { + "value": "PLC03 / ZM2" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674233996404 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "9h:1m:9s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Sleep mode activated" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC09 / L3" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674554165092 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "98h:39m:12s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Medium speed mode activation" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC09 / MHE" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674231482352 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "9h:3m:47s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Reset buton" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC01 / P1 / S0033" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674554007223 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "97h:57m:17s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Undervoltage" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC03 / 60 / M0011" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674233997159 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "97h:57m:17s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Undervoltage" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC03 / 60 / M0012" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674233997159 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "8h:33m:21s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Stop button" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC02 / P1 / S0032" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674555833991 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "97h:57m:17s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Undervoltage" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC03 / 50 / M0041" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674233997130 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "97h:57m:17s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Undervoltage" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC03 / 50 / M0042" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674233997130 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "9h:1m:9s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Sleep mode activated" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC09 / I3_2" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674554165092 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "198h:55m:56s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Stop button" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC03 / P2 / S0012" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1673870478869 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "9h:35m:12s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Sleep mode activated" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC09 / L2" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674552122041 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "9h:3m:49s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Stop button" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC01 / P1 / S0032" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674554005464 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "11h:29m:21s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Received telegram is invalid" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC01 / General" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674545273550 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "97h:57m:17s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Undervoltage" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC03 / 60 / M0022" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674233997191 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "97h:57m:17s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Undervoltage" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC03 / 60 / M0021" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674233997191 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "10h:0m:42s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Sleep mode activated" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC09 / I3_1" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674550592036 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "98h:31m:6s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Reset buton" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC03 / P1 / S0033" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674231968042 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "9h:35m:12s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Sleep mode activated" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC09 / L1" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674552122041 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "97h:57m:17s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Undervoltage" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC03 / 50 / M0032" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674233997135 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "97h:57m:17s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Undervoltage" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC03 / 50 / M0031" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674233997135 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "212h:36m:18s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Stop button" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC01 / P2 / S0012" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1673821256850 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "8h:33m:13s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Reset buton" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC02 / P1 / S0033" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674555841111 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "9h:1m:9s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Sleep mode activated" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC09 / L4" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674554165092 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "225h:32m:20s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Stop button" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC02 / P2 / S0012" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1673774694508 + } + } + } + }, + { + "style": { + "classes": "Alarms-Styles/Diagnostic" + }, + "value": { + "Duration": { + "value": "98h:31m:5s" + }, + "Expiration": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Stop button" + }, + "Priority": { + "value": "1. Diagnostic" + }, + "SourceId": { + "value": "PLC03 / P1 / S0032" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1674586633866 + ], + "$ts": 1674231969209 + } + } + } + } + ], + "headerGroups": [ + [ + { + "align": "center", + "justify": "center", + "span": 1, + "style": { + "classes": "" + }, + "title": "DisplayPath" + } + ] + ], + "headerStyle": { + "classes": "Background-Styles/Controller" + }, + "pager": { + "bottom": false + }, + "rows": { + "highlight": { + "color": "#FFFF09" + } + }, + "selection": { + "data": [ + { + "Duration": "97h:57m:18s", + "Expiration": "Thu Jan 01 1970 01:00:00 GMT+0100 (Greenwich Mean Time)", + "Message": "Estop activated", + "Priority": "4. High", + "SourceId": "PLC03 / 30 / S0102", + "Timestamp": "Fri Jan 20 2023 16:59:56 GMT+0000 (Greenwich Mean Time)" + } + ], + "mode": "multiple interval", + "selectedColumn": "SourceId", + "selectedRow": 0 + }, + "virtualized": false + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "severity-filters", + "pageScope": true, + "script": "\tcritical \u003d payload.get(\"critical\")\n\tif critical \u003d\u003d \"true\":\n\t\tself.custom.severity_filters[4] \u003d 4\n\tif critical \u003d\u003d \"false\":\n\t\tself.custom.severity_filters[4] \u003d \"off\"\n\t\n\thigh \u003d payload.get(\"high\")\n\tif high \u003d\u003d \"true\":\n\t\tself.custom.severity_filters[3] \u003d 3\n\tif high \u003d\u003d \"false\":\n\t\tself.custom.severity_filters[3] \u003d \"off\"\n\t\n\tmedium \u003d payload.get(\"medium\")\n\tif medium \u003d\u003d \"true\":\n\t\tself.custom.severity_filters[2] \u003d 2\n\tif medium \u003d\u003d \"false\":\n\t\tself.custom.severity_filters[2] \u003d \"off\"\n\t\n\tlow \u003d payload.get(\"low\")\n\tif low \u003d\u003d \"true\":\n\t\tself.custom.severity_filters[1] \u003d 1\n\tif low \u003d\u003d \"false\":\n\t\tself.custom.severity_filters[1] \u003d \"off\"\n\t\n\tdiagnostic \u003d payload.get(\"diagnostic\")\n\tif diagnostic \u003d\u003d \"true\":\n\t\tself.custom.severity_filters[0] \u003d 0\n\tif diagnostic \u003d\u003d \"false\":\n\t\tself.custom.severity_filters[0] \u003d \"off\"", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "update-table", + "pageScope": true, + "script": "\t# implement your handler here\n\tupdate \u003d payload[\"update\"]\n\tself.custom.run_update \u003d update", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "run-export", + "pageScope": true, + "script": "\t# implement your handler here\n\texport \u003d payload[\"export\"]\n\tself.custom.run_export \u003d export", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "reset-filters", + "pageScope": true, + "script": "\tbackground \u003d \"false\"\n\tseverity \u003d payload[\"reset\"]\n\tseverity_filters \u003d self.custom.severity_filters\n\tseverity_filters[0] \u003d \"off\"\n\tseverity_filters[1] \u003d \"off\"\n\tseverity_filters[2] \u003d \"off\"\n\tseverity_filters[3] \u003d \"off\"\n\tseverity_filters[4] \u003d \"off\"", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.display.table" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/1c5aa327a910a2aa5eaf95aaa63a07d1570def6619be8c1f13caad25fa5f842c b/.resources/1c5aa327a910a2aa5eaf95aaa63a07d1570def6619be8c1f13caad25fa5f842c new file mode 100644 index 0000000..d4c5f78 --- /dev/null +++ b/.resources/1c5aa327a910a2aa5eaf95aaa63a07d1570def6619be8c1f13caad25fa5f842c @@ -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/.resources/1c98f8f79b5dd8c3057c8b68416da5e99f3bf56908f95805029fbdff38c83279 b/.resources/1c98f8f79b5dd8c3057c8b68416da5e99f3bf56908f95805029fbdff38c83279 new file mode 100644 index 0000000..763521d --- /dev/null +++ b/.resources/1c98f8f79b5dd8c3057c8b68416da5e99f3bf56908f95805029fbdff38c83279 @@ -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/.resources/1cdee86d0bd49bb495e04026248a8e1f6a0d92706470a5b8feba47753e95f409 b/.resources/1cdee86d0bd49bb495e04026248a8e1f6a0d92706470a5b8feba47753e95f409 new file mode 100644 index 0000000..e8d6d02 --- /dev/null +++ b/.resources/1cdee86d0bd49bb495e04026248a8e1f6a0d92706470a5b8feba47753e95f409 @@ -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/.resources/1d8c466236681823083135ce8355a8cf8842ac856c77c4b80fab00924cf19ea0 b/.resources/1d8c466236681823083135ce8355a8cf8842ac856c77c4b80fab00924cf19ea0 new file mode 100644 index 0000000..9dd7586 --- /dev/null +++ b/.resources/1d8c466236681823083135ce8355a8cf8842ac856c77c4b80fab00924cf19ea0 @@ -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/.resources/1dd7015b65e8a1c2f28848c2b4a0d24464d4e4d0168fce41970982de365f2d63 b/.resources/1dd7015b65e8a1c2f28848c2b4a0d24464d4e4d0168fce41970982de365f2d63 new file mode 100644 index 0000000..c0e179f --- /dev/null +++ b/.resources/1dd7015b65e8a1c2f28848c2b4a0d24464d4e4d0168fce41970982de365f2d63 @@ -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/.resources/1ea7dfdb49968e59e944bc59e75f72a65c4b4c3369b412455c88430394145bc8 b/.resources/1ea7dfdb49968e59e944bc59e75f72a65c4b4c3369b412455c88430394145bc8 new file mode 100644 index 0000000..5ab8a80 --- /dev/null +++ b/.resources/1ea7dfdb49968e59e944bc59e75f72a65c4b4c3369b412455c88430394145bc8 @@ -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/.resources/1ec7206cf9f00d16bfed1891fe43b62865e78746e5ad859e8a99fa6e585ac096 b/.resources/1ec7206cf9f00d16bfed1891fe43b62865e78746e5ad859e8a99fa6e585ac096 new file mode 100644 index 0000000..562c9a3 --- /dev/null +++ b/.resources/1ec7206cf9f00d16bfed1891fe43b62865e78746e5ad859e8a99fa6e585ac096 @@ -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/.resources/1edd25f4f17bbf4964cd66bffaa6b66e07a3bd3b94f6aeee3790fc1fb9a67d14 b/.resources/1edd25f4f17bbf4964cd66bffaa6b66e07a3bd3b94f6aeee3790fc1fb9a67d14 new file mode 100644 index 0000000..48deb28 --- /dev/null +++ b/.resources/1edd25f4f17bbf4964cd66bffaa6b66e07a3bd3b94f6aeee3790fc1fb9a67d14 @@ -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/.resources/24f26035a2dbaef6cc5fad6abcec96b73bbd5eddc8a2a1ac78dd7201fd3adde9 b/.resources/24f26035a2dbaef6cc5fad6abcec96b73bbd5eddc8a2a1ac78dd7201fd3adde9 new file mode 100644 index 0000000..e898bdb --- /dev/null +++ b/.resources/24f26035a2dbaef6cc5fad6abcec96b73bbd5eddc8a2a1ac78dd7201fd3adde9 @@ -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/.resources/25313293b4a91dc75c10134d645ec3724e879a90c650ff48029ca5faa7941a74 b/.resources/25313293b4a91dc75c10134d645ec3724e879a90c650ff48029ca5faa7941a74 new file mode 100644 index 0000000..4e75888 --- /dev/null +++ b/.resources/25313293b4a91dc75c10134d645ec3724e879a90c650ff48029ca5faa7941a74 @@ -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/.resources/2556d6a6a86d0c8d9d427845d17819be0c10ce1b21edfad1902afe39345a8c75 b/.resources/2556d6a6a86d0c8d9d427845d17819be0c10ce1b21edfad1902afe39345a8c75 new file mode 100644 index 0000000..d311f3b --- /dev/null +++ b/.resources/2556d6a6a86d0c8d9d427845d17819be0c10ce1b21edfad1902afe39345a8c75 @@ -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/.resources/2638e4b0b80aa25c57788fb25c84db754a5741e974dac2f92f14ba264277a188 b/.resources/2638e4b0b80aa25c57788fb25c84db754a5741e974dac2f92f14ba264277a188 new file mode 100644 index 0000000..a188a79 --- /dev/null +++ b/.resources/2638e4b0b80aa25c57788fb25c84db754a5741e974dac2f92f14ba264277a188 @@ -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/.resources/27f9e112656215c5e81d106a2a8abc36bcb1a3b35105dc11b3446ebe8b984bf0 b/.resources/27f9e112656215c5e81d106a2a8abc36bcb1a3b35105dc11b3446ebe8b984bf0 new file mode 100644 index 0000000..cc715fc --- /dev/null +++ b/.resources/27f9e112656215c5e81d106a2a8abc36bcb1a3b35105dc11b3446ebe8b984bf0 @@ -0,0 +1,55 @@ +{ + "custom": {}, + "params": {}, + "props": {}, + "root": { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "fontFamily": "Arial", + "fontSize": 22, + "fontWeight": "bold", + "textAlign": "center" + }, + "text": "TEMPERATURE" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Table" + }, + "position": { + "basis": "400px" + }, + "propConfig": { + "props.data": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "direct", + "tagPath": "[IEC_SCADA_TAG_PROVIDER]Temperature/temperature_monitoring" + }, + "type": "tag" + } + } + }, + "type": "ia.display.table" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/287526ad50c3469bb2006dbead24822d6710150bc68f63cd7a236fa65e803a94 b/.resources/287526ad50c3469bb2006dbead24822d6710150bc68f63cd7a236fa65e803a94 new file mode 100644 index 0000000..82ad1aa --- /dev/null +++ b/.resources/287526ad50c3469bb2006dbead24822d6710150bc68f63cd7a236fa65e803a94 @@ -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/.resources/28fbdf24361839b5c83803e523c90319b1873771a8688690494674da2c440d20 b/.resources/28fbdf24361839b5c83803e523c90319b1873771a8688690494674da2c440d20 new file mode 100644 index 0000000..5a387ea --- /dev/null +++ b/.resources/28fbdf24361839b5c83803e523c90319b1873771a8688690494674da2c440d20 @@ -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/.resources/2911e2416b3f9d9186e3167869fa8cbacb6b2c24236e294e9cc80940f4a623fd b/.resources/2911e2416b3f9d9186e3167869fa8cbacb6b2c24236e294e9cc80940f4a623fd new file mode 100644 index 0000000..3077f84 --- /dev/null +++ b/.resources/2911e2416b3f9d9186e3167869fa8cbacb6b2c24236e294e9cc80940f4a623fd @@ -0,0 +1,1281 @@ +{ + "custom": {}, + "params": { + "alarm_states": [ + "Shelved", + "Active", + "Not Active" + ], + "length_of_table_data": 0, + "show_filter": false, + "show_severity_column": true, + "show_state_column": true, + "table_type": "value", + "tagProps": [ + "" + ] + }, + "propConfig": { + "params.alarm_states": { + "paramDirection": "input", + "persistent": true + }, + "params.length_of_table_data": { + "binding": { + "config": { + "expression": "len({/root/Table.props.data})" + }, + "type": "expr" + }, + "paramDirection": "output", + "persistent": true + }, + "params.show_filter": { + "paramDirection": "input", + "persistent": true + }, + "params.show_severity_column": { + "paramDirection": "input", + "persistent": true + }, + "params.show_state_column": { + "paramDirection": "input", + "persistent": true + }, + "params.table_type": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "custom": { + "alarms_to_shelve": {}, + "alarms_to_unshelve": {}, + "delay": 2000, + "run_export": false, + "run_update": true, + "severity_filters": [ + "off", + "off", + "off", + "off", + "off" + ], + "shelve_alarms": false, + "shelve_duration": "", + "unshelve_alarms": false + }, + "events": { + "component": { + "onRowClick": [ + { + "config": { + "script": "\n\talarm_id \u003d event.value.Alarm_id\n\tsource_id \u003d event.value.SourceId\n\tif self.props.data[event.row].value.Shelve.value \u003d\u003d True:\n\t\tself.props.data[event.row].value.Shelve.value \u003d False\n\t\tkey \u003d alarms.alarm_tables.create_shelve_key(source_id, alarm_id)\n\t\tself.custom.alarms_to_shelve.pop(key, \"no key found\")\n\telse:\n\t\tself.props.data[event.row].value.Shelve.value \u003d True\n\t\tkey \u003d alarms.alarm_tables.create_shelve_key(source_id, alarm_id)\n\t\tself.custom.alarms_to_shelve[key] \u003d event.value.Alarm_id" + }, + "scope": "G", + "type": "script" + }, + { + "config": { + "script": "\tif self.view.params.table_type \u003d\u003d \"Shelved\":\n\t\talarm_id \u003d event.value.Alarm_id\n\t\tsource_id \u003d event.value.SourceId\n\t\t\n\t\tif self.props.data[event.row].value.Unshelve.value \u003d\u003d True:\n\t\t\tself.props.data[event.row].value.Unshelve.value \u003d False\n\t\t\tkey \u003d alarms.alarm_tables.create_shelve_key(source_id, alarm_id)\n\t\t\tself.custom.alarms_to_unshelve.pop(key, \"no key found\")\n\t\telse:\n\t\t\tself.props.data[event.row].value.Unshelve.value \u003d True\n\t\t\tkey \u003d alarms.alarm_tables.create_shelve_key(source_id, alarm_id)\n\t\t\tself.custom.alarms_to_unshelve[key] \u003d event.value.Alarm_id" + }, + "scope": "G", + "type": "script" + } + ], + "onRowDoubleClick": { + "config": { + "script": "\trow \u003d event.value\n\tsource_id \u003d row.get(\"SourceId\")\n\tsource_id \u003d source_id.replace(\" \",\"\")\n\tconfig.project_config.source_id_lookup(self, source_id)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Table" + }, + "position": { + "basis": "1080px" + }, + "propConfig": { + "custom.device": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "type": "property" + } + }, + "custom.run_export": { + "onChange": { + "enabled": null, + "script": "\trun_export \u003d self.custom.run_export\n\tif run_export:\n\t\tdata \u003d self.props.data\n\t\trow_data \u003d []\n\t\tfor i,j in enumerate(data):\n\t\t\tvalue \u003d j[\"value\"]\n\t\t\tif i \u003d\u003d 0:\n\t\t\t\theader \u003d [item for item in value] \t\n\t\t\trow \u003d [value[item][\"value\"] for item in value]\n\t\t\tif not isinstance(row[3], int):\n\t\t\t\trow[3] \u003d 0\t\t\t\n\t\t\trow_data.append(row) \n\t\t\n\t\talarms_data \u003d system.dataset.toDataSet(header,row_data)\n\t\thtml_data \u003d system.dataset.dataSetToHTML(1, alarms_data, \"RealTimeAlarms\")\n\t\tsystem.perspective.download(\"myExport.html\",html_data)\n\t\tself.custom.run_export \u003d False" + } + }, + "custom.severity_filters[0]": { + "access": "PRIVATE" + }, + "custom.shelve_alarms": { + "onChange": { + "enabled": null, + "script": "\tif self.custom.shelve_alarms:\n\t\tsource_ids_to_shelve \u003d []\n\t\tids_to_shelve \u003d [] \n\t\tfor k,v in self.custom.alarms_to_shelve.items():\n\t\t\tsource_id, alarm_id \u003d alarms.alarm_tables.unformat_shelve_key(k)\n\t\t\tsource_ids_to_shelve .append(source_id)\n\t\t\tids_to_shelve.append(alarm_id)\n\t\twhid \u003d self.session.custom.fc\n\t\tduration \u003d self.custom.shelve_duration\n\t\tCommands.shelve_alarms.send_shelve_request(whid, source_ids_to_shelve, \"shelve\", duration, ids_to_shelve)\n\t\tself.custom.alarms_to_shelve \u003d {}\n\t\tself.custom.shelve_alarms \u003d False\n\t\t \t" + } + }, + "custom.unshelve_alarms": { + "onChange": { + "enabled": null, + "script": "\tif self.custom.unshelve_alarms:\n\t\tsource_ids_to_shelve \u003d []\n\t\tids_to_shelve \u003d [] \n\t\tfor k,v in self.custom.alarms_to_unshelve.items():\n\t\t\tsource_id, alarm_id \u003d alarms.alarm_tables.unformat_shelve_key(k)\n\t\t\tsource_ids_to_shelve .append(source_id)\n\t\t\tids_to_shelve.append(alarm_id)\n\t\twhid \u003d self.session.custom.fc\n\t\tduration \u003d 0\n\t\tCommands.shelve_alarms.send_shelve_request(whid, source_ids_to_shelve, \"unshelve\", duration, ids_to_shelve)\n\t\tself.custom.alarms_to_unshelve \u003d {}\n\t\tself.custom.unshelve_alarms \u003d False" + } + }, + "custom.update": { + "binding": { + "config": { + "expression": "if({this.custom.run_update},\r\nnow({this.custom.delay}), False)" + }, + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": "\n\tno_filter \u003d False\n\tseverity_filters \u003d self.custom.severity_filters\n\talarm_states \u003d self.view.params.alarm_states\n\ttable_type \u003d self.view.params.table_type\n\twhid \u003d self.session.custom.fc\n\talarms_to_shelve \u003d self.custom.alarms_to_shelve\n\tprovider \u003d \"[%s_SCADA_TAG_PROVIDER]\" % (whid)\n\tif (severity_filters[0] \u003d\u003d \"off\" and severity_filters[1] \u003d\u003d \"off\" \n\tand severity_filters[2] \u003d\u003d \"off\" and severity_filters[3] \u003d\u003d \"off\" \n\tand severity_filters[4] \u003d\u003d \"off\"):\n\t no_filter \u003d True\n\t\n\tif system.tag.exists(provider + \"System/aws_data\"):\n\t\ttags_to_read \u003d system.tag.readBlocking([provider + \"System/aws_data\", \n\t\t\t\t\t\t\t\t\t\t\t\tprovider + \"Configuration/DetailedViews\"])\n\t\tdecode_alarm_data \u003d system.util.jsonDecode(tags_to_read[0].value)\n\t\tdetailed_view_decoded \u003d system.util.jsonDecode(tags_to_read[1].value)\n\t\tif self.view.params.table_type \u003d\u003d \"Docked-East\":\n\t\t\tdevice_list \u003d [self.custom.device] \n\t\telse:\n\t\t\tdevice_list \u003d detailed_view_decoded.get(self.custom.device,[])\n\t\tif len(decode_alarm_data) \u003e 0:\n\t\t\talt_colour \u003d self.session.custom.colours.colour_impaired\n\t\t\talarms_data \u003d alarms.alarm_tables.get_alarm_table(self, decode_alarm_data, \n\t\t\tseverity_filters, no_filter, device_list, alarm_states, alt_colour,\n\t\t\ttable_type)\t\t\n\t\t\tif len(alarms_data)\u003e0:\n\t\t\t\tself.props.data \u003d alarms_data\n\t\t\telse:\n\t\t\t\tself.props.data \u003d []\n\t\telse:\n\t\t\tself.props.data \u003d []\n\telse:\n\t\tself.props.data \u003d []" + } + }, + "props.columns[2].visible": { + "binding": { + "config": { + "expression": "if({view.params.table_type} \u003d \"Shelved\", False, True)" + }, + "type": "expr" + } + }, + "props.columns[3].visible": { + "binding": { + "config": { + "expression": "if({view.params.table_type} \u003d \"Shelved\", False, True)" + }, + "type": "expr" + } + }, + "props.columns[4].visible": { + "binding": { + "config": { + "expression": "if({view.params.table_type} \u003d \"Shelved\", False, True)" + }, + "type": "expr" + } + }, + "props.columns[5].visible": { + "binding": { + "config": { + "path": "view.params.show_severity_column" + }, + "type": "property" + } + }, + "props.columns[6].visible": { + "binding": { + "config": { + "expression": "if({view.params.table_type} \u003d \"Shelved\", True, False)" + }, + "type": "expr" + } + }, + "props.columns[7].visible": { + "binding": { + "config": { + "expression": "if({view.params.table_type} \u003d \"Shelved\", False, True)" + }, + "type": "expr" + } + }, + "props.columns[8].visible": { + "binding": { + "config": { + "expression": "if({view.params.table_type} \u003d \"Shelved\", True, False)" + }, + "type": "expr" + } + }, + "props.filter.enabled": { + "binding": { + "config": { + "path": "view.params.show_filter" + }, + "type": "property" + } + }, + "props.selection.data": { + "onChange": { + "enabled": null, + "script": "\tpayload \u003d self.props.selection.data\n\tsystem.perspective.sendMessage(\"alarms-to-shelve\", payload \u003d payload, scope \u003d \"page\")" + } + } + }, + "props": { + "cells": { + "style": { + "marginLeft": 5, + "marginRight": 5, + "overflowWrap": "normal", + "wordWrap": "normal" + } + }, + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "SourceId", + "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", + "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": "Message", + "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", + "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 HH:mm:ss", + "editable": false, + "field": "Timestamp", + "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", + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Duration", + "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", + "number": "value", + "numberFormat": "00:00:00", + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "State", + "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", + "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": "", + "width": "" + }, + { + "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": "" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "Expiration", + "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", + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": true, + "field": "Shelve", + "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": "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": "", + "width": 100 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": true, + "field": "Unshelve", + "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": "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": "", + "width": 100 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Alarm_id", + "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": false, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Type", + "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": "" + } + ], + "emptyMessage": { + "noData": { + "icon": { + "color": "#000000" + } + } + }, + "filter": {}, + "headerStyle": { + "classes": "Background-Styles/Controller" + }, + "selection": { + "mode": "multiple interval" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "severity-filters", + "pageScope": true, + "script": "\n\tcritical \u003d payload.get(\"critical\")\n\tif critical \u003d\u003d \"true\":\n\t\tself.custom.severity_filters[5] \u003d 5\n\tif critical \u003d\u003d \"false\":\n\t\tself.custom.severity_filters[5] \u003d \"off\"\n\t\n\thigh \u003d payload.get(\"high\")\n\tif high \u003d\u003d \"true\":\n\t\tself.custom.severity_filters[4] \u003d 4\n\tif high \u003d\u003d \"false\":\n\t\tself.custom.severity_filters[4] \u003d \"off\"\n\t\n\tmedium \u003d payload.get(\"medium\")\n\tif medium \u003d\u003d \"true\":\n\t\tself.custom.severity_filters[3] \u003d 3\n\tif medium \u003d\u003d \"false\":\n\t\tself.custom.severity_filters[3] \u003d \"off\"\n\t\n\tlow \u003d payload.get(\"low\")\n\tif low \u003d\u003d \"true\":\n\t\tself.custom.severity_filters[2] \u003d 2\n\tif low \u003d\u003d \"false\":\n\t\tself.custom.severity_filters[2] \u003d \"off\"\n\t\n\tdiagnostic \u003d payload.get(\"diagnostic\")\n\tif diagnostic \u003d\u003d \"true\":\n\t\tself.custom.severity_filters[1] \u003d 1\n\tif diagnostic \u003d\u003d \"false\":\n\t\tself.custom.severity_filters[1] \u003d \"off\"", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "update-table", + "pageScope": true, + "script": "\t# implement your handler here\n\tupdate \u003d payload[\"update\"]\n\tself.custom.run_update \u003d update", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "run-alarm-export", + "pageScope": true, + "script": "\t# implement your handler here\n\tif self.view.params.table_type \u003d\u003d \"Realtime\":\n\t\texport \u003d payload[\"export\"]\n\t\tself.custom.run_export \u003d export", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "reset-filters", + "pageScope": true, + "script": "\tbackground \u003d \"false\"\n\tseverity \u003d payload[\"reset\"]\n\tseverity_filters \u003d self.custom.severity_filters\n\tseverity_filters[0] \u003d \"off\"\n\tseverity_filters[1] \u003d \"off\"\n\tseverity_filters[2] \u003d \"off\"\n\tseverity_filters[3] \u003d \"off\"\n\tseverity_filters[4] \u003d \"off\"\n\tself.custom.alarms_to_shelve \u003d {}", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "shelve-alarms", + "pageScope": true, + "script": "\tduration \u003d payload[\"duration\"]\n\tself.custom.shelve_duration \u003d duration\n\tself.custom.shelve_alarms \u003d True", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "unshelve-alarms", + "pageScope": true, + "script": "\tself.custom.unshelve_alarms \u003d True", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.display.table" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/2a7a3249da8cbed5b66601236ed50612b6f69ab326cd08abbe7d491dc36009dc b/.resources/2a7a3249da8cbed5b66601236ed50612b6f69ab326cd08abbe7d491dc36009dc new file mode 100644 index 0000000..68b4ff4 --- /dev/null +++ b/.resources/2a7a3249da8cbed5b66601236ed50612b6f69ab326cd08abbe7d491dc36009dc @@ -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/.resources/2cfc779230abacc2313e22e8841824b687613d0fa3c5ef5874284333ab6c6b1f b/.resources/2cfc779230abacc2313e22e8841824b687613d0fa3c5ef5874284333ab6c6b1f new file mode 100644 index 0000000..b298469 --- /dev/null +++ b/.resources/2cfc779230abacc2313e22e8841824b687613d0fa3c5ef5874284333ab6c6b1f @@ -0,0 +1,59 @@ +{ + "custom": { + "show_alarms": false + }, + "params": { + "customView": "", + "plcTagPath": "" + }, + "propConfig": { + "custom.show_alarms": { + "persistent": true + }, + "params.customView": { + "paramDirection": "input", + "persistent": true + }, + "params.plcTagPath": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "EmbeddedView" + }, + "position": { + "basis": "320px", + "grow": 1 + }, + "propConfig": { + "props.path": { + "binding": { + "config": { + "expression": "\"Custom-Views/\"+ {view.params.customView}" + }, + "type": "expr" + } + } + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/2de74f61b1e49a57ebb2b489577044177605c03a472d2b8424432619ccd14d74 b/.resources/2de74f61b1e49a57ebb2b489577044177605c03a472d2b8424432619ccd14d74 new file mode 100644 index 0000000..b440aeb --- /dev/null +++ b/.resources/2de74f61b1e49a57ebb2b489577044177605c03a472d2b8424432619ccd14d74 @@ -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/.resources/2eccb0861244a6617c828bb13d93b919d46e6b503f7839a14349181705f7ece7 b/.resources/2eccb0861244a6617c828bb13d93b919d46e6b503f7839a14349181705f7ece7 new file mode 100644 index 0000000..b27fca7 --- /dev/null +++ b/.resources/2eccb0861244a6617c828bb13d93b919d46e6b503f7839a14349181705f7ece7 @@ -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": "127.0.0.1", + "appBar": { + "togglePosition": "hidden" + }, + "device": {}, + "geolocation": {}, + "locale": "en-US", + "timeZoneId": "Asia/Tbilisi" + } +} \ No newline at end of file diff --git a/.resources/2efd45bc558539681ac57c1619e39ac89175e0e77bd37b369c22a639f0a749da b/.resources/2efd45bc558539681ac57c1619e39ac89175e0e77bd37b369c22a639f0a749da new file mode 100644 index 0000000..3f27d80 --- /dev/null +++ b/.resources/2efd45bc558539681ac57c1619e39ac89175e0e77bd37b369c22a639f0a749da @@ -0,0 +1,129 @@ +{ + "custom": {}, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\tself.params.request_focus \u003d True\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": { + "enabled": true, + "placeholder": "enter text...", + "request_focus": false, + "text": "" + }, + "propConfig": { + "params.enabled": { + "paramDirection": "input", + "persistent": true + }, + "params.placeholder": { + "paramDirection": "input", + "persistent": true + }, + "params.request_focus": { + "onChange": { + "enabled": null, + "script": "\t# if focus request set externally, set focus via message and clear request\n\tif currentValue.value:\n\t\tsystem.perspective.sendMessage(\u0027request_focus\u0027, scope\u003d\u0027view\u0027)\n\t\tself.params.request_focus \u003d False\n\t" + }, + "paramDirection": "inout", + "persistent": true + }, + "params.text": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 50, + "width": 200 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "TextField" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "path": "view.params.enabled" + }, + "type": "property" + } + }, + "props.placeholder": { + "binding": { + "config": { + "path": "view.params.placeholder" + }, + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({this.props.enabled},\u0027Input/Text/text_field_enabled\u0027,\u0027Input/Text/text_field_disabled\u0027)" + }, + "type": "expr" + } + }, + "props.text": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.text" + }, + "overlayOptOut": true, + "type": "property" + } + } + }, + "props": { + "style": { + "margin": "1%", + "padding": "1%" + } + }, + "scripts": { + "customMethods": [ + { + "name": "set_focus", + "params": [], + "script": "\tfrom time import sleep\n\tsleep(0.25)\n\tself.focus()\n\t" + } + ], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "request_focus", + "pageScope": false, + "script": "\tsystem.util.invokeAsynchronous(self.set_focus())\n\t", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.input.text-field" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/2f718abedae377af5f5ce883b1edd8807e32151b2f11bd82846794df6cbc3fbc b/.resources/2f718abedae377af5f5ce883b1edd8807e32151b2f11bd82846794df6cbc3fbc new file mode 100644 index 0000000..7097455 --- /dev/null +++ b/.resources/2f718abedae377af5f5ce883b1edd8807e32151b2f11bd82846794df6cbc3fbc @@ -0,0 +1,687 @@ +{ + "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": "LIFT_Symbol" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "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.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 5.5505752,8.3092441 H 12.962422 L 9.2349587,2.4863396 Z", + "fill": { + "opacity": "1" + }, + "id": "path5305", + "name": "path5305", + "stroke": { + "dasharray": "none", + "linecap": "butt", + "miterlimit": "4", + "opacity": "1", + "paint": "#000000", + "width": "0.656167" + }, + "type": "path" + }, + { + "d": "M 5.5653282,10.042435 H 12.977175 L 9.2497117,15.865339 Z", + "fill": { + "opacity": "1" + }, + "id": "path5305-1", + "name": "path5305-1", + "stroke": { + "dasharray": "none", + "linecap": "butt", + "miterlimit": "4", + "opacity": "1", + "paint": "#000000", + "width": "0.656167" + }, + "type": "path" + } + ], + "id": "g5310", + "name": "g5310", + "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/.resources/2f96e52786e432090b8f7ca46b316a1448715f38c7e8661b82ee501fd58a6617 b/.resources/2f96e52786e432090b8f7ca46b316a1448715f38c7e8661b82ee501fd58a6617 new file mode 100644 index 0000000..4d055fc --- /dev/null +++ b/.resources/2f96e52786e432090b8f7ca46b316a1448715f38c7e8661b82ee501fd58a6617 @@ -0,0 +1,127 @@ +{ + "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" + }, + "/Windows/Statistics": { + "title": "", + "viewPath": "" + }, + "/Windows/Status": { + "title": "", + "viewPath": "" + }, + "/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/.resources/305f65f7f346d9c6d9e49f4513e9eee84140ec1b6e66fbfb3a9afc2a8304b103 b/.resources/305f65f7f346d9c6d9e49f4513e9eee84140ec1b6e66fbfb3a9afc2a8304b103 new file mode 100644 index 0000000..8cca7fc --- /dev/null +++ b/.resources/305f65f7f346d9c6d9e49f4513e9eee84140ec1b6e66fbfb3a9afc2a8304b103 @@ -0,0 +1,2552 @@ +{ + "custom": { + "bucket": "maps.c4.rme.logistics.a2z.com-441697794360", + "current_flow_view": "AFE 1 MINISORTER", + "current_stage": "prod", + "enabled_whids": [ + "ABQ1", + "AGS1", + "AMA1", + "AUS2", + "BDL4", + "BOS3", + "DEN4", + "DEN8", + "DET3", + "DET6", + "ELP1", + "FAR1", + "FAT2", + "FOE1", + "FSD1", + "FTW5", + "FWA6", + "GEG2", + "HOU6", + "HOU8", + "HSV1", + "ICT2", + "IGQ1", + "IGQ2", + "ILG1", + "LFT1", + "LIT1", + "LIT2", + "LUK2", + "MLI1", + "MQY1", + "MTN1", + "OKC2", + "ORD5", + "ORF3", + "PAE2", + "RIC4", + "ROC1", + "SAN3", + "SAT3", + "SAT4", + "SAV4", + "SCK6", + "SMF6", + "STL3", + "SYR1", + "TEB4", + "TLH2", + "TPA4", + "TYS1", + "YEG2", + "YOO1", + "YOW3" + ], + "flow_view": "AFE 1 MINISORTER", + "flow_view_copy_operation": null, + "flow_view_copy_option": "both", + "flow_view_copy_tooltip": "", + "flow_view_destination": "AFE 1 MINISORTER", + "flow_view_destination_options": [ + { + "label": "AFE 1 MINISORTER", + "value": "AFE 1 MINISORTER" + }, + { + "label": "AFE TRAY SORTERS", + "value": "AFE TRAY SORTERS" + }, + { + "label": "AR FIELD", + "value": "AR FIELD" + }, + { + "label": "EMPTY TOTE LANES", + "value": "EMPTY TOTE LANES" + }, + { + "label": "INBOUND SORTER", + "value": "INBOUND SORTER" + }, + { + "label": "OUTBOUND", + "value": "OUTBOUND" + }, + { + "label": "PACK", + "value": "PACK" + }, + { + "label": "RSP LEVEL 2", + "value": "RSP LEVEL 2" + }, + { + "label": "RSP LEVEL 3", + "value": "RSP LEVEL 3" + }, + { + "label": "RSP LEVEL 4", + "value": "RSP LEVEL 4" + }, + { + "label": "RSP LEVEL 5", + "value": "RSP LEVEL 5" + }, + { + "label": "SHIP SORTER", + "value": "SHIP SORTER" + }, + { + "label": "SMARTPAC", + "value": "SMARTPAC" + }, + { + "label": "TOTE SORTER", + "value": "TOTE SORTER" + }, + { + "label": "TRANSHIP SORTER", + "value": "TRANSHIP SORTER" + }, + { + "label": "WASTE", + "value": "WASTE" + } + ], + "flow_view_edit_mode": { + "active": false, + "admin_enabled": true, + "enabled": true, + "reviewer_enabled": true, + "sadmin_enabled": false + }, + "flow_view_file_suffix": "_FlowView.svg", + "flow_view_options": [ + { + "label": "AFE 1 MINISORTER", + "value": "AFE 1 MINISORTER" + }, + { + "label": "AFE TRAY SORTERS", + "value": "AFE TRAY SORTERS" + }, + { + "label": "AR FIELD", + "value": "AR FIELD" + }, + { + "label": "EMPTY TOTE LANES", + "value": "EMPTY TOTE LANES" + }, + { + "label": "INBOUND SORTER", + "value": "INBOUND SORTER" + }, + { + "label": "OUTBOUND", + "value": "OUTBOUND" + }, + { + "label": "PACK", + "value": "PACK" + }, + { + "label": "RSP LEVEL 2", + "value": "RSP LEVEL 2" + }, + { + "label": "RSP LEVEL 3", + "value": "RSP LEVEL 3" + }, + { + "label": "RSP LEVEL 4", + "value": "RSP LEVEL 4" + }, + { + "label": "RSP LEVEL 5", + "value": "RSP LEVEL 5" + }, + { + "label": "SHIP SORTER", + "value": "SHIP SORTER" + }, + { + "label": "SMARTPAC", + "value": "SMARTPAC" + }, + { + "label": "TOTE SORTER", + "value": "TOTE SORTER" + }, + { + "label": "TRANSHIP SORTER", + "value": "TRANSHIP SORTER" + }, + { + "label": "WASTE", + "value": "WASTE" + } + ], + "flow_view_source": "AFE 1 MINISORTER", + "flow_view_source_options": [ + { + "label": "AFE 1 MINISORTER", + "value": "AFE 1 MINISORTER" + }, + { + "label": "AFE TRAY SORTERS", + "value": "AFE TRAY SORTERS" + }, + { + "label": "AR FIELD", + "value": "AR FIELD" + }, + { + "label": "EMPTY TOTE LANES", + "value": "EMPTY TOTE LANES" + }, + { + "label": "INBOUND SORTER", + "value": "INBOUND SORTER" + }, + { + "label": "OUTBOUND", + "value": "OUTBOUND" + }, + { + "label": "PACK", + "value": "PACK" + }, + { + "label": "RSP LEVEL 2", + "value": "RSP LEVEL 2" + }, + { + "label": "RSP LEVEL 3", + "value": "RSP LEVEL 3" + }, + { + "label": "RSP LEVEL 4", + "value": "RSP LEVEL 4" + }, + { + "label": "RSP LEVEL 5", + "value": "RSP LEVEL 5" + }, + { + "label": "SHIP SORTER", + "value": "SHIP SORTER" + }, + { + "label": "SMARTPAC", + "value": "SMARTPAC" + }, + { + "label": "TOTE SORTER", + "value": "TOTE SORTER" + }, + { + "label": "TRANSHIP SORTER", + "value": "TRANSHIP SORTER" + }, + { + "label": "WASTE", + "value": "WASTE" + } + ], + "instances_file_prefix": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/", + "instances_file_suffix": ".json", + "instances_files": [ + { + "ETag": "\"d5ab88e5aac79f0270c4df38fc76211b\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/AFE 1 MINISORTER.json", + "LastModified": "2023-07-06 19:13:31", + "Size": 169491, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"2d52b3ac56baf2c347b3cc5a83b3ba41\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/AFE TRAY SORTERS.json", + "LastModified": "2023-07-06 19:11:33", + "Size": 52706, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"aef77756bf27a4660051d2965d7238b4\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/AR FIELD.json", + "LastModified": "2023-07-08 01:54:18", + "Size": 459044, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"d4824a32702674453e14ea98e98a0392\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/EMPTY TOTE LANES.json", + "LastModified": "2023-07-06 19:08:48", + "Size": 30929, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"0dc3e31b34b442cc8a32611766ad829b\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/INBOUND SORTER.json", + "LastModified": "2023-07-07 14:56:13", + "Size": 85953, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"31678c5ee092b6cd6b066fcfe34d0637\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/OUTBOUND.json", + "LastModified": "2023-07-08 01:53:03", + "Size": 217082, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"897aed13d0ecb923a0642251375ee2e4\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/PACK.json", + "LastModified": "2023-07-07 14:51:27", + "Size": 96022, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"6b66dcbf14174ef5cb4488beb9c6b95d\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/RSP LEVEL 2.json", + "LastModified": "2023-07-07 14:46:03", + "Size": 38208, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"03e388834bcb2960fd20a81ba93be712\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/RSP LEVEL 3.json", + "LastModified": "2023-07-07 14:46:21", + "Size": 38439, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"96b1d70d6b14e9f9a03cbf1fde7f3258\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/RSP LEVEL 4.json", + "LastModified": "2023-07-07 14:46:34", + "Size": 38333, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"6c8b4a21227a76151bfca40c25abc186\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/RSP LEVEL 5.json", + "LastModified": "2023-07-07 14:46:46", + "Size": 38273, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"f2c10f54de8dbc30179f8cef737825ec\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/SHIP SORTER.json", + "LastModified": "2023-07-06 19:10:26", + "Size": 25374, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"99d01fcc3f3c62e32c5a4c98b320b91f\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/SMARTPAC.json", + "LastModified": "2023-07-06 19:07:29", + "Size": 19099, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"7a117bc9cf00e644518b06981e736f52\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/TOTE SORTER.json", + "LastModified": "2023-07-07 14:41:36", + "Size": 82727, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"32c23ced5bb7a4ff7d0f166f85f006dd\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/TRANSHIP SORTER.json", + "LastModified": "2023-07-08 01:47:48", + "Size": 13327, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"f0e92545033d5f070cd8884c7a16dac1\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/WASTE.json", + "LastModified": "2023-07-08 01:47:36", + "Size": 7784, + "StorageClass": "STANDARD" + } + ], + "loading": false, + "migrate_enabled": false, + "selected_flow_view": "OUTBOUND", + "site_files": [ + { + "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/", + "LastModified": "2023-06-22 15:10:22", + "Size": 0, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"3b31b83ba6617e83ef2a98edcedf9d9d\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/AFE 1 MINISORTER_FlowView.svg", + "LastModified": "2023-07-06 19:13:31", + "Size": 319635, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"db37b5cb4a0a74b4a46e3c65f968fbbf\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/AFE TRAY SORTERS_FlowView.svg", + "LastModified": "2023-07-06 19:11:33", + "Size": 105788, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"cdd14f701d2256a26ecad94e7c118f30\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/AR FIELD_FlowView.svg", + "LastModified": "2023-07-08 01:54:18", + "Size": 448282, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"4086b694863b38489bd980a40a3d686e\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/EMPTY TOTE LANES_FlowView.svg", + "LastModified": "2023-07-06 19:08:47", + "Size": 47625, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"9974714836554c5aa21683db6d7190a8\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/INBOUND SORTER_FlowView.svg", + "LastModified": "2023-07-07 14:56:13", + "Size": 170813, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"e86f2757a16dce8aa9160b4508f06257\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/OUTBOUND_FlowView.svg", + "LastModified": "2023-07-08 01:53:03", + "Size": 410568, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"8f64bed5643c9db4f7c0a57d506fe819\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/PACK_FlowView.svg", + "LastModified": "2023-07-07 14:51:27", + "Size": 185917, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"f1e70ba02a7b9e66a6391b67fd4a9166\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/RSP LEVEL 2_FlowView.svg", + "LastModified": "2023-07-07 14:46:03", + "Size": 105170, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"35aa4d02852470107a6af6a5ca87e7d3\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/RSP LEVEL 3_FlowView.svg", + "LastModified": "2023-07-07 14:46:21", + "Size": 105126, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"f47a62e8f45dc6d322a242ef7a12612a\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/RSP LEVEL 4_FlowView.svg", + "LastModified": "2023-07-07 14:46:34", + "Size": 105122, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"496a0b6c937eef0bb3fd62a4e35b98da\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/RSP LEVEL 5_FlowView.svg", + "LastModified": "2023-07-07 14:46:46", + "Size": 105118, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"8f8b7b0fff1b9fb3c6f04b6a8a3ddc7e\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/SHIP SORTER_FlowView.svg", + "LastModified": "2023-07-06 19:10:26", + "Size": 67640, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"e8f87755974bd51d7e9b287daa1e9c57\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/SMARTPAC_FlowView.svg", + "LastModified": "2023-07-06 19:07:28", + "Size": 36300, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"2923edb101a98c30ad62429ac22d423c\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/TOTE SORTER_FlowView.svg", + "LastModified": "2023-07-07 14:41:36", + "Size": 167519, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"6ec75cac9a4da963f90fa05e765c67e5\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/TRANSHIP SORTER_FlowView.svg", + "LastModified": "2023-07-08 01:47:48", + "Size": 39505, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"62b9a05376699daab936fe799139435f\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/WASTE_FlowView.svg", + "LastModified": "2023-07-08 01:47:36", + "Size": 19002, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/", + "LastModified": "2023-06-22 15:10:28", + "Size": 0, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"d5ab88e5aac79f0270c4df38fc76211b\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/AFE 1 MINISORTER.json", + "LastModified": "2023-07-06 19:13:31", + "Size": 169491, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"2d52b3ac56baf2c347b3cc5a83b3ba41\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/AFE TRAY SORTERS.json", + "LastModified": "2023-07-06 19:11:33", + "Size": 52706, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"aef77756bf27a4660051d2965d7238b4\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/AR FIELD.json", + "LastModified": "2023-07-08 01:54:18", + "Size": 459044, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"d4824a32702674453e14ea98e98a0392\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/EMPTY TOTE LANES.json", + "LastModified": "2023-07-06 19:08:48", + "Size": 30929, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"0dc3e31b34b442cc8a32611766ad829b\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/INBOUND SORTER.json", + "LastModified": "2023-07-07 14:56:13", + "Size": 85953, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"31678c5ee092b6cd6b066fcfe34d0637\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/OUTBOUND.json", + "LastModified": "2023-07-08 01:53:03", + "Size": 217082, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"897aed13d0ecb923a0642251375ee2e4\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/PACK.json", + "LastModified": "2023-07-07 14:51:27", + "Size": 96022, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"6b66dcbf14174ef5cb4488beb9c6b95d\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/RSP LEVEL 2.json", + "LastModified": "2023-07-07 14:46:03", + "Size": 38208, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"03e388834bcb2960fd20a81ba93be712\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/RSP LEVEL 3.json", + "LastModified": "2023-07-07 14:46:21", + "Size": 38439, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"96b1d70d6b14e9f9a03cbf1fde7f3258\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/RSP LEVEL 4.json", + "LastModified": "2023-07-07 14:46:34", + "Size": 38333, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"6c8b4a21227a76151bfca40c25abc186\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/RSP LEVEL 5.json", + "LastModified": "2023-07-07 14:46:46", + "Size": 38273, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"f2c10f54de8dbc30179f8cef737825ec\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/SHIP SORTER.json", + "LastModified": "2023-07-06 19:10:26", + "Size": 25374, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"99d01fcc3f3c62e32c5a4c98b320b91f\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/SMARTPAC.json", + "LastModified": "2023-07-06 19:07:29", + "Size": 19099, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"7a117bc9cf00e644518b06981e736f52\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/TOTE SORTER.json", + "LastModified": "2023-07-07 14:41:36", + "Size": 82727, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"32c23ced5bb7a4ff7d0f166f85f006dd\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/TRANSHIP SORTER.json", + "LastModified": "2023-07-08 01:47:48", + "Size": 13327, + "StorageClass": "STANDARD" + }, + { + "ETag": "\"f0e92545033d5f070cd8884c7a16dac1\"", + "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/WASTE.json", + "LastModified": "2023-07-08 01:47:36", + "Size": 7784, + "StorageClass": "STANDARD" + } + ], + "site_folder": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/", + "site_folder_destination": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/", + "site_folder_source": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/", + "stage_destination": "prod", + "stage_map": { + "alpha": { + "endpoint": "https://alpha.rmesdflowview.c4.rme.amazon.dev/", + "region": "us-west-2" + }, + "beta": { + "endpoint": "https://beta.rmesdflowview.c4.rme.amazon.dev/", + "region": "us-east-1" + }, + "prod": { + "endpoint": "https://rmesdflowview.c4.rme.amazon.dev/", + "region": "us-east-2" + } + }, + "stage_options": [ + { + "label": "Prod", + "value": "prod" + }, + { + "label": "Beta", + "value": "beta" + }, + { + "label": "Alpha", + "value": "alpha" + } + ], + "stage_source": "prod", + "title_text": "FlowView Management", + "whid": "YEG2", + "whid_destination": "YEG2", + "whid_destination_options": [ + { + "label": "ABQ1", + "value": "ABQ1" + }, + { + "label": "AGS1", + "value": "AGS1" + }, + { + "label": "AMA1", + "value": "AMA1" + }, + { + "label": "AUS2", + "value": "AUS2" + }, + { + "label": "BDL4", + "value": "BDL4" + }, + { + "label": "BOS3", + "value": "BOS3" + }, + { + "label": "DEN4", + "value": "DEN4" + }, + { + "label": "DEN8", + "value": "DEN8" + }, + { + "label": "DET3", + "value": "DET3" + }, + { + "label": "DET6", + "value": "DET6" + }, + { + "label": "ELP1", + "value": "ELP1" + }, + { + "label": "FAR1", + "value": "FAR1" + }, + { + "label": "FAT2", + "value": "FAT2" + }, + { + "label": "FOE1", + "value": "FOE1" + }, + { + "label": "FSD1", + "value": "FSD1" + }, + { + "label": "FTW5", + "value": "FTW5" + }, + { + "label": "FWA6", + "value": "FWA6" + }, + { + "label": "GEG2", + "value": "GEG2" + }, + { + "label": "HOU6", + "value": "HOU6" + }, + { + "label": "HOU8", + "value": "HOU8" + }, + { + "label": "HSV1", + "value": "HSV1" + }, + { + "label": "ICT2", + "value": "ICT2" + }, + { + "label": "IGQ1", + "value": "IGQ1" + }, + { + "label": "IGQ2", + "value": "IGQ2" + }, + { + "label": "ILG1", + "value": "ILG1" + }, + { + "label": "LFT1", + "value": "LFT1" + }, + { + "label": "LIT1", + "value": "LIT1" + }, + { + "label": "LIT2", + "value": "LIT2" + }, + { + "label": "LUK2", + "value": "LUK2" + }, + { + "label": "MLI1", + "value": "MLI1" + }, + { + "label": "MQY1", + "value": "MQY1" + }, + { + "label": "MTN1", + "value": "MTN1" + }, + { + "label": "OKC2", + "value": "OKC2" + }, + { + "label": "ORD5", + "value": "ORD5" + }, + { + "label": "ORF3", + "value": "ORF3" + }, + { + "label": "PAE2", + "value": "PAE2" + }, + { + "label": "RIC4", + "value": "RIC4" + }, + { + "label": "ROC1", + "value": "ROC1" + }, + { + "label": "SAN3", + "value": "SAN3" + }, + { + "label": "SAT3", + "value": "SAT3" + }, + { + "label": "SAT4", + "value": "SAT4" + }, + { + "label": "SAV4", + "value": "SAV4" + }, + { + "label": "SCK6", + "value": "SCK6" + }, + { + "label": "SMF6", + "value": "SMF6" + }, + { + "label": "STL3", + "value": "STL3" + }, + { + "label": "SYR1", + "value": "SYR1" + }, + { + "label": "TEB4", + "value": "TEB4" + }, + { + "label": "TLH2", + "value": "TLH2" + }, + { + "label": "TPA4", + "value": "TPA4" + }, + { + "label": "TYS1", + "value": "TYS1" + }, + { + "label": "YEG2", + "value": "YEG2" + }, + { + "label": "YOO1", + "value": "YOO1" + }, + { + "label": "YOW3", + "value": "YOW3" + } + ], + "whid_options": [ + { + "label": "ABQ1", + "value": "ABQ1" + }, + { + "label": "AGS1", + "value": "AGS1" + }, + { + "label": "AMA1", + "value": "AMA1" + }, + { + "label": "AUS2", + "value": "AUS2" + }, + { + "label": "BDL4", + "value": "BDL4" + }, + { + "label": "BOS3", + "value": "BOS3" + }, + { + "label": "DEN4", + "value": "DEN4" + }, + { + "label": "DEN8", + "value": "DEN8" + }, + { + "label": "DET3", + "value": "DET3" + }, + { + "label": "DET6", + "value": "DET6" + }, + { + "label": "ELP1", + "value": "ELP1" + }, + { + "label": "FAR1", + "value": "FAR1" + }, + { + "label": "FAT2", + "value": "FAT2" + }, + { + "label": "FOE1", + "value": "FOE1" + }, + { + "label": "FSD1", + "value": "FSD1" + }, + { + "label": "FTW5", + "value": "FTW5" + }, + { + "label": "FWA6", + "value": "FWA6" + }, + { + "label": "GEG2", + "value": "GEG2" + }, + { + "label": "HOU6", + "value": "HOU6" + }, + { + "label": "HOU8", + "value": "HOU8" + }, + { + "label": "HSV1", + "value": "HSV1" + }, + { + "label": "ICT2", + "value": "ICT2" + }, + { + "label": "IGQ1", + "value": "IGQ1" + }, + { + "label": "IGQ2", + "value": "IGQ2" + }, + { + "label": "ILG1", + "value": "ILG1" + }, + { + "label": "LFT1", + "value": "LFT1" + }, + { + "label": "LIT1", + "value": "LIT1" + }, + { + "label": "LIT2", + "value": "LIT2" + }, + { + "label": "LUK2", + "value": "LUK2" + }, + { + "label": "MLI1", + "value": "MLI1" + }, + { + "label": "MQY1", + "value": "MQY1" + }, + { + "label": "MTN1", + "value": "MTN1" + }, + { + "label": "OKC2", + "value": "OKC2" + }, + { + "label": "ORD5", + "value": "ORD5" + }, + { + "label": "ORF3", + "value": "ORF3" + }, + { + "label": "PAE2", + "value": "PAE2" + }, + { + "label": "RIC4", + "value": "RIC4" + }, + { + "label": "ROC1", + "value": "ROC1" + }, + { + "label": "SAN3", + "value": "SAN3" + }, + { + "label": "SAT3", + "value": "SAT3" + }, + { + "label": "SAT4", + "value": "SAT4" + }, + { + "label": "SAV4", + "value": "SAV4" + }, + { + "label": "SCK6", + "value": "SCK6" + }, + { + "label": "SMF6", + "value": "SMF6" + }, + { + "label": "STL3", + "value": "STL3" + }, + { + "label": "SYR1", + "value": "SYR1" + }, + { + "label": "TEB4", + "value": "TEB4" + }, + { + "label": "TLH2", + "value": "TLH2" + }, + { + "label": "TPA4", + "value": "TPA4" + }, + { + "label": "TYS1", + "value": "TYS1" + }, + { + "label": "YEG2", + "value": "YEG2" + }, + { + "label": "YOO1", + "value": "YOO1" + }, + { + "label": "YOW3", + "value": "YOW3" + } + ], + "whid_source": "YEG2", + "whid_source_options": [ + { + "label": "ABQ1", + "value": "ABQ1" + }, + { + "label": "AGS1", + "value": "AGS1" + }, + { + "label": "AMA1", + "value": "AMA1" + }, + { + "label": "AUS2", + "value": "AUS2" + }, + { + "label": "BDL4", + "value": "BDL4" + }, + { + "label": "BOS3", + "value": "BOS3" + }, + { + "label": "DEN4", + "value": "DEN4" + }, + { + "label": "DEN8", + "value": "DEN8" + }, + { + "label": "DET3", + "value": "DET3" + }, + { + "label": "DET6", + "value": "DET6" + }, + { + "label": "ELP1", + "value": "ELP1" + }, + { + "label": "FAR1", + "value": "FAR1" + }, + { + "label": "FAT2", + "value": "FAT2" + }, + { + "label": "FOE1", + "value": "FOE1" + }, + { + "label": "FSD1", + "value": "FSD1" + }, + { + "label": "FTW5", + "value": "FTW5" + }, + { + "label": "FWA6", + "value": "FWA6" + }, + { + "label": "GEG2", + "value": "GEG2" + }, + { + "label": "HOU6", + "value": "HOU6" + }, + { + "label": "HOU8", + "value": "HOU8" + }, + { + "label": "HSV1", + "value": "HSV1" + }, + { + "label": "ICT2", + "value": "ICT2" + }, + { + "label": "IGQ1", + "value": "IGQ1" + }, + { + "label": "IGQ2", + "value": "IGQ2" + }, + { + "label": "ILG1", + "value": "ILG1" + }, + { + "label": "LFT1", + "value": "LFT1" + }, + { + "label": "LIT1", + "value": "LIT1" + }, + { + "label": "LIT2", + "value": "LIT2" + }, + { + "label": "LUK2", + "value": "LUK2" + }, + { + "label": "MLI1", + "value": "MLI1" + }, + { + "label": "MQY1", + "value": "MQY1" + }, + { + "label": "MTN1", + "value": "MTN1" + }, + { + "label": "OKC2", + "value": "OKC2" + }, + { + "label": "ORD5", + "value": "ORD5" + }, + { + "label": "ORF3", + "value": "ORF3" + }, + { + "label": "PAE2", + "value": "PAE2" + }, + { + "label": "RIC4", + "value": "RIC4" + }, + { + "label": "ROC1", + "value": "ROC1" + }, + { + "label": "SAN3", + "value": "SAN3" + }, + { + "label": "SAT3", + "value": "SAT3" + }, + { + "label": "SAT4", + "value": "SAT4" + }, + { + "label": "SAV4", + "value": "SAV4" + }, + { + "label": "SCK6", + "value": "SCK6" + }, + { + "label": "SMF6", + "value": "SMF6" + }, + { + "label": "STL3", + "value": "STL3" + }, + { + "label": "SYR1", + "value": "SYR1" + }, + { + "label": "TEB4", + "value": "TEB4" + }, + { + "label": "TLH2", + "value": "TLH2" + }, + { + "label": "TPA4", + "value": "TPA4" + }, + { + "label": "TYS1", + "value": "TYS1" + }, + { + "label": "YEG2", + "value": "YEG2" + }, + { + "label": "YOO1", + "value": "YOO1" + }, + { + "label": "YOW3", + "value": "YOW3" + } + ] + }, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\t# initialize form via message handler\n\tsystem.perspective.sendMessage(\u0027request_initialize_form\u0027, scope\u003d\u0027view\u0027)\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": { + "selected_flow_view": "OUTBOUND", + "selected_site": "MTN1", + "selected_stage": "prod" + }, + "propConfig": { + "custom.bucket": { + "binding": { + "config": { + "path": "session.custom.flow_view_config.site_config.s3.bucket_name" + }, + "type": "property" + }, + "persistent": true + }, + "custom.current_flow_view": { + "binding": { + "config": { + "path": "session.custom.flow_view_config.site_config.selected_flow_view" + }, + "type": "property" + }, + "persistent": true + }, + "custom.current_stage": { + "binding": { + "config": { + "path": "session.custom.flow_view_config.stage_config.stage" + }, + "type": "property" + }, + "persistent": true + }, + "custom.enabled_whids": { + "binding": { + "config": { + "path": "session.custom.flow_view_config.site_config.enabled_whids" + }, + "type": "property" + }, + "persistent": true + }, + "custom.flow_view": { + "binding": { + "config": { + "path": "session.custom.flow_view_config.site_config.selected_flow_view" + }, + "type": "property" + }, + "persistent": true + }, + "custom.flow_view_copy_operation": { + "binding": { + "config": { + "expression": "if(isNull({view.custom.stage_source})||!len({view.custom.stage_source})\r\n\t||isNull({view.custom.stage_destination})||!len({view.custom.stage_destination})\r\n//\t||{view.custom.stage_source}\u003d{view.custom.stage_destination}\r\n\t||({view.custom.stage_source}\u003d{view.custom.stage_destination}\r\n\t\t\u0026\u0026{view.custom.whid_source}\u003d{view.custom.whid_destination}\r\n\t\t\u0026\u0026{view.custom.flow_view_source}\u003d{view.custom.flow_view_destination})\r\n\t,null,\r\n\tif({view.custom.whid_source}\u003d\u0027ALL\u0027,\u0027migrate_stages\u0027,\r\n\tif({view.custom.whid_source}\u003d{view.custom.whid_destination}\r\n\t\t\u0026\u0026{view.custom.flow_view_source}\u003d\u0027ALL\u0027,\u0027migrate_stages\u0027,\r\n\tif({view.custom.flow_view_source}\u003d\u0027ALL\u0027,\u0027migrate_sites\u0027,\r\n\t\u0027migrate_flowviews\u0027))))" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.flow_view_copy_option": { + "persistent": true + }, + "custom.flow_view_copy_tooltip": { + "binding": { + "config": { + "expression": "{view.custom.stage_source}+{view.custom.stage_destination}\r\n+{view.custom.whid_source}+{view.custom.whid_destination}\r\n+{view.custom.flow_view_source}+{view.custom.flow_view_destination}\r\n+{view.custom.flow_view_copy_operation}+{view.custom.flow_view_copy_option}" + }, + "transforms": [ + { + "code": "\toperation \u003d self.custom.flow_view_copy_operation\n\tif not operation:\n\t\treturn \u0027\u0027\n\tsrc_stage \u003d self.custom.stage_source\n\tdest_stage \u003d self.custom.stage_destination\n\tsrc_whid \u003d self.custom.whid_source\n\tdest_whid \u003d self.custom.whid_destination\n\tsrc_flowview \u003d self.custom.flow_view_source\n\tdest_flowview \u003d self.custom.flow_view_destination\n\tcopy_option \u003d self.custom.flow_view_copy_option\n\tmsg \u003d \u0027\u0027\n\tif operation \u003d\u003d \u0027migrate_stages\u0027:\n\t\tmsg \u003d (\u0027Migrate all flow view files for whid: %s \\n\u0027\n\t\t\t\u0027From %s stage to %s stage? \\n\u0027\n\t\t\t\u0027This operation may take several minutes\u0027) % (\n\t\t\tsrc_whid, src_stage, dest_stage)\n\telif operation \u003d\u003d \u0027migrate_sites\u0027:\n\t\tmsg \u003d (\u0027Migrate all flow view files for whid: %s to whid: %s \\n\u0027\n\t\t\t\u0027From %s stage to %s stage? \\n\u0027\n\t\t\t\u0027This operation may take several minutes\u0027) % (\n\t\t\tsrc_whid, dest_whid, src_stage, dest_stage)\n\telif operation \u003d\u003d \u0027migrate_flowviews\u0027:\n\t\tif copy_option \u003d\u003d \u0027both\u0027:\n\t\t\tcopy_prompt \u003d \u0027both svg image and config json files\u0027\n\t\telif copy_option \u003d\u003d \u0027svg\u0027:\n\t\t\tcopy_prompt \u003d \u0027svg image file\u0027\n\t\telse:\n\t\t\tcopy_prompt \u003d \u0027config json file\u0027\n\t\tmsg \u003d (\u0027Copy %s for flowview: %s to flowview: %s \\n\u0027\n\t\t\t\u0027From whid: %s to whid: %s \\n\u0027\n\t\t\t\u0027From %s stage to %s stage?\u0027) % (\n\t\t\tcopy_prompt, src_flowview, dest_flowview, \n\t\t\tsrc_whid, dest_whid, src_stage, dest_stage)\n\treturn msg", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "custom.flow_view_destination": { + "persistent": true + }, + "custom.flow_view_destination_options": { + "binding": { + "config": { + "expression": "{view.custom.bucket}+{view.custom.site_folder_destination}" + }, + "transforms": [ + { + "code": "\tfrom s3 import S3API\n\tbucket \u003d self.custom.bucket\n\tprefix \u003d self.custom.site_folder_destination\n\tstage \u003d self.custom.current_stage\n\tusername \u003d self.session.props.auth.user.userName\n\t# DEVNOTE 2023-04-21: force API call to prod\n#\ts3m \u003d S3API(stage, username)\n\t# fetch all files in site folder\n\ts3m \u003d S3API(\u0027prod\u0027, username)\n\tsite_files \u003d s3m.list_objects(prefix\u003dprefix, bucket\u003dbucket)\n\t# parse out flow-view files from the site files\n\tsuffix \u003d self.custom.flow_view_file_suffix\n\tflow_view_files \u003d [x for x in site_files if x[\u0027Key\u0027].startswith(prefix) \n\t\t\t\t\t\tand x[\u0027Key\u0027].endswith(suffix)]\n\t# build-out options from flow-view files, prepending with \u0027ALL\u0027 if user is sadmin\n\tif self.custom.flow_view_edit_mode.sadmin_enabled:\n\t\toptions \u003d [{\u0027value\u0027: \u0027ALL\u0027, \u0027label\u0027: \u0027ALL\u0027}]\n\telse:\n\t\toptions \u003d []\n\toptions.extend([{\u0027value\u0027: x[\u0027Key\u0027].replace(prefix,\u0027\u0027).replace(suffix,\u0027\u0027), \n\t\t\t\u0027label\u0027: x[\u0027Key\u0027].replace(prefix,\u0027\u0027).replace(suffix,\u0027\u0027)} \n\t\t\tfor x in flow_view_files])\n\treturn options", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "custom.flow_view_edit_mode": { + "binding": { + "config": { + "path": "session.custom.flow_view_config.edit_mode" + }, + "type": "property" + }, + "persistent": true + }, + "custom.flow_view_file_suffix": { + "binding": { + "config": { + "path": "session.custom.flow_view_config.site_config.s3.flow_view_file_suffix" + }, + "type": "property" + }, + "persistent": true + }, + "custom.flow_view_files": { + "binding": { + "config": { + "path": "view.custom.site_files" + }, + "transforms": [ + { + "code": "\tprefix \u003d self.custom.site_folder\n\tsuffix \u003d self.custom.flow_view_file_suffix\n\treturn [x for x in value \n\t\tif x.Key.startswith(prefix) and x.Key.endswith(suffix)]", + "type": "script" + } + ], + "type": "property" + } + }, + "custom.flow_view_options": { + "binding": { + "config": { + "path": "view.custom.flow_view_files" + }, + "transforms": [ + { + "code": "\tprefix \u003d self.custom.site_folder\n\tsuffix \u003d self.custom.flow_view_file_suffix\n\tif self.custom.flow_view_edit_mode.sadmin_enabled:\n\t\toptions \u003d [{\u0027value\u0027: \u0027ALL\u0027, \u0027label\u0027: \u0027ALL\u0027}]\n\telse:\n\t\toptions \u003d []\n\toptions.extend([{\u0027value\u0027: x.Key.replace(prefix,\u0027\u0027).replace(suffix,\u0027\u0027), \n\t\t\t\u0027label\u0027: x.Key.replace(prefix,\u0027\u0027).replace(suffix,\u0027\u0027)} \n\t\t\tfor x in value])\n\treturn options", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.flow_view_source": { + "persistent": true + }, + "custom.flow_view_source_options": { + "binding": { + "config": { + "expression": "{view.custom.bucket}+{view.custom.site_folder_source}" + }, + "transforms": [ + { + "code": "\tfrom s3 import S3API\n\tbucket \u003d self.custom.bucket\n\tprefix \u003d self.custom.site_folder_source\n\tstage \u003d self.custom.current_stage\n\tusername \u003d self.session.props.auth.user.userName\n\t# DEVNOTE 2023-04-21: force API call to prod\n#\ts3m \u003d S3API(stage, username)\n\t# fetch all files in site folder\n\ts3m \u003d S3API(\u0027prod\u0027, username)\n\tsite_files \u003d s3m.list_objects(prefix\u003dprefix, bucket\u003dbucket)\n\t# parse out flow-view files from the site files\n\tsuffix \u003d self.custom.flow_view_file_suffix\n\tflow_view_files \u003d [x for x in site_files if x[\u0027Key\u0027].startswith(prefix) \n\t\t\t\t\t\tand x[\u0027Key\u0027].endswith(suffix)]\n\t# build-out options from flow-view files, prepending with \u0027ALL\u0027 if user is sadmin\n\tif self.custom.flow_view_edit_mode.sadmin_enabled:\n\t\toptions \u003d [{\u0027value\u0027: \u0027ALL\u0027, \u0027label\u0027: \u0027ALL\u0027}]\n\telse:\n\t\toptions \u003d []\n\toptions.extend([{\u0027value\u0027: x[\u0027Key\u0027].replace(prefix,\u0027\u0027).replace(suffix,\u0027\u0027), \n\t\t\t\u0027label\u0027: x[\u0027Key\u0027].replace(prefix,\u0027\u0027).replace(suffix,\u0027\u0027)} \n\t\t\tfor x in flow_view_files])\n\treturn options", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "custom.instances_file_prefix": { + "binding": { + "config": { + "expression": "stringFormat(\u0027%sinstance_configs/\u0027,{view.custom.site_folder})" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.instances_file_suffix": { + "persistent": true + }, + "custom.instances_files": { + "binding": { + "config": { + "path": "view.custom.site_files" + }, + "transforms": [ + { + "code": "\tprefix \u003d self.custom.instances_file_prefix\n\tsuffix \u003d self.custom.instances_file_suffix\n\treturn [x for x in value \n\t\tif x.Key.startswith(prefix) and x.Key.endswith(suffix)]", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.loading": { + "persistent": true + }, + "custom.migrate_enabled": { + "binding": { + "config": { + "expression": "!isNull({view.custom.flow_view_copy_operation})\r\n\u0026\u0026\r\n({view.custom.flow_view_edit_mode.sadmin_enabled}\r\n||({view.custom.flow_view_edit_mode.admin_enabled}\r\n\t\u0026\u0026{view.custom.flow_view_copy_operation}\u003d\u0027migrate_flowviews\u0027)\r\n)" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.selected_flow_view": { + "persistent": true + }, + "custom.site_files": { + "binding": { + "config": { + "expression": "{view.custom.bucket}+{view.custom.site_folder}" + }, + "transforms": [ + { + "code": "\tfrom s3 import S3API\n\tbucket \u003d self.custom.bucket\n\tobj_key \u003d self.custom.site_folder\n\tstage \u003d self.custom.current_stage\n\tusername \u003d self.session.props.auth.user.userName\n\t# DEVNOTE 2023-04-21: force API call to prod\n#\ts3m \u003d S3API(stage, username)\n\ts3m \u003d S3API(\u0027prod\u0027, username)\n\treturn s3m.list_objects(prefix\u003dobj_key, bucket\u003dbucket)", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "custom.site_folder": { + "binding": { + "config": { + "path": "session.custom.flow_view_config.site_config.s3.site_obj_prefix" + }, + "type": "property" + }, + "persistent": true + }, + "custom.site_folder_destination": { + "binding": { + "config": { + "expression": "stringFormat(\u0027na-rme-scada-maps-hc/FlowViews-%s/%s/\u0027,\r\n\t{view.custom.stage_destination},{view.custom.whid_destination})" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.site_folder_source": { + "binding": { + "config": { + "expression": "stringFormat(\u0027na-rme-scada-maps-hc/FlowViews-%s/%s/\u0027,\r\n\t{view.custom.stage_source},{view.custom.whid_source})" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.stage_destination": { + "persistent": true + }, + "custom.stage_map": { + "binding": { + "config": { + "path": "session.custom.flow_view_config.stage_config.map" + }, + "type": "property" + }, + "persistent": true + }, + "custom.stage_options": { + "binding": { + "config": { + "path": "view.custom.stage_map" + }, + "transforms": [ + { + "code": "\treturn [{\u0027value\u0027: x, \u0027label\u0027: x.capitalize()} for x in value]", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.stage_source": { + "persistent": true + }, + "custom.title_text": { + "persistent": true + }, + "custom.whid": { + "binding": { + "config": { + "path": "session.custom.flow_view_config.site_config.whid" + }, + "type": "property" + }, + "persistent": true + }, + "custom.whid_destination": { + "persistent": true + }, + "custom.whid_destination_options": { + "binding": { + "config": { + "path": "view.custom.stage_destination" + }, + "transforms": [ + { + "code": "\tfrom s3 import S3API\n\tusername \u003d self.session.props.auth.user.userName\n\t# DEVNOTE 2023-04-21: force API call to prod\n#\ts3m \u003d S3API(api_stage\u003dvalue, username\u003dusername)\n\ts3m \u003d S3API(\u0027prod\u0027, username)\n\tbucket \u003d self.custom.bucket\n\treturn s3m.fetch_site_list_by_stage(bucket, value)\n\t", + "type": "script" + }, + { + "code": "\tif self.custom.flow_view_edit_mode.sadmin_enabled:\n\t\toptions \u003d [{\u0027value\u0027: \u0027ALL\u0027, \u0027label\u0027: \u0027ALL\u0027}]\n\telse:\n\t\toptions \u003d []\n\toptions.extend([{\u0027value\u0027: x, \u0027label\u0027: x} for x in value])\n\treturn options", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.whid_options": { + "binding": { + "config": { + "path": "view.custom.enabled_whids" + }, + "transforms": [ + { + "code": "\tif self.custom.flow_view_edit_mode.sadmin_enabled:\n\t\toptions \u003d [{\u0027value\u0027: \u0027ALL\u0027, \u0027label\u0027: \u0027ALL\u0027}]\n\telse:\n\t\toptions \u003d []\n\toptions.extend([{\u0027value\u0027: x, \u0027label\u0027: x} for x in value])\n\treturn options\n", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.whid_source": { + "persistent": true + }, + "custom.whid_source_options": { + "binding": { + "config": { + "path": "view.custom.stage_source" + }, + "transforms": [ + { + "code": "\tfrom s3 import S3API\n\tusername \u003d self.session.props.auth.user.userName\n\t# DEVNOTE 2023-04-21: force API call to prod\n#\ts3m \u003d S3API(api_stage\u003dvalue, username\u003dusername)\n\ts3m \u003d S3API(\u0027prod\u0027, username)\n\tbucket \u003d self.custom.bucket\n\treturn s3m.fetch_site_list_by_stage(bucket, value)\n\t", + "type": "script" + }, + { + "code": "\tif self.custom.flow_view_edit_mode.sadmin_enabled:\n\t\toptions \u003d [{\u0027value\u0027: \u0027ALL\u0027, \u0027label\u0027: \u0027ALL\u0027}]\n\telse:\n\t\toptions \u003d []\n\toptions.extend([{\u0027value\u0027: x, \u0027label\u0027: x} for x in value])\n\treturn options", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "params.selected_flow_view": { + "paramDirection": "input", + "persistent": true + }, + "params.selected_site": { + "paramDirection": "input", + "persistent": true + }, + "params.selected_stage": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 140, + "width": 900 + } + }, + "root": { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label Text/RightAlign_with_Padding", + "paddingLeft": "5px" + }, + "text": "Source Stage:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown", + "tooltip": { + "location": "bottom", + "style": { + "whiteSpace": "pre" + }, + "text": "Click here to select a different \nstage folder to manage" + } + }, + "position": { + "basis": "150px", + "shrink": 0 + }, + "propConfig": { + "props.options": { + "binding": { + "config": { + "path": "view.custom.stage_options" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.custom.stage_source" + }, + "type": "property" + } + } + }, + "props": { + "search": { + "searchParam": "ou" + }, + "style": { + "margin": "2px", + "marginRight": "5px" + } + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "FlexContainer Source" + }, + "position": { + "basis": "50%", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label Text/RightAlign_with_Padding", + "paddingLeft": "5px" + }, + "text": "Destination Stage:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown", + "tooltip": { + "location": "bottom", + "style": { + "whiteSpace": "pre" + }, + "text": "Click here to select a different \nstage folder to manage" + } + }, + "position": { + "basis": "150px", + "shrink": 0 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "{view.custom.flow_view_edit_mode.admin_enabled}\r\n||{view.custom.flow_view_edit_mode.sadmin_enabled}" + }, + "type": "expr" + } + }, + "props.options": { + "binding": { + "config": { + "path": "view.custom.stage_options" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.custom.stage_destination" + }, + "type": "property" + } + } + }, + "props": { + "search": { + "searchParam": "ou" + }, + "style": { + "margin": "2px", + "marginRight": "5px" + } + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "FlexContainer Destination" + }, + "position": { + "basis": "50%", + "shrink": 0 + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer Stages" + }, + "position": { + "basis": "30px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label Text/RightAlign_with_Padding", + "paddingLeft": "5px" + }, + "text": "Source WHID:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown", + "tooltip": { + "location": "bottom", + "style": { + "whiteSpace": "pre" + }, + "text": "Click here to select a different \nstage folder to manage" + } + }, + "position": { + "basis": "150px", + "shrink": 0 + }, + "propConfig": { + "props.options": { + "binding": { + "config": { + "path": "view.custom.whid_source_options" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.custom.whid_source" + }, + "type": "property" + }, + "onChange": { + "enabled": null, + "script": "\tif not missedEvents and origin \u003d\u003d \u0027Browser\u0027:\n\t\tif currentValue.value:\n\t\t\tself.view.custom.whid_destination \u003d currentValue.value\n\t\t" + } + } + }, + "props": { + "search": { + "searchParam": "smf" + }, + "style": { + "margin": "2px", + "marginRight": "5px" + } + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "FlexContainer Source" + }, + "position": { + "basis": "50%", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label Text/RightAlign_with_Padding", + "paddingLeft": "5px" + }, + "text": "Destination WHID:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown", + "tooltip": { + "location": "bottom", + "style": { + "whiteSpace": "pre" + }, + "text": "Click here to select a different \nstage folder to manage" + } + }, + "position": { + "basis": "150px", + "shrink": 0 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "path": "view.custom.flow_view_edit_mode.sadmin_enabled" + }, + "type": "property" + } + }, + "props.options": { + "binding": { + "config": { + "path": "view.custom.whid_destination_options" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.custom.whid_destination" + }, + "type": "property" + } + } + }, + "props": { + "search": { + "searchParam": "sm" + }, + "style": { + "margin": "2px", + "marginRight": "5px" + } + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "FlexContainer Destination" + }, + "position": { + "basis": "50%", + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "!isNull({view.custom.whid_source})\r\n\u0026\u0026len({view.custom.whid_source})\r\n\u0026\u0026{view.custom.whid_source}!\u003d\u0027ALL\u0027" + }, + "type": "expr" + } + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer Whids" + }, + "position": { + "basis": "30px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label Text/RightAlign_with_Padding", + "paddingLeft": "5px" + }, + "text": "Source Flowview:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown", + "tooltip": { + "location": "bottom", + "style": { + "whiteSpace": "pre" + }, + "text": "Click here to select a different \nstage folder to manage" + } + }, + "position": { + "basis": "250px", + "shrink": 0 + }, + "propConfig": { + "props.options": { + "binding": { + "config": { + "path": "view.custom.flow_view_source_options" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.custom.flow_view_source" + }, + "type": "property" + }, + "onChange": { + "enabled": null, + "script": "\tif not missedEvents and origin \u003d\u003d \u0027Browser\u0027:\n\t\tif currentValue.value:\n\t\t\tself.view.custom.flow_view_destination \u003d currentValue.value\n\t" + } + } + }, + "props": { + "search": { + "searchParam": "ou" + }, + "style": { + "margin": "2px", + "marginRight": "5px" + } + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "FlexContainer Source" + }, + "position": { + "basis": "50%", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label Text/RightAlign_with_Padding", + "paddingLeft": "5px" + }, + "text": "Destination Flowview:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown", + "tooltip": { + "location": "bottom", + "style": { + "whiteSpace": "pre" + }, + "text": "Click here to select a different \nstage folder to manage" + } + }, + "position": { + "basis": "250px", + "shrink": 0 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "path": "view.custom.flow_view_edit_mode.sadmin_enabled" + }, + "type": "property" + } + }, + "props.options": { + "binding": { + "config": { + "path": "view.custom.flow_view_destination_options" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.custom.flow_view_destination" + }, + "type": "property" + } + } + }, + "props": { + "search": { + "searchParam": "ou" + }, + "style": { + "margin": "2px", + "marginRight": "5px" + } + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "FlexContainer Destination" + }, + "position": { + "basis": "50%", + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "!isNull({view.custom.flow_view_source})\r\n\u0026\u0026len({view.custom.flow_view_source})\r\n\u0026\u0026{view.custom.flow_view_source}!\u003d\u0027ALL\u0027" + }, + "type": "expr" + } + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer Flowviews" + }, + "position": { + "basis": "30px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label Text/RightAlign_with_Padding", + "paddingLeft": "5px" + }, + "text": "Copy:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "RadioGroup" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "!isNull({view.custom.flow_view_source})\r\n\u0026\u0026len({view.custom.flow_view_source})" + }, + "type": "expr" + } + }, + "props.enabled": { + "binding": { + "config": { + "expression": "{view.custom.flow_view_edit_mode.admin_enabled}\r\n||{view.custom.flow_view_edit_mode.sadmin_enabled}" + }, + "type": "expr" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.custom.flow_view_copy_option" + }, + "type": "property" + } + } + }, + "props": { + "radioStyle": { + "fontSize": "12px" + }, + "radios": [ + { + "selected": true, + "text": "Both Files", + "value": "both" + }, + { + "selected": false, + "text": "SVG only", + "value": "svg" + }, + { + "selected": false, + "text": "JSON only", + "value": "json" + } + ] + }, + "type": "ia.input.radio-group" + } + ], + "meta": { + "name": "FlexContainer Radios" + }, + "position": { + "basis": "50%", + "shrink": 0 + }, + "props": { + "justify": "center" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.sendMessage(\u0027request_initialize_form\u0027, scope\u003d\u0027view\u0027)\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear Form" + }, + "position": { + "shrink": 0 + }, + "props": { + "image": { + "icon": { + "path": "material/refresh" + } + }, + "primary": false, + "style": { + "margin": "2px", + "padding": "4px" + }, + "text": "Reset Form" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t# call-up the confirm dialog to allow the user to decide if they\n\t# really want to copy/migrate the flow-view files in S3\n\tself.show_confirm_dialog({})" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Copy Files", + "tooltip": { + "enabled": true, + "location": "bottom", + "style": { + "whiteSpace": "pre" + } + } + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "path": "view.custom.flow_view_copy_tooltip" + }, + "type": "property" + } + }, + "props.enabled": { + "binding": { + "config": { + "path": "view.custom.migrate_enabled" + }, + "type": "property" + } + } + }, + "props": { + "image": { + "height": 20, + "icon": { + "path": "material/file_copy" + }, + "width": 20 + }, + "style": { + "margin": "2px", + "padding": "4px" + }, + "text": "Copy Files" + }, + "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\"Flow View Files Copied\", \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\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\"Flow View Files NOT Copied\", \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\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\"Flow View Files Copy 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\t{}\n\t)\n\t\t\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.custom.loading \u003d False\n\t\t" + }, + { + "name": "copy_operation", + "params": [], + "script": "\t\"\"\"\n\t\tCall s3.S3API().migrate_*() method using user selections\n\t* \u003d [\u0027stages\u0027, \u0027sites\u0027, \u0027flowviews\u0027] depending on user selections\n\t\"\"\"\n\tfrom s3 import S3API\n\tfrom pprint import pformat\n\tfrom helper.helper import sanitize_tree\n\t\n\tstage \u003d self.session.custom.flow_view_config.stage_config.stage\n\tusername \u003d self.session.props.auth.user.userName\n\t# DEVNOTE 2023-04-21: force API call to prod\n#\ts3m \u003d S3API(stage, username)\n\ts3m \u003d S3API(\u0027prod\u0027, username)\n\t# grab local variables from view custom props\n\tsrc_stage \u003d self.view.custom.stage_source\n\tdest_stage \u003d self.view.custom.stage_destination\n\tsrc_whid \u003d self.view.custom.whid_source\n\tdest_whid \u003d self.view.custom.whid_destination\n\tsrc_flowview \u003d self.view.custom.flow_view_source\n\tdest_flowview \u003d self.view.custom.flow_view_destination\n\tcopy_option \u003d self.view.custom.flow_view_copy_option\n\toperation \u003d self.view.custom.flow_view_copy_operation\n\t# pack up params based on operation selected\n\tparams \u003d {}\n\tif operation \u003d\u003d \u0027migrate_stages\u0027:\n\t\t# Lambda expects None for whid param if migrating all stage folder contents\n\t\tif src_whid \u003d\u003d \u0027ALL\u0027:\n\t\t\tsrc_whid \u003d None\n\t\tparams \u003d {\u0027src_stage\u0027: src_stage, \u0027dest_stage\u0027: dest_stage, \u0027whid\u0027: src_whid}\n\telif operation \u003d\u003d \u0027migrate_sites\u0027:\n\t\tparams \u003d {\u0027src_stage\u0027: src_stage, \u0027dest_stage\u0027: dest_stage,\n\t\t\t\t\t\u0027src_whid\u0027: src_whid, \u0027dest_whid\u0027: dest_whid}\n\telif operation \u003d\u003d \u0027migrate_flowviews\u0027:\n\t\tparams \u003d {\u0027src_stage\u0027: src_stage, \u0027dest_stage\u0027: dest_stage,\n\t\t\t\t\t\u0027src_whid\u0027: src_whid, \u0027dest_whid\u0027: dest_whid,\n\t\t\t\t\t\u0027src_flowview\u0027: src_flowview, \u0027dest_flowview\u0027: dest_flowview,\n\t\t\t\t\t\u0027copy_option\u0027: copy_option}\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\tself.show_success_dialog(msg)\n\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.show_error_dialog(msg)\n\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\toperation \u003d self.view.custom.flow_view_copy_operation\n\tsrc_stage \u003d self.view.custom.stage_source\n\tdest_stage \u003d self.view.custom.stage_destination\n\tsrc_whid \u003d self.view.custom.whid_source\n\tdest_whid \u003d self.view.custom.whid_destination\n\tsrc_flowview \u003d self.view.custom.flow_view_source\n\tdest_flowview \u003d self.view.custom.flow_view_destination\n\tcopy_option \u003d self.view.custom.flow_view_copy_option\n\tmsg \u003d \u0027\u0027\n\tif operation \u003d\u003d \u0027migrate_stages\u0027:\n\t\tmsg \u003d (\u0027Migrate all flow view files for whid: %s \\n\u0027\n\t\t\t\u0027From %s stage to %s stage? \\n\u0027\n\t\t\t\u0027This operation may take several minutes\u0027) % (\n\t\t\tsrc_whid, src_stage, dest_stage)\n\telif operation \u003d\u003d \u0027migrate_sites\u0027:\n\t\tmsg \u003d (\u0027Migrate all flow view files for whid: %s to whid: %s \\n\u0027\n\t\t\t\u0027From %s stage to %s stage? \\n\u0027\n\t\t\t\u0027This operation may take several minutes\u0027) % (\n\t\t\tsrc_whid, dest_whid, src_stage, dest_stage)\n\telif operation \u003d\u003d \u0027migrate_flowviews\u0027:\n\t\tif copy_option \u003d\u003d \u0027both\u0027:\n\t\t\tcopy_prompt \u003d \u0027both svg image and config json files\u0027\n\t\telif copy_option \u003d\u003d \u0027svg\u0027:\n\t\t\tcopy_prompt \u003d \u0027svg image file\u0027\n\t\telse:\n\t\t\tcopy_prompt \u003d \u0027config json file\u0027\n\t\tmsg \u003d (\u0027Copy %s for flowview: %s to flowview: %s \\n\u0027\n\t\t\t\u0027From whid: %s to whid: %s \\n\u0027\n\t\t\t\u0027From %s stage to %s stage?\u0027) % (\n\t\t\tcopy_prompt, src_flowview, dest_flowview, \n\t\t\tsrc_whid, dest_whid, src_stage, dest_stage)\n\tpayload \u003d {}\t\t\n\tAlerts.showAlert(\n\t\t\"info\", \n\t\t\"Copy Flow View Files?\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"Continue\", \n\t\t\"Cancel\", \n\t\t\"file_copy\", \n\t\t\"\", \n\t\t\"right\", \n\t\t\"confirm_copy_operation\", \n\t\t\"closePopup\", \n\t\t\"closePopup\",\n\t\tpayload\n\t)\n\t\t\t" + } + ], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "confirm_copy_operation", + "pageScope": true, + "script": "\tsystem.perspective.closePopup(\u0027alertDialog\u0027)\n\t# call the copy_operation custom method\n\tself.copy_operation()\n\t\t", + "sessionScope": true, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer Buttons" + }, + "position": { + "basis": "50%", + "shrink": 0 + }, + "props": { + "justify": "center" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer Controls" + }, + "position": { + "shrink": 0 + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "scripts": { + "customMethods": [ + { + "name": "update_instance_position", + "params": [ + "payload\u003dNone" + ], + "script": "\t\"\"\"\n\t\tupdate instance position based on payload received\n\t:param payload: dict; payload of values to update from message handler\n\t\"\"\"\n\tfrom helper.helper import sanitize_tree\n\tpos_keys \u003d [\u0027top\u0027,\u0027left\u0027,\u0027width\u0027,\u0027height\u0027]\n\tif not isinstance(payload, dict):\n\t\tmsg \u003d \u0027payload to update_instance_position must be a dictionary object!\u0027\n\t\tsystem.perspective.print(msg)\n\t\tself.show_error_dialog(msg)\n\t\treturn\n\tbad_keys \u003d [k for k in payload.keys() if k not in pos_keys]\n\tif len(bad_keys):\n\t\tmsg \u003d (\u0027Invalid keys: %s found in payload, \u0027,\n\t\t\t\t\u0027cannot be applied to instance.position.\\nValid keys: %s\u0027) % (\n\t\t\t\tbad_keys, pos_keys)\n\t\tsystem.perpsective.print(msg)\n\t\tself.show_error_dialog(msg)\n\t\treturn\n\tinstance \u003d sanitize_tree(self.view.params.instance)\n\tinstance.update(payload)\n\tself.view.params.instance \u003d instance\n\t" + }, + { + "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": "update_instance_config", + "params": [], + "script": "\t\"\"\"\n\t\tUpdate the instance config on the parent container\n\t\"\"\"\n\tfrom helper.helper import sanitize_tree\n\tfrom pprint import pformat" + }, + { + "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" + }, + { + "name": "initialize_form", + "params": [], + "script": "\t# initialize flow-view selections\n\tselected_flow_view \u003d self.session.custom.flow_view_config.site_config.selected_flow_view\n\tself.view.custom.flow_view_source \u003d selected_flow_view\n\tself.view.custom.flow_view_destination \u003d selected_flow_view\n\t# initialize WHID selections\n\tselected_whid \u003d self.session.custom.flow_view_config.site_config.whid\n\tself.view.custom.whid_source \u003d selected_whid\n\tself.view.custom.whid_destination \u003d selected_whid\n\t# initialize stage selections\n\tselected_stage \u003d self.session.custom.flow_view_config.stage_config.stage\n\tself.view.custom.stage_source \u003d selected_stage\n\tself.view.custom.stage_destination \u003d selected_stage\n\t# initialize the flow view copy option\n\tself.view.custom.flow_view_copy_option \u003d \u0027both\u0027\n\t\t" + } + ], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "request_initialize_form", + "pageScope": false, + "script": "\t# initialize form on call\n\tself.initialize_form()", + "sessionScope": true, + "viewScope": true + } + ] + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/30d1cc4c95f6031666b3d236d81f0af4928c78625bc8c6a5b1cac59053d1d5c2 b/.resources/30d1cc4c95f6031666b3d236d81f0af4928c78625bc8c6a5b1cac59053d1d5c2 new file mode 100644 index 0000000..e5619d2 --- /dev/null +++ b/.resources/30d1cc4c95f6031666b3d236d81f0af4928c78625bc8c6a5b1cac59053d1d5c2 @@ -0,0 +1,97 @@ +{ + "custom": {}, + "params": { + "Error_message": "none" + }, + "propConfig": { + "params.Error_message": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 100, + "width": 242 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "200px" + }, + "props": { + "color": "#FFFFFF", + "path": "material/error_outline", + "style": { + "backgroundColor": "#555555" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "250px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.Error_message" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "backgroundColor": "#000000" + }, + "textStyle": { + "color": "#FFFFFF", + "fontWeight": "bold", + "margin": 10, + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "200px" + }, + "props": { + "direction": "column", + "style": { + "borderColor": "#FFFFFF", + "borderStyle": "solid", + "borderWidth": "1px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "Error" + }, + "props": { + "direction": "column", + "style": { + "classes": "Background-Styles/Controller" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/334448723737520c043f72840d0e5a25489054133253b78819f314cf0c6b77bc b/.resources/334448723737520c043f72840d0e5a25489054133253b78819f314cf0c6b77bc new file mode 100644 index 0000000..2c04f42 --- /dev/null +++ b/.resources/334448723737520c043f72840d0e5a25489054133253b78819f314cf0c6b77bc @@ -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/.resources/3546e8f9ea2622403584b03505ad73912584071db894d39cfeb7397a2eb652a4 b/.resources/3546e8f9ea2622403584b03505ad73912584071db894d39cfeb7397a2eb652a4 new file mode 100644 index 0000000..b5cf61a --- /dev/null +++ b/.resources/3546e8f9ea2622403584b03505ad73912584071db894d39cfeb7397a2eb652a4 @@ -0,0 +1,99 @@ +{ + "custom": {}, + "params": { + "styleClass": "", + "text": "" + }, + "propConfig": { + "params.styleClass": { + "paramDirection": "input", + "persistent": true + }, + "params.stylePath": { + "paramDirection": "input", + "persistent": true + }, + "params.text": { + "binding": { + "config": { + "expression": "{view.params.text}" + }, + "type": "expr" + }, + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 40, + "width": 210 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "TextInput" + }, + "position": { + "basis": "10px", + "grow": 1 + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "expression": "{view.params.styleClass}" + }, + "transforms": [ + { + "fallback": "Input/Label/Valid_Entry", + "inputType": "scalar", + "mappings": [ + { + "input": 0, + "output": "Input/Label/Invalid_Entry" + }, + { + "input": 1, + "output": "Input/Label/Valid_Entry" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + }, + "props.text": { + "binding": { + "config": { + "path": "view.params.text" + }, + "type": "property" + } + } + }, + "props": { + "placeholder": "Enter Value", + "resize": "both", + "style": {} + }, + "type": "ia.input.text-area" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "justify": "center", + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/36ffe3b88ac704181645812175f95ec8aed9fc4f1c4a2fc14e9ba9c7bb220ecf b/.resources/36ffe3b88ac704181645812175f95ec8aed9fc4f1c4a2fc14e9ba9c7bb220ecf new file mode 100644 index 0000000..4915027 --- /dev/null +++ b/.resources/36ffe3b88ac704181645812175f95ec8aed9fc4f1c4a2fc14e9ba9c7bb220ecf @@ -0,0 +1,4867 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Image" + }, + "position": { + "height": 1080, + "width": 1920 + }, + "propConfig": { + "props.source": { + "binding": { + "config": { + "expression": "\"http://127.0.0.1:5500/MCM05%20Sorter%20Destination%2C%20chutes%20and%20Bypass.svg?var\" + toMillis(now(100))" + }, + "type": "expr" + } + } + }, + "props": { + "fit": { + "mode": "fill" + }, + "style": { + "backgroundColor": "#EEEEEE" + } + }, + "type": "ia.display.image" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect1-6-2-0-0-8-7-6-9-0-9-6-84-7-0-3", + "inheritedGroupPrefix": "CON", + "name": "S013003", + "originalName": "rect1-6-2-0-0-8-7-6-9-0-9-6-84-7-0-3" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 868, + "y": 436.34 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect1", + "inheritedGroupPrefix": "CON", + "name": "S013005", + "originalName": "rect1" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 845.96, + "y": 436.34 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect2", + "inheritedGroupPrefix": "CON", + "name": "S013007", + "originalName": "rect2" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 823.69, + "y": 436.34 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect3", + "inheritedGroupPrefix": "CON", + "name": "S013009", + "originalName": "rect3" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 797.87, + "y": 436.34 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect4", + "inheritedGroupPrefix": "CON", + "name": "S013011", + "originalName": "rect4" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 775.74, + "y": 436.34 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect5", + "inheritedGroupPrefix": "CON", + "name": "S013013", + "originalName": "rect5" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 750.96, + "y": 436.34 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect6", + "inheritedGroupPrefix": "CON", + "name": "S013015", + "originalName": "rect6" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 728.83, + "y": 436.34 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect7", + "inheritedGroupPrefix": "CON", + "name": "S013017", + "originalName": "rect7" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 704.14, + "y": 436.16 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect8", + "inheritedGroupPrefix": "CON", + "name": "S013019", + "originalName": "rect8" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 681.87, + "y": 436.16 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect9", + "inheritedGroupPrefix": "CON", + "name": "S013021", + "originalName": "rect9" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 656.05, + "y": 436.16 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect10", + "inheritedGroupPrefix": "CON", + "name": "S013023", + "originalName": "rect10" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 633.92, + "y": 436.16 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect11", + "inheritedGroupPrefix": "CON", + "name": "S013025", + "originalName": "rect11" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 609.14, + "y": 436.16 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect12", + "inheritedGroupPrefix": "CON", + "name": "S013027", + "originalName": "rect12" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 587.01, + "y": 436.16 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect13", + "inheritedGroupPrefix": "CON", + "name": "S013029", + "originalName": "rect13" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 563, + "y": 436.16 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect14", + "inheritedGroupPrefix": "CON", + "name": "S013031", + "originalName": "rect14" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 540.73, + "y": 436.16 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect15", + "inheritedGroupPrefix": "CON", + "name": "S013033", + "originalName": "rect15" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 516.05, + "y": 435.84 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect16", + "inheritedGroupPrefix": "CON", + "name": "S013035", + "originalName": "rect16" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 493.92, + "y": 435.84 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect17", + "inheritedGroupPrefix": "CON", + "name": "S013037", + "originalName": "rect17" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 469.14, + "y": 435.84 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect18", + "inheritedGroupPrefix": "CON", + "name": "S013039", + "originalName": "rect18" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 447.01, + "y": 435.84 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect19", + "inheritedGroupPrefix": "CON", + "name": "S013041", + "originalName": "rect19" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 422.78, + "y": 435.84 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect20", + "inheritedGroupPrefix": "CON", + "name": "S013043", + "originalName": "rect20" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 400.5, + "y": 435.84 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect21", + "inheritedGroupPrefix": "CON", + "name": "S013045", + "originalName": "rect21" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 376.96, + "y": 436.11 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect22", + "inheritedGroupPrefix": "CON", + "name": "S013047", + "originalName": "rect22" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 354.83, + "y": 436.11 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect23", + "inheritedGroupPrefix": "CON", + "name": "S013049", + "originalName": "rect23" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 330.05, + "y": 436.11 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect24", + "inheritedGroupPrefix": "CON", + "name": "S013051", + "originalName": "rect24" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 307.92, + "y": 436.11 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect25", + "inheritedGroupPrefix": "CON", + "name": "S013053", + "originalName": "rect25" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 284.23, + "y": 435.88 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect26", + "inheritedGroupPrefix": "CON", + "name": "S013055", + "originalName": "rect26" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 262.1, + "y": 435.88 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect27", + "inheritedGroupPrefix": "CON", + "name": "S013057", + "originalName": "rect27" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 239.32, + "y": 435.88 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect28", + "inheritedGroupPrefix": "CON", + "name": "S013059", + "originalName": "rect28" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 217.19, + "y": 435.88 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect29", + "inheritedGroupPrefix": "CON", + "name": "S013061", + "originalName": "rect29" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 194.55, + "y": 435.66 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect30", + "inheritedGroupPrefix": "CON", + "name": "S013063", + "originalName": "rect30" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 172.42, + "y": 435.66 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect31", + "inheritedGroupPrefix": "CON", + "name": "S013004", + "originalName": "rect31" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 869.28, + "y": 340.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect32", + "inheritedGroupPrefix": "CON", + "name": "S013006", + "originalName": "rect32" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 847.23, + "y": 340.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect33", + "inheritedGroupPrefix": "CON", + "name": "S013008", + "originalName": "rect33" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 824.96, + "y": 340.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect34", + "inheritedGroupPrefix": "CON", + "name": "S013010", + "originalName": "rect34" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 795.14, + "y": 340.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect35", + "inheritedGroupPrefix": "CON", + "name": "S013012", + "originalName": "rect35" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 773.01, + "y": 340.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect36", + "inheritedGroupPrefix": "CON", + "name": "S013014", + "originalName": "rect36" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 750.23, + "y": 340.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect37", + "inheritedGroupPrefix": "CON", + "name": "S013018", + "originalName": "rect37" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 716.1, + "y": 340.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect38", + "inheritedGroupPrefix": "CON", + "name": "S013020", + "originalName": "rect38" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 693.41, + "y": 340.25 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect39", + "inheritedGroupPrefix": "CON", + "name": "S013022", + "originalName": "rect39" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 669.14, + "y": 340.25 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect40", + "inheritedGroupPrefix": "CON", + "name": "S013024", + "originalName": "rect40" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 647.32, + "y": 340.25 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect41", + "inheritedGroupPrefix": "CON", + "name": "S013026", + "originalName": "rect41" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 619.19, + "y": 340.25 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect42", + "inheritedGroupPrefix": "CON", + "name": "S013028", + "originalName": "rect42" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 594.41, + "y": 340.25 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect43", + "inheritedGroupPrefix": "CON", + "name": "S013032", + "originalName": "rect43" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 558.28, + "y": 340.25 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect44", + "inheritedGroupPrefix": "CON", + "name": "S013034", + "originalName": "rect44" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 530.24, + "y": 340.01 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect47", + "inheritedGroupPrefix": "CON", + "name": "S013036", + "originalName": "rect47" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 507.19, + "y": 339.93 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect48", + "inheritedGroupPrefix": "CON", + "name": "S013038", + "originalName": "rect48" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 480.41, + "y": 339.93 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect49", + "inheritedGroupPrefix": "CON", + "name": "S013040", + "originalName": "rect49" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 458.28, + "y": 339.93 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect50", + "inheritedGroupPrefix": "CON", + "name": "S013042", + "originalName": "rect50" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 432.05, + "y": 339.93 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect51", + "inheritedGroupPrefix": "CON", + "name": "S013044", + "originalName": "rect51" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 409.78, + "y": 339.93 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect52", + "inheritedGroupPrefix": "CON", + "name": "S013048", + "originalName": "rect52" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 372.23, + "y": 340.2 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect53", + "inheritedGroupPrefix": "CON", + "name": "S013050", + "originalName": "rect53" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 346.1, + "y": 340.2 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect54", + "inheritedGroupPrefix": "CON", + "name": "S013052", + "originalName": "rect54" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 323.32, + "y": 340.2 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect55", + "inheritedGroupPrefix": "CON", + "name": "S013054", + "originalName": "rect55" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 299.19, + "y": 340.2 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect56", + "inheritedGroupPrefix": "CON", + "name": "S013056", + "originalName": "rect56" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 277.5, + "y": 339.97 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect181", + "inheritedGroupPrefix": "CON", + "name": "S012061", + "originalName": "rect181" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1271.86, + "y": 436.34 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect182", + "inheritedGroupPrefix": "CON", + "name": "S012063", + "originalName": "rect182" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1250.47, + "y": 436.28 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect183", + "inheritedGroupPrefix": "CON", + "name": "S012065", + "originalName": "rect183" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1228.11, + "y": 436.4 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect186", + "inheritedGroupPrefix": "CON", + "name": "S012057", + "originalName": "rect186" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1317.11, + "y": 436.32 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect187", + "inheritedGroupPrefix": "CON", + "name": "S012059", + "originalName": "rect187" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1294.7, + "y": 436.29 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect188", + "inheritedGroupPrefix": "CON", + "name": "S012053", + "originalName": "rect188" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1361.12, + "y": 436.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect189", + "inheritedGroupPrefix": "CON", + "name": "S012055", + "originalName": "rect189" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1339.62, + "y": 436.38 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect208", + "inheritedGroupPrefix": "CON", + "name": "S012049", + "originalName": "rect208" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1406.77, + "y": 436.32 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect209", + "inheritedGroupPrefix": "CON", + "name": "S012051", + "originalName": "rect209" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1385.36, + "y": 436.29 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect210", + "inheritedGroupPrefix": "CON", + "name": "S012045", + "originalName": "rect210" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1450.78, + "y": 436.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect211", + "inheritedGroupPrefix": "CON", + "name": "S012047", + "originalName": "rect211" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1429.28, + "y": 436.38 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect212", + "inheritedGroupPrefix": "CON", + "name": "S012041", + "originalName": "rect212" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1495.75, + "y": 436.32 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect213", + "inheritedGroupPrefix": "CON", + "name": "S012043", + "originalName": "rect213" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1474.33, + "y": 436.29 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect214", + "inheritedGroupPrefix": "CON", + "name": "S012037", + "originalName": "rect214" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1539.76, + "y": 436.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect215", + "inheritedGroupPrefix": "CON", + "name": "S012039", + "originalName": "rect215" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1518.25, + "y": 436.38 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect216", + "inheritedGroupPrefix": "CON", + "name": "S012033", + "originalName": "rect216" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1584.61, + "y": 436.55 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect217", + "inheritedGroupPrefix": "CON", + "name": "S012035", + "originalName": "rect217" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1563.2, + "y": 436.52 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect218", + "inheritedGroupPrefix": "CON", + "name": "S012029", + "originalName": "rect218" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1628.62, + "y": 436.66 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect219", + "inheritedGroupPrefix": "CON", + "name": "S012031", + "originalName": "rect219" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1607.12, + "y": 436.6 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect220", + "inheritedGroupPrefix": "CON", + "name": "S012025", + "originalName": "rect220" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1672.75, + "y": 436.55 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect221", + "inheritedGroupPrefix": "CON", + "name": "S012027", + "originalName": "rect221" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1651.33, + "y": 436.52 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect223", + "inheritedGroupPrefix": "CON", + "name": "S012023", + "originalName": "rect223" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1695.25, + "y": 436.6 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect226", + "inheritedGroupPrefix": "CON", + "name": "S012068", + "originalName": "rect226" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1206.51, + "y": 340.24 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect229", + "inheritedGroupPrefix": "CON", + "name": "S012064", + "originalName": "rect229" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1252.75, + "y": 340.22 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect230", + "inheritedGroupPrefix": "CON", + "name": "S012066", + "originalName": "rect230" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1230.34, + "y": 340.19 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect231", + "inheritedGroupPrefix": "CON", + "name": "S012060", + "originalName": "rect231" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1295.77, + "y": 340.33 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect232", + "inheritedGroupPrefix": "CON", + "name": "S012062", + "originalName": "rect232" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1275.26, + "y": 340.27 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect233", + "inheritedGroupPrefix": "CON", + "name": "S012056", + "originalName": "rect233" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1358.41, + "y": 340.22 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect234", + "inheritedGroupPrefix": "CON", + "name": "S012058", + "originalName": "rect234" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1320, + "y": 340.19 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect235", + "inheritedGroupPrefix": "CON", + "name": "S012052", + "originalName": "rect235" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1402.43, + "y": 340.33 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect236", + "inheritedGroupPrefix": "CON", + "name": "S012054", + "originalName": "rect236" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1380.92, + "y": 340.27 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect237", + "inheritedGroupPrefix": "CON", + "name": "S012048", + "originalName": "rect237" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1447.39, + "y": 340.22 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect238", + "inheritedGroupPrefix": "CON", + "name": "S012050", + "originalName": "rect238" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1425.98, + "y": 340.19 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect239", + "inheritedGroupPrefix": "CON", + "name": "S012044", + "originalName": "rect239" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1506.4, + "y": 340.33 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect240", + "inheritedGroupPrefix": "CON", + "name": "S012046", + "originalName": "rect240" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1469.9, + "y": 340.27 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect241", + "inheritedGroupPrefix": "CON", + "name": "S012038", + "originalName": "rect241" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1551.25, + "y": 340.45 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect242", + "inheritedGroupPrefix": "CON", + "name": "S012042", + "originalName": "rect242" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1529.84, + "y": 340.41 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect243", + "inheritedGroupPrefix": "CON", + "name": "S012034", + "originalName": "rect243" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1595.27, + "y": 340.56 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect244", + "inheritedGroupPrefix": "CON", + "name": "S012036", + "originalName": "rect244" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1573.76, + "y": 340.5 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect245", + "inheritedGroupPrefix": "CON", + "name": "S012030", + "originalName": "rect245" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1658.39, + "y": 340.45 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect246", + "inheritedGroupPrefix": "CON", + "name": "S012032", + "originalName": "rect246" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1620.98, + "y": 340.41 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect247", + "inheritedGroupPrefix": "CON", + "name": "S012028", + "originalName": "rect247" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1679.9, + "y": 340.5 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect248", + "inheritedGroupPrefix": "CON", + "name": "S012026", + "originalName": "rect248" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1704.25, + "y": 340.68 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect249", + "inheritedGroupPrefix": "CON", + "name": "S012024", + "originalName": "rect249" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1726.76, + "y": 340.73 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect256", + "inheritedGroupPrefix": "CON", + "name": "S012008", + "originalName": "rect256" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 1810.17, + "y": 561.94 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect257", + "inheritedGroupPrefix": "CON", + "name": "S012006", + "originalName": "rect257" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 1810.18, + "y": 583.58 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect258", + "inheritedGroupPrefix": "CON", + "name": "S012002", + "originalName": "rect258" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 1810.5, + "y": 632.73 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect260", + "inheritedGroupPrefix": "CON", + "name": "S012004", + "originalName": "rect260" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 1810.14, + "y": 608.62 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect265", + "inheritedGroupPrefix": "CON", + "name": "S012022", + "originalName": "rect265" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 1810.14, + "y": 424.41 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect266", + "inheritedGroupPrefix": "CON", + "name": "S012020", + "originalName": "rect266" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 1810.15, + "y": 446.06 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect267", + "inheritedGroupPrefix": "CON", + "name": "S012016", + "originalName": "rect267" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 1810.47, + "y": 495.2 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect268", + "inheritedGroupPrefix": "CON", + "name": "S012014", + "originalName": "rect268" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 1810.63, + "y": 516.49 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect269", + "inheritedGroupPrefix": "CON", + "name": "S012018", + "originalName": "rect269" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 1810.11, + "y": 471.09 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect270", + "inheritedGroupPrefix": "CON", + "name": "S012007", + "originalName": "rect270" + }, + "position": { + "height": 20, + "rotate": { + "angle": 180 + }, + "width": 20, + "x": 1716.6, + "y": 560.75 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect271", + "inheritedGroupPrefix": "CON", + "name": "S012005", + "originalName": "rect271" + }, + "position": { + "height": 20, + "rotate": { + "angle": 180 + }, + "width": 20, + "x": 1716.61, + "y": 582.39 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect272", + "inheritedGroupPrefix": "CON", + "name": "S012001", + "originalName": "rect272" + }, + "position": { + "height": 20, + "rotate": { + "angle": 180 + }, + "width": 20, + "x": 1716.93, + "y": 631.53 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect274", + "inheritedGroupPrefix": "CON", + "name": "S012003", + "originalName": "rect274" + }, + "position": { + "height": 20, + "rotate": { + "angle": 180 + }, + "width": 20, + "x": 1716.57, + "y": 607.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect275", + "inheritedGroupPrefix": "CON", + "name": "S012067", + "originalName": "rect275" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1205.7, + "y": 436.23 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect276", + "inheritedGroupPrefix": "CON", + "name": "S013001", + "originalName": "rect276" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 892.31, + "y": 439.28 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect275", + "inheritedGroupPrefix": "CON", + "name": "S012069", + "originalName": "rect275" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1180.7, + "y": 438.868 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "MCM01_Button" + }, + "position": { + "height": 47, + "width": 222, + "x": 177.91, + "y": 823.96 + }, + "props": { + "params": { + "pageid": "DetailedView/MCM01 Bulk Inbound", + "panel_id": "value", + "text": "MCM01 Bulk Inbound" + }, + "path": "Custom-Views/Area_Nav_Button" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "MCM02-MCM03_Button" + }, + "position": { + "height": 45.04, + "width": 206.98, + "x": 1449.79, + "y": 850.93 + }, + "props": { + "params": { + "pageid": "DetailedView/MCM02 \u0026 MCM03 Fluid Inbound", + "panel_id": "value", + "text": "MCM02 \u0026 MCM03 Fluid Inbound" + }, + "path": "Custom-Views/Area_Nav_Button" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "ULC1-7-JR2" + }, + "position": { + "height": 13, + "width": 13, + "x": 248.9555810546875, + "y": 312.91999999999996 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S013050_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 349, + "y": 300 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S013042_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 436, + "y": 299 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S013034_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 534, + "y": 299 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S013026_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 622, + "y": 299 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S013018_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 720, + "y": 299 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S013010_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 799, + "y": 299 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S013004_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 873, + "y": 299 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM14" + }, + "position": { + "height": 20, + "width": 20, + "x": 324.028, + "y": 364.424 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM12" + }, + "position": { + "height": 20, + "width": 20, + "x": 410.028, + "y": 364.424 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM10" + }, + "position": { + "height": 20, + "width": 20, + "x": 507.028, + "y": 364.424 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM8" + }, + "position": { + "height": 20, + "width": 20, + "x": 595.028, + "y": 364.424 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM6" + }, + "position": { + "height": 20, + "width": 20, + "x": 693.028, + "y": 363.424 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM4" + }, + "position": { + "height": 20, + "width": 20, + "x": 773.028, + "y": 363.424 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM2" + }, + "position": { + "height": 20, + "width": 20, + "x": 869.028, + "y": 363.424 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM15" + }, + "position": { + "height": 20, + "width": 20, + "x": 217, + "y": 413 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM13" + }, + "position": { + "height": 20, + "width": 20, + "x": 308, + "y": 412 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM11" + }, + "position": { + "height": 20, + "width": 20, + "x": 400, + "y": 412 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM9" + }, + "position": { + "height": 20, + "width": 20, + "x": 494, + "y": 412 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM7" + }, + "position": { + "height": 20, + "width": 20, + "x": 587, + "y": 412 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM5" + }, + "position": { + "height": 20, + "width": 20, + "x": 682, + "y": 412 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM3" + }, + "position": { + "height": 20, + "width": 20, + "x": 776, + "y": 412 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM1" + }, + "position": { + "height": 20, + "width": 20, + "x": 868, + "y": 413 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S013057_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 244, + "y": 482 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S013049_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 334, + "y": 482 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S013041_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 427, + "y": 482 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S013033_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 519, + "y": 483 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S013025_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 614, + "y": 483 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S013017_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 708, + "y": 483 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S013009_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 802, + "y": 483 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S013001_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 896, + "y": 482 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S012064_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1256.03, + "y": 299.91668701171875 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01B_FIOM17" + }, + "position": { + "height": 20, + "width": 20, + "x": 1231.03, + "y": 364.41790771484375 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S012058_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1324.03, + "y": 300.91 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01B_FIOM15" + }, + "position": { + "height": 20, + "width": 20, + "x": 1296.03, + "y": 364.91 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01B_FIOM13" + }, + "position": { + "height": 20, + "width": 20, + "x": 1381.03, + "y": 364.91 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S012052_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1409.03, + "y": 300.91 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01B_FIOM11" + }, + "position": { + "height": 20, + "width": 20, + "x": 1470.03, + "y": 364.91 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S012046_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1474.03, + "y": 300.91 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S012036_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1580.03, + "y": 298.91 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01B_FIOM8" + }, + "position": { + "height": 20, + "width": 20, + "x": 1552.03, + "y": 362.91 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01B_FIOM6" + }, + "position": { + "height": 20, + "width": 20, + "x": 1704.03, + "y": 364.91 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S012024_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1730.03, + "y": 300.91 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01B_FIOM16" + }, + "position": { + "height": 20, + "width": 20, + "x": 1229.03, + "y": 412.91 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S012063_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1254.03, + "y": 482.91 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S012055_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1344.03, + "y": 483.9 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01B_FIOM14" + }, + "position": { + "height": 20, + "width": 20, + "x": 1317.03, + "y": 414.9 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01B_FIOM12" + }, + "position": { + "height": 20, + "width": 20, + "x": 1385.03, + "y": 414.9 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S012049_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1412.03, + "y": 483.9 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01B_FIOM10" + }, + "position": { + "height": 20, + "width": 20, + "x": 1475.02, + "y": 414.9 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S012041_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1500.02, + "y": 483.9 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S012033_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1588.02, + "y": 483.9 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01B_FIOM7" + }, + "position": { + "height": 20, + "width": 20, + "x": 1563.02, + "y": 414.9 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01B_FIOM5" + }, + "position": { + "height": 20, + "width": 20, + "x": 1673.01, + "y": 414.9 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S012023_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1699.01, + "y": 483.9 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S012022_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1858, + "y": 428 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01B_FIOM4" + }, + "position": { + "height": 20, + "width": 20, + "x": 1789, + "y": 424 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01B_FIOM3" + }, + "position": { + "height": 20, + "width": 20, + "x": 1788, + "y": 496 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01B_FIOM2" + }, + "position": { + "height": 20, + "width": 20, + "x": 1788, + "y": 608 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01B_FIOM1" + }, + "position": { + "height": 20, + "width": 20, + "x": 1742, + "y": 608 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S012002_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1859, + "y": 636 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S012001_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1676, + "y": 636 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S012014_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1858, + "y": 520 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "root" + }, + "props": { + "style": { + "backgroundColor": "#FFFFFF" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/.resources/374a387b6fbed5b6f90fdddc0bc96445fe060f31428d78def85d2f5521fad4be b/.resources/374a387b6fbed5b6f90fdddc0bc96445fe060f31428d78def85d2f5521fad4be new file mode 100644 index 0000000..fdef339 --- /dev/null +++ b/.resources/374a387b6fbed5b6f90fdddc0bc96445fe060f31428d78def85d2f5521fad4be @@ -0,0 +1,497 @@ +{ + "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)\r\n", + "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": 40 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Light_Curtain", + "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].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{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 32.5,0 h 8 v 8 h -8 z m -32,0 h 8 v 8 h -8 z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m 9,4 c 7.666668,0 15.333332,0 23,0", + "name": "path", + "stroke": { + "width": 3 + }, + "type": "path" + } + ], + "style": {}, + "viewBox": "-0.5 -0.5 42 9" + }, + "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": { + "aspectRatio": "40:10", + "mode": "percent", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/.resources/39ad9288b6a75113302b7d52b3f7fc60a2baa58e22ad75ea896e22ac63484702 b/.resources/39ad9288b6a75113302b7d52b3f7fc60a2baa58e22ad75ea896e22ac63484702 new file mode 100644 index 0000000..1503a50 --- /dev/null +++ b/.resources/39ad9288b6a75113302b7d52b3f7fc60a2baa58e22ad75ea896e22ac63484702 @@ -0,0 +1,293 @@ +import sys, os, datetime, hashlib, hmac +from StringIO import StringIO +import gzip +import urllib +import urllib2 +import json + +def get_filters_2(**kwargs): + filter_stack = [] + canonical_querystring = "" + url_encoding = kwargs.get("url_encoding") + + sources = kwargs.get("sources") + if sources: + source_string = "SourceId=" + ",".join(sources) + filter_stack.append(source_string) + + devices = kwargs.get("devices") + if devices: + device_string = "Device=" + ",".join(devices) + filter_stack.append(device_string) + + priorities = kwargs.get("priorities") + if priorities: + priority_string = "Priority=" + ",".join(str(item) for item in priorities) + filter_stack.append(priority_string) + + types = kwargs.get("types") + if types: + type_string = ("Type=" + ",".join(str(item) for item in types)) + filter_stack.append(type_string) + + time_from = kwargs.get("start") + if time_from: + time_from_string = "StartTimestamp=" + str(time_from) + filter_stack.append(time_from_string) + + time_to = kwargs.get("end") + if time_to: + time_to_string = "EndTimestamp=" + str(time_to) + filter_stack.append(time_to_string) + + duration = kwargs.get("duration") + if duration: + duration_string = "MinimumDuration=" + str(duration) + filter_stack.append(duration_string) + if filter_stack: + if url_encoding: + canonical_querystring += "Filter=" + for i, j in enumerate(filter_stack): + if i == len(filter_stack)-1 and url_encoding == True: + canonical_querystring += urllib.quote(j, "") + elif i == len(filter_stack)-1: + canonical_querystring += j + elif url_encoding == True: + canonical_querystring += urllib.quote(j + "&", "") + else: + canonical_querystring += (j + "&") + + return canonical_querystring + +def get_filters(**kwargs): + #Build filter string, filters are passed as key word arguments into the function + #Check if any of the filters have been passed means we need to add Filter=. + #Each filter is then converted using the urllib_parse. + canonical_querystring = "" + sources = kwargs.get("sources") + devices = kwargs.get("devices") + priorities = kwargs.get("priorities") + types = kwargs.get("types") + time_from = kwargs.get("start") + time_to = kwargs.get("end") + duration = kwargs.get("duration") + url_encoding = kwargs.get("url_encoding") + filter_list = [sources, devices, priorities, types, time_from, time_to, duration] + if any(filter_list): + canonical_querystring = "Filter=" + if sources: + source_string = ("SourceId=" + ",".join(sources)) + if url_encoding == True: + canonical_querystring += urllib.quote(source_string + "&","") + else: + canonical_querystring += source_string + "&" + if devices: + device_string = ("Device=" + ",".join(devices)) + if url_encoding == True: + canonical_querystring += urllib.quote(device_string + "&","") + else: + canonical_querystring += device_string +"&" + if priorities: + priority_string = ("Priority=" + ",".join(str(item) for item in priorities)) + if url_encoding == True: + canonical_querystring += urllib.quote(priority_string + "&", "") + else: + canonical_querystring += priority_string +"&" + if types: + type_string = ("Type=" + ",".join(str(item) for item in types)) + if url_encoding == True: + canonical_querystring += urllib.quote(type_string + "&","") + else: + canonical_querystring += type_string +"&" + if time_from: + if url_encoding == True: + canonical_querystring += urllib.quote("StartTimestamp=" + str(time_from) + "&","") + else: + canonical_querystring += "StartTimestamp=" + str(time_from) +"&" + if time_to: + if url_encoding == True: + canonical_querystring += urllib.quote("EndTimestamp=" + str(time_to) + "&","") + else: + canonical_querystring += "EndTimestamp=" + str(time_to) +"&" + if duration: + if url_encoding == True: + canonical_querystring += urllib.quote("MinimumDuration=" + str(duration) + "&","") + else: + canonical_querystring += "MinimumDuration=" + str(duration) +"&" + system.perspective.print("filtered string = " + canonical_querystring ) + canonical_querystring = canonical_querystring.rstrip("&") + return canonical_querystring + +def get_response(response): + if response.info().get('Content-Encoding') == 'gzip': + buf = StringIO(response.read()) + f = gzip.GzipFile(fileobj=buf) + data = f.read() + return (response.getcode(), data) + else: + buf = StringIO(response.read()) + return(response.getcode(), buf.read()) + +def build_url(credentials, **kwargs): + # ************* REQUEST VALUES ************* + method = 'GET' + service = 'lambda' + + # This is a lookup in secrets to a return the function url for the lambda that needs called. + # This allows beta and prod to be dynamically retrived. + whid = kwargs.get("fc") + region = kwargs.get("region") + API_ID, STAGE, ACC_ID, FUNC_URL = AWS.secrets_manager.get_secret(str(whid), 'scada/api/endpoint') + api_id = FUNC_URL + host = "%s.%s-url.%s.on.aws" % (api_id, service, region) + endpoint = "https://%s" % (host) + + + # Key derivation functions. See: + # http://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-python + 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 + + # Read AWS access key from env. variables or configuration file. Best practice is NOT + # to embed credentials in code. +# access_key = os.environ.get('AWS_ACCESS_KEY_ID') +# access_key= 'ASIATVSVCYSV2JJJMDPP' +# secret_key = os.environ.get('AWS_SECRET_ACCESS_KEY') +# secret_key= 'Hc0G/0eACBlgplGSBnfsB98Y6DPqwpvyb4nc1Rvs' +# session_token = os.environ["AWS_SESSION_TOKEN"] +# session_token= 'IQoJb3JpZ2luX2VjEJr//////////wEaCWV1LXdlc3QtMSJHMEUCIQCbrPQoj4OM0SXIo6QtcNAblnplgXfvSYIcA+k8xkXmZwIgN1Pi7Nyc66T8p0HkZSMmuW8pu1qPEVJii41YgYCuiBYqngIIo///////////ARAAGgwyNTI1MDc3Njc5NzkiDKGV69tLNcKNVcoeryryARkU2Lmnj0aa+ilLOrg35FIb81jvmj6bpPR3+5zJ3Wna+vOBgz6cqphyn28+Q8Ryw/lzM6gM0vWH+gV26CuQZtKd1U4ETo9eL9QuluLBqLnZYfT5q+F9hzJy3OQQl0c3VvwcaCjOPrMdbvWnJGEoEZTKe7Xm5v3ok3huJDgKLEIVlE6Z4c2kKNy/N/JfbxB5a33A2eaE9YaGj1V0cQgUFCCkn9uDq8W4TzOPZ3NgKAyj8RoBR6KAC8gEtWXFEwwZR3ZMwYIXryEepcU7HQSHpp66JAFm/X5+HNxRe7WUwTETAveYMNi5ssFzl3rneKh9+U37MPW58psGOp0B11BghSma0KZHgCfXqdsgfGyD7/sBEyYE9wdnzmi8fOpel5EDQoUoYilRSXod2E9wlaXj3h8S+dtBJjGVqsIbHEIrW7WKOEYELxoW4VSDw5hDjZaUuZ5fA3z59c4CEeAz3v5EA6NN6+ulEb7/4pbWF8s3fezNk9T73NpmKnjaMFukcBX8DofesZGJFpfGij2Sx4hQ3qlmG91uac8kMw==' + access_key = credentials["AccessKey"] + secret_key = credentials["SecretKey"] + session_token = credentials["SessionKey"] + + + + if access_key is None or secret_key is None: + system.perspective.print('No access key is available.') + sys.exit() + + # Create a date for headers and the credential string + t = datetime.datetime.utcnow() + amz_date = t.strftime('%Y%m%dT%H%M%SZ') # Format date as YYYYMMDD'T'HHMMSS'Z' + datestamp = t.strftime('%Y%m%d') # Date w/o time, used in credential scope + system.perspective.print("creating header") + system.perspective.print("datestamp = " + str(datestamp) + " region = " + str(region) + "service = " + str(service)) + + # ************* TASK 1: CREATE A CANONICAL REQUEST ************* + # http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html + + # Because almost all information is being passed in the query string, + # the order of these steps is slightly different than examples that + # use an authorization header. + + # Step 1: Define the verb (GET, POST, etc.)--already done. + + # Step 2: Create canonical URI--the part of the URI from domain to query + # string (use '/' if no path) + fc = kwargs.get("fc") + canonical_uri = "/history/%s" % (fc) + + # Step 3: Create the canonical headers and signed headers. Header names + # must be trimmed and lowercase, and sorted in code point order from + # low to high. Note trailing \n in canonical_headers. + # signed_headers is the list of headers that are being included + # as part of the signing process. For requests that use query strings, + # only "host" is included in the signed headers. + canonical_headers = 'host:' + host + '\n' + signed_headers = 'host' + + # Match the algorithm to the hashing algorithm you use, either SHA-1 or + # SHA-256 (recommended) + algorithm = 'AWS4-HMAC-SHA256' + + credential_scope = datestamp + '/' + region + '/' + service + '/' + 'aws4_request' + + # Step 4: Create the canonical query string. In this example, request + # parameters are in the query string. Query string values must + # be URL-encoded (space=%20). The parameters must be sorted by name. + #canonical_querystring = 'Action=CreateUser&UserName=NewUser&Version=2010-05-08' + #canonical_querystring = 'NextToken=' + urllib.parse.quote("1669217267.5230844/PLC09/T00049",'') + '&PageSize=50' + #canonical_querystring = 'PageSize=50&PreviousToken=' + urllib.parse.quote('1669217267.5824845/PLC09/T00099','') + canonical_querystring = "" + #Build filter string, filters are passed as key word arguments int the function + #Check if any of the filters have been passed means we need to add Filter=. + #Each filter is then converted using the urllib_parse. + #Including client id for timestream api. + client_id = kwargs.get("client_id") + if client_id: + canonical_querystring += 'ClientId=' + client_id + '&' + PAGE_SIZE = "200" + filters= kwargs.get("filters","") + if filters != "": + canonical_querystring += filters + "&" + + next_token = kwargs.get("next_token") + + previous_token = kwargs.get("previous_token") + if next_token != None: + canonical_querystring += 'NextToken=' + urllib.quote(next_token,'') + '&' + system.perspective.print("created string " + canonical_querystring) + + if previous_token != None: + canonical_querystring += 'PreviousToken=' + urllib.quote(previous_token,'') + '&' + + else: + canonical_querystring += 'X-Amz-Algorithm=AWS4-HMAC-SHA256' + canonical_querystring += '&X-Amz-Credential=' + urllib.quote_plus(access_key + '/' + credential_scope) + canonical_querystring += '&X-Amz-Date=' + amz_date + #canonical_querystring += '&X-Amz-Expires=30' + canonical_querystring += "&X-Amz-Security-Token=" + urllib.quote_plus(session_token) + canonical_querystring += '&X-Amz-SignedHeaders=' + signed_headers + + + # Step 5: Create payload hash. For GET requests, the payload is an + # empty string (""). + payload_hash = hashlib.sha256(('').encode('utf-8')).hexdigest() + + # Step 6: Combine elements to create canonical request + canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash + + + # ************* TASK 2: CREATE THE STRING TO SIGN************* + string_to_sign = algorithm + '\n' + amz_date + '\n' + credential_scope + '\n' + hashlib.sha256(canonical_request.encode('utf-8')).hexdigest() + + # ************* TASK 3: CALCULATE THE SIGNATURE ************* + # Create the signing key + signing_key = getSignatureKey(secret_key, datestamp, region, service) + + # Sign the string_to_sign using the signing_key + signature = hmac.new(signing_key, (string_to_sign).encode("utf-8"), hashlib.sha256).hexdigest() + + + # ************* TASK 4: ADD SIGNING INFORMATION TO THE REQUEST ************* + # The auth information can be either in a query string + # value or in a header named Authorization. This code shows how to put + # everything into a query string. + canonical_querystring += '&X-Amz-Signature=' + signature + + + # ************* SEND THE REQUEST ************* + # The 'host' header is added automatically by the Python 'request' lib. But it + # must exist as a header in the request. + request_url = endpoint + canonical_uri + "?" + canonical_querystring + + system.perspective.print('\nBEGIN REQUEST++++++++++++++++++++++++++++++++++++') + system.perspective.print('Request URL = ' + request_url) +# r = requests.get(request_url) + request = urllib2.Request(request_url) + request.add_header('Accept-encoding', 'gzip') + try: + response = urllib2.urlopen(request) + except urllib2.HTTPError as e: + return(e.code, None) + except urllib2.URLError as e: + return(e.reason, None) + return get_response(response) + diff --git a/.resources/39c1efa0540ced11e009464959c68e8e3fb7a601e861a7eacb14122ea87fb9bf b/.resources/39c1efa0540ced11e009464959c68e8e3fb7a601e861a7eacb14122ea87fb9bf new file mode 100644 index 0000000..459bb13 --- /dev/null +++ b/.resources/39c1efa0540ced11e009464959c68e8e3fb7a601e861a7eacb14122ea87fb9bf @@ -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/.resources/3a9b20c8045394086dffad5bc4e0fd92c3bdb1231ef074d4664f340803b90a6a b/.resources/3a9b20c8045394086dffad5bc4e0fd92c3bdb1231ef074d4664f340803b90a6a new file mode 100644 index 0000000..805802c --- /dev/null +++ b/.resources/3a9b20c8045394086dffad5bc4e0fd92c3bdb1231ef074d4664f340803b90a6a @@ -0,0 +1,2408 @@ +{ + "custom": { + "Enable_input": false + }, + "params": {}, + "propConfig": { + "custom.Enable_input": { + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "32px" + }, + "props": { + "path": "material/edit_attributes", + "style": { + "marginLeft": "10px" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "232px" + }, + "props": { + "style": { + "marginLeft": "10px" + }, + "text": "Configuration Tags", + "textStyle": { + "fontFamily": "Arial", + "fontSize": "16px", + "fontWeight": "bold" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "50px", + "grow": 1 + }, + "type": "ia.display.label" + }, + { + "custom": { + "dockOpened": true + }, + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tdevice_entry \u003d {\"Device\":\"\",\"Area\":\"\",\"SubArea\":\"\"}\n\tif not self.view.getChild(\"root\").custom.isDockOpen:\n\t\tparams \u003d {\n\t\t\t\"path\":\"Main-Views/Config-Tool/TagViewer\",\n\t\t\t\"params\":device_entry\t\n\t\t}\n\t\t\n\t\tsystem.perspective.sendMessage(\"select-side-view\", payload\u003dparams)\n\t\n\t\t\n\t\n\tsystem.perspective.print(self.view.getChild(\"root\").custom.isDockOpen)\n\tself.custom.dockOpened \u003d self.view.getChild(\"root\").custom.isDockOpen ^ True\n\tsystem.perspective.print(self.view.getChild(\"root\").custom.isDockOpen)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Icon_0" + }, + "position": { + "basis": "30px" + }, + "props": { + "path": "material/local_offer", + "style": { + "margin": "5px" + } + }, + "type": "ia.display.icon" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "50px" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "57px" + }, + "props": { + "text": "FC:", + "textStyle": { + "fontFamily": "Arial", + "fontSize": "16px", + "fontWeight": "bold" + } + }, + "type": "ia.display.label" + }, + { + "custom": { + "tagPath": "Configuration/FC" + }, + "meta": { + "name": "TextField" + }, + "position": { + "basis": "175px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "path": "view.custom.Enable_input" + }, + "type": "property" + } + }, + "props.placeholder": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]Configuration/FC" + }, + "transforms": [ + { + "code": "\tif value :\n\t\treturn value\n\telse:\n\t\treturn \"No Value Configured\"", + "type": "script" + } + ], + "type": "tag" + } + }, + "props.text": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]Configuration/FC" + }, + "transforms": [ + { + "code": "\treturn value", + "type": "script" + } + ], + "type": "tag" + }, + "onChange": { + "enabled": null, + "script": "\tif currentValue.value:\n\t\ttagPath \u003d \"[%s_SCADA_TAG_PROVIDER]%s\"%(self.session.custom.fc,self.custom.tagPath)\n\t\tsystem.perspective.print(tagPath)\n\t\tres \u003d system.tag.writeBlocking([tagPath], [currentValue.value])\n\t\tsystem.perspective.print(res)" + } + } + }, + "props": { + "deferUpdates": false + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "107px" + }, + "props": { + "style": { + "marginLeft": "25px" + }, + "text": "AWS Prefix :", + "textStyle": { + "fontFamily": "Arial", + "fontSize": "16px", + "fontWeight": "bold" + } + }, + "type": "ia.display.label" + }, + { + "custom": { + "key": "prefix", + "tagPath": "Configuration/aws" + }, + "meta": { + "name": "TextField_0" + }, + "position": { + "basis": "175px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "path": "view.custom.Enable_input" + }, + "type": "property" + } + }, + "props.placeholder": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]Configuration/aws" + }, + "transforms": [ + { + "code": "\t\n\t\n\tvalue \u003d system.util.jsonDecode(value)\n\t\n\tif value.get(\"prefix\"):\n\t\treturn value[\"prefix\"] \n\telse:\n\t\treturn \"No Value Configured\"", + "type": "script" + } + ], + "type": "tag" + } + }, + "props.text": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]Configuration/aws" + }, + "transforms": [ + { + "code": "\treturn system.util.jsonDecode(value).get(\"prefix\", None)", + "type": "script" + } + ], + "type": "tag" + }, + "onChange": { + "enabled": null, + "script": "\tif currentValue.value:\n\t\tfc \u003d self.session.custom.fc\n\t\ttagPath \u003d \"[%s_SCADA_TAG_PROVIDER]%s\"%(fc, self.custom.tagPath)\n\t\ttagData \u003d system.util.jsonDecode(system.tag.readBlocking([tagPath])[0].value)\n\t\ttry:\n\t\t\ttagData[self.custom.key] \u003d currentValue.value.strip()\n\t\texcept Exception as e :\n\t\t\tsystem.perspective.print(e)\n\t\t\treturn \n\t\tsystem.tag.writeBlocking([tagPath], [system.util.jsonEncode(tagData)])\n\t\t\t\n\t\t\t" + } + } + }, + "props": { + "deferUpdates": false + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "initialise-values", + "pageScope": true, + "script": "\t# implement your handler here\n\tsystem.perspective.print(payload)", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "115px" + }, + "props": { + "style": { + "marginLeft": "25px" + }, + "text": "AWS Region :", + "textStyle": { + "fontFamily": "Arial", + "fontSize": "16px", + "fontWeight": "bold" + } + }, + "type": "ia.display.label" + }, + { + "custom": { + "key": "region", + "tagPath": "Configuration/aws" + }, + "meta": { + "name": "TextField_2" + }, + "position": { + "basis": "175px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "path": "view.custom.Enable_input" + }, + "type": "property" + } + }, + "props.placeholder": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]Configuration/aws" + }, + "transforms": [ + { + "code": "\t\n\t\n\tvalue \u003d system.util.jsonDecode(value)\n\t\n\tif value.get(\"region\"):\n\t\treturn value[\"region\"] \n\telse:\n\t\treturn \"No Value Configured\"", + "type": "script" + } + ], + "type": "tag" + } + }, + "props.text": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]Configuration/aws" + }, + "transforms": [ + { + "code": "\treturn system.util.jsonDecode(value).get(\"region\", None)", + "type": "script" + } + ], + "type": "tag" + }, + "onChange": { + "enabled": null, + "script": "\tif currentValue.value:\n\t\tfc \u003d self.session.custom.fc\n\t\ttagPath \u003d \"[%s_SCADA_TAG_PROVIDER]%s\"%(fc, self.custom.tagPath)\n\t\ttagData \u003d system.util.jsonDecode(system.tag.readBlocking([tagPath])[0].value)\n\t\ttry:\n\t\t\ttagData[self.custom.key] \u003d currentValue.value.strip()\n\t\texcept Exception as e :\n\t\t\tsystem.perspective.print(e)\n\t\t\treturn \n\t\tsystem.tag.writeBlocking([tagPath], [system.util.jsonEncode(tagData)])\n\t\t\t\n\t\t\t" + } + } + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "basis": "120px" + }, + "props": { + "style": { + "marginLeft": "25px" + }, + "text": "Backend Type :", + "textStyle": { + "fontFamily": "Arial", + "fontSize": "16px", + "fontWeight": "bold" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "175px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "path": "view.custom.Enable_input" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]Configuration/BACKEND_EDGE_DEVICE" + }, + "transforms": [ + { + "code": "\tif value:\n\t\treturn value\n\t", + "type": "script" + } + ], + "type": "tag" + }, + "onChange": { + "enabled": null, + "script": "\twhid \u003d self.session.custom.fc\n\tsystem.tag.writeBlocking([\"[%s_SCADA_TAG_PROVIDER]Configuration/BACKEND_EDGE_DEVICE\"%whid], [currentValue.value])" + } + } + }, + "props": { + "options": [ + { + "label": "Edge To Cloud", + "value": "e2c" + }, + { + "label": "Quattro", + "value": "quattro" + }, + { + "label": "DataBridge", + "value": "databridge" + } + ], + "placeholder": { + "text": "No Value Configured" + }, + "search": { + "enabled": false + } + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "40px" + }, + "props": { + "style": { + "marginLeft": "10px", + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "basis": "140px" + }, + "props": { + "direction": "column", + "style": { + "borderBottomLeftRadius": "5px", + "borderBottomRightRadius": "5px", + "borderStyle": "solid", + "borderTopLeftRadius": "5px", + "borderTopRightRadius": "5px", + "margin": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "32px" + }, + "props": { + "path": "material/settings_applications", + "style": { + "marginLeft": "10px" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "232px" + }, + "props": { + "style": { + "marginLeft": "10px" + }, + "text": "PLC Configuration", + "textStyle": { + "fontFamily": "Arial", + "fontSize": "16px", + "fontWeight": "bold" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "50px" + }, + "type": "ia.container.flex" + }, + { + "events": { + "component": { + "onEditCellCommit": { + "config": { + "script": "\tif not self.view.custom.Enable_input:\n\t\treturn\n\tcolumn \u003d event.column\n\trow \u003d event.row\n\tself.props.data[row][column] \u003d event.value\n\trow_data \u003d self.props.data[row]\n\tsystem.perspective.print(row_data)\n\twhid \u003d self.session.custom.fc\n\ttag_path \u003d \"[%s_SCADA_TAG_PROVIDER]Configuration/PLC\"%whid\n\ttag_data \u003d system.tag.readBlocking([tag_path])[0].value\n\ttag_data \u003d system.util.jsonDecode(tag_data)\n\t\n\tdef get_child():\n\t\treturn {\n\t\t\t\"Area\":\"\",\n\t\t\t\"SubArea\":\"\"\n\t\t}\n\t\n\tchild \u003d get_child()\n\tchild[\"Area\"] \u003d row_data[\"Area\"]\n\tchild[\"SubArea\"]\u003d row_data[\"SubArea\"]\n\t\n\ttag_data[row_data[\"Device\"]]\u003d child\n\tencoded_data \u003d system.util.jsonEncode(tag_data)\n\tsystem.tag.writeBlocking([tag_path], [encoded_data])\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Table" + }, + "position": { + "basis": "286px" + }, + "propConfig": { + "custom.tagData": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]Configuration/PLC" + }, + "transforms": [ + { + "code": "\ttagData \u003d[{\"Device\":k, \"Area\":v[\"Area\"], \"SubArea\":v[\"SubArea\"]} for k,v in system.util.jsonDecode(value).items()]\n\treturn tagData", + "type": "script" + } + ], + "type": "tag" + } + }, + "props.data": { + "binding": { + "config": { + "path": "this.custom.tagData" + }, + "type": "property" + } + }, + "props.selection.data": { + "onChange": { + "enabled": null, + "script": "\tsystem.perspective.sendMessage(\"selected-plcs\", payload\u003dcurrentValue.value)" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": true, + "field": "Device", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": false, + "number": { + "condition": "", + "value": "" + }, + "string": { + "condition": "", + "value": "" + }, + "visible": "on-hover" + }, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "auto", + "nullFormat": { + "includeNullStrings": false, + "nullFormatValue": "", + "strict": false + }, + "number": "value", + "numberFormat": "0,0.##", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "auto", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "", + "fontSize": "12px" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": true, + "field": "Area", + "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": "", + "fontSize": "12px" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": true, + "field": "SubArea", + "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": "", + "fontSize": "12px" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + } + ], + "filter": { + "enabled": true + }, + "selection": { + "mode": "multiple interval" + }, + "style": { + "fontSize": "12px", + "marginLeft": "10px" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "add-device-entry", + "pageScope": false, + "script": "\tdata \u003d payload[\"data\"]\n\tself.props.data.append(data)", + "sessionScope": false, + "viewScope": true + }, + { + "messageType": "update-plc-config", + "pageScope": false, + "script": "\tdata \u003d payload[\"data\"]\n\tself.props.data \u003d data", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.display.table" + }, + { + "children": [ + { + "custom": { + "dockOpened": true + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tdevice_entry \u003d {\"Device\":\"\",\"Area\":\"\",\"SubArea\":\"\"}\n\tif not self.view.getChild(\"root\").custom.isDockOpen:\n\t\tparams \u003d {\n\t\t\t\"path\":\"Main-Views/Config-Tool/AddDevice\",\n\t\t\t\"params\":device_entry\t\n\t\t}\n\t\tsystem.perspective.sendMessage(\"select-side-view\", payload\u003dparams)\n\n\tself.custom.dockOpened \u003d self.view.getChild(\"root\").custom.isDockOpen ^ True\n" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "basis": "135px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "path": "view.custom.Enable_input" + }, + "type": "property" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/add_circle_outline" + } + }, + "primary": false, + "style": { + "marginLeft": "10px" + }, + "text": "Add Device" + }, + "type": "ia.input.button" + }, + { + "custom": { + "dataAfterRemoval": { + "ARSAW1301": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1302": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1303": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1304": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1305": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1306": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1307": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1308": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1309": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1310": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1311": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1312": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1501": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1502": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1503": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1504": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1505": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1506": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1507": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1508": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1509": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1510": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1511": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1512": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "FSC1": { + "Area": "", + "SubArea": "" + }, + "FSC10": { + "Area": "OUTBOUND", + "SubArea": "FSC" + }, + "FSC2": { + "Area": "", + "SubArea": "" + }, + "FSC_Cells": { + "Area": "", + "SubArea": "" + }, + "FSC_Induct_1-4": { + "Area": "", + "SubArea": "" + }, + "PLC01": { + "Area": "OUTBOUND", + "SubArea": "SHIP" + }, + "PLC02": { + "Area": "OUTBOUND", + "SubArea": "SHIP" + }, + "PLC03": { + "Area": "OUTBOUND", + "SubArea": "KO \u0026 REJECT" + }, + "PLC06": { + "Area": "OUTBOUND", + "SubArea": "TOTE ROUTER" + }, + "PLC07": { + "Area": "OUTBOUND", + "SubArea": "TOTE ROUTER" + }, + "PLC08": { + "Area": "OUTBOUND", + "SubArea": "TOTE FEED" + }, + "PLC09": { + "Area": "INBOUND", + "SubArea": "RECEIVING" + }, + "PLC09_Receiving2": { + "Area": "", + "SubArea": "" + }, + "PLC09_Receiving3": { + "Area": "", + "SubArea": "" + }, + "PLC1000": { + "Area": "INBOUND", + "SubArea": "RECEIVING" + }, + "PLC1000_Receiving4": { + "Area": "", + "SubArea": "" + }, + "PLC13": { + "Area": "AR FLOOR", + "SubArea": "ARSAW P2" + }, + "PLC13_SC2": { + "Area": "", + "SubArea": "" + }, + "PLC14": { + "Area": "", + "SubArea": "" + }, + "PLC15": { + "Area": "AR FLOOR", + "SubArea": "ARSAW P3" + }, + "PLC15_SC2": { + "Area": "", + "SubArea": "" + }, + "PLC16": { + "Area": "AR FLOOR", + "SubArea": "PICK TO REBIN P3" + }, + "PLC20": { + "Area": "OUTBOUND", + "SubArea": "AFE1 TOTE 1-3" + }, + "PLC20_Tote4-8": { + "Area": "", + "SubArea": "" + }, + "PLC21": { + "Area": "OUTBOUND", + "SubArea": "AFE TRAY ROUTER" + }, + "PLC22": { + "Area": "OUTBOUND", + "SubArea": "AFE TRAY ROUTER" + }, + "PLC23": { + "Area": "OUTBOUND", + "SubArea": "AFE1 TRAY FEED" + }, + "PLC24": { + "Area": "OUTBOUND", + "SubArea": "AFE1 WALL 1,2" + }, + "PLC25": { + "Area": "OUTBOUND", + "SubArea": "AFE1 WALL 3,4" + }, + "PLC26": { + "Area": "OUTBOUND", + "SubArea": "AFE1 WALL 5,6" + }, + "PLC27": { + "Area": "OUTBOUND", + "SubArea": "AFE1 WALL 7,8" + }, + "PLC30": { + "Area": "OUTBOUND", + "SubArea": "AFE1 PACK 1-4" + }, + "PLC31": { + "Area": "OUTBOUND", + "SubArea": "AFE1 PACK 5-8" + }, + "PLC32": { + "Area": "OUTBOUND", + "SubArea": "AFE1 EMP. TOTE" + }, + "PLC60": { + "Area": "OUTBOUND", + "SubArea": "S.PACKING 1" + }, + "PLC61": { + "Area": "OUTBOUND", + "SubArea": "S.PACKING 2" + }, + "PLC69": { + "Area": "OUTBOUND", + "SubArea": "GIFT WRAP" + }, + "PLC70": { + "Area": "OUTBOUND", + "SubArea": "TRANSSHIP" + }, + "PLC71": { + "Area": "OUTBOUND", + "SubArea": "TRANSSHIP" + }, + "PLC80": { + "Area": "OUTBOUND", + "SubArea": "SMART PACKING" + }, + "PLC81": { + "Area": "OUTBOUND", + "SubArea": "SMART PACKING" + }, + "PLC82": { + "Area": "OUTBOUND", + "SubArea": "SMART PACKING" + }, + "PLC97": { + "Area": "SAFETY PLC", + "SubArea": "" + }, + "PLC98": { + "Area": "SAFETY PLC", + "SubArea": "" + }, + "PLC99": { + "Area": "SAFETY PLC", + "SubArea": "" + } + }, + "itemsToRemove": [] + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t\n\twhid \u003d self.session.custom.fc\n\t\n\ttagData \u003d system.util.jsonDecode(system.tag.readBlocking([\"[%s_SCADA_TAG_PROVIDER]Configuration/PLC\"%whid])[0].value) \n\t\n\tfor item in self.custom.itemsToRemove:\n\t\tresult \u003d tagData.pop(item[\"Device\"],None)\n\t\n\tsystem.tag.writeBlocking([\"[%s_SCADA_TAG_PROVIDER]Configuration/PLC\"%whid],system.util.jsonEncode(tagData))" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_2" + }, + "position": { + "basis": "156px" + }, + "propConfig": { + "custom.tagData": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]Configuration/PLC" + }, + "transforms": [ + { + "code": "\treturn system.util.jsonDecode(value)", + "type": "script" + } + ], + "type": "tag" + } + }, + "props.enabled": { + "binding": { + "config": { + "path": "view.custom.Enable_input" + }, + "type": "property" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/remove_circle_outline" + } + }, + "primary": false, + "style": { + "marginLeft": "10px", + "marginRight": "10px" + }, + "text": "Remove Device" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "selected-plcs", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.custom.itemsToRemove \u003d payload", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t\n\ttagPath\u003d \"[%s_SCADA_TAG_PROVIDER]Configuration/PLC\"%self.session.custom.fc \n\t\t\n\tsystem.tag.writeBlocking(tagPath, \"{}\")\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_0", + "visible": false + }, + "position": { + "basis": "135px", + "display": false + }, + "props": { + "image": { + "icon": { + "path": "material/remove_circle_outline" + } + }, + "primary": false, + "style": { + "marginLeft": "10px", + "marginRight": "10px" + }, + "text": "Clear" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\n\tFileHandler.downloader.download_file(\"Device_data.csv\", self.custom.tagData, FileHandler.downloader.device_data_converter)\n" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_3" + }, + "position": { + "basis": "135px" + }, + "propConfig": { + "custom.tagData": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]Configuration/PLC" + }, + "transforms": [ + { + "code": "\ttagData \u003d[{\"Device\":k, \"Area\":v[\"Area\"], \"SubArea\":v[\"SubArea\"]} for k,v in system.util.jsonDecode(value).items()]\n\treturn tagData", + "type": "script" + } + ], + "type": "tag" + } + } + }, + "props": { + "image": { + "icon": { + "color": "#377AAE", + "path": "material/cloud_download" + } + }, + "primary": false, + "style": { + "classes": "\n" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "40px" + }, + "props": { + "style": { + "marginBottom": "10px", + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "414px" + }, + "props": { + "direction": "column", + "style": { + "borderBottomLeftRadius": "5px", + "borderBottomRightRadius": "5px", + "borderStyle": "solid", + "borderTopLeftRadius": "5px", + "borderTopRightRadius": "5px", + "margin": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "32px" + }, + "props": { + "path": "material/view_list", + "style": { + "marginLeft": "10px" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "232px" + }, + "props": { + "style": { + "marginLeft": "10px" + }, + "text": "Detailed View Mapping", + "textStyle": { + "fontFamily": "Arial", + "fontSize": "16px", + "fontWeight": "bold" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "50px" + }, + "type": "ia.container.flex" + }, + { + "events": { + "component": { + "onEditCellCommit": { + "config": { + "script": "\timport ast\n\t\n\tif not self.view.custom.Enable_input:\n\t\treturn \n\t\t\n\tdef is_valid_list(s):\n\t try:\n\t # Try to evaluate the string\n\t result \u003d ast.literal_eval(s)\n\t # Check if the result is a list\n\t return isinstance(result, list)\n\t except (ValueError, SyntaxError):\n\t # If there is a ValueError or SyntaxError, the string is not a valid list\n\t return False\n\n\tcolumn \u003d event.column\n\trow \u003d event.row\n\tself.props.data[row][column] \u003d event.value\n\trow_data \u003d self.props.data[row]\n\twhid \u003d self.session.custom.fc\n\ttag_path \u003d \"[%s_SCADA_TAG_PROVIDER]Configuration/DetailedViews\"%whid\n\ttag_data \u003d system.tag.readBlocking([tag_path])[0].value\n\ttag_data \u003d system.util.jsonDecode(tag_data)\n\t\n\tif is_valid_list(event.value):\n\t\ttag_data[row_data[\"DetailedView\"]] \u003d event.value\n\telse:\n\t\tsystem.perspective.print(\"Not a valid list \")\n\t\treturn\n\n\ttag_data \u003d system.util.jsonEncode(tag_data)\n\tsystem.tag.writeBlocking([tag_path], [tag_data])" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Table" + }, + "position": { + "basis": "302px" + }, + "propConfig": { + "custom.tagData": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]Configuration/DetailedViews" + }, + "transforms": [ + { + "code": "\tdata \u003d []\n\t\n\tdef get_item(detailed_view , devices):\n\t\treturn {\n\t\t\t\"Devices\":str(devices),\n\t\t\t\"DetailedView\":detailed_view\n\t\t\t\n\t\t}\n\t\n\tfor k,v in system.util.jsonDecode(value).items():\n\t\titem \u003d get_item(k, v)\n\t\tdata.append(item)\n\t\n\treturn data\n\t\t\n\t\t", + "type": "script" + } + ], + "type": "tag" + } + }, + "props.data": { + "binding": { + "config": { + "path": "this.custom.tagData" + }, + "type": "property" + } + }, + "props.rows.subview.viewParams.value": { + "binding": { + "config": { + "path": "this.props.selection.data" + }, + "type": "property" + } + }, + "props.selection.data": { + "onChange": { + "enabled": null, + "script": "\tsystem.perspective.sendMessage(\"selected-views\", payload\u003dcurrentValue.value)" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": true, + "field": "DetailedView", + "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": false, + "sort": "none", + "sortable": false, + "strictWidth": false, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": true, + "field": "Devices", + "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": "" + } + ], + "filter": { + "enabled": true + }, + "rows": { + "subview": { + "viewParams": { + "rowIndex": "value" + }, + "viewPath": "Main-Views/Config-Tool/TableSubView" + } + }, + "style": { + "fontSize": "12px", + "marginLeft": "10px" + } + }, + "type": "ia.display.table" + }, + { + "children": [ + { + "custom": { + "dockOpened": true + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tdevice_entry \u003d {\"view\":\"\",\"deviceList\":\"\"}\n\tif not self.view.getChild(\"root\").custom.isDockOpen:\n\t\tparams \u003d {\n\t\t\t\"path\":\"Main-Views/Config-Tool/AddDetailedViewMapping\",\n\t\t\t\"params\":device_entry\t\n\t\t}\n\t\tsystem.perspective.sendMessage(\"select-side-view\", payload\u003dparams)\n\n\t\n\tsystem.perspective.print(self.view.getChild(\"root\").custom.isDockOpen)\n\tself.custom.dockOpened \u003d self.view.getChild(\"root\").custom.isDockOpen ^ True\n\tsystem.perspective.print(self.view.getChild(\"root\").custom.isDockOpen)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "basis": "135px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "path": "view.custom.Enable_input" + }, + "type": "property" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/add_circle_outline" + } + }, + "primary": false, + "style": { + "marginLeft": "10px" + }, + "text": "Add View" + }, + "type": "ia.input.button" + }, + { + "custom": { + "dataAfterRemoval": { + "ARSAW1301": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1302": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1303": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1304": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1305": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1306": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1307": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1308": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1309": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1310": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1311": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1312": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1501": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1502": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1503": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1504": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1505": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1506": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1507": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1508": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1509": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1510": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1511": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "ARSAW1512": { + "Area": "AR FLOOR", + "SubArea": "ARSAW" + }, + "FSC1": { + "Area": "", + "SubArea": "" + }, + "FSC10": { + "Area": "OUTBOUND", + "SubArea": "FSC" + }, + "FSC2": { + "Area": "", + "SubArea": "" + }, + "FSC_Cells": { + "Area": "", + "SubArea": "" + }, + "FSC_Induct_1-4": { + "Area": "", + "SubArea": "" + }, + "PLC01": { + "Area": "OUTBOUND", + "SubArea": "SHIP" + }, + "PLC02": { + "Area": "OUTBOUND", + "SubArea": "SHIP" + }, + "PLC03": { + "Area": "OUTBOUND", + "SubArea": "KO \u0026 REJECT" + }, + "PLC06": { + "Area": "OUTBOUND", + "SubArea": "TOTE ROUTER" + }, + "PLC07": { + "Area": "OUTBOUND", + "SubArea": "TOTE ROUTER" + }, + "PLC08": { + "Area": "OUTBOUND", + "SubArea": "TOTE FEED" + }, + "PLC09": { + "Area": "INBOUND", + "SubArea": "RECEIVING" + }, + "PLC09_Receiving2": { + "Area": "", + "SubArea": "" + }, + "PLC09_Receiving3": { + "Area": "", + "SubArea": "" + }, + "PLC1000": { + "Area": "INBOUND", + "SubArea": "RECEIVING" + }, + "PLC1000_Receiving4": { + "Area": "", + "SubArea": "" + }, + "PLC13": { + "Area": "AR FLOOR", + "SubArea": "ARSAW P2" + }, + "PLC13_SC2": { + "Area": "", + "SubArea": "" + }, + "PLC14": { + "Area": "", + "SubArea": "" + }, + "PLC15": { + "Area": "AR FLOOR", + "SubArea": "ARSAW P3" + }, + "PLC15_SC2": { + "Area": "", + "SubArea": "" + }, + "PLC16": { + "Area": "AR FLOOR", + "SubArea": "PICK TO REBIN P3" + }, + "PLC20": { + "Area": "OUTBOUND", + "SubArea": "AFE1 TOTE 1-3" + }, + "PLC20_Tote4-8": { + "Area": "", + "SubArea": "" + }, + "PLC21": { + "Area": "OUTBOUND", + "SubArea": "AFE TRAY ROUTER" + }, + "PLC22": { + "Area": "OUTBOUND", + "SubArea": "AFE TRAY ROUTER" + }, + "PLC23": { + "Area": "OUTBOUND", + "SubArea": "AFE1 TRAY FEED" + }, + "PLC24": { + "Area": "OUTBOUND", + "SubArea": "AFE1 WALL 1,2" + }, + "PLC25": { + "Area": "OUTBOUND", + "SubArea": "AFE1 WALL 3,4" + }, + "PLC26": { + "Area": "OUTBOUND", + "SubArea": "AFE1 WALL 5,6" + }, + "PLC27": { + "Area": "OUTBOUND", + "SubArea": "AFE1 WALL 7,8" + }, + "PLC30": { + "Area": "OUTBOUND", + "SubArea": "AFE1 PACK 1-4" + }, + "PLC31": { + "Area": "OUTBOUND", + "SubArea": "AFE1 PACK 5-8" + }, + "PLC32": { + "Area": "OUTBOUND", + "SubArea": "AFE1 EMP. TOTE" + }, + "PLC60": { + "Area": "OUTBOUND", + "SubArea": "S.PACKING 1" + }, + "PLC61": { + "Area": "OUTBOUND", + "SubArea": "S.PACKING 2" + }, + "PLC69": { + "Area": "OUTBOUND", + "SubArea": "GIFT WRAP" + }, + "PLC70": { + "Area": "OUTBOUND", + "SubArea": "TRANSSHIP" + }, + "PLC71": { + "Area": "OUTBOUND", + "SubArea": "TRANSSHIP" + }, + "PLC80": { + "Area": "OUTBOUND", + "SubArea": "SMART PACKING" + }, + "PLC81": { + "Area": "OUTBOUND", + "SubArea": "SMART PACKING" + }, + "PLC82": { + "Area": "OUTBOUND", + "SubArea": "SMART PACKING" + }, + "PLC97": { + "Area": "SAFETY PLC", + "SubArea": "" + }, + "PLC98": { + "Area": "SAFETY PLC", + "SubArea": "" + }, + "PLC99": { + "Area": "SAFETY PLC", + "SubArea": "" + } + }, + "itemsToRemove": [] + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t\n\twhid \u003d self.session.custom.fc\n\t\n\ttagData \u003d system.util.jsonDecode(system.tag.readBlocking([\"[%s_SCADA_TAG_PROVIDER]Configuration/DetailedViews\"%whid])[0].value) \n\t\n\tfor item in self.custom.itemsToRemove:\n\t\tresult \u003d tagData.pop(item[\"DetailedView\"],None)\n\t\n\tsystem.tag.writeBlocking([\"[%s_SCADA_TAG_PROVIDER]Configuration/DetailedViews\"%whid],system.util.jsonEncode(tagData))" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_2" + }, + "position": { + "basis": "156px" + }, + "propConfig": { + "custom.tagData": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]Configuration/PLC" + }, + "transforms": [ + { + "code": "\treturn system.util.jsonDecode(value)", + "type": "script" + } + ], + "type": "tag" + } + }, + "props.enabled": { + "binding": { + "config": { + "path": "view.custom.Enable_input" + }, + "type": "property" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/remove_circle_outline" + } + }, + "primary": false, + "style": { + "marginLeft": "10px", + "marginRight": "10px" + }, + "text": "Remove View" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "selected-views", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.custom.itemsToRemove \u003d payload", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\twhid \u003d self.session.custom.fc\n\tsystem.tag.writeBlocking([\"[%s_SCADA_TAG_PROVIDER]Configuration/DetailedViews\"%whid], [\"{}\"])" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_0", + "visible": false + }, + "position": { + "basis": "135px", + "display": false + }, + "props": { + "image": { + "icon": { + "path": "material/remove_circle_outline" + } + }, + "primary": false, + "style": { + "marginLeft": "10px" + }, + "text": "Clear" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t\n\tFileHandler.downloader.download_file(\"DetailedView_data.csv\", self.custom.tagData, FileHandler.downloader.detailed_views_converter)\n" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_1" + }, + "position": { + "basis": "135px" + }, + "propConfig": { + "custom.tagData": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]Configuration/DetailedViews" + }, + "transforms": [ + { + "code": "\treturn [{\"DetailedView\":k,\"Devices\":v}for k,v in system.util.jsonDecode(value).items()]", + "type": "script" + } + ], + "type": "tag" + } + } + }, + "props": { + "image": { + "icon": { + "color": "#377AAE", + "path": "material/cloud_download" + } + }, + "primary": false, + "style": { + "classes": "\n" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "40px" + }, + "props": { + "style": { + "marginBottom": "10px", + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "414px" + }, + "props": { + "direction": "column", + "style": { + "borderBottomLeftRadius": "5px", + "borderBottomRightRadius": "5px", + "borderStyle": "solid", + "borderTopLeftRadius": "5px", + "borderTopRightRadius": "5px", + "margin": "10px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "888px", + "grow": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "custom": { + "params": { + "Area": "", + "Device": "", + "SubArea": "" + }, + "path": "Main-Views/Config-Tool/TagViewer" + }, + "meta": { + "name": "EmbeddedView" + }, + "position": { + "basis": "320px", + "grow": 1 + }, + "propConfig": { + "props.params.params": { + "binding": { + "config": { + "path": "this.custom.params" + }, + "type": "property" + } + }, + "props.path": { + "binding": { + "config": { + "path": "this.custom.path" + }, + "type": "property" + } + } + }, + "props": { + "useDefaultViewWidth": true + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "select-side-view", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.custom.path \u003d payload.get(\"path\")\n\tself.custom.params \u003d payload.get(\"params\")\n\t", + "sessionScope": true, + "viewScope": false + } + ] + }, + "type": "ia.display.view" + } + ], + "custom": { + "path": "Main-Views/Config-Tool/TagViewer" + }, + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "420px" + }, + "props": { + "direction": "column" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "select-side-view", + "pageScope": true, + "script": "\t# implement your handler here\n\tif self.position.display and payload.get(\"path\") \u003d\u003d self.custom.path :\n\t\tself.position.display \u003d False\n\telse:\n\t\tself.position.display \u003d True\n\t\t\n\tself.custom.path \u003d payload.get(\"path\")\n\n#\tself.position.display \u003d not self.position.display", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.container.flex" + } + ], + "custom": { + "isDockOpen": false + }, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\twhid \u003d self.session.custom.fc\n\ttag_path \u003d \"[%s_SCADA_TAG_PROVIDER]Configuration/PLC\" % (whid)\n\t\n\tif system.tag.exists(tag_path):\n\t\tpayload \u003d {}\n\t\ttag_to_read \u003d system.tag.readBlocking([tag_path])[0].value\n\t\tjson_value \u003d system.util.jsonDecode(tag_to_read)\n\t\tplc_config \u003d []\n\t\tfor k,v in json_value.items():\n\t\t\tplc \u003d k\n\t\t\tarea \u003d v.get(\"Area\")\n\t\t\tsub_area \u003d v.get(\"SubArea\")\n\t\t\titems_to_add \u003d {\"Device\":plc, \n\t\t\t\t\t\t\t\"Area\":area, \n\t\t\t\t\t\t\t\"SubArea\":sub_area}\n\t\t\tplc_config.append(items_to_add)\n\t\tpayload[\"data\"] \u003d plc_config\n\t\tsystem.perspective.sendMessage(\"update-plc-config\", payload, scope \u003d \"view\")\n\t\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root" + }, + "scripts": { + "customMethods": [ + { + "name": "newMethod", + "params": [], + "script": "\t# implement your method here" + } + ], + "extensionFunctions": null, + "messageHandlers": [] + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/3accd52b8292fb20b1b73347ace3e588941afd07466a7e3640a901c3b301b639 b/.resources/3accd52b8292fb20b1b73347ace3e588941afd07466a7e3640a901c3b301b639 new file mode 100644 index 0000000..79e3b5d --- /dev/null +++ b/.resources/3accd52b8292fb20b1b73347ace3e588941afd07466a7e3640a901c3b301b639 @@ -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/.resources/3c78ab939d40b94a06dbbbde600018a7d9c850998ea62dd867f6ecbe3ba78299 b/.resources/3c78ab939d40b94a06dbbbde600018a7d9c850998ea62dd867f6ecbe3ba78299 new file mode 100644 index 0000000..3f0cd71 --- /dev/null +++ b/.resources/3c78ab939d40b94a06dbbbde600018a7d9c850998ea62dd867f6ecbe3ba78299 @@ -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/.resources/3e272246cdb301f8b5b5f0bfb9984738f70b26cab08de1434322ab859e124d25 b/.resources/3e272246cdb301f8b5b5f0bfb9984738f70b26cab08de1434322ab859e124d25 new file mode 100644 index 0000000..030be53 --- /dev/null +++ b/.resources/3e272246cdb301f8b5b5f0bfb9984738f70b26cab08de1434322ab859e124d25 @@ -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/.resources/3fc26b8576cccec41d223f2c5edf93ecaa98e70c92d329e785a337234e25c0a3 b/.resources/3fc26b8576cccec41d223f2c5edf93ecaa98e70c92d329e785a337234e25c0a3 new file mode 100644 index 0000000..3c9a383 --- /dev/null +++ b/.resources/3fc26b8576cccec41d223f2c5edf93ecaa98e70c92d329e785a337234e25c0a3 @@ -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/.resources/416f484acb7c2bb270e44620e7c017c70b50412f196b674e6a3e0f2d8fa96394 b/.resources/416f484acb7c2bb270e44620e7c017c70b50412f196b674e6a3e0f2d8fa96394 new file mode 100644 index 0000000..8aa1a0f --- /dev/null +++ b/.resources/416f484acb7c2bb270e44620e7c017c70b50412f196b674e6a3e0f2d8fa96394 @@ -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/.resources/41d31bd4f2c0d3b7560a4ca4e34dc3084c281851659c09bb6b07ea9990a9489c b/.resources/41d31bd4f2c0d3b7560a4ca4e34dc3084c281851659c09bb6b07ea9990a9489c new file mode 100644 index 0000000000000000000000000000000000000000..20459a2ffc0d48833b25aace77316c2fec5f1485 GIT binary patch literal 68531 zcmeFYbx<7L*De}7SP1SAEO?Lv2=4Cg4nYS91RE@Pa0vDS!QFKRhX6q*KyY_wa2Q<9 zkoWhU`p&6)Pu2PJR^6^ZRhsVJz1LcM?Popf=?FCyS!@h4j2ACnV9U!%X}oxW1b*=X z5$`1`{LJ+W&B+%pzP^x`64&xFIaosZLNK#{dJ?m$v&h`55QQ?c-Ww@7M%xP_2w&G( zMPg}40?S1?ys-@mSw#*)_VmO?S9v+gcf6EoT|Z~dSFEZF|XrO(KBCFl= z6PC@fP)L)DDAvw#SeduOPQw;42sRBFU3}HG6)&q-f5ir->@3^1PJ3_de(Y)_YdyMx z*_%-AS?jg%na8>P5n$chN_7RW*4I^^nPY{tM7E5W=uc};x?c{}RpnLH>!!F9x@Wf6 zRg{-N50b5orHyT>*`O@@0zUswxAYaYaFbvP{Tg$)ayi>Z;-U7o!TEfv^Q}w@>K^-U z6JWiv(-b=-V1Ln=?3caKQThM=r2m`2=VrBZ!xHEFh^d9T?fKL2XD08N0dsZ$%g;LH z4XdmMC{Cie+pw+mNr2^?w!z$sLkX?91(g)|8whCXlz){r$nVsgyW+2c&ysZqQdjkZ z1JdH!!3G_=`9Ggj1=HD^ zn7*?Tbel^&R=@O%y-TSp2UGg()E&DSg~M$)l4@)YyA{ZsI~qykRKw`TgL{eV{^cS)K$P- z4Xv>`B#-Hg&d+jXvKxCFmdPOVKjDA16oy{|zk(+P6bQes5BU5DYkh}lYwW8d(HFRX z4|OAJuai}TZ~q?aEU1RGe~-us632+YCz(_%YZz#6(H2`haXgQg8E$7<1D^boIs+8z zmRq9hH&+s1kMIkTgV}M_u@ax+Mg49Gs!coJ-s<|m_6a2%w+kHYveL6W_XvA6ZJ;zo^W(f^K!OT<3mDo?*T@icC zf=-qOlfM5{LhVW=3?wM@)b3E^T97!O5|b|*7ldCNaQ9_vi135MG?sCzM=!`>=Hz5e@_Yd0hL1)vex}M469)(9 zmni`?6`#=RX9c%y_6FFgv%|vn`A-{Z5zU_Oq;Sg*kiqSl5GBu%yr{|A6UQ)__3^XB zL-ErVB(VLs4Q`0?WF+CKTsNwXN=q&7lF;eOskZxY5ndHs+&;ClTUds5H686_ z-OH%Z+u%U9RM~$z3{zq_lamjX8KyjNaf!(H92x*CjyBB_qAB2IV5XhxV_OV_ZFJCg zdAri_VD!tYl)LW^6LSL257*UJ?XaPzp9P{~ENpC8hw~s!$>TyaT`HnNQFMNdn#|JB zsl=j_mM8f9$K4=iic(U}J@DU~7Pp+6+`53@v$F*kIGHo;dGaC0;f-YzyEzHIi;U>Ee? zTFyAkUhDzK_|MkZkyiz^q#Q4r!g11FVdybkc&BAmOuh{*=7O-fpIKR5w3Foh>6$bNSXfyNJmf54tmJ zQpK(!AFXD?(b_OI?hqm0p1SJO(HVapcnjJnBcqF>tfmO#IM-SPr)>XzLA?`+0c zDaaXbaAk|QEcru&}`U8*Y1DIwrxis?o{J9w>&SpIEa;{}fJ!vsg7` zw+tqsn3^kDa)2r>zggQu%Y9Pwj7BEq;_2B%Y5>`w=J|=9>L!TfmYK#4{p6?@*V7{P~_53f?tL1~xNiLJnPA%aS+|jCh zMG&oACJn2`Th*B9{1mag?-#Z*S8b|}KO%xi6KU4aNaN|V5PH*9`yh

YQmmJT=(n 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. + + 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/.resources/4fef3d35477dce7ea49dd22282c5f5f35b87a14c7b69bc0e77d3b5e431b2404d b/.resources/4fef3d35477dce7ea49dd22282c5f5f35b87a14c7b69bc0e77d3b5e431b2404d new file mode 100644 index 0000000..113bd45 --- /dev/null +++ b/.resources/4fef3d35477dce7ea49dd22282c5f5f35b87a14c7b69bc0e77d3b5e431b2404d @@ -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/.resources/52a803e7dbe79a31a2e4c178180e4a1ae337e27542c023b8a1aa887e691a6a4f b/.resources/52a803e7dbe79a31a2e4c178180e4a1ae337e27542c023b8a1aa887e691a6a4f new file mode 100644 index 0000000..7841930 --- /dev/null +++ b/.resources/52a803e7dbe79a31a2e4c178180e4a1ae337e27542c023b8a1aa887e691a6a4f @@ -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/.resources/52c94ff315f93f8e443d975953dfe4ce1d62f8529ec9fe361980e756b18e7334 b/.resources/52c94ff315f93f8e443d975953dfe4ce1d62f8529ec9fe361980e756b18e7334 new file mode 100644 index 0000000..078717c --- /dev/null +++ b/.resources/52c94ff315f93f8e443d975953dfe4ce1d62f8529ec9fe361980e756b18e7334 @@ -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/.resources/534a3270419edec362e021e66bdf36e333dbb842c25afd4b0e46dbd1275e4b86 b/.resources/534a3270419edec362e021e66bdf36e333dbb842c25afd4b0e46dbd1275e4b86 new file mode 100644 index 0000000..ec5ac7b --- /dev/null +++ b/.resources/534a3270419edec362e021e66bdf36e333dbb842c25afd4b0e46dbd1275e4b86 @@ -0,0 +1,1808 @@ +{ + "custom": { + "PLCs": "{\n \"FSC1\": [\"FSC1\"],\n \"FSC2\": [\"FSC2\"],\n \"FSC_Cells\": [\"FSC_Cells\"],\n \"FSC_Induct_1-4\": [\"FSC_Induct_1-4\"],\n \"FSC_Induct_5-8\": [\"FSC10\"],\n \"PLC01\": [\"PLC01\"],\n \"PLC02\": [\n \"PLC02\",\n \"PLC98\"\n ],\n \"PLC03\": [\"PLC03\"],\n \"PLC06\": [\n \"PLC06\",\n \"PLC07\"\n ],\n \"PLC08\": [\n \"PLC08\",\n \"PLC99\"\n ],\n \"PLC09\": [\"PLC09\"],\n \"PLC09_Receiving2\": [\"PLC09_Receiving2\"],\n \"PLC09_Receiving3\": [\"PLC09_Receiving3\"],\n \"PLC1000\": [\"PLC1000\"],\n \"PLC1000_Receiving4\": [\"PLC1000_Receiving4\"],\n \"PLC1301\": [\"ARSAW1301\"],\n \"PLC1302\": [\"ARSAW1302\"],\n \"PLC1303\": [\"ARSAW1303\"],\n \"PLC1304\": [\"ARSAW1304\"],\n \"PLC1305\": [\"ARSAW1305\"],\n \"PLC1306\": [\"ARSAW1306\"],\n \"PLC1307\": [\"ARSAW1307\"],\n \"PLC1308\": [\"ARSAW1308\"],\n \"PLC1309\": [\"ARSAW1309\"],\n \"PLC1310\": [\"ARSAW1310\"],\n \"PLC1311\": [\"ARSAW1311\"],\n \"PLC1312\": [\"ARSAW1312\"],\n \"PLC13_SC1\": [\"PLC13\"],\n \"PLC13_SC2\": [\"PLC13_SC2\"],\n \"PLC14\": [\"PLC14\"],\n \"PLC1501\": [\"ARSAW1501\"],\n \"PLC1502\": [\"ARSAW1502\"],\n \"PLC1503\": [\"ARSAW1503\"],\n \"PLC1504\": [\"ARSAW1504\"],\n \"PLC1505\": [\"ARSAW1505\"],\n \"PLC1506\": [\"ARSAW1506\"],\n \"PLC1507\": [\"ARSAW1507\"],\n \"PLC1508\": [\"ARSAW1508\"],\n \"PLC1509\": [\"ARSAW1509\"],\n \"PLC1510\": [\"ARSAW1510\"],\n \"PLC1511\": [\"ARSAW1511\"],\n \"PLC1512\": [\"ARSAW1512\"],\n \"PLC15_SC1\": [\"PLC15\"],\n \"PLC15_SC2\": [\"PLC15_SC2\"],\n \"PLC16\": [\"PLC16\"],\n \"PLC20_Tote1-3\": [\"PLC20\"],\n \"PLC20_Tote4-8\": [\"PLC20_Tote4-8\"],\n \"PLC21_22\": [\n \"PLC21\",\n \"PLC22\"\n ],\n \"PLC23\": [\"PLC23\"],\n \"PLC24\": [\n \"PLC24\",\n \"PLC97\"\n ],\n \"PLC25\": [\"PLC25\"],\n \"PLC26\": [\"PLC26\"],\n \"PLC27\": [\"PLC27\"],\n \"PLC30\": [\"PLC30\"],\n \"PLC31\": [\"PLC31\"],\n \"PLC32\": [\"PLC32\"],\n \"PLC60\": [\"PLC60\"],\n \"PLC61\": [\"PLC61\"],\n \"PLC69\": [\"PLC69\"],\n \"PLC70\": [\n \"PLC70\",\n \"PLC71\"\n ],\n \"PLC80_81_82\": [\n \"PLC80\",\n \"PLC81\",\n \"PLC82\"\n ]\n}", + "activityLogger": { + "alt_pageid": "command_control", + "start_time": { + "$": [ + "ts", + 192, + 1715227222179 + ], + "$ts": 1715227222179 + } + }, + "devices": { + "ARSAW1301": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1301", + "tagProps": [ + "ARSAW1301", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1302": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1302", + "tagProps": [ + "ARSAW1302", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1303": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1303", + "tagProps": [ + "ARSAW1303", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1304": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1304", + "tagProps": [ + "ARSAW1304", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1305": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1305", + "tagProps": [ + "ARSAW1305", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1306": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1306", + "tagProps": [ + "ARSAW1306", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1307": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1307", + "tagProps": [ + "ARSAW1307", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1308": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1308", + "tagProps": [ + "ARSAW1308", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1309": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1309", + "tagProps": [ + "ARSAW1309", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1310": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1310", + "tagProps": [ + "ARSAW1310", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1311": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1311", + "tagProps": [ + "ARSAW1311", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1312": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1312", + "tagProps": [ + "ARSAW1312", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1501": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1501", + "tagProps": [ + "ARSAW1501", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1502": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1502", + "tagProps": [ + "ARSAW1502", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1503": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1503", + "tagProps": [ + "ARSAW1503", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1504": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1504", + "tagProps": [ + "ARSAW1504", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1505": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1505", + "tagProps": [ + "ARSAW1505", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1506": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1506", + "tagProps": [ + "ARSAW1506", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1507": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1507", + "tagProps": [ + "ARSAW1507", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1508": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1508", + "tagProps": [ + "ARSAW1508", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1509": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1509", + "tagProps": [ + "ARSAW1509", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1510": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1510", + "tagProps": [ + "ARSAW1510", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1511": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1511", + "tagProps": [ + "ARSAW1511", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "ARSAW1512": { + "area": "AR FLOOR/ARSAW\r\r", + "name": "ARSAW1512", + "tagProps": [ + "ARSAW1512", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "FSC1": { + "area": "/\r\r", + "name": "FSC1", + "tagProps": [ + "FSC1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "FSC10": { + "area": "OUTBOUND/FSC\r\r", + "name": "FSC10", + "tagProps": [ + "FSC10", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "FSC2": { + "area": "/\r\r", + "name": "FSC2", + "tagProps": [ + "FSC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "FSC_Cells": { + "area": "/\r\r", + "name": "FSC_Cells", + "tagProps": [ + "FSC_Cells", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "FSC_Induct_1-4": { + "area": "/\r\r", + "name": "FSC_Induct_1-4", + "tagProps": [ + "FSC_Induct_1-4", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC01": { + "area": "OUTBOUND/SHIP\r\r", + "name": "PLC01", + "tagProps": [ + "PLC01", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC02": { + "area": "OUTBOUND/SHIP\r\r", + "name": "PLC02", + "tagProps": [ + "PLC02", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC03": { + "area": "OUTBOUND/KO \u0026 REJECT\r\r", + "name": "PLC03", + "tagProps": [ + "PLC03", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC06": { + "area": "OUTBOUND/TOTE ROUTER\r\r", + "name": "PLC06", + "tagProps": [ + "PLC06", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC07": { + "area": "OUTBOUND/TOTE ROUTER\r\r", + "name": "PLC07", + "tagProps": [ + "PLC07", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC08": { + "area": "OUTBOUND/TOTE FEED\r\r", + "name": "PLC08", + "tagProps": [ + "PLC08", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC09": { + "area": "INBOUND/RECEIVING\r\r", + "name": "PLC09", + "tagProps": [ + "PLC09", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC09_Receiving2": { + "area": "/\r\r", + "name": "PLC09_Receiving2", + "tagProps": [ + "PLC09_Receiving2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC09_Receiving3": { + "area": "/\r\r", + "name": "PLC09_Receiving3", + "tagProps": [ + "PLC09_Receiving3", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC1000": { + "area": "INBOUND/RECEIVING\r\r", + "name": "PLC1000", + "tagProps": [ + "PLC1000", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC1000_Receiving4": { + "area": "/\r\r", + "name": "PLC1000_Receiving4", + "tagProps": [ + "PLC1000_Receiving4", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC13": { + "area": "AR FLOOR/ARSAW P2\r\r", + "name": "PLC13", + "tagProps": [ + "PLC13", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC13_SC2": { + "area": "/\r\r", + "name": "PLC13_SC2", + "tagProps": [ + "PLC13_SC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC14": { + "area": "/\r\r", + "name": "PLC14", + "tagProps": [ + "PLC14", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC15": { + "area": "AR FLOOR/ARSAW P3\r\r", + "name": "PLC15", + "tagProps": [ + "PLC15", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC15_SC2": { + "area": "/\r\r", + "name": "PLC15_SC2", + "tagProps": [ + "PLC15_SC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC16": { + "area": "AR FLOOR/PICK TO REBIN P3\r\r", + "name": "PLC16", + "tagProps": [ + "PLC16", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC20": { + "area": "OUTBOUND/AFE1 TOTE 1-3\r\r", + "name": "PLC20", + "tagProps": [ + "PLC20", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC20_Tote4-8": { + "area": "/\r\r", + "name": "PLC20_Tote4-8", + "tagProps": [ + "PLC20_Tote4-8", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC21": { + "area": "OUTBOUND/AFE TRAY ROUTER\r\r", + "name": "PLC21", + "tagProps": [ + "PLC21", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC22": { + "area": "OUTBOUND/AFE TRAY ROUTER\r\r", + "name": "PLC22", + "tagProps": [ + "PLC22", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC23": { + "area": "OUTBOUND/AFE1 TRAY FEED\r\r", + "name": "PLC23", + "tagProps": [ + "PLC23", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC24": { + "area": "OUTBOUND/AFE1 WALL 1-2\r\r", + "name": "PLC24", + "tagProps": [ + "PLC24", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC25": { + "area": "OUTBOUND/AFE1 WALL 3-4\r\r", + "name": "PLC25", + "tagProps": [ + "PLC25", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC26": { + "area": "OUTBOUND/AFE1 WALL 5-6\r\r", + "name": "PLC26", + "tagProps": [ + "PLC26", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC27": { + "area": "OUTBOUND/AFE1 WALL 7-8\r\r", + "name": "PLC27", + "tagProps": [ + "PLC27", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC30": { + "area": "OUTBOUND/AFE1 PACK 1-4\r\r", + "name": "PLC30", + "tagProps": [ + "PLC30", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC31": { + "area": "OUTBOUND/AFE1 PACK 5-8\r\r", + "name": "PLC31", + "tagProps": [ + "PLC31", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC32": { + "area": "OUTBOUND/AFE1 EMP. TOTE\r\r", + "name": "PLC32", + "tagProps": [ + "PLC32", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC60": { + "area": "OUTBOUND/S.PACKING 1\r\r", + "name": "PLC60", + "tagProps": [ + "PLC60", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC61": { + "area": "OUTBOUND/S.PACKING 2\r\r", + "name": "PLC61", + "tagProps": [ + "PLC61", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC69": { + "area": "OUTBOUND/GIFT WRAP\r\r", + "name": "PLC69", + "tagProps": [ + "PLC69", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC70": { + "area": "OUTBOUND/TRANSSHIP\r\r", + "name": "PLC70", + "tagProps": [ + "PLC70", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC71": { + "area": "OUTBOUND/TRANSSHIP\r\r", + "name": "PLC71", + "tagProps": [ + "PLC71", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC80": { + "area": "OUTBOUND/SMART PACKING\r\r", + "name": "PLC80", + "tagProps": [ + "PLC80", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC81": { + "area": "OUTBOUND/SMART PACKING\r\r", + "name": "PLC81", + "tagProps": [ + "PLC81", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC82": { + "area": "OUTBOUND/SMART PACKING\r\r", + "name": "PLC82", + "tagProps": [ + "PLC82", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC97": { + "area": "SAFETY PLC/\r\r", + "name": "PLC97", + "tagProps": [ + "PLC97", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC98": { + "area": "SAFETY PLC/\r\r", + "name": "PLC98", + "tagProps": [ + "PLC98", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "PLC99": { + "area": "SAFETY PLC/\r\r", + "name": "PLC99", + "tagProps": [ + "PLC99", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + } + } + }, + "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": { + "page_name": "Command and Control" + }, + "propConfig": { + "custom.PLCs": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]Configuration/DetailedViews" + }, + "type": "tag" + }, + "persistent": true + }, + "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.devices": { + "binding": { + "config": { + "path": "view.custom.PLCs" + }, + "transforms": [ + { + "code": "\tdevices \u003d system.util.jsonDecode(value)\n\tPLCs \u003d {}\n\tfc \u003d self.session.custom.fc\n\tconfig \u003d system.tag.readBlocking(\u0027[\u0027 + fc + \u0027_SCADA_TAG_PROVIDER]\u0027 + \u0027/Configuration/PLC\u0027)[0].value\n\t\n\tif devices:\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\tdecode \u003d system.util.jsonDecode(config)\n\t\t\t\tif decode:\n\t\t\t\t\tarea \u003d decode[i][\"Area\"]\n\t\t\t\t\tsub_area \u003d decode[i][\"SubArea\"]\n\t\t\t\t\tarea_label \u003d str(area) + \"/\" + str(sub_area) if sub_area else str(area)\n\t\t\t\telse:\n\t\t\t\t\tarea \u003d \"\"\n\t\t\t\t\tarea_label \u003d \"\"\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\tPLCs[i] \u003d {\u0027name\u0027:i,\u0027area\u0027:area_label,\u0027tagProps\u0027:[\n\t\t\t\t\t\t\t\t i,\n\t\t\t\t\t\t\t\t \"value\",\n\t\t\t\t\t\t\t\t \"value\",\n\t\t\t\t\t\t\t\t \"value\",\n\t\t\t\t\t\t\t\t \"value\",\n\t\t\t\t\t\t\t\t \"value\",\n\t\t\t\t\t\t\t\t \"value\",\n\t\t\t\t\t\t\t\t \"value\",\n\t\t\t\t\t\t\t\t \"value\",\n\t\t\t\t\t\t\t\t \"value\"\n\t\t\t\t\t\t\t\t ]}\n\t\n\treturn PLCs", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "params.page_name": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "300px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "session.custom.command_auth.enabled" + }, + "type": "property" + } + }, + "props.text": { + "binding": { + "config": { + "expression": "\u0027Control Enabled Timeout: \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": 15, + "marginTop": 15 + } + }, + "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 + } + }, + "position": { + "basis": "175px" + }, + "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": 15, + "marginRight": 5, + "marginTop": 15 + } + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "70px", + "shrink": 0 + }, + "props": { + "justify": "flex-end" + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Table" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "props.data": { + "binding": { + "config": { + "path": "view.custom.devices" + }, + "transforms": [ + { + "code": "\tresults \u003d []\n\tfor row, val in value.items():\n\t\tresults.append({\"plc\": val[\"name\"], \"area\": val[\"area\"],\"status\": {\"tagProps\":val[\"tagProps\"]},\"alarms\": {\"tagProps\":val[\"tagProps\"]},\"actions\": {\"tagProps\":val[\"tagProps\"]}})\n\t\n\tresults.sort(key\u003dlambda item: item[\u0027plc\u0027])\n\treturn results", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "cells": { + "style": { + "borderColor": "#4A4A4A", + "borderStyle": "solid", + "borderWidth": 1, + "fontFamily": "Arial", + "fontSize": 14, + "fontWeight": "bold", + "paddingLeft": 16, + "paddingRight": 16 + } + }, + "columns": [ + { + "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": { + "borderColor": "#4A4A4A", + "borderStyle": "solid", + "borderWidth": 1, + "classes": "", + "color": "#4A4A4A", + "fontFamily": "Arial", + "fontSize": 14, + "fontWeight": "bold", + "paddingLeft": 11, + "paddingRight": 11 + }, + "title": "PLC" + }, + "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": 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": "area", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "borderColor": "#4A4A4A", + "borderStyle": "solid", + "borderWidth": 1, + "classes": "", + "color": "#4A4A4A", + "fontFamily": "Arial", + "fontSize": 14, + "fontWeight": "bold", + "paddingLeft": 11, + "paddingRight": 11 + }, + "title": "Area" + }, + "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": 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": "status", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "borderColor": "#4A4A4A", + "borderStyle": "solid", + "borderWidth": 1, + "classes": "", + "color": "#4A4A4A", + "fontFamily": "Arial", + "fontSize": 14, + "fontWeight": "bold", + "paddingLeft": 11, + "paddingRight": 11 + }, + "title": "Status" + }, + "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": "Symbol-Views/Controller-Views/CommandControlStatus", + "visible": true, + "width": 75 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "alarms", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "borderColor": "#4A4A4A", + "borderStyle": "solid", + "borderWidth": 1, + "classes": "", + "color": "#4A4A4A", + "fontFamily": "Arial", + "fontSize": 14, + "fontWeight": "bold", + "paddingLeft": 11, + "paddingRight": 11 + }, + "title": "Active Alarms" + }, + "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": "Symbol-Views/Controller-Views/CommandControlAlarms", + "visible": true, + "width": "auto" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "actions", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "borderColor": "#4A4A4A", + "borderStyle": "solid", + "borderWidth": 1, + "classes": "", + "color": "#4A4A4A", + "fontFamily": "Arial", + "fontSize": 14, + "fontWeight": "bold", + "paddingLeft": 11, + "paddingRight": 11 + }, + "title": "Controls" + }, + "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": false, + "sort": "none", + "sortable": false, + "strictWidth": false, + "style": { + "classes": "", + "textAlign": "center" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "Symbol-Views/Controller-Views/CommandControlActions", + "visible": true, + "width": "auto" + } + ], + "dragOrderable": false, + "pager": { + "initialOption": 50 + }, + "rows": { + "height": 44, + "highlight": { + "color": "#EEEEEE" + }, + "striped": { + "enabled": false + }, + "style": { + "backgroundColor": "#FFFFFF", + "borderColor": "#4A4A4A", + "borderStyle": "none", + "borderWidth": 1, + "classes": "Fonts/BodyText14", + "color": "#4A4A4A" + } + }, + "selection": { + "enableRowSelection": false + }, + "style": { + "borderStyle": "none", + "margin": 5, + "overflow": "hidden", + "overflowX": "hidden", + "overflowY": "hidden" + }, + "virtualized": false + }, + "type": "ia.display.table" + } + ], + "custom": { + "Devices": [], + "count": "value", + "delay": 4000 + }, + "events": { + "system": { + "onShutdown": [ + { + "config": { + "script": "\tself.session.custom.command_auth.enabled \u003d False" + }, + "scope": "G", + "type": "script" + }, + { + "config": { + "script": "\twhid \u003d self.session.custom.fc\n\tsession_id \u003d self.session.props.id\n\tpage_id \u003d self.view.params.page_name\n\tCommands.analytics.send_page_details(whid, session_id, page_id)" + }, + "scope": "G", + "type": "script" + } + ] + } + }, + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/53daed53ca82ef50c0d1a825743d1e72f4eb1aef7c93d2dcf834118f3e44094c b/.resources/53daed53ca82ef50c0d1a825743d1e72f4eb1aef7c93d2dcf834118f3e44094c new file mode 100644 index 0000000..6091991 --- /dev/null +++ b/.resources/53daed53ca82ef50c0d1a825743d1e72f4eb1aef7c93d2dcf834118f3e44094c @@ -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/.resources/545b8b1b41e1010ab5ae392903df7d65959ec40b6ddb07c44c91f662107b3f45 b/.resources/545b8b1b41e1010ab5ae392903df7d65959ec40b6ddb07c44c91f662107b3f45 new file mode 100644 index 0000000..e4d037f --- /dev/null +++ b/.resources/545b8b1b41e1010ab5ae392903df7d65959ec40b6ddb07c44c91f662107b3f45 @@ -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/.resources/57911d9c8a0aabb323809e1508d23daea2f6a5f194ecbe53070d1a8a76811ae7 b/.resources/57911d9c8a0aabb323809e1508d23daea2f6a5f194ecbe53070d1a8a76811ae7 new file mode 100644 index 0000000..6273751 --- /dev/null +++ b/.resources/57911d9c8a0aabb323809e1508d23daea2f6a5f194ecbe53070d1a8a76811ae7 @@ -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/.resources/5db7b323b176ec0c9600548c4be2ad8e0ad03f84d49ac4610c46362d9bea8e35 b/.resources/5db7b323b176ec0c9600548c4be2ad8e0ad03f84d49ac4610c46362d9bea8e35 new file mode 100644 index 0000000..a625894 --- /dev/null +++ b/.resources/5db7b323b176ec0c9600548c4be2ad8e0ad03f84d49ac4610c46362d9bea8e35 @@ -0,0 +1,1001 @@ +{ + "custom": {}, + "params": { + "params": "value" + }, + "propConfig": { + "params.params": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 1080, + "width": 400 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "32px" + }, + "props": { + "path": "material/settings_applications", + "style": { + "marginLeft": "10px" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "129px", + "grow": 1 + }, + "props": { + "style": { + "marginLeft": "10px" + }, + "text": "Add Device", + "textStyle": { + "fontFamily": "Arial", + "fontSize": "20px", + "fontWeight": "bolder", + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "basis": "40px" + }, + "props": { + "justify": "space-around", + "style": { + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "129px" + }, + "props": { + "style": { + "marginLeft": "0px" + }, + "text": "Device :", + "textStyle": { + "fontFamily": "Arial", + "fontSize": "16px", + "fontWeight": "bold" + } + }, + "type": "ia.display.label" + }, + { + "custom": { + "Device": "", + "tagPath": "Configuration/FC" + }, + "meta": { + "name": "TextField" + }, + "position": { + "basis": "150px" + }, + "propConfig": { + "props.text": { + "onChange": { + "enabled": null, + "script": "\tsystem.perspective.sendMessage(\"update-device-data\", currentValue.value)" + } + } + }, + "props": { + "placeholder": "\u003cDevice Id\u003e" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "multiple_selection", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.props.enabled \u003d not payload", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "missing-data", + "pageScope": true, + "script": "\t# implement your handler here\n\t", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.text-field" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "40px" + }, + "props": { + "justify": "space-around", + "style": { + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "130px" + }, + "props": { + "style": { + "marginLeft": "0px" + }, + "text": "Area :", + "textStyle": { + "fontFamily": "Arial", + "fontSize": "16px", + "fontWeight": "bold" + } + }, + "type": "ia.display.label" + }, + { + "custom": { + "key": "prefix", + "tagPath": "Configuration/aws" + }, + "meta": { + "name": "TextField_0" + }, + "position": { + "basis": "150px" + }, + "propConfig": { + "props.text": { + "onChange": { + "enabled": null, + "script": "\tsystem.perspective.sendMessage(\"update-area-data\", currentValue.value)" + } + } + }, + "props": { + "placeholder": "\u003cArea Id\u003e" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "multiple_selection", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.props.enabled \u003d not payload", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.text-field" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "40px" + }, + "props": { + "justify": "space-around", + "style": { + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "130px" + }, + "props": { + "style": { + "marginLeft": "0px" + }, + "text": "SubArea :", + "textStyle": { + "fontFamily": "Arial", + "fontSize": "16px", + "fontWeight": "bold" + } + }, + "type": "ia.display.label" + }, + { + "custom": { + "key": "prefix", + "tagPath": "Configuration/aws" + }, + "meta": { + "name": "TextField_0" + }, + "position": { + "basis": "150px" + }, + "propConfig": { + "props.text": { + "onChange": { + "enabled": null, + "script": "\tsystem.perspective.sendMessage(\"update-subarea-data\", currentValue.value)" + } + } + }, + "props": { + "placeholder": "\u003cSubArea Id\u003e" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "multiple_selection", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.props.enabled \u003d not payload", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.text-field" + } + ], + "meta": { + "name": "FlexContainer_2" + }, + "position": { + "basis": "40px" + }, + "props": { + "justify": "space-around", + "style": { + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Checkbox" + }, + "position": { + "basis": "130px" + }, + "propConfig": { + "props.selected": { + "onChange": { + "enabled": null, + "script": "\tsystem.perspective.sendMessage(\"multiple_selection\", payload\u003dcurrentValue.value)" + } + } + }, + "props": { + "style": { + "margin-left": "0px" + }, + "text": "Upload" + }, + "type": "ia.input.checkbox" + }, + { + "custom": { + "rowToAdd": { + "Area": "", + "Device": "", + "SubArea": "" + } + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\twhid \u003d self.session.custom.fc\n\ttagPath \u003d \"[%s_SCADA_TAG_PROVIDER]Configuration/PLC\"%(whid)\n\tself.custom.tagData.append(self.custom.rowToAdd)\n\t\n\ttag \u003d {}\n\tfor i in self.custom.tagData:\n\t\ttag[i[\"Device\"]]\u003d {\"Area\": i[\"Area\"], \"SubArea\":i[\"SubArea\"]}\n\t\t\n\t\n\tsystem.tag.writeBlocking([tagPath], [system.util.jsonEncode(tag)])\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button", + "tooltip": { + "enabled": true, + "text": "Missing Data for : [u\u0027Area\u0027, u\u0027SubArea\u0027, u\u0027Device\u0027]" + } + }, + "position": { + "basis": "150px" + }, + "propConfig": { + "custom.tagData": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]Configuration/PLC" + }, + "transforms": [ + { + "code": "\ttagData \u003d[{\"Device\":k, \"Area\":v[\"Area\"], \"SubArea\":v[\"SubArea\"]} for k,v in system.util.jsonDecode(value).items()]\n\treturn tagData", + "type": "script" + } + ], + "type": "tag" + } + }, + "props.enabled": { + "binding": { + "config": { + "path": "this.custom.rowToAdd" + }, + "transforms": [ + { + "code": "\n\tmissing_data \u003d []\n\tfor k, v in value.items():\n\t\tif not v:\n\t\t\tmissing_data.append(k)\n\t\n\tif missing_data:\n\t\tenabled \u003d False\n\t\tmsg \u003d \"Missing Data for : %s\"%missing_data\n\telse:\n\t\tenabled \u003d True\n\t\tmsg \u003d \"\"\n\t\n\tself.meta.tooltip.text \u003d msg \n\t\n\treturn enabled\n\t", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/add_circle" + }, + "position": "right" + }, + "primary": false, + "text": "Submit" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update-device-data", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.custom.rowToAdd[\"Device\"] \u003d payload", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "update-area-data", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.custom.rowToAdd[\"Area\"] \u003d payload", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "update-subarea-data", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.custom.rowToAdd[\"SubArea\"] \u003d payload", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "multiple_selection", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.position.display \u003d not payload", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + }, + { + "custom": { + "data": { + "ARSAW1301": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1302": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1303": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1304": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1305": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1306": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1307": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1308": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1309": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1310": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1311": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1312": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1501": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1502": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1503": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1504": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1505": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1506": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1507": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1508": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1509": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1510": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1511": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "ARSAW1512": { + "Area": "AR FLOOR", + "SubArea": "ARSAW\r" + }, + "FSC1": { + "Area": "", + "SubArea": "\r" + }, + "FSC10": { + "Area": "OUTBOUND", + "SubArea": "FSC\r" + }, + "FSC2": { + "Area": "", + "SubArea": "\r" + }, + "FSC_Cells": { + "Area": "", + "SubArea": "\r" + }, + "FSC_Induct_1-4": { + "Area": "", + "SubArea": "\r" + }, + "PLC01": { + "Area": "OUTBOUND", + "SubArea": "SHIP\r" + }, + "PLC02": { + "Area": "OUTBOUND", + "SubArea": "SHIP\r" + }, + "PLC03": { + "Area": "OUTBOUND", + "SubArea": "KO \u0026 REJECT\r" + }, + "PLC06": { + "Area": "OUTBOUND", + "SubArea": "TOTE ROUTER\r" + }, + "PLC07": { + "Area": "OUTBOUND", + "SubArea": "TOTE ROUTER\r" + }, + "PLC08": { + "Area": "OUTBOUND", + "SubArea": "TOTE FEED\r" + }, + "PLC09": { + "Area": "INBOUND", + "SubArea": "RECEIVING\r" + }, + "PLC09_Receiving2": { + "Area": "", + "SubArea": "\r" + }, + "PLC09_Receiving3": { + "Area": "", + "SubArea": "\r" + }, + "PLC1000": { + "Area": "INBOUND", + "SubArea": "RECEIVING\r" + }, + "PLC1000_Receiving4": { + "Area": "", + "SubArea": "\r" + }, + "PLC13": { + "Area": "AR FLOOR", + "SubArea": "ARSAW P2\r" + }, + "PLC13_SC2": { + "Area": "", + "SubArea": "\r" + }, + "PLC14": { + "Area": "", + "SubArea": "\r" + }, + "PLC15": { + "Area": "AR FLOOR", + "SubArea": "ARSAW P3\r" + }, + "PLC15_SC2": { + "Area": "", + "SubArea": "\r" + }, + "PLC16": { + "Area": "AR FLOOR", + "SubArea": "PICK TO REBIN P3\r" + }, + "PLC20": { + "Area": "OUTBOUND", + "SubArea": "AFE1 TOTE 1-3\r" + }, + "PLC20_Tote4-8": { + "Area": "", + "SubArea": "\r" + }, + "PLC21": { + "Area": "OUTBOUND", + "SubArea": "AFE TRAY ROUTER\r" + }, + "PLC22": { + "Area": "OUTBOUND", + "SubArea": "AFE TRAY ROUTER\r" + }, + "PLC23": { + "Area": "OUTBOUND", + "SubArea": "AFE1 TRAY FEED\r" + }, + "PLC24": { + "Area": "OUTBOUND", + "SubArea": "AFE1 WALL 1-2\r" + }, + "PLC25": { + "Area": "OUTBOUND", + "SubArea": "AFE1 WALL 3-4\r" + }, + "PLC26": { + "Area": "OUTBOUND", + "SubArea": "AFE1 WALL 5-6\r" + }, + "PLC27": { + "Area": "OUTBOUND", + "SubArea": "AFE1 WALL 7-8\r" + }, + "PLC30": { + "Area": "OUTBOUND", + "SubArea": "AFE1 PACK 1-4\r" + }, + "PLC31": { + "Area": "OUTBOUND", + "SubArea": "AFE1 PACK 5-8\r" + }, + "PLC32": { + "Area": "OUTBOUND", + "SubArea": "AFE1 EMP. TOTE\r" + }, + "PLC60": { + "Area": "OUTBOUND", + "SubArea": "S.PACKING 1\r" + }, + "PLC61": { + "Area": "OUTBOUND", + "SubArea": "S.PACKING 2\r" + }, + "PLC69": { + "Area": "OUTBOUND", + "SubArea": "GIFT WRAP\r" + }, + "PLC70": { + "Area": "OUTBOUND", + "SubArea": "TRANSSHIP\r" + }, + "PLC71": { + "Area": "OUTBOUND", + "SubArea": "TRANSSHIP\r" + }, + "PLC80": { + "Area": "OUTBOUND", + "SubArea": "SMART PACKING\r" + }, + "PLC81": { + "Area": "OUTBOUND", + "SubArea": "SMART PACKING\r" + }, + "PLC82": { + "Area": "OUTBOUND", + "SubArea": "SMART PACKING\r" + }, + "PLC97": { + "Area": "SAFETY PLC", + "SubArea": "\r" + }, + "PLC98": { + "Area": "SAFETY PLC", + "SubArea": "\r" + }, + "PLC99": { + "Area": "SAFETY PLC", + "SubArea": "\r" + }, + "THE": { + "Area": "BOB", + "SubArea": "NOB" + } + }, + "list_data": [ + "OUTBOUND", + "PLC03", + "KO \u0026 REJECT\r", + "OUTBOUND", + "PLC01", + "SHIP\r", + "OUTBOUND", + "PLC02", + "SHIP\r", + "OUTBOUND", + "PLC07", + "TOTE ROUTER\r", + "OUTBOUND", + "PLC08", + "TOTE FEED\r", + "OUTBOUND", + "PLC06", + "TOTE ROUTER\r", + "OUTBOUND", + "PLC81", + "SMART PACKING\r", + "OUTBOUND", + "PLC82", + "SMART PACKING\r", + "", + "PLC09_Receiving3", + "\r", + "", + "PLC09_Receiving2", + "\r", + "INBOUND", + "PLC09", + "RECEIVING\r", + "", + "PLC14", + "\r", + "AR FLOOR", + "PLC15", + "ARSAW P3\r", + "AR FLOOR", + "PLC13", + "ARSAW P2\r", + "AR FLOOR", + "PLC16", + "PICK TO REBIN P3\r", + "", + "FSC_Induct_1-4", + "\r", + "SAFETY PLC", + "PLC98", + "\r", + "SAFETY PLC", + "PLC99", + "\r", + "SAFETY PLC", + "PLC97", + "\r", + "OUTBOUND", + "FSC10", + "FSC\r", + "", + "FSC_Cells", + "\r", + "OUTBOUND", + "PLC25", + "AFE1 WALL 3-4\r", + "OUTBOUND", + "PLC69", + "GIFT WRAP\r", + "OUTBOUND", + "PLC26", + "AFE1 WALL 5-6\r", + "OUTBOUND", + "PLC23", + "AFE1 TRAY FEED\r", + "OUTBOUND", + "PLC24", + "AFE1 WALL 1-2\r", + "OUTBOUND", + "PLC27", + "AFE1 WALL 7-8\r", + "AR FLOOR", + "ARSAW1310", + "ARSAW\r", + "OUTBOUND", + "PLC61", + "S.PACKING 2\r", + "AR FLOOR", + "ARSAW1312", + "ARSAW\r", + "AR FLOOR", + "ARSAW1510", + "ARSAW\r", + "AR FLOOR", + "ARSAW1311", + "ARSAW\r", + "OUTBOUND", + "PLC60", + "S.PACKING 1\r", + "AR FLOOR", + "ARSAW1512", + "ARSAW\r", + "OUTBOUND", + "PLC21", + "AFE TRAY ROUTER\r", + "AR FLOOR", + "ARSAW1511", + "ARSAW\r", + "OUTBOUND", + "PLC22", + "AFE TRAY ROUTER\r", + "INBOUND", + "PLC1000", + "RECEIVING\r", + "OUTBOUND", + "PLC20", + "AFE1 TOTE 1-3\r", + "AR FLOOR", + "ARSAW1307", + "ARSAW\r", + "AR FLOOR", + "ARSAW1505", + "ARSAW\r", + "AR FLOOR", + "ARSAW1306", + "ARSAW\r", + "AR FLOOR", + "ARSAW1504", + "ARSAW\r", + "AR FLOOR", + "ARSAW1309", + "ARSAW\r", + "AR FLOOR", + "ARSAW1507", + "ARSAW\r", + "AR FLOOR", + "ARSAW1308", + "ARSAW\r", + "AR FLOOR", + "ARSAW1506", + "ARSAW\r", + "AR FLOOR", + "ARSAW1509", + "ARSAW\r", + "", + "PLC20_Tote4-8", + "\r", + "AR FLOOR", + "ARSAW1508", + "ARSAW\r", + "", + "PLC13_SC2", + "\r", + "AR FLOOR", + "ARSAW1301", + "ARSAW\r", + "OUTBOUND", + "PLC70", + "TRANSSHIP\r", + "OUTBOUND", + "PLC71", + "TRANSSHIP\r", + "AR FLOOR", + "ARSAW1303", + "ARSAW\r", + "AR FLOOR", + "ARSAW1501", + "ARSAW\r", + "OUTBOUND", + "PLC32", + "AFE1 EMP. TOTE\r", + "AR FLOOR", + "ARSAW1302", + "ARSAW\r", + "AR FLOOR", + "ARSAW1305", + "ARSAW\r", + "AR FLOOR", + "ARSAW1503", + "ARSAW\r", + "OUTBOUND", + "PLC30", + "AFE1 PACK 1-4\r", + "AR FLOOR", + "ARSAW1304", + "ARSAW\r", + "AR FLOOR", + "ARSAW1502", + "ARSAW\r", + "OUTBOUND", + "PLC31", + "AFE1 PACK 5-8\r", + "OUTBOUND", + "PLC80", + "SMART PACKING\r", + "", + "FSC1", + "\r", + "", + "PLC15_SC2", + "\r", + "", + "FSC2", + "\r", + "", + "PLC1000_Receiving4", + "\r", + "BOB", + "THE", + "NOB" + ] + }, + "events": { + "component": { + "onFileReceived": { + "config": { + "script": "#\tpayload\u003d{\"fileContent\":event.file.getString(),\"fileName\":event.file.name}\n#\twhid \u003d self.session.custom.fc\n#\tdata \u003d{}\n#\tdef get_child():\n#\t\treturn {\n#\t\t\t\"Area\":\"\",\n#\t\t\t\"SubArea\":\"\"\n#\t\t}\n#\t\t\n#\tdef convert_csv_string_list(string):\n#\t\treturn string.replace(\"\\n\",\",\").replace(\"\\\"\",\"\").split(\",\")[3:]\n#\t\n#\tlist_data \u003d convert_csv_string_list(event.file.getString())\n#\tself.custom.list_data \u003d list_data\n#\tfor i in range(2, len(list_data),3):\n#\t\tchild \u003d get_child()\n#\t\tchild[\"Area\"] \u003d list_data[i-2]\n#\t\tchild[\"SubArea\"] \u003d list_data[i]\n#\t\tdata[list_data[i-1]]\u003d child\n#\n#\tself.custom.data \u003d data\n#\t\n#\t\n#\tvalues \u003d system.util.jsonEncode(data)\n#\t\n#\tsystem.tag.writeBlocking([\"[%s_SCADA_TAG_PROVIDER]Configuration/PLC\"%whid], values)\n#\t\n\twhid \u003d self.session.custom.fc\n\tFileHandler.uploader.add_device_btn_code(whid, event)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "FileUpload" + }, + "position": { + "basis": "150px", + "display": false + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "multiple_selection", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.position.display \u003d payload ", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.fileupload" + } + ], + "meta": { + "name": "FlexContainer_4" + }, + "position": { + "basis": "40px" + }, + "props": { + "justify": "space-around", + "style": { + "margin-top": "10px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "borderBottomLeftRadius": "5px", + "borderBottomRightRadius": "5px", + "borderStyle": "solid", + "borderTopLeftRadius": "5px", + "borderTopRightRadius": "5px", + "margin": "10px" + }, + "wrap": "wrap" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/60efdd795e408c10e447f12ef617f37fbf195808c7f1088efc3b71b762899cdb b/.resources/60efdd795e408c10e447f12ef617f37fbf195808c7f1088efc3b71b762899cdb new file mode 100644 index 0000000..87d71c8 --- /dev/null +++ b/.resources/60efdd795e408c10e447f12ef617f37fbf195808c7f1088efc3b71b762899cdb @@ -0,0 +1,931 @@ +{ + "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": false, + "searchId": "value", + "show_error": false, + "show_running": true, + "state": 5, + "state_string": "Unknown", + "visible_status": false + }, + "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} || {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" + } + }, + "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.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": 20, + "width": 29 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "ErrorStatus", + "tooltip": { + "style": { + "fontSize": 16 + } + } + }, + "position": { + "grow": 1 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "{view.custom.display_icon} \u0026\u0026 {view.custom.error} \u0026! {view.params.directionLeft}" + }, + "type": "expr" + } + }, + "position.display": { + "binding": { + "config": { + "expression": "{view.custom.display_icon} \u0026\u0026 {view.custom.error} \u0026! {view.params.directionLeft} \u0026\u0026 {view.custom.show_error}" + }, + "type": "expr" + } + }, + "props.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" + } + ], + "type": "property" + } + }, + "props.elements[1].fill.paint": { + "binding": { + "config": { + "path": "view.custom.running_status" + }, + "transforms": [ + { + "expression": "case(\t{value}, \r\n\t\t1, {session.custom.colours.state0},\r\n\t\t2, {session.custom.colours.state0},\r\n\t\t3, {session.custom.colours.state5},\r\n\t\t\u0027#000000\u0027\r\n\t)", + "type": "expression" + }, + { + "expression": "if({session.custom.alarm_filter.show_running},{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[1].stroke.width": { + "binding": { + "config": { + "expression": "if({session.custom.alarm_filter.show_running},2,0)" + }, + "type": "expr" + } + }, + "props.elements[2].fill": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired}, \r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#FFFFFF\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#000000\u0027,\r\n\t\t\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\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[2].text": { + "binding": { + "config": { + "path": "view.custom.priority" + }, + "type": "property" + } + } + }, + "props": { + "elements": [ + { + "d": "M 32 2 L 62 32 L 32 62 L 2 32 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 2 + }, + "type": "path" + }, + { + "d": "M 38 2 L 57.96 2 L 57.96 2 L 88 32 L 57.96 62 L 57.96 62 L 38 62 L 67.96 32 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000" + }, + "type": "path" + }, + { + "style": { + "classes": "", + "fontSize": 42, + "fontWeight": "bolder" + }, + "type": "text", + "x": 20, + "y": 44.5 + } + ], + "style": { + "overflow": "hidden" + }, + "viewBox": "0.5 0.5 89 64" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "ErrorStatus_Left" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "{view.custom.display_icon} \u0026\u0026 {view.custom.error} \u0026\u0026 {view.params.directionLeft}" + }, + "type": "expr" + } + }, + "position.display": { + "binding": { + "config": { + "expression": "{view.custom.display_icon} \u0026\u0026 {view.custom.error} \u0026\u0026 {view.params.directionLeft} \u0026\u0026 {view.custom.show_error}" + }, + "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" + } + ], + "type": "property" + } + }, + "props.elements[1].fill.paint": { + "binding": { + "config": { + "path": "view.custom.running_status" + }, + "transforms": [ + { + "expression": "case(\t{value}, \r\n\t\t1, {session.custom.colours.state0},\r\n\t\t2, {session.custom.colours.state0},\r\n\t\t3, {session.custom.colours.state5},\r\n\t\t\u0027#000000\u0027\r\n\t)", + "type": "expression" + }, + { + "expression": "if({session.custom.alarm_filter.show_running},{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[1].stroke.width": { + "binding": { + "config": { + "expression": "if({session.custom.alarm_filter.show_running},2,0)" + }, + "type": "expr" + } + }, + "props.elements[2].fill": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired}, \r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#FFFFFF\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#000000\u0027,\r\n\t\t\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\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[2].text": { + "binding": { + "config": { + "path": "view.custom.priority" + }, + "type": "property" + } + } + }, + "props": { + "elements": [ + { + "d": "M 56,2 C 66,12 76,22 86,32 76,42 66,52 56,62 46,52 36,42 26,32 36,22 46,12 56,2 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 2 + }, + "type": "path" + }, + { + "d": "M 50,2 C 43.346667,2 36.693333,2 30.04,2 20.026667,12 10.013333,22 0,32 10.013333,42 20.026667,52 30.04,62 36.693333,62 43.346667,62 50,62 40.013333,52 30.026667,42 20.04,32 30.026667,22 40.013333,12 50,2 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000" + }, + "type": "path" + }, + { + "style": { + "classes": "", + "fontSize": 42, + "fontWeight": "bolder", + "textOrientation": "upright", + "writingMode": "horizontal-tb" + }, + "type": "text", + "x": 44.5, + "y": 44.5 + } + ], + "style": { + "overflow": "hidden" + }, + "viewBox": "0.5 0.5 89 64" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "RunningStatus" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "if((({view.custom.display_icon} \u0026\u0026 !{view.custom.error}) || ({view.custom.show_running} \u0026! {view.custom.show_error})) \u0026! {view.params.directionLeft},True, False)" + }, + "type": "expr" + } + }, + "position.rotate.angle": { + "binding": { + "config": { + "path": "view.params.directionLeft" + }, + "transforms": [ + { + "expression": "if({value}, \u0027180deg\u0027, \u00270deg\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[0].fill.paint": { + "binding": { + "config": { + "path": "view.custom.running_status" + }, + "transforms": [ + { + "expression": "case(\t{value}, \r\n\t\t1, {session.custom.colours.state0},\r\n\t\t2, {session.custom.colours.state0},\r\n\t\t3, {session.custom.colours.state5},\r\n\t\t\u0027#000000\u0027\r\n\t)\r\n\t\t\r\n", + "type": "expression" + } + ], + "type": "property" + } + } + }, + "props": { + "elements": [ + { + "d": "M 0 0 L 40 0 L 40 0 L 70 30 L 40 60 L 40 60 L 0 60 L 30 30 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#4c4c4c", + "width": "2" + }, + "type": "path" + } + ], + "style": { + "overflow": "hidden" + }, + "viewBox": "-1.5 -1.5 73 63" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "RunningStatus_Left" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "if((({view.custom.display_icon} \u0026\u0026 !{view.custom.error}) || ({view.custom.show_running} \u0026! {view.custom.show_error})) \u0026\u0026 {view.params.directionLeft},True, False)" + }, + "type": "expr" + } + }, + "position.rotate.angle": { + "binding": { + "config": { + "path": "view.params.directionLeft" + }, + "transforms": [ + { + "expression": "if({value}, \u0027180deg\u0027, \u00270deg\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[0].fill.paint": { + "binding": { + "config": { + "path": "view.custom.running_status" + }, + "transforms": [ + { + "expression": "case(\t{value}, \r\n\t\t1, {session.custom.colours.state0},\r\n\t\t2, {session.custom.colours.state0},\r\n\t\t3, {session.custom.colours.state5},\r\n\t\t\u0027#000000\u0027\r\n\t)\r\n\t\t\r\n", + "type": "expression" + } + ], + "type": "property" + } + } + }, + "props": { + "elements": [ + { + "d": "M 70,60 C 56.666667,60 43.333333,60 30,60 20,50 10,40 0,30 10,20 20,10 30,0 43.333333,0 56.666667,0 70,0 60,10 50,20 40,30 50,40 60,50 70,60 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#4c4c4c", + "width": "2" + }, + "type": "path" + } + ], + "style": { + "overflow": "hidden" + }, + "viewBox": "-0.5 -0.5 71 61" + }, + "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.borderStyle": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "solid" + }, + { + "input": false, + "output": "none" + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "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": { + "borderColor": "#FF0000", + "borderWidth": "2px", + "cursor": "pointer" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/6129b02fa079d41edaf9997f71d8ab3bb047283c0bf2ed762b058176e7fae368 b/.resources/6129b02fa079d41edaf9997f71d8ab3bb047283c0bf2ed762b058176e7fae368 new file mode 100644 index 0000000..7992065 --- /dev/null +++ b/.resources/6129b02fa079d41edaf9997f71d8ab3bb047283c0bf2ed762b058176e7fae368 @@ -0,0 +1,125 @@ +{ + "custom": {}, + "params": { + "params": {}, + "path": "", + "title": "Card Title", + "useDefaultHeight": false, + "useDefaultWidth": false + }, + "propConfig": { + "params.params": { + "paramDirection": "input", + "persistent": true + }, + "params.path": { + "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.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/.resources/66e70b3df18ccf7b625c78bb5c17b88931efdba779935cbf80fc0001fd06231c b/.resources/66e70b3df18ccf7b625c78bb5c17b88931efdba779935cbf80fc0001fd06231c new file mode 100644 index 0000000..e35b3d6 --- /dev/null +++ b/.resources/66e70b3df18ccf7b625c78bb5c17b88931efdba779935cbf80fc0001fd06231c @@ -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/.resources/696c6536ed1424a5882e25de5d63a5f74f3f53ab3341d654385637b748dbb299 b/.resources/696c6536ed1424a5882e25de5d63a5f74f3f53ab3341d654385637b748dbb299 new file mode 100644 index 0000000..9129458 --- /dev/null +++ b/.resources/696c6536ed1424a5882e25de5d63a5f74f3f53ab3341d654385637b748dbb299 @@ -0,0 +1,732 @@ +{ + "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": "Spiral" + }, + "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/Spiral" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "Spiral_Symbol" + }, + "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,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": [ + { + "cx": "6.6145835", + "cy": "6.6145835", + "fill": {}, + "id": "path234", + "name": "path234", + "r": "6.303678", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.23" + }, + "type": "circle" + }, + { + "cx": "6.6145835", + "cy": "6.6145835", + "fill": { + "paint": "transparent" + }, + "id": "path234-7", + "name": "path234-7", + "r": "3.313657", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.221" + }, + "type": "circle" + }, + { + "d": "M 6.6188113,9.8749524 6.6103553,3.3542142", + "fill": { + "paint": "transparent" + }, + "id": "path3429", + "name": "path3429", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.218" + }, + "type": "path" + }, + { + "d": "M 4.978764,9.47052 8.23181,3.819167", + "fill": { + "paint": "transparent" + }, + "id": "path3429-8", + "name": "path3429-8", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.218" + }, + "type": "path" + }, + { + "d": "M 3.818909,8.2200703 9.461806,4.9523781", + "fill": { + "paint": "transparent" + }, + "id": "path3429-8-2", + "name": "path3429-8-2", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.218" + }, + "type": "path" + }, + { + "d": "M 3.3168328,6.6175189 9.837571,6.6090589", + "fill": { + "paint": "transparent" + }, + "id": "path3429-8-2-6", + "name": "path3429-8-2-6", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.218" + }, + "type": "path" + }, + { + "d": "M 3.7180036,4.9712623 6.8282074,6.7528116", + "fill": { + "paint": "transparent" + }, + "id": "path3429-8-2-6-5", + "name": "path3429-8-2-6-5", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.219869" + }, + "type": "path" + }, + { + "d": "M 4.9523763,3.7647768 8.2200718,9.4076712", + "fill": { + "paint": "transparent" + }, + "id": "path3429-8-2-6-5-5", + "name": "path3429-8-2-6-5-5", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.218" + }, + "type": "path" + }, + { + "cx": "6.6145835", + "cy": "6.6145835", + "fill": { + "opacity": "1", + "paint": "#fefefe" + }, + "id": "path234-7-0", + "name": "path234-7-0", + "r": "0.26523831", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.218" + }, + "type": "circle" + } + ], + "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/.resources/6baa4d757e7ae772648da57ee76c68adb28cc399e1a2de5deccd9b833f380529 b/.resources/6baa4d757e7ae772648da57ee76c68adb28cc399e1a2de5deccd9b833f380529 new file mode 100644 index 0000000..0759166 --- /dev/null +++ b/.resources/6baa4d757e7ae772648da57ee76c68adb28cc399e1a2de5deccd9b833f380529 @@ -0,0 +1,897 @@ +{ + "custom": {}, + "params": { + "Counts": { + "Diag": 0, + "High": 0, + "Low": 0, + "Medium": 0 + }, + "Status": "", + "tagProps": [ + "PLC03", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "params.Counts": { + "paramDirection": "input", + "persistent": true + }, + "params.Status": { + "paramDirection": "input", + "persistent": true + }, + "params.tagProps": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 212, + "width": 336 + }, + "key": "value" + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "400px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "type": "property" + } + } + }, + "props": { + "textStyle": { + "textIndent": "10px" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "JAM", + "tooltip": { + "enabled": true, + "text": "Jams" + } + }, + "position": { + "basis": "24px", + "shrink": 0 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/JAM", + "style": { + "marginRight": "5px" + } + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "10px", + "grow": 1 + }, + "props": { + "style": { + "marginRight": "10px" + }, + "text": 0, + "textStyle": { + "textAlign": "end" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "60px" + }, + "props": { + "style": { + "backgroundColor": "#555555", + "key": "value" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "50px" + }, + "props": { + "style": { + "marginLeft": 10 + }, + "text": "AREA", + "textStyle": { + "fontFamily": "Roboto", + "fontSize": 12 + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "195px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "/root.custom.area_display" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "marginLeft": 50 + }, + "textStyle": { + "fontSize": 12 + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "80px" + }, + "props": { + "style": { + "borderBottomColor": "#555555", + "borderBottomStyle": "solid", + "borderBottomWidth": 0.5, + "borderLeftColor": "#555555", + "borderLeftStyle": "none", + "borderLeftWidth": 0.5, + "borderRightColor": "#555555", + "borderRightStyle": "none", + "borderRightWidth": 0.5, + "borderTopColor": "#555555", + "borderTopStyle": "solid", + "borderTopWidth": 0.5 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "50px" + }, + "props": { + "style": { + "marginLeft": 10 + }, + "text": "STATUS", + "textStyle": { + "fontFamily": "Roboto", + "fontSize": 12 + } + }, + "type": "ia.display.label" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tself.session.custom.covert\u003d False\n\tnavigation.navigate_to_page.detailed_view(self, self.view.params.tagProps[0],self.view.params.tagProps[0], self.view.params.tagProps[3])" + }, + "enabled": false, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Label" + }, + "position": { + "basis": "236px" + }, + "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": { + "borderBottomLeftRadius": 5, + "borderBottomRightRadius": 5, + "borderColor": "#555555", + "borderStyle": "solid", + "borderTopLeftRadius": 5, + "borderTopRightRadius": 5, + "borderWidth": 2, + "marginBottom": 10, + "marginLeft": 50, + "marginRight": 10, + "marginTop": 10 + }, + "textStyle": { + "fontSize": 12, + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "basis": "80px" + }, + "props": { + "style": { + "borderBottomColor": "#555555", + "borderBottomStyle": "solid", + "borderBottomWidth": 0.5 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "25px" + }, + "props": { + "path": "material/notifications_active", + "style": { + "marginLeft": 10 + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "100px" + }, + "props": { + "style": { + "marginLeft": 10 + }, + "text": "ACTIVE ALARMS", + "textStyle": { + "fontFamily": "Roboto", + "fontSize": 12 + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_3" + }, + "position": { + "basis": "80px" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "32px" + }, + "props": { + "text": "High", + "textStyle": { + "fontSize": 10 + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "32px" + }, + "props": { + "text": "Medium", + "textStyle": { + "fontSize": 10 + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "basis": "32px" + }, + "props": { + "text": "Low", + "textStyle": { + "fontSize": 10 + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_3" + }, + "position": { + "basis": "32px" + }, + "props": { + "text": "Diag", + "textStyle": { + "fontSize": 10 + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_4" + }, + "position": { + "basis": "32px" + }, + "props": { + "text": "Total", + "textStyle": { + "fontSize": 10 + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "200px" + }, + "props": { + "justify": "space-between" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "32px" + }, + "props": { + "text": 0, + "textStyle": { + "fontSize": 10, + "textAlign": "center" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update-alarm-count", + "pageScope": false, + "script": "\thigh \u003d payload.get(\"High\",0)\n\tself.props.text \u003d high", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "32px" + }, + "props": { + "text": 0, + "textStyle": { + "fontSize": 10, + "textAlign": "center" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update-alarm-count", + "pageScope": false, + "script": "\tmedium \u003d payload.get(\"Medium\",0)\n\tself.props.text \u003d medium", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_2" + }, + "position": { + "basis": "32px" + }, + "props": { + "text": 0, + "textStyle": { + "fontSize": 10, + "textAlign": "center" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update-alarm-count", + "pageScope": false, + "script": "\tlow \u003d payload.get(\"Low\",0)\n\tself.props.text \u003d low", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_3" + }, + "position": { + "basis": "32px" + }, + "props": { + "text": 0, + "textStyle": { + "fontSize": 10, + "textAlign": "center" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update-alarm-count", + "pageScope": false, + "script": "\tdiag \u003d payload.get(\"Diagnostic\",0)\n\tself.props.text \u003d diag", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_4" + }, + "position": { + "basis": "32px" + }, + "props": { + "text": 0, + "textStyle": { + "fontSize": 10, + "textAlign": "center" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update-alarm-count", + "pageScope": false, + "script": "\tcritical \u003d payload.get(\"Critical\",0)\n\thigh \u003d payload.get(\"High\",0)\n\tmed \u003d payload.get(\"Medium\",0)\n\tlow \u003d payload.get(\"Low\",0)\n\tdiag \u003d payload.get(\"Diagnostic\",0)\n\t\n\ttotal \u003d critical + high + med + low + diag\n\tself.props.text \u003d total\n\t", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "basis": "200px" + }, + "props": { + "justify": "space-between" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "334px" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_2" + }, + "position": { + "basis": "80px" + }, + "props": { + "style": { + "marginBottom": 5, + "marginLeft": 10, + "marginRight": 10 + } + }, + "type": "ia.container.flex" + } + ], + "custom": { + "counts": { + "Critical": 0 + } + }, + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tself.session.custom.covert\u003d False\n\twhid \u003d self.session.custom.fc\n\tsession_id \u003d self.session.props.id\n\tpage_id \u003d \"Detailed-View: \" + self.view.params.tagProps[0]\n\tCommands.analytics.send_page_details(whid, session_id, page_id)\n\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": "root" + }, + "propConfig": { + "custom.Total": { + "binding": { + "config": { + "expression": "{view.params.Counts.High} + {view.params.Counts.Medium} + {view.params.Counts.Low} + {view.params.Counts.Diag}" + }, + "type": "expr" + } + }, + "custom.area": { + "binding": { + "config": { + "expression": "jsonGet({this.custom.plc_dict}, \"Area\")" + }, + "type": "expr" + } + }, + "custom.area_display": { + "binding": { + "config": { + "expression": "if(len({this.custom.sub_area})\u003e0,\r\nconcat({this.custom.area} + \"/\" + {this.custom.sub_area}),\r\n{this.custom.area})" + }, + "type": "expr" + } + }, + "custom.counts": { + "onChange": { + "enabled": null, + "script": "\tsystem.perspective.sendMessage(\"update-alarm-count\", self.custom.counts, \"view\")" + } + }, + "custom.counts.Diagnostic": { + "binding": { + "config": { + "path": "view.params.Counts.Diag" + }, + "type": "property" + } + }, + "custom.counts.High": { + "binding": { + "config": { + "path": "view.params.Counts.High" + }, + "type": "property" + } + }, + "custom.counts.Low": { + "binding": { + "config": { + "path": "view.params.Counts.Low" + }, + "type": "property" + } + }, + "custom.counts.Medium": { + "binding": { + "config": { + "path": "view.params.Counts.Medium" + }, + "type": "property" + } + }, + "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}, {view.params.tagProps[0]})", + "type": "expression" + } + ], + "type": "tag" + } + }, + "custom.provider": { + "binding": { + "config": { + "expression": "\"[\"+{session.custom.fc}+\"_SCADA_TAG_PROVIDER]\"" + }, + "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" + } + }, + "custom.sub_area": { + "binding": { + "config": { + "expression": "jsonGet({this.custom.plc_dict}, \"SubArea\")" + }, + "type": "expr" + } + }, + "meta.visible": { + "binding": { + "config": { + "expression": "if({session.custom.covert} \u003d False \u0026\u0026 {this.custom.status} \u003d 5, False, True)" + }, + "type": "expr" + } + } + }, + "props": { + "direction": "column", + "style": { + "animationFillMode": "both", + "borderBottomLeftRadius": 10, + "borderBottomRightRadius": 10, + "borderColor": "#555555", + "borderStyle": "solid", + "borderTopLeftRadius": 10, + "borderTopRightRadius": 10, + "borderWidth": 1, + "box-shadow": "5px 5px 5px grey", + "classes": "Background-Styles/Controller", + "cursor": "pointer" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/6c17ddcad7c68dc7c160e4e9d8bf74344846c0fc72868b56461bf4dc16bc1ce1 b/.resources/6c17ddcad7c68dc7c160e4e9d8bf74344846c0fc72868b56461bf4dc16bc1ce1 new file mode 100644 index 0000000000000000000000000000000000000000..b0da013d6e6a690d7fa3910d0cc73afc047c7c8c GIT binary patch literal 35897 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 literal 0 HcmV?d00001 diff --git a/.resources/6e68c94742f2d88bc49ec65479f33ff9a2d24a56fba4b0e26d9885dc12a1c55d b/.resources/6e68c94742f2d88bc49ec65479f33ff9a2d24a56fba4b0e26d9885dc12a1c55d new file mode 100644 index 0000000..14a2b6c --- /dev/null +++ b/.resources/6e68c94742f2d88bc49ec65479f33ff9a2d24a56fba4b0e26d9885dc12a1c55d @@ -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/.resources/6fc287161b4a45507a2342e1ec9931968d0b4839bcc2846ac421501b216b1dc5 b/.resources/6fc287161b4a45507a2342e1ec9931968d0b4839bcc2846ac421501b216b1dc5 new file mode 100644 index 0000000..decb668 --- /dev/null +++ b/.resources/6fc287161b4a45507a2342e1ec9931968d0b4839bcc2846ac421501b216b1dc5 @@ -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/.resources/714326548c55526266be11f24fdbe06aebb10794f4f12074d348332028f370be b/.resources/714326548c55526266be11f24fdbe06aebb10794f4f12074d348332028f370be new file mode 100644 index 0000000..1a47bff --- /dev/null +++ b/.resources/714326548c55526266be11f24fdbe06aebb10794f4f12074d348332028f370be @@ -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/.resources/71f8506be9076cc7dd756b07a493e2e3f67706e5f26f998287c5686e76cc3ce6 b/.resources/71f8506be9076cc7dd756b07a493e2e3f67706e5f26f998287c5686e76cc3ce6 new file mode 100644 index 0000000..cdf5608 --- /dev/null +++ b/.resources/71f8506be9076cc7dd756b07a493e2e3f67706e5f26f998287c5686e76cc3ce6 @@ -0,0 +1,614 @@ +{ + "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": "Pin Detection" + }, + "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.0570302", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.264583" + }, + "type": "circle" + }, + { + "d": "M 1.4878915,9.8402065 9.8014876,1.4637334", + "fill": { + "paint": "transparent" + }, + "id": "path2", + "name": "path2", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.264726" + }, + "type": "path" + }, + { + "d": "M 3.5515604,11.84005 11.75248,3.4068377", + "fill": { + "paint": "transparent" + }, + "id": "path3", + "name": "path3", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.258089" + }, + "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/.resources/734efa3652ca169af9acd59d26d5bcbd3d3039c94d7ab5ef9862e472f348c064 b/.resources/734efa3652ca169af9acd59d26d5bcbd3d3039c94d7ab5ef9862e472f348c064 new file mode 100644 index 0000000..6331de9 --- /dev/null +++ b/.resources/734efa3652ca169af9acd59d26d5bcbd3d3039c94d7ab5ef9862e472f348c064 @@ -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/.resources/74152d7e2cb159bbffb64ed63a6d802e4022b8f103e410e7cd32062335e28b6c b/.resources/74152d7e2cb159bbffb64ed63a6d802e4022b8f103e410e7cd32062335e28b6c new file mode 100644 index 0000000..855523d --- /dev/null +++ b/.resources/74152d7e2cb159bbffb64ed63a6d802e4022b8f103e410e7cd32062335e28b6c @@ -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/.resources/75dd16cb25a3bcece01ca5928fe30d0ea335f5f93e1169d80982a08c6885f2bb b/.resources/75dd16cb25a3bcece01ca5928fe30d0ea335f5f93e1169d80982a08c6885f2bb new file mode 100644 index 0000000..c47d627 --- /dev/null +++ b/.resources/75dd16cb25a3bcece01ca5928fe30d0ea335f5f93e1169d80982a08c6885f2bb @@ -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/.resources/77dc8910ab440f9e7ae3ba9d69bd4a2b937933dffd4277f006ebbbd9adfa987f b/.resources/77dc8910ab440f9e7ae3ba9d69bd4a2b937933dffd4277f006ebbbd9adfa987f new file mode 100644 index 0000000..7c289f7 --- /dev/null +++ b/.resources/77dc8910ab440f9e7ae3ba9d69bd4a2b937933dffd4277f006ebbbd9adfa987f @@ -0,0 +1,1104 @@ +{ + "custom": { + "activityLogger": { + "alt_pageid": "Header", + "start_time": { + "$": [ + "ts", + 192, + 1746010658533 + ], + "$ts": 1746010658516 + } + } + }, + "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" + }, + "enabled": false, + "transforms": [ + { + "code": "\treturn AWS.s3.getPresignedURL(self, value)", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "fit": { + "height": 30, + "mode": "fill" + }, + "source": "/system/images/Builtin/amazon_rme_logo.png" + }, + "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/.resources/780825d85de900b059b5807413d4ccb1238ce1fe92867759be4b32deb2168fc0 b/.resources/780825d85de900b059b5807413d4ccb1238ce1fe92867759be4b32deb2168fc0 new file mode 100644 index 0000000..b35c404 --- /dev/null +++ b/.resources/780825d85de900b059b5807413d4ccb1238ce1fe92867759be4b32deb2168fc0 @@ -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/.resources/7c672b1aaab2347134048467b2a1f043248e62c5b1cdc8bb3e1f667c1c34285e b/.resources/7c672b1aaab2347134048467b2a1f043248e62c5b1cdc8bb3e1f667c1c34285e new file mode 100644 index 0000000..f8424ae --- /dev/null +++ b/.resources/7c672b1aaab2347134048467b2a1f043248e62c5b1cdc8bb3e1f667c1c34285e @@ -0,0 +1,147 @@ +{ + "custom": { + "SelectAll": null + }, + "params": { + "Columns": { + "ETag": false, + "Filename": true, + "Key": false, + "Last Updated": true, + "Size (bytes)": true, + "Storage Class": false + } + }, + "propConfig": { + "custom.SelectAll": { + "binding": { + "config": { + "path": "view.params.Columns" + }, + "enabled": false, + "transforms": [ + { + "code": "\tshow_all \u003d True\n\tif len(value) \u003e 0:\n\t\thidden_count \u003d 0\t\t\n\t\tfor column in value:\n\t\t\tif not column[\u0027Hidden\u0027]:\n\t\t\t\tshow_all \u003d False\n\t\t\t\thidden_count +\u003d 1\n\t\tif show_all and hidden_count !\u003d len(value):\n\t\t\tshow_all \u003d None\n\treturn show_all", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "params.Columns": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 224, + "width": 450 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Title" + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "marginTop": 5, + "textAlign": "center", + "textDecoration": "underline" + }, + "text": "Hide/Unhide Columns" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "SelectAllCheck" + }, + "position": { + "basis": "36px", + "display": false + }, + "propConfig": { + "props.selected": { + "binding": { + "config": { + "path": "view.custom.SelectAll" + }, + "type": "property" + } + }, + "props.text": { + "binding": { + "config": { + "expression": "IF(!isNull({view.custom.SelectAll}), IF({view.custom.SelectAll}, \u0027Hide All\u0027, \u0027Show All\u0027), \u0027Hide/Show All\u0027)" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "fontSize": 12 + } + }, + "type": "ia.input.checkbox" + }, + { + "meta": { + "name": "ColumnTiles" + }, + "position": { + "basis": "320px" + }, + "propConfig": { + "props.instances": { + "binding": { + "config": { + "path": "view.params.Columns" + }, + "transforms": [ + { + "code": "\tcolumns \u003d []\n\tif len(value.keys()) \u003e 0:\n\t\tfor column in value:\n\t\t\tnew_instance \u003d {\n\t\t\t\t\u0027Name\u0027: column,\n\t\t\t\t#If not hidden, show Add (+) sign\n\t\t\t\t\u0027Hidden\u0027: not value[column]\n\t\t\t}\n\t\t\tcolumns.append(new_instance)\n\treturn columns", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "alignContent": "flex-start", + "alignItems": "flex-start", + "justify": "center", + "path": "Objects/PowerTable/ColumnSelectionTile", + "style": { + "marginBottom": 5, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 5 + }, + "wrap": "wrap" + }, + "type": "ia.display.flex-repeater" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "borderBottomLeftRadius": 20, + "borderBottomRightRadius": 20, + "borderTopRightRadius": 20 + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/7ce24de31a792785a8519fcceb6213d967692d999e249f1ef541e136def3e6bb b/.resources/7ce24de31a792785a8519fcceb6213d967692d999e249f1ef541e136def3e6bb new file mode 100644 index 0000000..c4ea686 --- /dev/null +++ b/.resources/7ce24de31a792785a8519fcceb6213d967692d999e249f1ef541e136def3e6bb @@ -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/.resources/7e1a4cc36f0a459267860d0238ae1df705e1853f3ea7a0aa65fc3e50c5ea6554 b/.resources/7e1a4cc36f0a459267860d0238ae1df705e1853f3ea7a0aa65fc3e50c5ea6554 new file mode 100644 index 0000000..6070270 --- /dev/null +++ b/.resources/7e1a4cc36f0a459267860d0238ae1df705e1853f3ea7a0aa65fc3e50c5ea6554 @@ -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/.resources/7e49f2b3928b1313ccc4f33dfc8ad37c024c9da19efa0bee9fa0c4fc5b9206fc b/.resources/7e49f2b3928b1313ccc4f33dfc8ad37c024c9da19efa0bee9fa0c4fc5b9206fc new file mode 100644 index 0000000..c03ab77 --- /dev/null +++ b/.resources/7e49f2b3928b1313ccc4f33dfc8ad37c024c9da19efa0bee9fa0c4fc5b9206fc @@ -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/.resources/7ec3d670cd904a32010acede3bf6e4fa02a9a6419c20f6aa46e56eec4bb95233 b/.resources/7ec3d670cd904a32010acede3bf6e4fa02a9a6419c20f6aa46e56eec4bb95233 new file mode 100644 index 0000000..ea2f59a --- /dev/null +++ b/.resources/7ec3d670cd904a32010acede3bf6e4fa02a9a6419c20f6aa46e56eec4bb95233 @@ -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/.resources/7fdd96095f08dbc1a62c91d21f89af967724d20db932fd0ababfc5669d7de006 b/.resources/7fdd96095f08dbc1a62c91d21f89af967724d20db932fd0ababfc5669d7de006 new file mode 100644 index 0000000..3c52e6a --- /dev/null +++ b/.resources/7fdd96095f08dbc1a62c91d21f89af967724d20db932fd0ababfc5669d7de006 @@ -0,0 +1,456 @@ +{ + "custom": { + "api_region_name": "eu", + "enabled_whids": [ + "DNK7", + "EWR4" + ], + "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_options": [ + { + "label": "DNK7", + "value": "DNK7" + }, + { + "label": "EWR4", + "value": "EWR4" + } + ], + "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" + ] + }, + "params": { + "enables": { + "site": true + }, + "image_count": 0, + "selected_whid": "EWR4", + "source_count": 0 + }, + "propConfig": { + "custom.api_region_name": { + "binding": { + "config": { + "path": "session.custom.aws.prefix" + }, + "type": "property" + }, + "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.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_options": { + "binding": { + "config": { + "path": "view.custom.enabled_whids" + }, + "transforms": [ + { + "code": "\treturn [{\u0027value\u0027: x, \u0027label\u0027: x} for x in value]", + "type": "script" + } + ], + "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\t\n\tbucket \u003d self.custom.stage_config.repo_bucket\n\treturn s3m.fetch_site_list(bucket)", + "type": "script" + } + ], + "type": "expr" + }, + "persistent": true + }, + "params.enables": { + "paramDirection": "input", + "persistent": true + }, + "params.image_count": { + "paramDirection": "input", + "persistent": true + }, + "params.selected_whid": { + "paramDirection": "input", + "persistent": true + }, + "params.source_count": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 78, + "width": 400 + } + }, + "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": "Site:" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tselected_whid \u003d self.props.value\n\tsystem.perspective.sendMessage(\u0027update_selected_whid\u0027, \n\t\t\t\t\t\t\t\t{\u0027whid\u0027: selected_whid}, \n\t\t\t\t\t\t\t\tscope\u003d\u0027session\u0027)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Dropdown", + "tooltip": { + "location": "bottom", + "style": { + "whiteSpace": "pre" + }, + "text": "Click here to select a different \nstage folder to manage" + } + }, + "position": { + "basis": "175px", + "shrink": 0 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "path": "view.params.enables.site" + }, + "type": "property" + } + }, + "props.options": { + "binding": { + "config": { + "path": "view.custom.whid_options" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "path": "view.params.selected_whid" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "margin": "2px", + "marginRight": "26px" + } + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "FlexContainer Site Selection" + }, + "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": "Images (SVG):" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "label_LeftAlign" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.params.text": { + "binding": { + "config": { + "path": "view.params.image_count" + }, + "type": "property" + } + } + }, + "props": { + "path": "Objects/Templates/Labels/label_LeftAlign", + "style": { + "classes": "Framework/Card/Value" + } + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "FlexContainer Images" + }, + "position": { + "basis": "50%", + "grow": 1 + }, + "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": "Source (DRAWIO):" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "label_LeftAlign" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.params.text": { + "binding": { + "config": { + "path": "view.params.source_count" + }, + "type": "property" + } + } + }, + "props": { + "path": "Objects/Templates/Labels/label_LeftAlign", + "style": { + "classes": "Framework/Card/Value" + } + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "FlexContainer Source" + }, + "position": { + "basis": "50%", + "grow": 1 + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer File Counts" + }, + "position": { + "basis": "26px", + "shrink": 0 + }, + "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" + }, + "scripts": { + "customMethods": [ + { + "name": "update_wo_view_param", + "params": [ + "d\u003dNone" + ], + "script": "\t# helper \"sanitize_tree\" function to make work order view param mutable\n\tfrom helper.helper import sanitize_tree\n\twork_order \u003d sanitize_tree(self.view.params.work_order)\n\t# sanity-check the update dict \"d\"\n\tif d is None or not isinstance(d, dict): d \u003d {}\n\t# update the embedded object inside the work order view param\n\twork_order.get(\u0027data\u0027, {}).get(\u0027WorkOrder\u0027, {}).update(d)\n\t# write the updated work_order object back to view param\n\tself.view.params.work_order \u003d work_order\n\t" + } + ], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update_enabled_whids", + "pageScope": false, + "script": "\t# implement your handler here\n\tself.view.refreshBinding(\u0027custom.enabled_whids\u0027)\n\tself.view.refreshBinding(\u0027custom.whids_in_s3\u0027)", + "sessionScope": true, + "viewScope": true + } + ] + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/814b68e97d82aff8c094dbd1df785b6267a4b23e03c626098e46c4874e06667a b/.resources/814b68e97d82aff8c094dbd1df785b6267a4b23e03c626098e46c4874e06667a new file mode 100644 index 0000000..b21b1a1 --- /dev/null +++ b/.resources/814b68e97d82aff8c094dbd1df785b6267a4b23e03c626098e46c4874e06667a @@ -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/.resources/840cd1bcdcfbfd0f6b613b59d7a4c7c10bb27c718ed6b84ca703148dd1155a54 b/.resources/840cd1bcdcfbfd0f6b613b59d7a4c7c10bb27c718ed6b84ca703148dd1155a54 new file mode 100644 index 0000000..7aca894 --- /dev/null +++ b/.resources/840cd1bcdcfbfd0f6b613b59d7a4c7c10bb27c718ed6b84ca703148dd1155a54 @@ -0,0 +1,198 @@ +{ + "custom": { + "activityLogger": { + "alt_pageid": "card_view", + "start_time": { + "$": [ + "ts", + 192, + 1746012819449 + ], + "$ts": 1746012819449 + } + } + }, + "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": { + "page_name": "Home" + }, + "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" + } + }, + "params.page_name": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "FlexRepeater" + }, + "position": { + "basis": "1080px" + }, + "props": { + "alignContent": "flex-start", + "alignItems": "flex-start", + "elementPosition": { + "grow": 0, + "shrink": 0 + }, + "path": "Symbol-Views/Controller-Views/ControllerStatus", + "style": { + "overflow": "visible" + }, + "wrap": "wrap" + }, + "type": "ia.display.flex-repeater" + } + ], + "custom": { + "Devices": [ + "ARSAW1301", + "PLC03", + "ARSAW1302", + "PLC01", + "PLC02", + "PLC98", + "ARSAW1305", + "ARSAW1503", + "PLC08", + "PLC99", + "ARSAW1306", + "ARSAW1504", + "ARSAW1501", + "ARSAW1303", + "PLC06", + "PLC07", + "ARSAW1304", + "ARSAW1502", + "ARSAW1309", + "ARSAW1507", + "ARSAW1508", + "PLC09", + "ARSAW1307", + "ARSAW1505", + "ARSAW1308", + "ARSAW1506", + "PLC20", + "ARSAW1509", + "PLC14", + "PLC80", + "PLC81", + "PLC82", + "PLC16", + "FSC10", + "PLC21", + "PLC22", + "PLC69", + "PLC25", + "PLC26", + "PLC23", + "PLC24", + "PLC97", + "PLC27", + "PLC61", + "PLC60", + "PLC1000", + "PLC13", + "ARSAW1312", + "ARSAW1510", + "ARSAW1511", + "ARSAW1310", + "ARSAW1311", + "ARSAW1512", + "PLC70", + "PLC71", + "PLC32", + "PLC30", + "PLC31", + "PLC15" + ], + "count": "value", + "delay": 2000, + "run_update": true + }, + "events": { + "system": { + "onStartup": [ + { + "config": { + "script": "\tVisualisation.home_page.create_home_page(self)" + }, + "scope": "G", + "type": "script" + }, + { + "config": { + "script": "\twhid \u003d self.session.custom.fc\n\tsession_id \u003d self.session.props.id\n\tpage_id \u003d self.view.params.page_name\n\tCommands.analytics.send_page_details(whid, session_id, page_id)" + }, + "scope": "G", + "type": "script" + } + ] + } + }, + "meta": { + "name": "root" + }, + "propConfig": { + "custom.update": { + "binding": { + "config": { + "expression": "now({this.custom.delay})" + }, + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": "\n if (self.session.custom.fc \u003d\u003d \u0027\u0027) or (self.session.custom.fc is None):\n \tself.getChild(\"FlexRepeater\").props.instances \u003d []\n \treturn\n \n if self.custom.run_update:\n \tVisualisation.home_page.update_home_status(self)\n# system_tags \u003d system.tag.readBlocking([\"Configuration/FC\", \"System/ActiveAlarms\"])\n# tag_provider \u003d \"[%s_SCADA_TAG_PROVIDER]\" % (system_tags[0].value)\n# status_decoded \u003d system.util.jsonDecode(self.session.custom.id_to_state)\n# if status_decoded:\n#\t values \u003d []\n#\t devices \u003d self.custom.Devices\n#\t for i in devices:\n#\t \tvalue \u003d status_decoded.get(i)\n#\t \tif value \u003d\u003d None:\n#\t \t\tvalues.append(5)\n#\t \telse:\n#\t \t\tvalues.append(value)\n#\t zipped_list \u003d zip(values, devices)\n#\t devices_sorted \u003d [y for x,y in sorted(zipped_list)]\n#\t for i,j in enumerate(devices_sorted):\n#\t try:\n#\t \tself.getChild(\"FlexRepeater\").props.instances[i].tagProps[0] \u003d j\n#\t except:\n#\t \tsystem.perspective.print(i)" + } + } + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/8644181828f65e97d2999122f18df666aeb6e50ca464af9ca6b995567cffe0a3 b/.resources/8644181828f65e97d2999122f18df666aeb6e50ca464af9ca6b995567cffe0a3 new file mode 100644 index 0000000..b0112aa --- /dev/null +++ b/.resources/8644181828f65e97d2999122f18df666aeb6e50ca464af9ca6b995567cffe0a3 @@ -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/.resources/893636a3101d99e74481180593af33f20cab7e631679d4e45ad1f3de9bf5a675 b/.resources/893636a3101d99e74481180593af33f20cab7e631679d4e45ad1f3de9bf5a675 new file mode 100644 index 0000000..65db1c1 --- /dev/null +++ b/.resources/893636a3101d99e74481180593af33f20cab7e631679d4e45ad1f3de9bf5a675 @@ -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/.resources/89e8d0518adc7b877f117ff6aa17f005237ed6b4228f2904a073cbb2266127f4 b/.resources/89e8d0518adc7b877f117ff6aa17f005237ed6b4228f2904a073cbb2266127f4 new file mode 100644 index 0000000..3f59e8e --- /dev/null +++ b/.resources/89e8d0518adc7b877f117ff6aa17f005237ed6b4228f2904a073cbb2266127f4 @@ -0,0 +1,5771 @@ +{ + "custom": { + "activityLogger": { + "alt_pageid": "alarms", + "start_time": { + "$": [ + "ts", + 192, + 1718118450597 + ], + "$ts": 1718118450596 + } + } + }, + "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": { + "page_name": "Alarms-RealTime", + "table_type": "value" + }, + "propConfig": { + "custom.activityLogger": { + "persistent": true + }, + "custom.activityLogger.pageid": { + "binding": { + "config": { + "expression": "{/root/TabContainer.props.currentTabIndex}" + }, + "transforms": [ + { + "code": "\tpageid\u003d self.custom.activityLogger.alt_pageid+\u0027/\u0027+self.getChild(\"root\").getChild(\"TabContainer\").props.tabs[value]\n\treturn pageid.replace(\u0027 \u0027,\u0027\u0027)", + "type": "script" + } + ], + "type": "expr" + } + }, + "params.page_name": { + "paramDirection": "input", + "persistent": true + }, + "params.table_type": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [ + { + "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\tfilter_on \u003d \"\"\n\tbackground \u003d self.custom.background_on\n\tif background \u003d\u003d \"false\":\n\t\tfilter_on \u003d \"true\"\n\t\tself.custom.background_on \u003d \"true\"\n\telse:\n\t\tself.custom.background_on \u003d \"false\"\n\t\tfilter_on \u003d\"false\"\n\tpayload \u003d {\"critical\":filter_on}\n\tsystem.perspective.sendMessage(\"severity-filters\", payload \u003dpayload, scope \u003d \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "basis": "125px", + "display": false + }, + "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": "Buttons/PB_1" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "color": "#FFFFFF", + "path": "material/error" + } + }, + "style": {}, + "text": "Critical" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "reset-filters", + "pageScope": true, + "script": "\tbackground \u003d \"false\"\n\tseverity \u003d payload[\"reset\"]\n\tif severity \u003d\u003d \"false\":\n\t\tbackground \u003d \"false\"\n\telse:\n\t\tbackground \u003d \"true\"\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\tfilter_on \u003d \"\"\n\tbackground \u003d self.custom.background_on\n\tif background \u003d\u003d \"false\":\n\t\tfilter_on \u003d \"true\"\n\t\tself.custom.background_on \u003d \"true\"\n\telse:\n\t\tself.custom.background_on \u003d \"false\"\n\t\tfilter_on \u003d\"false\"\n\tpayload \u003d {\"high\":filter_on}\n\tsystem.perspective.sendMessage(\"severity-filters\", payload \u003dpayload, scope \u003d \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_0" + }, + "position": { + "basis": "120px" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "expression": "if({this.custom.background_on}\u003d\"false\",0,\r\nif({session.custom.colours.colour_impaired},2,1))" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": 0, + "output": "" + }, + { + "input": 1, + "output": "Alarms-Styles/High" + }, + { + "input": 2, + "output": "Alarms-Styles/Alt-Colours/High" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/priority_high" + } + }, + "primary": false, + "style": { + "margin": 15 + }, + "text": "High" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "reset-filters", + "pageScope": true, + "script": "\tbackground \u003d \"false\"\n\tseverity \u003d payload[\"reset\"]\n\tif severity \u003d\u003d \"false\":\n\t\tbackground \u003d \"false\"\n\telse:\n\t\tbackground \u003d \"true\"\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\tfilter_on \u003d \"\"\n\tbackground \u003d self.custom.background_on\n\tif background \u003d\u003d \"false\":\n\t\tfilter_on \u003d \"true\"\n\t\tself.custom.background_on \u003d \"true\"\n\telse:\n\t\tself.custom.background_on \u003d \"false\"\n\t\tfilter_on \u003d\"false\"\n\tpayload \u003d {\"medium\":filter_on}\n\tsystem.perspective.sendMessage(\"severity-filters\", payload \u003dpayload, scope \u003d \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_1" + }, + "position": { + "basis": "120px" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "expression": "if({this.custom.background_on}\u003d\"false\",0,\r\nif({session.custom.colours.colour_impaired},2,1))" + }, + "transforms": [ + { + "fallback": "Buttons/PB_1", + "inputType": "scalar", + "mappings": [ + { + "input": 0, + "output": "" + }, + { + "input": 1, + "output": "Alarms-Styles/Medium" + }, + { + "input": 2, + "output": "Alarms-Styles/Alt-Colours/Medium" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/priority_high" + } + }, + "primary": false, + "style": { + "margin": 15 + }, + "text": "Medium" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "reset-filters", + "pageScope": true, + "script": "\tbackground \u003d \"false\"\n\tseverity \u003d payload[\"reset\"]\n\tif severity \u003d\u003d \"false\":\n\t\tbackground \u003d \"false\"\n\telse:\n\t\tbackground \u003d \"true\"\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": "Low", + "background_on": "false" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload \u003d {}\n\tfilter_on \u003d \"\"\n\tbackground \u003d self.custom.background_on\n\tif background \u003d\u003d \"false\":\n\t\tfilter_on \u003d \"true\"\n\t\tself.custom.background_on \u003d \"true\"\n\telse:\n\t\tself.custom.background_on \u003d \"false\"\n\t\tfilter_on \u003d\"false\"\n\tpayload \u003d {\"low\":filter_on}\n\tsystem.perspective.sendMessage(\"severity-filters\", payload \u003dpayload, scope \u003d \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_2" + }, + "position": { + "basis": "120px" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "expression": "if({this.custom.background_on}\u003d\"false\",0,\r\nif({session.custom.colours.colour_impaired},2,1))" + }, + "transforms": [ + { + "fallback": "Buttons/PB_1", + "inputType": "scalar", + "mappings": [ + { + "input": 0, + "output": "" + }, + { + "input": 1, + "output": "Alarms-Styles/Low" + }, + { + "input": 2, + "output": "Alarms-Styles/Alt-Colours/Low" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/low_priority" + } + }, + "primary": false, + "style": { + "margin": 15 + }, + "text": "Low" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "reset-filters", + "pageScope": true, + "script": "\tbackground \u003d \"false\"\n\tseverity \u003d payload[\"reset\"]\n\tif severity \u003d\u003d \"false\":\n\t\tbackground \u003d \"false\"\n\telse:\n\t\tbackground \u003d \"true\"\n\tself.custom.background_on \u003d background", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_3" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "custom": { + "Severity": "Diagnostic", + "background_on": "false" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload \u003d {}\n\tfilter_on \u003d \"\"\n\tbackground \u003d self.custom.background_on\n\tif background \u003d\u003d \"false\":\n\t\tfilter_on \u003d \"true\"\n\t\tself.custom.background_on \u003d \"true\"\n\telse:\n\t\tself.custom.background_on \u003d \"false\"\n\t\tfilter_on \u003d\"false\"\n\tpayload \u003d {\"diagnostic\":filter_on}\n\tsystem.perspective.sendMessage(\"severity-filters\", payload \u003dpayload, scope \u003d \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_3" + }, + "position": { + "basis": "120px" + }, + "propConfig": { + "props.style.classes": { + "binding": { + "config": { + "expression": "if({this.custom.background_on}\u003d\"false\",0,\r\nif({session.custom.colours.colour_impaired},2,1))" + }, + "transforms": [ + { + "fallback": "Buttons/PB_1", + "inputType": "scalar", + "mappings": [ + { + "input": 0, + "output": "" + }, + { + "input": 1, + "output": "Alarms-Styles/Diagnostic" + }, + { + "input": 2, + "output": "Alarms-Styles/Alt-Colours/Diagnostic" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/warning" + } + }, + "primary": false, + "style": { + "margin": 15 + }, + "text": "Diagnostic" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "reset-filters", + "pageScope": true, + "script": "\t# implement your handler here\n\tbackground \u003d \"false\"\n\tseverity \u003d payload[\"reset\"]\n\tif severity \u003d\u003d \"false\":\n\t\tbackground \u003d \"false\"\n\telse:\n\t\tbackground \u003d \"true\"\n\tself.custom.background_on \u003d background", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "700px", + "shrink": 0 + }, + "props": { + "style": { + "padding": 0 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "20px" + }, + "type": "ia.display.label" + }, + { + "custom": { + "Severity": "Critical", + "background_on": "false" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload \u003d {}\n\tfilter_on \u003d \"false\"\n\tpayload[\"reset\"] \u003d filter_on\n\tsystem.perspective.sendMessage(\"reset-filters\", payload \u003dpayload, scope \u003d \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "basis": "120px" + }, + "props": { + "image": { + "icon": { + "color": "#000000", + "path": "material/clear" + } + }, + "primary": false, + "style": { + "margin": 15 + }, + "text": "Reset" + }, + "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_2" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "custom": { + "Severity": "High", + "background_on": "true", + "update_on": false + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload \u003d {}\n\tpayload[\"export\"] \u003d True\n\tsystem.perspective.sendMessage(\"run-alarm-export\", payload \u003d payload, scope \u003d \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_1" + }, + "position": { + "basis": "120px" + }, + "props": { + "image": { + "icon": { + "path": "material/import_export" + } + }, + "primary": false, + "style": { + "margin": 15 + }, + "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_0" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "custom": { + "alarms_to_shelve": [ + { + "style": { + "classes": "Alarms-Styles/Medium" + }, + "value": { + "Alarm_id": { + "value": 13 + }, + "Duration": { + "value": 10495 + }, + "Expiration": { + "value": { + "$": [ + "ts", + 0, + 1704730823344 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Photo eye blocked" + }, + "Priority": { + "value": "3. Medium" + }, + "Shelve": { + "value": false + }, + "SourceId": { + "value": "PLC09/1210_07_44/B830_3" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 0, + 1704730823344 + ], + "$ts": 1704720394486 + } + }, + "Unshelve": { + "value": false + } + } + } + ] + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tduration \u003d self.props.value\n\tpayload \u003d {}\n\tpayload[\"duration\"] \u003d duration\n\tsystem.perspective.sendMessage(\"shelve-alarms\", payload, scope \u003d \"page\")\n\tself.props.value \u003d None" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "120px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "path": "session.custom.fc" + }, + "transforms": [ + { + "code": "\twhid \u003d value.lower()\n\tWHID \u003d value.upper()\n\tsiterole \u003d \u0027Authenticated/Roles/rme-ignition-\u0027+whid+\u0027-alarm-shelving\u0027\n\tSITErole \u003d \u0027Authenticated/Roles/rme-ignition-\u0027+WHID+\u0027-alarm-shelving\u0027\n# Example: rme-ignition-BRS1-alarm-shelving\n\troles \u003d [\u0027Authenticated/Roles/eurme-ignition-admins\u0027, siterole, SITErole]\n\tauth \u003d system.perspective.isAuthorized(False, securityLevels\u003droles)\n\treturn auth", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "options": [ + { + "label": "15 mins", + "value": 15 + }, + { + "label": "30 min", + "value": 30 + }, + { + "label": "45 min", + "value": 45 + }, + { + "label": "1 hr", + "value": 60 + }, + { + "label": "2 hr", + "value": 120 + }, + { + "label": "4 hr", + "value": 240 + }, + { + "label": "8 hr", + "value": 480 + }, + { + "label": "1 Day", + "value": 1440 + }, + { + "label": "2 Days", + "value": 2880 + }, + { + "label": "1 week", + "value": 10080 + }, + { + "label": "2 weeks", + "value": 20160 + }, + { + "label": "Out of Service", + "value": 263000 + } + ], + "placeholder": { + "color": "#000000", + "icon": { + "color": "#000000", + "path": "material/archive", + "style": { + "classes": "" + } + }, + "text": "Shelve" + }, + "search": { + "enabled": false + }, + "showClearIcon": true, + "style": { + "borderBottomLeftRadius": "5px", + "borderBottomRightRadius": "5px", + "borderTopLeftRadius": "5px", + "borderTopRightRadius": "5px", + "classes": "Dropdown/DropDownBox", + "margin": 15 + }, + "value": null + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "alarms-to-shelve", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.custom.alarms_to_shelve \u003d payload", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "513px", + "shrink": 0 + }, + "props": { + "style": { + "padding": 0 + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "70px", + "shrink": 0 + }, + "props": { + "alignContent": "flex-start", + "style": { + "overflow": "visible" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "50px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "if({../AlarmTable.props.params.length_of_table_data} \u003d 0, True, False)" + }, + "type": "expr" + } + } + }, + "props": { + "text": "No Active Alarms", + "textStyle": { + "fontWeight": "bold", + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "AlarmTable" + }, + "position": { + "basis": "1898px", + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "if({this.props.params.length_of_table_data} \u003e 0, True, False)" + }, + "type": "expr" + } + } + }, + "props": { + "params": { + "alarm_states": [ + "Active", + "Not Active" + ], + "length_of_table_data": 0, + "show_filter": true, + "show_severity_column": true, + "show_state_column": true, + "table_type": "Realtime", + "tagProps": [ + "" + ] + }, + "path": "Alarm-Views/AlarmTable", + "style": { + "margin": 5 + } + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "480px", + "grow": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "Active_tab" + }, + "props": { + "direction": "column", + "justify": "space-evenly" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "custom": { + "alarms_to_shelve": [ + { + "style": { + "classes": "Alarms-Styles/Medium" + }, + "value": { + "Alarm_id": { + "value": 13 + }, + "Duration": { + "value": 10495 + }, + "Expiration": { + "value": { + "$": [ + "ts", + 0, + 1704730823344 + ], + "$ts": 0 + } + }, + "Message": { + "value": "Photo eye blocked" + }, + "Priority": { + "value": "3. Medium" + }, + "Shelve": { + "value": false + }, + "SourceId": { + "value": "PLC09/1210_07_44/B830_3" + }, + "State": { + "value": "Active" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 0, + 1704730823344 + ], + "$ts": 1704720394486 + } + }, + "Unshelve": { + "value": false + } + } + } + ] + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload \u003d {}\n\tsystem.perspective.sendMessage(\"unshelve-alarms\", payload, scope \u003d \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "basis": "153px" + }, + "props": { + "image": { + "icon": { + "color": "#000000", + "path": "material/archive" + } + }, + "style": { + "classes": "Dropdown/DropDownBox" + }, + "text": "Unshelve", + "value": "" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "alarms-to-shelve", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.props.enabled \u003d True\n\tself.custom.alarms_to_shelve \u003d payload", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "450px", + "shrink": 0 + }, + "props": { + "style": { + "padding": 5 + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "40px", + "shrink": 0 + }, + "props": { + "alignContent": "flex-start", + "style": { + "overflow": "visible" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "AlarmTable" + }, + "position": { + "basis": "1898px", + "grow": 1 + }, + "props": { + "params": { + "alarm_states": [ + "Shelved" + ], + "length_of_table_data": 0, + "table_type": "Shelved", + "tagProps": [ + "" + ] + }, + "path": "Alarm-Views/AlarmTable" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "10px" + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "500px", + "grow": 1 + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "Shelved tab" + }, + "position": { + "tabIndex": 1 + }, + "props": { + "direction": "column", + "justify": "space-evenly" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "children": [ + { + "custom": { + "SetFilter": true + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload \u003d {}\n\tif self.custom.SetFilter \u003d\u003d True:\n\t\tpayload[\"data\"] \u003d False\n\t\tself.custom.SetFilter \u003d False\n\t\t\n\t\n\telif self.custom.SetFilter \u003d\u003d False:\n\t\tpayload[\"data\"] \u003d True\n\t\tself.custom.SetFilter \u003d True\n\t\n\tsystem.perspective.sendMessage(\"show-historical-filters\", \n\t\t\t\t\t\t\t\t\tpayload \u003d payload, scope \u003d \"page\")\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button", + "tooltip": { + "enabled": true, + "style": { + "background-color": "white", + "borderColor": "#000000", + "borderStyle": "solid", + "borderWidth": "1px", + "box-shadow": "5px 5px 5px grey", + "color": "#000000", + "fontFamily": "Arial", + "fontWeight": "normal" + }, + "text": "Show Filters" + } + }, + "position": { + "basis": "120px" + }, + "props": { + "image": { + "icon": { + "path": "material/filter_alt" + }, + "position": "center" + }, + "primary": false, + "style": { + "margin": 15, + "marginLeft": 20 + }, + "text": "" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "281px" + }, + "props": { + "style": { + "color": "#FF0000", + "margin-left": "20px" + }, + "text": "ALL TIMESTAMPS ARE IN UTC" + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "Show filters" + }, + "position": { + "basis": "70px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "100px" + }, + "props": { + "style": { + "fontFamily": "Arial", + "fontWeight": "bold", + "textAlign": "center" + }, + "text": "From" + }, + "type": "ia.display.label" + }, + { + "custom": { + "max_duration_days": 10 + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tmessaging.message_handler.set_time_from_filters(self)\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "DateTimeInput", + "tooltip": { + "enabled": true + } + }, + "position": { + "basis": "200px" + }, + "propConfig": { + "props.maxDate": { + "binding": { + "config": { + "expression": "now()" + }, + "type": "expr" + } + }, + "props.minDate": { + "access": "PUBLIC", + "binding": { + "config": { + "expression": "addDays(now(),-{this.custom.max_duration_days})" + }, + "type": "expr" + } + } + }, + "props": { + "formattedValue": null, + "style": { + "margin": 15 + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "reset-historical-filters", + "pageScope": true, + "script": "\treset \u003d payload[\"data\"]\n\tself.props.value \u003d None", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.date-time-input" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "61px" + }, + "props": { + "style": { + "fontFamily": "Arial", + "fontWeight": "bold", + "textAlign": "center" + }, + "text": "To" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tmessaging.message_handler.set_time_to_filters(self)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "DateTimeInput_0" + }, + "position": { + "basis": "200px" + }, + "propConfig": { + "props.maxDate": { + "binding": { + "config": { + "expression": "now()" + }, + "type": "expr" + } + }, + "props.minDate": { + "binding": { + "config": { + "expression": "addDays(now(),-10)" + }, + "type": "expr" + } + }, + "props.value": { + "persistent": true + } + }, + "props": { + "formattedValue": null, + "style": { + "margin": 15 + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "reset-historical-filters", + "pageScope": true, + "script": "\treset \u003d payload[\"data\"]\n\tself.props.value \u003d None", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.date-time-input" + } + ], + "meta": { + "name": "Time" + }, + "position": { + "basis": "70px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "100px" + }, + "props": { + "style": { + "fontFamily": "Arial", + "fontWeight": "bold", + "textAlign": "center" + }, + "text": "SourceId" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tmessaging.message_handler.set_source_filters(self)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "490px" + }, + "propConfig": { + "props.value": { + "persistent": false + } + }, + "props": { + "multiSelect": true, + "options": [ + { + "label": "_types_/Topics", + "value": "_types_/Topics" + }, + { + "label": "PLC01", + "value": "PLC01" + }, + { + "label": "PLC01/10", + "value": "PLC01/10" + }, + { + "label": "PLC01/10/S0101", + "value": "PLC01/10/S0101" + }, + { + "label": "PLC01/30", + "value": "PLC01/30" + }, + { + "label": "PLC01/30/S0102", + "value": "PLC01/30/S0102" + }, + { + "label": "PLC01/40", + "value": "PLC01/40" + }, + { + "label": "PLC01/50", + "value": "PLC01/50" + }, + { + "label": "PLC01/50/SN0101", + "value": "PLC01/50/SN0101" + }, + { + "label": "PLC01/60", + "value": "PLC01/60" + }, + { + "label": "PLC01/210", + "value": "PLC01/210" + }, + { + "label": "PLC01/220", + "value": "PLC01/220" + }, + { + "label": "PLC01/AIR", + "value": "PLC01/AIR" + }, + { + "label": "PLC01/AIR/B0021", + "value": "PLC01/AIR/B0021" + }, + { + "label": "PLC01/AIR/B0022", + "value": "PLC01/AIR/B0022" + }, + { + "label": "PLC01/P1", + "value": "PLC01/P1" + }, + { + "label": "PLC01/P1/SN0021", + "value": "PLC01/P1/SN0021" + }, + { + "label": "PLC01/S01", + "value": "PLC01/S01" + }, + { + "label": "PLC01/S01/B0111", + "value": "PLC01/S01/B0111" + }, + { + "label": "PLC01/S01/K0041", + "value": "PLC01/S01/K0041" + }, + { + "label": "PLC01/ZM1", + "value": "PLC01/ZM1" + }, + { + "label": "PLC01/ZM1/B0121", + "value": "PLC01/ZM1/B0121" + }, + { + "label": "PLC01/ZM1/B0122", + "value": "PLC01/ZM1/B0122" + }, + { + "label": "PLC01/ZM2", + "value": "PLC01/ZM2" + }, + { + "label": "PLC01/ZM2/B0121", + "value": "PLC01/ZM2/B0121" + }, + { + "label": "PLC01/ZM2/B0122", + "value": "PLC01/ZM2/B0122" + }, + { + "label": "PLC02", + "value": "PLC02" + }, + { + "label": "PLC02/S01", + "value": "PLC02/S01" + }, + { + "label": "PLC02/S01/K0041", + "value": "PLC02/S01/K0041" + }, + { + "label": "PLC02/ZM1", + "value": "PLC02/ZM1" + }, + { + "label": "PLC02/ZM1/B0083", + "value": "PLC02/ZM1/B0083" + }, + { + "label": "PLC02/ZM1/B0121", + "value": "PLC02/ZM1/B0121" + }, + { + "label": "PLC02/ZM1/B0122", + "value": "PLC02/ZM1/B0122" + }, + { + "label": "PLC02/ZM1/U0251", + "value": "PLC02/ZM1/U0251" + }, + { + "label": "PLC02/ZM2", + "value": "PLC02/ZM2" + }, + { + "label": "PLC02/ZM2/B0121", + "value": "PLC02/ZM2/B0121" + }, + { + "label": "PLC02/ZM2/B0122", + "value": "PLC02/ZM2/B0122" + }, + { + "label": "PLC02/ZM2/U0251", + "value": "PLC02/ZM2/U0251" + }, + { + "label": "PLC03", + "value": "PLC03" + }, + { + "label": "PLC03/10", + "value": "PLC03/10" + }, + { + "label": "PLC03/10/S0101", + "value": "PLC03/10/S0101" + }, + { + "label": "PLC03/30", + "value": "PLC03/30" + }, + { + "label": "PLC03/30/S0102", + "value": "PLC03/30/S0102" + }, + { + "label": "PLC03/40", + "value": "PLC03/40" + }, + { + "label": "PLC03/50", + "value": "PLC03/50" + }, + { + "label": "PLC03/50/SN0101", + "value": "PLC03/50/SN0101" + }, + { + "label": "PLC03/60", + "value": "PLC03/60" + }, + { + "label": "PLC03/210", + "value": "PLC03/210" + }, + { + "label": "PLC03/220", + "value": "PLC03/220" + }, + { + "label": "PLC03/AIR", + "value": "PLC03/AIR" + }, + { + "label": "PLC03/AIR/B0021", + "value": "PLC03/AIR/B0021" + }, + { + "label": "PLC03/AIR/B0022", + "value": "PLC03/AIR/B0022" + }, + { + "label": "PLC03/P1", + "value": "PLC03/P1" + }, + { + "label": "PLC03/P1/SN0021", + "value": "PLC03/P1/SN0021" + }, + { + "label": "PLC03/S01", + "value": "PLC03/S01" + }, + { + "label": "PLC03/S01/B0111", + "value": "PLC03/S01/B0111" + }, + { + "label": "PLC03/S01/K0041", + "value": "PLC03/S01/K0041" + }, + { + "label": "PLC03/ZM1", + "value": "PLC03/ZM1" + }, + { + "label": "PLC03/ZM1/B0121", + "value": "PLC03/ZM1/B0121" + }, + { + "label": "PLC03/ZM1/B0122", + "value": "PLC03/ZM1/B0122" + }, + { + "label": "PLC03/ZM2", + "value": "PLC03/ZM2" + }, + { + "label": "PLC03/ZM2/B0121", + "value": "PLC03/ZM2/B0121" + }, + { + "label": "PLC03/ZM2/B0122", + "value": "PLC03/ZM2/B0122" + }, + { + "label": "PLC09", + "value": "PLC09" + }, + { + "label": "PLC09/ASL1", + "value": "PLC09/ASL1" + }, + { + "label": "PLC09/ASL1/ES", + "value": "PLC09/ASL1/ES" + }, + { + "label": "PLC09/ASL2", + "value": "PLC09/ASL2" + }, + { + "label": "PLC09/ASL2/ES", + "value": "PLC09/ASL2/ES" + }, + { + "label": "PLC09/ASL3", + "value": "PLC09/ASL3" + }, + { + "label": "PLC09/ASL3/ES", + "value": "PLC09/ASL3/ES" + }, + { + "label": "PLC09/I1_1", + "value": "PLC09/I1_1" + }, + { + "label": "PLC09/I1_1/ES1", + "value": "PLC09/I1_1/ES1" + }, + { + "label": "PLC09/I1_2", + "value": "PLC09/I1_2" + }, + { + "label": "PLC09/I1_2/ES1", + "value": "PLC09/I1_2/ES1" + }, + { + "label": "PLC09/I1_3", + "value": "PLC09/I1_3" + }, + { + "label": "PLC09/I1_3_4", + "value": "PLC09/I1_3_4" + }, + { + "label": "PLC09/I1_4", + "value": "PLC09/I1_4" + }, + { + "label": "PLC09/I2_1", + "value": "PLC09/I2_1" + }, + { + "label": "PLC09/I2_1/ES1", + "value": "PLC09/I2_1/ES1" + }, + { + "label": "PLC09/I2_2", + "value": "PLC09/I2_2" + }, + { + "label": "PLC09/I2_2/ES1", + "value": "PLC09/I2_2/ES1" + }, + { + "label": "PLC09/I2_3", + "value": "PLC09/I2_3" + }, + { + "label": "PLC09/I2_3_4", + "value": "PLC09/I2_3_4" + }, + { + "label": "PLC09/I2_4", + "value": "PLC09/I2_4" + }, + { + "label": "PLC09/I3_1", + "value": "PLC09/I3_1" + }, + { + "label": "PLC09/I3_1/ES1", + "value": "PLC09/I3_1/ES1" + }, + { + "label": "PLC09/I3_2", + "value": "PLC09/I3_2" + }, + { + "label": "PLC09/I3_2/ES1", + "value": "PLC09/I3_2/ES1" + }, + { + "label": "PLC09/I3_3", + "value": "PLC09/I3_3" + }, + { + "label": "PLC09/I3_3_4", + "value": "PLC09/I3_3_4" + }, + { + "label": "PLC09/I3_4", + "value": "PLC09/I3_4" + }, + { + "label": "PLC09/I4_1", + "value": "PLC09/I4_1" + }, + { + "label": "PLC09/I4_1/ES1", + "value": "PLC09/I4_1/ES1" + }, + { + "label": "PLC09/I4_2", + "value": "PLC09/I4_2" + }, + { + "label": "PLC09/I4_2/ES1", + "value": "PLC09/I4_2/ES1" + }, + { + "label": "PLC09/I4_3", + "value": "PLC09/I4_3" + }, + { + "label": "PLC09/I4_3_4", + "value": "PLC09/I4_3_4" + }, + { + "label": "PLC09/I4_4", + "value": "PLC09/I4_4" + }, + { + "label": "PLC09/INDUCT", + "value": "PLC09/INDUCT" + }, + { + "label": "PLC09/L1_1", + "value": "PLC09/L1_1" + }, + { + "label": "PLC09/L1_1/ES1", + "value": "PLC09/L1_1/ES1" + }, + { + "label": "PLC09/L1_1A", + "value": "PLC09/L1_1A" + }, + { + "label": "PLC09/L1_1B", + "value": "PLC09/L1_1B" + }, + { + "label": "PLC09/L1_2", + "value": "PLC09/L1_2" + }, + { + "label": "PLC09/L1_2_1", + "value": "PLC09/L1_2_1" + }, + { + "label": "PLC09/L1_2_2", + "value": "PLC09/L1_2_2" + }, + { + "label": "PLC09/L1_2_3", + "value": "PLC09/L1_2_3" + }, + { + "label": "PLC09/L1_2_4", + "value": "PLC09/L1_2_4" + }, + { + "label": "PLC09/L1_2_5", + "value": "PLC09/L1_2_5" + }, + { + "label": "PLC09/L1_2_6", + "value": "PLC09/L1_2_6" + }, + { + "label": "PLC09/L1_2_7", + "value": "PLC09/L1_2_7" + }, + { + "label": "PLC09/L1_2_8", + "value": "PLC09/L1_2_8" + }, + { + "label": "PLC09/L1_3_1", + "value": "PLC09/L1_3_1" + }, + { + "label": "PLC09/L1_3_2", + "value": "PLC09/L1_3_2" + }, + { + "label": "PLC09/L1_3_5", + "value": "PLC09/L1_3_5" + }, + { + "label": "PLC09/L1_4_1", + "value": "PLC09/L1_4_1" + }, + { + "label": "PLC09/L1_4_2", + "value": "PLC09/L1_4_2" + }, + { + "label": "PLC09/L1_4_3", + "value": "PLC09/L1_4_3" + }, + { + "label": "PLC09/L1_5_1", + "value": "PLC09/L1_5_1" + }, + { + "label": "PLC09/L1_5_2", + "value": "PLC09/L1_5_2" + }, + { + "label": "PLC09/L1_6", + "value": "PLC09/L1_6" + }, + { + "label": "PLC09/L1_7", + "value": "PLC09/L1_7" + }, + { + "label": "PLC09/L1_7/ES1", + "value": "PLC09/L1_7/ES1" + }, + { + "label": "PLC09/L1_8", + "value": "PLC09/L1_8" + }, + { + "label": "PLC09/L1_8/ES1", + "value": "PLC09/L1_8/ES1" + }, + { + "label": "PLC09/L1_9_1", + "value": "PLC09/L1_9_1" + }, + { + "label": "PLC09/L1_9_2", + "value": "PLC09/L1_9_2" + }, + { + "label": "PLC09/L1_9_10", + "value": "PLC09/L1_9_10" + }, + { + "label": "PLC09/L1_10_1", + "value": "PLC09/L1_10_1" + }, + { + "label": "PLC09/L1_10_2", + "value": "PLC09/L1_10_2" + }, + { + "label": "PLC09/L1_11", + "value": "PLC09/L1_11" + }, + { + "label": "PLC09/L1_11/ES1", + "value": "PLC09/L1_11/ES1" + }, + { + "label": "PLC09/L1_11A", + "value": "PLC09/L1_11A" + }, + { + "label": "PLC09/L1_11B", + "value": "PLC09/L1_11B" + }, + { + "label": "PLC09/L1_11C", + "value": "PLC09/L1_11C" + }, + { + "label": "PLC09/L1_11D", + "value": "PLC09/L1_11D" + }, + { + "label": "PLC09/L1_11E", + "value": "PLC09/L1_11E" + }, + { + "label": "PLC09/L1_11F", + "value": "PLC09/L1_11F" + }, + { + "label": "PLC09/L1_12_1", + "value": "PLC09/L1_12_1" + }, + { + "label": "PLC09/L1_12_2", + "value": "PLC09/L1_12_2" + }, + { + "label": "PLC09/L1_12_3", + "value": "PLC09/L1_12_3" + }, + { + "label": "PLC09/L1_12_4", + "value": "PLC09/L1_12_4" + }, + { + "label": "PLC09/L1_12_15", + "value": "PLC09/L1_12_15" + }, + { + "label": "PLC09/L1_13_1", + "value": "PLC09/L1_13_1" + }, + { + "label": "PLC09/L1_14_1", + "value": "PLC09/L1_14_1" + }, + { + "label": "PLC09/L1_14_2", + "value": "PLC09/L1_14_2" + }, + { + "label": "PLC09/L1_14_3", + "value": "PLC09/L1_14_3" + }, + { + "label": "PLC09/L1_15_1", + "value": "PLC09/L1_15_1" + }, + { + "label": "PLC09/L1_16", + "value": "PLC09/L1_16" + }, + { + "label": "PLC09/L1_16/ES1", + "value": "PLC09/L1_16/ES1" + }, + { + "label": "PLC09/L1_16A", + "value": "PLC09/L1_16A" + }, + { + "label": "PLC09/L1_16B", + "value": "PLC09/L1_16B" + }, + { + "label": "PLC09/L1_17", + "value": "PLC09/L1_17" + }, + { + "label": "PLC09/L1_17_1", + "value": "PLC09/L1_17_1" + }, + { + "label": "PLC09/L1_17_2", + "value": "PLC09/L1_17_2" + }, + { + "label": "PLC09/L1_17_3", + "value": "PLC09/L1_17_3" + }, + { + "label": "PLC09/L1_17_4", + "value": "PLC09/L1_17_4" + }, + { + "label": "PLC09/L1_17_5", + "value": "PLC09/L1_17_5" + }, + { + "label": "PLC09/L1_17_6", + "value": "PLC09/L1_17_6" + }, + { + "label": "PLC09/L1_17_7", + "value": "PLC09/L1_17_7" + }, + { + "label": "PLC09/L1_17_8", + "value": "PLC09/L1_17_8" + }, + { + "label": "PLC09/L1_18_1", + "value": "PLC09/L1_18_1" + }, + { + "label": "PLC09/L1_18_20", + "value": "PLC09/L1_18_20" + }, + { + "label": "PLC09/L1_19_1", + "value": "PLC09/L1_19_1" + }, + { + "label": "PLC09/L1_19_2", + "value": "PLC09/L1_19_2" + }, + { + "label": "PLC09/L1_19_3", + "value": "PLC09/L1_19_3" + }, + { + "label": "PLC09/L1_20_1", + "value": "PLC09/L1_20_1" + }, + { + "label": "PLC09/L1_21", + "value": "PLC09/L1_21" + }, + { + "label": "PLC09/L1_21A", + "value": "PLC09/L1_21A" + }, + { + "label": "PLC09/L1_21A_1", + "value": "PLC09/L1_21A_1" + }, + { + "label": "PLC09/L1_21A_2", + "value": "PLC09/L1_21A_2" + }, + { + "label": "PLC09/L1_21A_3", + "value": "PLC09/L1_21A_3" + }, + { + "label": "PLC09/L1_21A_4", + "value": "PLC09/L1_21A_4" + }, + { + "label": "PLC09/L1_21A_5", + "value": "PLC09/L1_21A_5" + }, + { + "label": "PLC09/L1_21A_6", + "value": "PLC09/L1_21A_6" + }, + { + "label": "PLC09/L1_21A_7", + "value": "PLC09/L1_21A_7" + }, + { + "label": "PLC09/L1_21A_8", + "value": "PLC09/L1_21A_8" + }, + { + "label": "PLC09/L1_21A_9", + "value": "PLC09/L1_21A_9" + }, + { + "label": "PLC09/L1_21A_10", + "value": "PLC09/L1_21A_10" + }, + { + "label": "PLC09/L1_21B", + "value": "PLC09/L1_21B" + }, + { + "label": "PLC09/L1_21B_1", + "value": "PLC09/L1_21B_1" + }, + { + "label": "PLC09/L1_21B_2", + "value": "PLC09/L1_21B_2" + }, + { + "label": "PLC09/L1_21B_3", + "value": "PLC09/L1_21B_3" + }, + { + "label": "PLC09/L1_21B_4", + "value": "PLC09/L1_21B_4" + }, + { + "label": "PLC09/L1_21B_5", + "value": "PLC09/L1_21B_5" + }, + { + "label": "PLC09/L1_21B_6", + "value": "PLC09/L1_21B_6" + }, + { + "label": "PLC09/L1_21B_7", + "value": "PLC09/L1_21B_7" + }, + { + "label": "PLC09/L1_21B_8", + "value": "PLC09/L1_21B_8" + }, + { + "label": "PLC09/L1_21B_9", + "value": "PLC09/L1_21B_9" + }, + { + "label": "PLC09/L1_21B_10", + "value": "PLC09/L1_21B_10" + }, + { + "label": "PLC09/L1_22", + "value": "PLC09/L1_22" + }, + { + "label": "PLC09/L1_22/ES1", + "value": "PLC09/L1_22/ES1" + }, + { + "label": "PLC09/L1_22/ES2", + "value": "PLC09/L1_22/ES2" + }, + { + "label": "PLC09/L1_24", + "value": "PLC09/L1_24" + }, + { + "label": "PLC09/L1_24_1", + "value": "PLC09/L1_24_1" + }, + { + "label": "PLC09/L1_24_2", + "value": "PLC09/L1_24_2" + }, + { + "label": "PLC09/L1_24_3", + "value": "PLC09/L1_24_3" + }, + { + "label": "PLC09/L1_24_4", + "value": "PLC09/L1_24_4" + }, + { + "label": "PLC09/L1_24_5", + "value": "PLC09/L1_24_5" + }, + { + "label": "PLC09/L1_24_6", + "value": "PLC09/L1_24_6" + }, + { + "label": "PLC09/L1_24_7", + "value": "PLC09/L1_24_7" + }, + { + "label": "PLC09/L1_25", + "value": "PLC09/L1_25" + }, + { + "label": "PLC09/L1_25/ES1", + "value": "PLC09/L1_25/ES1" + }, + { + "label": "PLC09/L1_25/ES2", + "value": "PLC09/L1_25/ES2" + }, + { + "label": "PLC09/L1_25A", + "value": "PLC09/L1_25A" + }, + { + "label": "PLC09/L1_25B", + "value": "PLC09/L1_25B" + }, + { + "label": "PLC09/L1_25C", + "value": "PLC09/L1_25C" + }, + { + "label": "PLC09/L1_25D", + "value": "PLC09/L1_25D" + }, + { + "label": "PLC09/L1_25E", + "value": "PLC09/L1_25E" + }, + { + "label": "PLC09/L2_1A", + "value": "PLC09/L2_1A" + }, + { + "label": "PLC09/L2_1B", + "value": "PLC09/L2_1B" + }, + { + "label": "PLC09/L2_2", + "value": "PLC09/L2_2" + }, + { + "label": "PLC09/L2_2_1", + "value": "PLC09/L2_2_1" + }, + { + "label": "PLC09/L2_2_2", + "value": "PLC09/L2_2_2" + }, + { + "label": "PLC09/L2_2_3", + "value": "PLC09/L2_2_3" + }, + { + "label": "PLC09/L2_2_4", + "value": "PLC09/L2_2_4" + }, + { + "label": "PLC09/L2_2_5", + "value": "PLC09/L2_2_5" + }, + { + "label": "PLC09/L2_2_6", + "value": "PLC09/L2_2_6" + }, + { + "label": "PLC09/L2_2_7", + "value": "PLC09/L2_2_7" + }, + { + "label": "PLC09/L2_2_8", + "value": "PLC09/L2_2_8" + }, + { + "label": "PLC09/L2_3_1", + "value": "PLC09/L2_3_1" + }, + { + "label": "PLC09/L2_3_2", + "value": "PLC09/L2_3_2" + }, + { + "label": "PLC09/L2_3_4_5", + "value": "PLC09/L2_3_4_5" + }, + { + "label": "PLC09/L2_3_5", + "value": "PLC09/L2_3_5" + }, + { + "label": "PLC09/L2_4_1", + "value": "PLC09/L2_4_1" + }, + { + "label": "PLC09/L2_4_2", + "value": "PLC09/L2_4_2" + }, + { + "label": "PLC09/L2_4_3", + "value": "PLC09/L2_4_3" + }, + { + "label": "PLC09/L2_4_4", + "value": "PLC09/L2_4_4" + }, + { + "label": "PLC09/L2_4_6", + "value": "PLC09/L2_4_6" + }, + { + "label": "PLC09/L2_4_7", + "value": "PLC09/L2_4_7" + }, + { + "label": "PLC09/L2_4_8", + "value": "PLC09/L2_4_8" + }, + { + "label": "PLC09/L2_5", + "value": "PLC09/L2_5" + }, + { + "label": "PLC09/L2_5/ES1", + "value": "PLC09/L2_5/ES1" + }, + { + "label": "PLC09/L2_5_1", + "value": "PLC09/L2_5_1" + }, + { + "label": "PLC09/L2_5_2", + "value": "PLC09/L2_5_2" + }, + { + "label": "PLC09/L2_6", + "value": "PLC09/L2_6" + }, + { + "label": "PLC09/L2_7", + "value": "PLC09/L2_7" + }, + { + "label": "PLC09/L2_8", + "value": "PLC09/L2_8" + }, + { + "label": "PLC09/L2_9", + "value": "PLC09/L2_9" + }, + { + "label": "PLC09/L2_9/ES1", + "value": "PLC09/L2_9/ES1" + }, + { + "label": "PLC09/L2_10_1", + "value": "PLC09/L2_10_1" + }, + { + "label": "PLC09/L2_10_2", + "value": "PLC09/L2_10_2" + }, + { + "label": "PLC09/L2_10_3", + "value": "PLC09/L2_10_3" + }, + { + "label": "PLC09/L2_10_4", + "value": "PLC09/L2_10_4" + }, + { + "label": "PLC09/L2_10_11", + "value": "PLC09/L2_10_11" + }, + { + "label": "PLC09/L2_11_1", + "value": "PLC09/L2_11_1" + }, + { + "label": "PLC09/L2_11_2", + "value": "PLC09/L2_11_2" + }, + { + "label": "PLC09/L2_12", + "value": "PLC09/L2_12" + }, + { + "label": "PLC09/L2_12/ES1", + "value": "PLC09/L2_12/ES1" + }, + { + "label": "PLC09/L2_12A", + "value": "PLC09/L2_12A" + }, + { + "label": "PLC09/L2_12B", + "value": "PLC09/L2_12B" + }, + { + "label": "PLC09/L2_13", + "value": "PLC09/L2_13" + }, + { + "label": "PLC09/L2_13_1", + "value": "PLC09/L2_13_1" + }, + { + "label": "PLC09/L2_13_2", + "value": "PLC09/L2_13_2" + }, + { + "label": "PLC09/L2_13_3", + "value": "PLC09/L2_13_3" + }, + { + "label": "PLC09/L2_13_4", + "value": "PLC09/L2_13_4" + }, + { + "label": "PLC09/L2_13_5", + "value": "PLC09/L2_13_5" + }, + { + "label": "PLC09/L2_13_6", + "value": "PLC09/L2_13_6" + }, + { + "label": "PLC09/L2_13_7", + "value": "PLC09/L2_13_7" + }, + { + "label": "PLC09/L2_13_8", + "value": "PLC09/L2_13_8" + }, + { + "label": "PLC09/L2_14_1", + "value": "PLC09/L2_14_1" + }, + { + "label": "PLC09/L2_14_16", + "value": "PLC09/L2_14_16" + }, + { + "label": "PLC09/L2_15_1", + "value": "PLC09/L2_15_1" + }, + { + "label": "PLC09/L2_15_2", + "value": "PLC09/L2_15_2" + }, + { + "label": "PLC09/L2_15_3", + "value": "PLC09/L2_15_3" + }, + { + "label": "PLC09/L2_16_1", + "value": "PLC09/L2_16_1" + }, + { + "label": "PLC09/L2_17", + "value": "PLC09/L2_17" + }, + { + "label": "PLC09/L2_17A", + "value": "PLC09/L2_17A" + }, + { + "label": "PLC09/L2_17A_1", + "value": "PLC09/L2_17A_1" + }, + { + "label": "PLC09/L2_17A_2", + "value": "PLC09/L2_17A_2" + }, + { + "label": "PLC09/L2_17A_3", + "value": "PLC09/L2_17A_3" + }, + { + "label": "PLC09/L2_17A_4", + "value": "PLC09/L2_17A_4" + }, + { + "label": "PLC09/L2_17A_5", + "value": "PLC09/L2_17A_5" + }, + { + "label": "PLC09/L2_17A_6", + "value": "PLC09/L2_17A_6" + }, + { + "label": "PLC09/L2_17A_7", + "value": "PLC09/L2_17A_7" + }, + { + "label": "PLC09/L2_17A_8", + "value": "PLC09/L2_17A_8" + }, + { + "label": "PLC09/L2_17A_9", + "value": "PLC09/L2_17A_9" + }, + { + "label": "PLC09/L2_17A_10", + "value": "PLC09/L2_17A_10" + }, + { + "label": "PLC09/L2_17B", + "value": "PLC09/L2_17B" + }, + { + "label": "PLC09/L2_17B_1", + "value": "PLC09/L2_17B_1" + }, + { + "label": "PLC09/L2_17B_2", + "value": "PLC09/L2_17B_2" + }, + { + "label": "PLC09/L2_17B_3", + "value": "PLC09/L2_17B_3" + }, + { + "label": "PLC09/L2_17B_4", + "value": "PLC09/L2_17B_4" + }, + { + "label": "PLC09/L2_17B_5", + "value": "PLC09/L2_17B_5" + }, + { + "label": "PLC09/L2_17B_6", + "value": "PLC09/L2_17B_6" + }, + { + "label": "PLC09/L2_17B_7", + "value": "PLC09/L2_17B_7" + }, + { + "label": "PLC09/L2_17B_8", + "value": "PLC09/L2_17B_8" + }, + { + "label": "PLC09/L2_17B_9", + "value": "PLC09/L2_17B_9" + }, + { + "label": "PLC09/L2_17B_10", + "value": "PLC09/L2_17B_10" + }, + { + "label": "PLC09/L2_18", + "value": "PLC09/L2_18" + }, + { + "label": "PLC09/L2_18/ES1", + "value": "PLC09/L2_18/ES1" + }, + { + "label": "PLC09/L2_18/ES2", + "value": "PLC09/L2_18/ES2" + }, + { + "label": "PLC09/L2_20", + "value": "PLC09/L2_20" + }, + { + "label": "PLC09/L2_20_1", + "value": "PLC09/L2_20_1" + }, + { + "label": "PLC09/L2_20_2", + "value": "PLC09/L2_20_2" + }, + { + "label": "PLC09/L2_20_3", + "value": "PLC09/L2_20_3" + }, + { + "label": "PLC09/L2_20_4", + "value": "PLC09/L2_20_4" + }, + { + "label": "PLC09/L2_20_5", + "value": "PLC09/L2_20_5" + }, + { + "label": "PLC09/L2_20_6", + "value": "PLC09/L2_20_6" + }, + { + "label": "PLC09/L2_20_7", + "value": "PLC09/L2_20_7" + }, + { + "label": "PLC09/L2_20_8", + "value": "PLC09/L2_20_8" + }, + { + "label": "PLC09/L2_21", + "value": "PLC09/L2_21" + }, + { + "label": "PLC09/L2_21/ES1", + "value": "PLC09/L2_21/ES1" + }, + { + "label": "PLC09/L2_21/ES2", + "value": "PLC09/L2_21/ES2" + }, + { + "label": "PLC09/L2_21A", + "value": "PLC09/L2_21A" + }, + { + "label": "PLC09/L2_21B", + "value": "PLC09/L2_21B" + }, + { + "label": "PLC09/L2_21C", + "value": "PLC09/L2_21C" + }, + { + "label": "PLC09/L2_21D", + "value": "PLC09/L2_21D" + }, + { + "label": "PLC09/L2_21E", + "value": "PLC09/L2_21E" + }, + { + "label": "PLC09/L3_1", + "value": "PLC09/L3_1" + }, + { + "label": "PLC09/L3_1/ES1", + "value": "PLC09/L3_1/ES1" + }, + { + "label": "PLC09/L3_1A", + "value": "PLC09/L3_1A" + }, + { + "label": "PLC09/L3_1B", + "value": "PLC09/L3_1B" + }, + { + "label": "PLC09/L3_2", + "value": "PLC09/L3_2" + }, + { + "label": "PLC09/L3_2_1", + "value": "PLC09/L3_2_1" + }, + { + "label": "PLC09/L3_2_2", + "value": "PLC09/L3_2_2" + }, + { + "label": "PLC09/L3_2_3", + "value": "PLC09/L3_2_3" + }, + { + "label": "PLC09/L3_2_4", + "value": "PLC09/L3_2_4" + }, + { + "label": "PLC09/L3_2_5", + "value": "PLC09/L3_2_5" + }, + { + "label": "PLC09/L3_2_6", + "value": "PLC09/L3_2_6" + }, + { + "label": "PLC09/L3_2_7", + "value": "PLC09/L3_2_7" + }, + { + "label": "PLC09/L3_2_8", + "value": "PLC09/L3_2_8" + }, + { + "label": "PLC09/L3_3_1", + "value": "PLC09/L3_3_1" + }, + { + "label": "PLC09/L3_3_2", + "value": "PLC09/L3_3_2" + }, + { + "label": "PLC09/L3_3_5", + "value": "PLC09/L3_3_5" + }, + { + "label": "PLC09/L3_4", + "value": "PLC09/L3_4" + }, + { + "label": "PLC09/L3_4/ES1", + "value": "PLC09/L3_4/ES1" + }, + { + "label": "PLC09/L3_4_1", + "value": "PLC09/L3_4_1" + }, + { + "label": "PLC09/L3_5_1", + "value": "PLC09/L3_5_1" + }, + { + "label": "PLC09/L3_5_2", + "value": "PLC09/L3_5_2" + }, + { + "label": "PLC09/L3_6", + "value": "PLC09/L3_6" + }, + { + "label": "PLC09/L3_7", + "value": "PLC09/L3_7" + }, + { + "label": "PLC09/L3_7/ES1", + "value": "PLC09/L3_7/ES1" + }, + { + "label": "PLC09/L3_8", + "value": "PLC09/L3_8" + }, + { + "label": "PLC09/L3_8/ES1", + "value": "PLC09/L3_8/ES1" + }, + { + "label": "PLC09/L3_9", + "value": "PLC09/L3_9" + }, + { + "label": "PLC09/L3_9_1", + "value": "PLC09/L3_9_1" + }, + { + "label": "PLC09/L3_9_2", + "value": "PLC09/L3_9_2" + }, + { + "label": "PLC09/L3_9_3", + "value": "PLC09/L3_9_3" + }, + { + "label": "PLC09/L3_9_4", + "value": "PLC09/L3_9_4" + }, + { + "label": "PLC09/L3_9_5", + "value": "PLC09/L3_9_5" + }, + { + "label": "PLC09/L3_9_6", + "value": "PLC09/L3_9_6" + }, + { + "label": "PLC09/L3_9_7", + "value": "PLC09/L3_9_7" + }, + { + "label": "PLC09/L3_10_1", + "value": "PLC09/L3_10_1" + }, + { + "label": "PLC09/L3_10_2", + "value": "PLC09/L3_10_2" + }, + { + "label": "PLC09/L3_10_11", + "value": "PLC09/L3_10_11" + }, + { + "label": "PLC09/L3_11", + "value": "PLC09/L3_11" + }, + { + "label": "PLC09/L3_11/ES1", + "value": "PLC09/L3_11/ES1" + }, + { + "label": "PLC09/L3_11_1", + "value": "PLC09/L3_11_1" + }, + { + "label": "PLC09/L3_11_2", + "value": "PLC09/L3_11_2" + }, + { + "label": "PLC09/L3_11_3", + "value": "PLC09/L3_11_3" + }, + { + "label": "PLC09/L3_11_4", + "value": "PLC09/L3_11_4" + }, + { + "label": "PLC09/L3_12", + "value": "PLC09/L3_12" + }, + { + "label": "PLC09/L3_12/ES1", + "value": "PLC09/L3_12/ES1" + }, + { + "label": "PLC09/L3_12A", + "value": "PLC09/L3_12A" + }, + { + "label": "PLC09/L3_12B", + "value": "PLC09/L3_12B" + }, + { + "label": "PLC09/L3_12C", + "value": "PLC09/L3_12C" + }, + { + "label": "PLC09/L4_1A", + "value": "PLC09/L4_1A" + }, + { + "label": "PLC09/L4_1B", + "value": "PLC09/L4_1B" + }, + { + "label": "PLC09/L4_2", + "value": "PLC09/L4_2" + }, + { + "label": "PLC09/L4_2_1", + "value": "PLC09/L4_2_1" + }, + { + "label": "PLC09/L4_2_2", + "value": "PLC09/L4_2_2" + }, + { + "label": "PLC09/L4_2_3", + "value": "PLC09/L4_2_3" + }, + { + "label": "PLC09/L4_2_4", + "value": "PLC09/L4_2_4" + }, + { + "label": "PLC09/L4_2_5", + "value": "PLC09/L4_2_5" + }, + { + "label": "PLC09/L4_2_6", + "value": "PLC09/L4_2_6" + }, + { + "label": "PLC09/L4_2_7", + "value": "PLC09/L4_2_7" + }, + { + "label": "PLC09/L4_2_8", + "value": "PLC09/L4_2_8" + }, + { + "label": "PLC09/L4_3_1", + "value": "PLC09/L4_3_1" + }, + { + "label": "PLC09/L4_3_2", + "value": "PLC09/L4_3_2" + }, + { + "label": "PLC09/L4_3_5", + "value": "PLC09/L4_3_5" + }, + { + "label": "PLC09/L4_4_1", + "value": "PLC09/L4_4_1" + }, + { + "label": "PLC09/L4_4_2", + "value": "PLC09/L4_4_2" + }, + { + "label": "PLC09/L4_5_1", + "value": "PLC09/L4_5_1" + }, + { + "label": "PLC09/L4_5_2", + "value": "PLC09/L4_5_2" + }, + { + "label": "PLC09/L4_6", + "value": "PLC09/L4_6" + }, + { + "label": "PLC09/L4_6/ES1", + "value": "PLC09/L4_6/ES1" + }, + { + "label": "PLC09/L4_7", + "value": "PLC09/L4_7" + }, + { + "label": "PLC09/L4_8", + "value": "PLC09/L4_8" + }, + { + "label": "PLC09/L4_8/ES1", + "value": "PLC09/L4_8/ES1" + }, + { + "label": "PLC09/L4_8/ES2", + "value": "PLC09/L4_8/ES2" + }, + { + "label": "PLC09/L4_9", + "value": "PLC09/L4_9" + }, + { + "label": "PLC09/L4_9/ES1", + "value": "PLC09/L4_9/ES1" + }, + { + "label": "PLC09/L4_10_1", + "value": "PLC09/L4_10_1" + }, + { + "label": "PLC09/L4_10_2", + "value": "PLC09/L4_10_2" + }, + { + "label": "PLC09/L4_10_3", + "value": "PLC09/L4_10_3" + }, + { + "label": "PLC09/L4_10_4", + "value": "PLC09/L4_10_4" + }, + { + "label": "PLC09/L4_10_5", + "value": "PLC09/L4_10_5" + }, + { + "label": "PLC09/L4_10_6", + "value": "PLC09/L4_10_6" + }, + { + "label": "PLC09/L4_10_7", + "value": "PLC09/L4_10_7" + }, + { + "label": "PLC09/L4_10_8", + "value": "PLC09/L4_10_8" + }, + { + "label": "PLC09/L4_10_11", + "value": "PLC09/L4_10_11" + }, + { + "label": "PLC09/L4_11", + "value": "PLC09/L4_11" + }, + { + "label": "PLC09/L4_11/ES1", + "value": "PLC09/L4_11/ES1" + }, + { + "label": "PLC09/L4_11_1", + "value": "PLC09/L4_11_1" + }, + { + "label": "PLC09/L4_11_2", + "value": "PLC09/L4_11_2" + }, + { + "label": "PLC09/L4_12", + "value": "PLC09/L4_12" + }, + { + "label": "PLC09/L4_12/ES1", + "value": "PLC09/L4_12/ES1" + }, + { + "label": "PLC09/L4_12A", + "value": "PLC09/L4_12A" + }, + { + "label": "PLC09/L4_12B", + "value": "PLC09/L4_12B" + }, + { + "label": "PLC09/L4_12C", + "value": "PLC09/L4_12C" + }, + { + "label": "PLC09/L4_12D", + "value": "PLC09/L4_12D" + }, + { + "label": "PLC09/L4_12E", + "value": "PLC09/L4_12E" + }, + { + "label": "PLC09/L4_12F", + "value": "PLC09/L4_12F" + }, + { + "label": "PLC09/L4_13", + "value": "PLC09/L4_13" + }, + { + "label": "PLC09/L4_13_1", + "value": "PLC09/L4_13_1" + }, + { + "label": "PLC09/L4_13_2", + "value": "PLC09/L4_13_2" + }, + { + "label": "PLC09/L4_13_3", + "value": "PLC09/L4_13_3" + }, + { + "label": "PLC09/L4_13_4", + "value": "PLC09/L4_13_4" + }, + { + "label": "PLC09/L4_14", + "value": "PLC09/L4_14" + }, + { + "label": "PLC09/L4_14/ES1", + "value": "PLC09/L4_14/ES1" + }, + { + "label": "PLC09/L4_14A", + "value": "PLC09/L4_14A" + }, + { + "label": "PLC09/L4_14B", + "value": "PLC09/L4_14B" + }, + { + "label": "PLC09/L5_1", + "value": "PLC09/L5_1" + }, + { + "label": "PLC09/L5_2", + "value": "PLC09/L5_2" + }, + { + "label": "PLC09/L5_3", + "value": "PLC09/L5_3" + }, + { + "label": "PLC09/L5_3_1", + "value": "PLC09/L5_3_1" + }, + { + "label": "PLC09/L5_3_2", + "value": "PLC09/L5_3_2" + }, + { + "label": "PLC09/L5_3_3", + "value": "PLC09/L5_3_3" + }, + { + "label": "PLC09/L5_3_5", + "value": "PLC09/L5_3_5" + }, + { + "label": "PLC09/L5_3_6", + "value": "PLC09/L5_3_6" + }, + { + "label": "PLC09/L5_3_7", + "value": "PLC09/L5_3_7" + }, + { + "label": "PLC09/L5_3_8", + "value": "PLC09/L5_3_8" + }, + { + "label": "PLC09/L5_4", + "value": "PLC09/L5_4" + }, + { + "label": "PLC09/L5_4/ES1", + "value": "PLC09/L5_4/ES1" + }, + { + "label": "PLC09/L5_4/ES2", + "value": "PLC09/L5_4/ES2" + }, + { + "label": "PLC09/L5_4A", + "value": "PLC09/L5_4A" + }, + { + "label": "PLC09/L5_4B", + "value": "PLC09/L5_4B" + }, + { + "label": "PLC09/L5_4C", + "value": "PLC09/L5_4C" + }, + { + "label": "PLC09/L5_4D", + "value": "PLC09/L5_4D" + }, + { + "label": "PLC09/L5_4E", + "value": "PLC09/L5_4E" + }, + { + "label": "PLC09/L6_1", + "value": "PLC09/L6_1" + }, + { + "label": "PLC09/L6_2", + "value": "PLC09/L6_2" + }, + { + "label": "PLC09/L6_3", + "value": "PLC09/L6_3" + }, + { + "label": "PLC09/L6_3_1", + "value": "PLC09/L6_3_1" + }, + { + "label": "PLC09/L6_3_2", + "value": "PLC09/L6_3_2" + }, + { + "label": "PLC09/L6_3_3", + "value": "PLC09/L6_3_3" + }, + { + "label": "PLC09/L6_3_4", + "value": "PLC09/L6_3_4" + }, + { + "label": "PLC09/L6_3_5", + "value": "PLC09/L6_3_5" + }, + { + "label": "PLC09/L6_3_6", + "value": "PLC09/L6_3_6" + }, + { + "label": "PLC09/L6_3_7", + "value": "PLC09/L6_3_7" + }, + { + "label": "PLC09/L6_3_8", + "value": "PLC09/L6_3_8" + }, + { + "label": "PLC09/L6_4", + "value": "PLC09/L6_4" + }, + { + "label": "PLC09/L6_4/ES1", + "value": "PLC09/L6_4/ES1" + }, + { + "label": "PLC09/L6_4/ES2", + "value": "PLC09/L6_4/ES2" + }, + { + "label": "PLC09/L6_4A", + "value": "PLC09/L6_4A" + }, + { + "label": "PLC09/L6_4B", + "value": "PLC09/L6_4B" + }, + { + "label": "PLC09/L6_4C", + "value": "PLC09/L6_4C" + }, + { + "label": "PLC09/L6_4D", + "value": "PLC09/L6_4D" + }, + { + "label": "PLC09/L6_4E", + "value": "PLC09/L6_4E" + }, + { + "label": "PLC09/LINE_1", + "value": "PLC09/LINE_1" + }, + { + "label": "PLC09/LINE_2", + "value": "PLC09/LINE_2" + }, + { + "label": "PLC09/LINE_3", + "value": "PLC09/LINE_3" + }, + { + "label": "PLC09/LINE_4", + "value": "PLC09/LINE_4" + }, + { + "label": "PLC09/MP1", + "value": "PLC09/MP1" + }, + { + "label": "PLC09/MP1/ES1", + "value": "PLC09/MP1/ES1" + }, + { + "label": "PLC09/RP1", + "value": "PLC09/RP1" + }, + { + "label": "PLC09/RP1/ES1", + "value": "PLC09/RP1/ES1" + }, + { + "label": "PLC09/RP2", + "value": "PLC09/RP2" + }, + { + "label": "PLC09/RP2/ES1", + "value": "PLC09/RP2/ES1" + }, + { + "label": "PLC09/SAFETY MONITOR", + "value": "PLC09/SAFETY MONITOR" + }, + { + "label": "PLC09/SAFETY MONITOR/RELAY", + "value": "PLC09/SAFETY MONITOR/RELAY" + }, + { + "label": "PLC09/T1", + "value": "PLC09/T1" + }, + { + "label": "PLC09/T1_1", + "value": "PLC09/T1_1" + }, + { + "label": "PLC09/T1_2", + "value": "PLC09/T1_2" + }, + { + "label": "PLC09/T1_3", + "value": "PLC09/T1_3" + }, + { + "label": "PLC09/T1_4", + "value": "PLC09/T1_4" + }, + { + "label": "PLC09/T1_5", + "value": "PLC09/T1_5" + }, + { + "label": "PLC09/T1_6", + "value": "PLC09/T1_6" + }, + { + "label": "PLC09/T2", + "value": "PLC09/T2" + }, + { + "label": "PLC09/T2_", + "value": "PLC09/T2_" + }, + { + "label": "PLC09/T2_1", + "value": "PLC09/T2_1" + }, + { + "label": "PLC09/T2_2", + "value": "PLC09/T2_2" + }, + { + "label": "PLC09/T2_3", + "value": "PLC09/T2_3" + }, + { + "label": "PLC09/T2_4", + "value": "PLC09/T2_4" + }, + { + "label": "PLC09/T3", + "value": "PLC09/T3" + }, + { + "label": "PLC09/T3_1", + "value": "PLC09/T3_1" + }, + { + "label": "PLC09/T3_2", + "value": "PLC09/T3_2" + }, + { + "label": "PLC09/T3_3", + "value": "PLC09/T3_3" + }, + { + "label": "PLC09/T3_4", + "value": "PLC09/T3_4" + }, + { + "label": "PLC09/T3_5", + "value": "PLC09/T3_5" + }, + { + "label": "PLC09/T3_6", + "value": "PLC09/T3_6" + }, + { + "label": "PLC09/T4", + "value": "PLC09/T4" + }, + { + "label": "PLC09/T4_1", + "value": "PLC09/T4_1" + }, + { + "label": "PLC09/T4_2", + "value": "PLC09/T4_2" + }, + { + "label": "PLC09/T4_3", + "value": "PLC09/T4_3" + }, + { + "label": "PLC09/T4_4", + "value": "PLC09/T4_4" + }, + { + "label": "PLC09/T4_5", + "value": "PLC09/T4_5" + } + ], + "style": { + "margin": 15 + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update-source_id-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.props.options \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "reset-historical-filters", + "pageScope": true, + "script": "\treset \u003d payload[\"data\"]\n\tself.props.value \u003d None", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "SourceId" + }, + "position": { + "basis": "70px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "100px" + }, + "props": { + "style": { + "fontFamily": "Arial", + "fontWeight": "bold", + "textAlign": "center" + }, + "text": "Priority" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tmessaging.message_handler.set_priority_filters(self)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "490px" + }, + "propConfig": { + "props.value": { + "persistent": false + } + }, + "props": { + "multiSelect": true, + "options": [ + { + "label": "Diagnostic", + "value": "1" + }, + { + "label": "Low", + "value": "2" + }, + { + "label": "Medium", + "value": "3" + }, + { + "label": "High", + "value": "4" + } + ], + "style": { + "margin": 15 + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "reset-historical-filters", + "pageScope": true, + "script": "\treset \u003d payload[\"data\"]\n\tself.props.value \u003d None", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "Priority" + }, + "position": { + "basis": "70px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "100px" + }, + "props": { + "style": { + "fontFamily": "Arial", + "fontWeight": "bold", + "textAlign": "center" + }, + "text": "Devices" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tmessaging.message_handler.set_device_filters(self)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "490px" + }, + "propConfig": { + "props.value": { + "persistent": false + } + }, + "props": { + "multiSelect": true, + "options": [ + { + "label": "PLC01", + "value": "PLC01" + }, + { + "label": "PLC02", + "value": "PLC02" + }, + { + "label": "PLC03", + "value": "PLC03" + }, + { + "label": "PLC09", + "value": "PLC09" + } + ], + "style": { + "margin": 15 + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update-device-filters", + "pageScope": true, + "script": "\tdevices \u003d payload[\"data\"]\n\tself.props.options \u003d devices", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "reset-historical-filters", + "pageScope": true, + "script": "\treset \u003d payload[\"data\"]\n\tself.props.value \u003d None", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "Devices" + }, + "position": { + "basis": "70px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "100px" + }, + "props": { + "style": { + "fontFamily": "Arial", + "fontWeight": "bold", + "textAlign": "center" + }, + "text": "Type" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tmessaging.message_handler.set_type_filters(self)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Dropdown" + }, + "position": { + "basis": "490px" + }, + "propConfig": { + "props.value": { + "persistent": false + } + }, + "props": { + "multiSelect": true, + "options": [ + { + "label": "Emergency Stop", + "value": 1 + } + ], + "style": { + "margin": 15 + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "reset-historical-filters", + "pageScope": true, + "script": "\treset \u003d payload[\"data\"]\n\tself.props.value \u003d None", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "Type" + }, + "position": { + "basis": "70px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "100px" + }, + "props": { + "text": "Duration", + "textStyle": { + "fontFamily": "Arial", + "fontWeight": "bold", + "margin": 15, + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tmessaging.message_handler.set_duration_filters(self)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "NumericEntryField" + }, + "position": { + "basis": "160px" + }, + "props": { + "align": "left", + "containerStyle": { + "margin": 15 + }, + "format": "0,0", + "inputBounds": { + "maximum": 1000000, + "minimum": 0 + }, + "tooltipText": "Duration greater than or equal to in secs.", + "value": null + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "reset-historical-filters", + "pageScope": true, + "script": "\treset \u003d payload[\"data\"]\n\tself.props.value \u003d None", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.numeric-entry-field" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "100px" + }, + "props": { + "style": { + "marginRight": 80 + }, + "text": "secs", + "textStyle": { + "fontFamily": "Arial", + "fontWeight": "bold", + "textAlign": "left" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "Duration" + }, + "position": { + "basis": "70px", + "shrink": 0 + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "custom": { + "client_id": "5094ea37-bff1-4564-b9ec-cfc45bf5ad4f", + "device_filters": null, + "duration_filter": null, + "duration_filters": null, + "priority_filters": null, + "source_id_filters": null, + "time_from_filter": null, + "time_to_filter": null, + "tokens": [ + 1712754859219 + ], + "type_filters": null + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.custom.tokens \u003d []\n\tfc \u003d self.session.custom.fc\n\tmessaging.message_handler.send_http_response_code(\"Waiting...\")\n\tAPI_ID, STAGE, ACC_ID, FUNC_URL \u003d AWS.secrets_manager.get_secret(fc, \"scada/api/endpoint\")\n\tAWS_REGION \u003d self.session.custom.aws.region\n\tcredentials \u003d AWS.credentials.assume_role(region \u003d AWS_REGION, arn \u003d ACC_ID)\n\tmessaging.message_handler.update_token_array([])\n\tstart_time \u003d self.custom.time_from_filter\n\tif not start_time:\n\t\ttime \u003d self.custom.max_duration\n\t\tstart_time \u003d system.date.toMillis(time)\n\tself.custom.tokens.append(start_time)\n\tmessaging.message_handler.view_message_handler(start_time, \"update-default-start\")\n\tfilters \u003d AWS.build_url_http.get_filters_2(sources \u003d self.custom.source_id_filters, \n\t\t\t\t\t\t\t\t\t\t\tdevices \u003d self.custom.device_filters,\n\t\t\t\t\t\t\t\t\t\t\tpriorities \u003d self.custom.priority_filters, \n\t\t\t\t\t\t\t\t\t\t\ttypes \u003d self.custom.type_filters,\n\t\t\t\t\t\t\t\t\t\t\tstart \u003d start_time,\n\t\t\t\t\t\t\t\t\t\t\t\tend \u003d self.custom.time_to_filter, \n\t\t\t\t\t\t\t\t\t\t\t\tduration \u003d self.custom.duration_filter, \n\t\t\t\t\t\t\t\t\t\t\t\turl_encoding \u003d True)\n\tstatus, data \u003d AWS.build_url_http.build_url(credentials, fc \u003d fc, filters \u003d filters, region \u003d AWS_REGION)\n\tif status \u003d\u003d 200:\n\t\tjson_data \u003d system.util.jsonDecode(data)\n\t\thistorical_data \u003d json_data.get(\"payload\",{}).get(\"messages\")\n\t\tfor i in historical_data:\n\t\t\ttimestamp \u003d i.get(\"value\",{}).get(\"Timestamp\",{}).get(\"value\")\n\t\t\tconvert_timestamp \u003d alarms.alarm_tables.get_timestamp(int(timestamp))\n\t\t\tutc_offset \u003d -self.session.props.device.timezone.utcOffset\n\t\t\tconvert_timestamp \u003d system.date.addHours(convert_timestamp, utc_offset)\n\t\t\tduration_ms \u003d i.get(\"value\",{}).get(\"Duration\",{}).get(\"value\")\n\t\t\tduration_s \u003d float(duration_ms)/1000\n\t\t\ti[\"value\"][\"Timestamp\"][\"value\"] \u003d convert_timestamp\n\t\t\ti[\"value\"][\"Duration\"][\"value\"] \u003d duration_s\n\t #The first set of data received will only have a next token\n\t #To get back to this data we store a value of 0 in the token array\n\t #and store the data in the property inital_value on the table component.\n\t #When paginating backwards we get to a 0 value we load the inital_values \n\t #into the historical table\n\t\tmessaging.message_handler.update_historical_first_request(historical_data)\n\t\tnext_token \u003d json_data.get(\"payload\",{}).get(\"NextToken\")\n\t\tclient_id \u003d json_data.get(\"payload\",{}).get(\"ClientId\")\n\t\tmessaging.message_handler.update_client_id(client_id)\n\t\tmessaging.message_handler.view_message_handler(next_token, \"update-next-token\")\n\t\tmessaging.message_handler.view_message_handler(self.custom.tokens, \"update-tokens-array\")\n\tmessaging.message_handler.send_http_response_code(status)\n\tself.custom.client_id \u003d client_id\n\tself.props.enabled \u003d True" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Apply" + }, + "position": { + "basis": "120px" + }, + "propConfig": { + "custom.device_filters": { + "persistent": true + }, + "custom.max_duration": { + "binding": { + "config": { + "expression": "addDays(now(),-20)" + }, + "type": "expr" + } + }, + "custom.priority_filters": { + "persistent": true + }, + "custom.source_id_filters": { + "persistent": true + }, + "custom.time_from_filter": { + "persistent": true + }, + "custom.time_to_filter": { + "persistent": true + } + }, + "props": { + "image": { + "icon": { + "path": "material/update" + } + }, + "style": { + "margin": 15 + }, + "text": "Apply" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "set-source-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.source_id_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-device-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.device_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-message-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.message_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-priority-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.priority_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-from-filters", + "pageScope": true, + "script": "\ttime \u003d payload[\"data\"]\n\tself.custom.time_from_filter \u003d time", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-to-filters", + "pageScope": true, + "script": "\ttime \u003d payload[\"data\"]\n\tself.custom.time_to_filter \u003d time", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "reset-historical-filters", + "pageScope": true, + "script": "\taction \u003d payload[\"data\"]\n\tif action \u003d\u003d \"reset\":\n\t\tself.custom.device_filters \u003d None\n\t\tself.custom.priority_filters \u003d None\n\t\tself.custom.source_id_filters \u003d None\n\t\tself.custom.time_from_filter \u003d None\n\t\tself.custom.time_to_filter \u003d None\n\t\tself.custom.type_filters \u003d None\n\t\tself.custom.duration_filter \u003d None\n\t\tself.props.enabled \u003dTrue\n\t\tself.custom.tokens \u003d []\n\t\t", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-type-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.type_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-duration-filters", + "pageScope": true, + "script": "\tduration \u003d payload[\"data\"]\n\tself.custom.duration_filter \u003d duration", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "#\tpayload \u003d {}\n#\tpayload[\"data\"] \u003d \"reset\"\n#\tsystem.perspective.sendMessage(\"reset-historical-filters\", \n#\t\t\t\t\t\t\t\t\tpayload\u003d payload, scope \u003d \"page\")\n\tmessaging.message_handler.reset_historical_filters(\"reset\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Clear" + }, + "position": { + "basis": "120px" + }, + "props": { + "image": { + "icon": { + "path": "material/delete_forever" + } + }, + "primary": false, + "style": { + "margin": 15 + }, + "text": "Clear" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "122px", + "shrink": 2 + }, + "props": { + "style": { + "fontFamily": "Arial", + "fontWeight": "bold", + "marginLeft": "30px", + "textAlign": "center" + }, + "text": "Diagnostics" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "30px", + "shrink": 0 + }, + "propConfig": { + "props.color": { + "binding": { + "config": { + "expression": "case({this.props.path},\r\n\"material/check_circle_outline\", \"#2ECC71\",\r\n\"material/error_outline\", \"#4287f5\",\r\n\"#FF0000\")" + }, + "type": "expr" + } + } + }, + "props": { + "path": "material/error_outline" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "http-response-code", + "pageScope": true, + "script": "\t\n\tresponse \u003d payload[\"response\"]\n\tif response \u003d\u003d 200:\n\t\tresponse \u003d \"material/check_circle_outline\"\n\telif response \u003d\u003d \"Waiting...\":\n\t\tresponse \u003d \"material/error_outline\"\n\telif response \u003d\u003d \"\":\n\t\tresponse \u003d \"\"\n\telse:\n\t\tresponse \u003d \"material/cancel\"\n\tself.props.path \u003d response", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "reset-historical-filters", + "pageScope": true, + "script": "\tself.props.path \u003d \"\"", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.display.icon" + }, + { + "custom": { + "status_code": "Waiting..." + }, + "meta": { + "name": "Response", + "tooltip": {} + }, + "position": { + "basis": "164px" + }, + "propConfig": { + "meta.tooltip.enabled": { + "binding": { + "config": { + "expression": "if(len({this.props.text}) \u003e 0, True, False)" + }, + "type": "expr" + } + }, + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "\"The request returned the following http response code \" + {this.custom.status_code}" + }, + "type": "expr" + } + }, + "props.style.color": { + "binding": { + "config": { + "expression": "case({this.props.text},\r\n\"Success\", \"#2ECC71\",\r\n\"Waiting...\", \"#4287f5\",\r\n\"#FF0000\")" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "borderColor": "#555555", + "borderStyle": "solid", + "borderWidth": "0.5px", + "cursor": "help", + "fontWeight": "bold", + "marginBottom": "10px", + "marginLeft": "10px", + "marginTop": "10px", + "textAlign": "center" + }, + "text": "Waiting..." + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "http-response-code", + "pageScope": true, + "script": "\tresponse \u003d payload[\"response\"]\n\tresponses \u003d {200:\"Success\", \"Waiting...\":\"Waiting...\", \"\":\"\"}\n\tdisplay_value \u003d responses.get(response, \"Fail\")\n\t\n#\tif response \u003d\u003d 200:\n#\t\tresponse \u003d \"Success\"\n#\t\n#\tif response \u003d\u003d \"Waiting...\":\n#\t\tresponse \u003d\u003d \"Waiting...\"\n#\telse:\n#\t\tresponse \u003d \"Fail\"\n\tself.props.text \u003d display_value\n\tself.custom.status_code \u003d response", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "reset-historical-filters", + "pageScope": true, + "script": "\tself.props.text \u003d \"\"\n\tself.custom.status_code \u003d \"\"", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "Apply" + }, + "position": { + "basis": "70px", + "shrink": 0 + }, + "props": { + "alignContent": "flex-start" + }, + "type": "ia.container.flex" + } + ], + "custom": { + "ShowFilters": true + }, + "meta": { + "name": "Filters" + }, + "position": { + "basis": "500px", + "grow": 1, + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "this.custom.ShowFilters" + }, + "type": "property" + }, + "persistent": true + } + }, + "props": { + "direction": "column", + "style": { + "borderStyle": "solid", + "borderWidth": "1px", + "box-shadow": "0 4px 20px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19)", + "marginBottom": 10, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 10 + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "show-historical-filters", + "pageScope": true, + "script": "\tshow \u003d payload[\"data\"]\n\tself.custom.ShowFilters \u003d show", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "custom": { + "device_filters": null, + "duration_filter": null, + "duration_filters": "value", + "initial_data": [ + { + "value": { + "Device": { + "value": "PLC01" + }, + "Duration": { + "value": 10 + }, + "Message": { + "value": "Test" + }, + "Priority": { + "value": "1" + }, + "SourceId": { + "value": "PLC01/0820_06_16/NR1" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1712731396290 + ], + "$ts": 1711029268000 + } + }, + "Type": { + "value": "0" + } + } + }, + { + "value": { + "Device": { + "value": "PLC01" + }, + "Duration": { + "value": 0.01 + }, + "Message": { + "value": "Test" + }, + "Priority": { + "value": "1" + }, + "SourceId": { + "value": "PLC01/0820_06_16/NR1" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1712731396290 + ], + "$ts": 1711473599010 + } + }, + "Type": { + "value": "0" + } + } + }, + { + "value": { + "Device": { + "value": "PLC01" + }, + "Duration": { + "value": 10 + }, + "Message": { + "value": "Test" + }, + "Priority": { + "value": "1" + }, + "SourceId": { + "value": "PLC01/0820_06_16/NR1" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1712731396290 + ], + "$ts": 1711474160000 + } + }, + "Type": { + "value": "0" + } + } + }, + { + "value": { + "Device": { + "value": "PLC01" + }, + "Duration": { + "value": 10 + }, + "Message": { + "value": "Test" + }, + "Priority": { + "value": "1" + }, + "SourceId": { + "value": "PLC01/0820_06_16/NR1" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1712731396290 + ], + "$ts": 1711474180000 + } + }, + "Type": { + "value": "0" + } + } + }, + { + "value": { + "Device": { + "value": "PLC01" + }, + "Duration": { + "value": 10 + }, + "Message": { + "value": "Test" + }, + "Priority": { + "value": "1" + }, + "SourceId": { + "value": "PLC01/0820_06_16/NR1" + }, + "Timestamp": { + "value": { + "$": [ + "ts", + 192, + 1712731396290 + ], + "$ts": 1711474200000 + } + }, + "Type": { + "value": "0" + } + } + } + ], + "priority_filters": null, + "source_id_filters": null, + "time_from_filter": null, + "time_to_filter": null, + "type_filters": null + }, + "meta": { + "name": "Table" + }, + "position": { + "basis": "1920px", + "grow": 1 + }, + "propConfig": { + "custom.max_duration": { + "binding": { + "config": { + "expression": "addDays(now(),-10)" + }, + "type": "expr" + } + } + }, + "props": { + "box-shadow": "0 4px 20px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19)", + "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": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Message", + "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": "Device", + "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 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": "00:00:00", + "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": "none", + "editable": false, + "field": "Type", + "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": "" + } + ], + "enabled": true, + "pager": { + "bottom": false + }, + "style": { + "margin": 20 + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update-first-request", + "pageScope": true, + "script": "\tdata \u003d payload[\"data\"]\n\tinitial_data \u003d payload[\"initial_data\"]\n\tself.props.data \u003d data\n\tself.custom.initial_data \u003d initial_data", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "update-historical-data", + "pageScope": true, + "script": "\thistorical_data \u003d payload[\"data\"]\n\tself.props.data \u003d historical_data", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "load_initial_data", + "pageScope": true, + "script": "\trequest \u003d payload[\"data\"]\n\tsystem.perspective.print(\"initial message received\")\n\tif request \u003d\u003d True:\n\t\tself.props.data \u003d self.custom.initial_data", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "reset-historical-filters", + "pageScope": true, + "script": "\treset \u003d payload[\"data\"]\n\tif reset \u003d\u003d \"reset\":\n\t\tself.props.data \u003d []\n\t\tself.custom.device_filters \u003d None\n\t\tself.custom.priority_filters \u003d None\n\t\tself.custom.source_id_filters \u003d None\n\t\tself.custom.time_from_filter \u003d None\n\t\tself.custom.time_to_filter \u003d None\n\t\tself.custom.type_filters \u003d None\n\t\tself.custom.duration_filter \u003d None\n\t\tself.props.enabled \u003dTrue", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-source-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.source_id_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-device-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.device_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-priority-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.priority_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-from-filters", + "pageScope": true, + "script": "\ttime \u003d payload[\"data\"]\n\tself.custom.time_from_filter \u003d time", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-to-filters", + "pageScope": true, + "script": "\ttime \u003d payload[\"data\"]\n\tself.custom.time_to_filter \u003d time", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-type-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.type_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-duration-filters", + "pageScope": true, + "script": "\tduration \u003d payload[\"data\"]\n\tself.custom.duration_filter \u003d duration", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.display.table" + } + ], + "meta": { + "name": "Table" + }, + "position": { + "basis": "980px", + "grow": 1 + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update-historical-data", + "pageScope": true, + "script": "\tdata \u003d payload[\"data\"]\n\tself.getChild(\"Table\").props.data \u003d data", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "custom": { + "device_filters": null, + "download_in_progress": true, + "duration_filter": null, + "duration_filters": null, + "enable_timeout": false, + "priority_filters": null, + "source_id_filters": null, + "time_from_filter": null, + "time_to_filter": null, + "type_filters": null + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\twhid \u003d self.session.custom.fc\n\tsession_id \u003d self.session.props.id\n\t\n\tfilters \u003d AWS.build_url_http.get_filters_2(sources \u003d self.custom.source_id_filters, \n\t\t\t\t\t\t\t\t\t\t\t\tdevices \u003d self.custom.device_filters,\n\t\t\t\t\t\t\t\t\t\t\t\tpriorities \u003d self.custom.priority_filters, \n\t\t\t\t\t\t\t\t\t\t\t\ttypes \u003d self.custom.type_filters,\n\t\t\t\t\t\t\t\t\t\t\t\tstart \u003d self.custom.time_from_filter,\n\t\t\t\t\t\t\t\t\t\t\t\tend \u003d self.custom.time_to_filter, \n\t\t\t\t\t\t\t\t\t\t\t\tduration \u003d self.custom.duration_filter)\n\t\n\tCommands.button_commands.send_download_request(whid, filters, session_id)\n\tself.custom.enable_timeout \u003d True\n\tself.custom.download_in_progress \u003d True" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Export" + }, + "position": { + "basis": "120px", + "shrink": 0 + }, + "propConfig": { + "custom.device_filters": { + "persistent": true + }, + "custom.disable": { + "binding": { + "config": { + "expression": "if(isNull({this.custom.start_time}), False, secondsBetween({this.custom.start_time}, {this.custom.time_now}))" + }, + "transforms": [ + { + "code": "\tif value \u003e 60:\n\t\tself.custom.enable_timeout \u003d False\n\t\treturn False\n\telse:\n\t\treturn True", + "type": "script" + } + ], + "type": "expr" + } + }, + "custom.download_complete": { + "binding": { + "config": { + "path": "session.custom.downloads" + }, + "transforms": [ + { + "code": "\tif value \u003d\u003d True:\n\t\tself.custom.download_in_progress \u003d False", + "type": "script" + } + ], + "type": "property" + } + }, + "custom.priority_filters": { + "persistent": true + }, + "custom.source_id_filters": { + "persistent": true + }, + "custom.start_time": { + "binding": { + "config": { + "expression": "{this.custom.enable_timeout}" + }, + "transforms": [ + { + "code": "\tif value \u003d\u003d True:\n\t\treturn self.custom.time_now", + "type": "script" + } + ], + "type": "expr" + } + }, + "custom.time_from_filter": { + "persistent": true + }, + "custom.time_now": { + "binding": { + "config": { + "expression": "now()" + }, + "type": "expr" + } + }, + "custom.time_to_filter": { + "persistent": true + }, + "props.enabled": { + "binding": { + "config": { + "expression": "!{this.custom.enable_timeout} || !{this.custom.download_in_progress} " + }, + "type": "expr" + } + }, + "props.text": { + "binding": { + "config": { + "expression": "if(!{this.custom.enable_timeout}, \"Export\",\r\nif({this.custom.download_in_progress}, \"Exporting...\",\r\n\"Export\"))" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/import_export" + } + }, + "primary": false, + "style": { + "margin": 15, + "marginLeft": 20 + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "set-source-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.source_id_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-device-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.device_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-message-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.message_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-priority-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.priority_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-from-filters", + "pageScope": true, + "script": "\ttime \u003d payload[\"data\"]\n\tself.custom.time_from_filter \u003d time", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-to-filters", + "pageScope": true, + "script": "\ttime \u003d payload[\"data\"]\n\tself.custom.time_to_filter \u003d time", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "reset-historical-filters", + "pageScope": true, + "script": "\taction \u003d payload[\"data\"]\n\tif action \u003d\u003d \"reset\":\n\t\tself.custom.device_filters \u003d None\n\t\tself.custom.priority_filters \u003d None\n\t\tself.custom.source_id_filters \u003d None\n\t\tself.custom.time_from_filter \u003d None\n\t\tself.custom.time_to_filter \u003d None\n\t\tself.custom.type_filters \u003d None\n\t\tself.custom.duration_filter \u003d None\n\t\tself.props.enabled \u003dTrue\n\t\t", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-type-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.type_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-duration-filters", + "pageScope": true, + "script": "\tduration \u003d payload[\"data\"]\n\tself.custom.duration_filter \u003d duration", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "580px", + "grow": 1 + }, + "type": "ia.display.label" + }, + { + "custom": { + "client_id": "5094ea37-bff1-4564-b9ec-cfc45bf5ad4f", + "current_page": null, + "device_filters": null, + "duration_filter": null, + "initial_token": null, + "previous_token": "value", + "priority_filters": null, + "source_filters": null, + "source_id_filters": null, + "start_pagination": false, + "time_from_filter": null, + "time_to_filter": null, + "tokens": [], + "type_filters": null + }, + "events": { + "component": { + "onActionPerformed": [ + { + "config": { + "script": "\tmessaging.message_handler.send_http_response_code(\"Waiting...\")\n\tself.props.enabled \u003d False\n\tfc \u003d self.session.custom.fc\n\tclient_id \u003d self.custom.client_id\n\tAPI_ID, STAGE, ACC_ID, FUNC_URL \u003d AWS.secrets_manager.get_secret(fc, \"scada/api/endpoint\")\n\tAWS_REGION \u003d self.session.custom.aws.region\n\tif self.custom.start_pagination:\n\t\tstart_time \u003d self.custom.tokens.pop(-1)\n\t\tstart_time \u003d self.custom.tokens.pop(-1)\n\telse:\n\t\tstart_time \u003d self.custom.tokens.pop(-1)\n\tpayload \u003d {}\n\tpayload[\"data\"] \u003d \"\"\n\tsystem.perspective.sendMessage(\"reset-pagination-start\", payload, scope \u003d \"view\")\n\tcredentials \u003d AWS.credentials.assume_role(region \u003d AWS_REGION, arn \u003d ACC_ID)\n\tfilters \u003d AWS.build_url_http.get_filters_2(sources \u003d self.custom.source_id_filters, \n\t\t\t\t\t\t\t\t\t\t\tdevices \u003d self.custom.device_filters,\n\t\t\t\t\t\t\t\t\t\t\tpriorities \u003d self.custom.priority_filters, \n\t\t\t\t\t\t\t\t\t\t\ttypes \u003d self.custom.type_filters,\n\t\t\t\t\t\t\t\t\t\t\tstart \u003d start_time,\n\t\t\t\t\t\t\t\t\t\t\tend \u003d self.custom.time_to_filter, \n\t\t\t\t\t\t\t\t\t\t\tduration \u003d self.custom.duration_filter,\n\t\t\t\t\t\t\t\t\t\t\turl_encoding \u003d True)\n\tstatus, data \u003d AWS.build_url_http.build_url(credentials, fc \u003d fc, filters \u003d filters,\n\t\t\t\t\t\t\t\t\t\t\t\tregion \u003d AWS_REGION)\n\tsystem.perspective.print(data)\n\tif status \u003d\u003d 200:\n\t\tjson_data \u003d system.util.jsonDecode(data)\n\t\thistorical_data \u003d json_data.get(\"payload\",{}).get(\"messages\")\n\t\tfor i,j in enumerate(historical_data):\n\t\t\tsystem.perspective.print(\"time is \" + str(i))\n\t\t\ttimestamp \u003d j.get(\"value\",{}).get(\"Timestamp\",{}).get(\"value\")\n\t\t\tconvert_timestamp \u003d alarms.alarm_tables.get_timestamp(int(timestamp))\n\t\t\tutc_offset \u003d -self.session.props.device.timezone.utcOffset\n\t\t\tconvert_timestamp \u003d system.date.addHours(convert_timestamp, utc_offset) \n\t\t\tj[\"value\"][\"Timestamp\"][\"value\"] \u003d convert_timestamp\n\t\t\tduration_ms \u003d j.get(\"value\",{}).get(\"Duration\",{}).get(\"value\")\n \t\t\tduration_s \u003d float(duration_ms)/1000\n \t\t\tj[\"value\"][\"Timestamp\"][\"value\"] \u003d convert_timestamp\n \t\t\tj[\"value\"][\"Duration\"][\"value\"] \u003d duration_s \n\t\tmessaging.message_handler.update_historical(historical_data)\n\t\tmessaging.message_handler.view_message_handler(\"\", \"update-pagination-start\")\n\t\ttoken \u003d json_data.get(\"payload\",{}).get(\"nextToken\")\n\tself.custom.start_pagination \u003d False\t\t\n\tmessaging.message_handler.send_http_response_code(status)\n\t" + }, + "scope": "G", + "type": "script" + }, + { + "config": { + "script": "\tpayload \u003d {}\n\tpayload[\"data\"] \u003d self.custom.tokens\n\tsystem.perspective.sendMessage(\"update-tokens-array\", payload, scope \u003d \"view\")" + }, + "scope": "G", + "type": "script" + } + ] + } + }, + "meta": { + "name": "Back", + "tooltip": { + "enabled": true, + "text": "Return previous results" + } + }, + "position": { + "basis": "120px", + "shrink": 0 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "if(len({this.custom.tokens}), True, False)" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/arrow_back" + }, + "position": "center" + }, + "primary": false, + "style": { + "margin": 15, + "marginLeft": 0 + }, + "text": "" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update-tokens-array", + "pageScope": false, + "script": "\ttokens \u003d payload[\"data\"]\n\tself.custom.tokens \u003d tokens", + "sessionScope": false, + "viewScope": true + }, + { + "messageType": "update-initial-tokens", + "pageScope": true, + "script": "\ttoken \u003d payload[\"data\"]\n\tself.custom.initial_token \u003d token", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "reset-historical-filters", + "pageScope": true, + "script": "\treset \u003d payload[\"data\"]\n\tif reset \u003d\u003d \"reset\":\n\t\tself.props.enabled \u003d True\n \t\tself.custom.device_filters \u003d None\n \t\tself.custom.priority_filters \u003d None\n \t\tself.custom.source_id_filters \u003d None\n \t\tself.custom.time_from_filter \u003d None\n \t\tself.custom.time_to_filter \u003d None\n \t\tself.custom.type_filters \u003d None\n \t\tself.custom.source_filters \u003d None\n \t\tself.custom.duration_filter \u003d None\n \t\tself.custom.initial_token \u003d None\n \t\tself.custom.start_pagination \u003d False\n \t\tself.custom.tokens \u003d []", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-type-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.type_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-priority-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.priority_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-source-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.source_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-device-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.device_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-to-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.time_to_filter \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-from-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.time_from_filter \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-duration-filters", + "pageScope": true, + "script": "\tduration \u003d payload[\"data\"]\n\tself.custom.duration_filter \u003d duration\n\t# implement your handler here", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "update-client-id", + "pageScope": true, + "script": "\tclient_id \u003d payload[\"data\"]\n\tself.custom.client_id \u003d client_id\n\t", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "update-previous-timestamp", + "pageScope": false, + "script": "\ttime \u003d payload[\"data\"]\n\tself.custom.time_from_filter \u003d time", + "sessionScope": false, + "viewScope": true + }, + { + "messageType": "set-pagination-flag", + "pageScope": false, + "script": "\tself.custom.start_pagination \u003d True", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Records Number", + "visible": false + }, + "position": { + "basis": "50px" + }, + "props": { + "text": 0, + "textStyle": { + "fontFamily": "Arial", + "fontWeight": "bold", + "textAlign": "center" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update-token-array", + "pageScope": true, + "script": "\tarray \u003d payload[\"data\"]\n\tself.props.text \u003d len(array)", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "reset-historical-filters", + "pageScope": true, + "script": "\tself.props.text \u003d 0", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.display.label" + }, + { + "custom": { + "client_id": "", + "current_page": 0, + "device_filters": null, + "duration_filter": null, + "initial_token": null, + "next_token": "", + "previous_timestamp": "", + "priority_filters": null, + "source_filters": null, + "source_id_filters": null, + "start_pagination": false, + "time_from_filter": 1712754859219, + "time_to_filter": null, + "tokens": [], + "type_filters": null + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tmessaging.message_handler.send_http_response_code(\"Waiting...\")\n\tself.props.enabled \u003d False\n\tfc \u003d self.session.custom.fc\n\tclient_id \u003d self.custom.client_id\n\ttoken \u003d self.custom.next_token\n\tAPI_ID, STAGE, ACC_ID, FUNC_URL \u003d AWS.secrets_manager.get_secret(fc, \"scada/api/endpoint\")\n\tAWS_REGION \u003d self.session.custom.aws.region\n\ttime \u003d self.custom.max_duration\n\tstart_time \u003d self.custom.time_from_filter\n\tcredentials \u003d AWS.credentials.assume_role(region \u003d AWS_REGION, arn \u003d ACC_ID)\n\tfilters \u003d AWS.build_url_http.get_filters_2(sources \u003d self.custom.source_id_filters, \n\t\t\t\t\t\t\t\t\t\t\tdevices \u003d self.custom.device_filters,\n\t\t\t\t\t\t\t\t\t\t\tpriorities \u003d self.custom.priority_filters, \n\t\t\t\t\t\t\t\t\t\t\ttypes \u003d self.custom.type_filters,\n\t\t\t\t\t\t\t\t\t\t\tstart \u003d start_time,\n\t\t\t\t\t\t\t\t\t\t\tend \u003d self.custom.time_to_filter, \n\t\t\t\t\t\t\t\t\t\t\tduration \u003d self.custom.duration_filter,\n\t\t\t\t\t\t\t\t\t\t\turl_encoding \u003d True)\n\tstatus, data \u003d AWS.build_url_http.build_url(credentials, fc \u003d fc, next_token \u003d token, \n\t\t\t\t\t\t\t\t\t\t\t\tfilters \u003d filters, client_id \u003d client_id, region \u003d AWS_REGION)\n\tif status \u003d\u003d 200:\n\t\tjson_data \u003d system.util.jsonDecode(data)\n\t\thistorical_data \u003d json_data.get(\"payload\",{}).get(\"messages\")\n\t\tfor i,j in enumerate(historical_data):\n\t\t\tif i \u003d\u003d 0:\n\t\t\t\tself.custom.tokens.append(j.get(\"value\",{}).get(\"Timestamp\",{}).get(\"value\"))\n\t\t\tsystem.perspective.print(\"time is \" + str(i))\n\t\t\ttimestamp \u003d j.get(\"value\",{}).get(\"Timestamp\",{}).get(\"value\")\n\t\t\tconvert_timestamp \u003d alarms.alarm_tables.get_timestamp(int(timestamp))\n\t\t\tutc_offset \u003d -self.session.props.device.timezone.utcOffset\n\t\t\tconvert_timestamp \u003d system.date.addHours(convert_timestamp, utc_offset) \n\t\t\tj[\"value\"][\"Timestamp\"][\"value\"] \u003d convert_timestamp\n\t\t\tduration_ms \u003d j.get(\"value\",{}).get(\"Duration\",{}).get(\"value\")\n\t\t\tduration_s \u003d float(duration_ms)/1000\n\t\t\tj[\"value\"][\"Timestamp\"][\"value\"] \u003d convert_timestamp\n\t\t\tj[\"value\"][\"Duration\"][\"value\"] \u003d duration_s\n\t\tmessaging.message_handler.update_historical(historical_data)\n\t\ttoken \u003d json_data.get(\"payload\",{}).get(\"nextToken\")\t\n\t\tnext_token \u003d json_data.get(\"payload\",{}).get(\"NextToken\")\n\t\tself.custom.next_token \u003d next_token\n\t\tclient_id \u003d json_data.get(\"payload\",{}).get(\"ClientId\")\n\t\tself.custom.client_id \u003d client_id\n\tmessaging.message_handler.send_http_response_code(status)\n\tmessaging.message_handler.view_message_handler(self.custom.tokens, \"update-tokens-array\")\n\tif len(self.custom.tokens)\u003e1:\n\t\tmessaging.message_handler.view_message_handler(\"\", \"set-pagination-flag\")\n\tif self.custom.next_token:\n\t\tself.props.enabled \u003d True" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Forward", + "tooltip": { + "enabled": true, + "text": "Return next results" + } + }, + "position": { + "basis": "120px", + "shrink": 0 + }, + "propConfig": { + "custom.max_duration": { + "binding": { + "config": { + "expression": "addDays(now(),-10)" + }, + "type": "expr" + } + }, + "custom.previous_timestamp": { + "onChange": { + "enabled": null, + "script": "\tpayload \u003d {}\n\tpayload[\"data\"] \u003d self.custom.previous_timestamp\n\tsystem.perspective.sendMessage(\"update-previous-timestamp\", payload, scope \u003d \"view\")" + } + }, + "position.display": { + "persistent": true + }, + "props.enabled": { + "binding": { + "config": { + "expression": "if({this.custom.next_token}\u003dnull, False, True)" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/arrow_forward" + }, + "position": "center" + }, + "primary": false, + "style": { + "margin": 15 + }, + "text": "" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update-tokens-array", + "pageScope": false, + "script": "\ttokens \u003d payload[\"data\"]\n\tself.custom.tokens \u003d tokens", + "sessionScope": false, + "viewScope": true + }, + { + "messageType": "reset-historical-filters", + "pageScope": true, + "script": "\treset \u003d payload[\"data\"]\n\tif reset \u003d\u003d \"reset\":\n\t\tself.props.enabled \u003d True\n\t\tself.custom.device_filters \u003d None\n\t\tself.custom.priority_filters \u003d None\n\t\tself.custom.source_id_filters \u003d None\n\t\tself.custom.time_from_filter \u003d None\n\t\tself.custom.time_to_filter \u003d None\n\t\tself.custom.type_filters \u003d None\n\t\tself.custom.source_filters \u003d None\n\t\tself.custom.duration_filter \u003d None\n\t\tself.custom.initial_token \u003d None\n\t\tself.custom.next_token \u003d \"\"\n\t\tself.custom.start_pagination \u003d False\n\t\tself.custom.tokens \u003d []", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-source-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.source_id_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-device-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.device_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-priority-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.priority_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-from-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.time_from_filter \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-to-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.time_to_filter \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-type-filters", + "pageScope": true, + "script": "\tfilters \u003d payload[\"data\"]\n\tself.custom.type_filters \u003d filters", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "set-duration-filters", + "pageScope": true, + "script": "\tduration \u003d payload[\"data\"]\n\tself.custom.duration_filter \u003d duration", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "update-client-id", + "pageScope": true, + "script": "\tclient_id \u003d payload[\"data\"]\n\tself.custom.client_id \u003d client_id\n\t", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "update-next-token", + "pageScope": false, + "script": "\tnext_token \u003d payload[\"data\"]\n\tself.custom.next_token \u003d next_token", + "sessionScope": false, + "viewScope": true + }, + { + "messageType": "set-pagination-start", + "pageScope": false, + "script": "\ttime \u003d payload[\"data\"]\n\tself.custom.time_from_filter \u003d time\n\tself.custom.next_token \u003d \"\"", + "sessionScope": false, + "viewScope": true + }, + { + "messageType": "update-default-start", + "pageScope": false, + "script": "\tdata\u003d payload[\"data\"]\n\tself.custom.time_from_filter \u003d data", + "sessionScope": false, + "viewScope": true + }, + { + "messageType": "update-pagination-start", + "pageScope": false, + "script": "\tself.custom.time_from_filter \u003d self.custom.tokens[-1]\n\tself.custom.client_id \u003d \"\"\n\tself.custom.next_token \u003d \"\"\n\t", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "914px" + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "Paginate" + }, + "position": { + "basis": "70px", + "shrink": 0 + }, + "props": { + "justify": "space-evenly" + }, + "type": "ia.container.flex" + } + ], + "events": { + "system": { + "onStartup": { + "config": { + "script": "\tfc \u003d self.session.custom.fc\n\tsource_ids \u003d tags.tag_utilities.get_tag_paths(fc)\n\tmessaging.message_handler.update_source_id_filters(source_ids)\n\t#Set the device filter options on startup.\n\tdevices \u003d tags.tag_utilities.get_devices(fc)\n\tdevice_drop_down \u003d []\n\tfor i in devices:\n\t\toptions \u003d {\"label\":i, \"value\":i}\n\t\tdevice_drop_down.append(options)\n\tmessaging.message_handler.update_device_filters(device_drop_down)\n\tmessaging.message_handler.update_historical([])\n#\tmessaging.message_handler.show_historical_filters(False)\n\tmessaging.message_handler.reset_historical_filters(\"reset\")\n\tmessaging.message_handler.update_token_array([])\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "classes": "Background-Styles/Grey-Background" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "Historical_tab" + }, + "position": { + "tabIndex": 2 + }, + "props": { + "direction": "column", + "justify": "space-evenly" + }, + "type": "ia.container.flex" + } + ], + "events": { + "system": { + "onStartup": { + "config": { + "script": "\tself.props.currentTabIndex \u003d 0" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "TabContainer" + }, + "position": { + "basis": "300px", + "grow": 1 + }, + "propConfig": { + "props.currentTabIndex": { + "onChange": { + "enabled": null, + "script": "\tif self.props.currentTabIndex !\u003d 0:\n\t\tpayload \u003d {}\n\t\tfilter_on \u003d \"false\"\n\t\tpayload[\"reset\"] \u003d filter_on\n\t\tsystem.perspective.sendMessage(\"reset-filters\", payload \u003dpayload, scope \u003d \"page\")\n\ttry:\n\t\tpageid \u003d self.view.custom.activityLogger.alt_pageid + \u0027/\u0027+ self.props.tabs[previousValue.value]\n\t\tpageid \u003d pageid.replace(\u0027 \u0027,\u0027\u0027)\n\t\tpayload \u003d activityLog.productMetrics.createActivityPayload(self.view, \u0027page\u0027, pageid, pageid)\n\t\tself.view.custom.activityLogger.start_time \u003d system.date.now()\n\t\tif payload:\n\t\t\tsystem.perspective.sendMessage(\u0027activityLogger-TabChanged\u0027, payload \u003d payload, scope \u003d \u0027page\u0027)\n\texcept:\n\t\tpass" + } + } + }, + "props": { + "contentStyle": { + "classes": "Background-Styles/Grey-Background" + }, + "currentTabIndex": 2, + "style": { + "classes": "Background-Styles/Grey-Background" + }, + "tabSize": { + "width": 140 + }, + "tabStyle": { + "active": { + "backgroundColor": "#EEEEEE", + "borderLeftColor": "#7FFF00", + "borderLeftStyle": "solid", + "borderLeftWidth": 5, + "borderTopLeftRadius": 5, + "borderTopRightRadius": 5, + "color": "#000000", + "fontFamily": "Arial", + "fontWeight": "bold", + "outlineStyle": "none", + "textDecoration": "underline" + }, + "inactive": { + "backgroundColor": "#D7D7D7", + "borderLeftColor": "#FFFFFF", + "borderTopLeftRadius": 5, + "borderTopRightRadius": 5, + "color": "#969696", + "fontFamily": "Arial" + } + }, + "tabs": [ + "Active Alarms", + "Shelved Alarms", + "Historical" + ] + }, + "type": "ia.container.tab" + } + ], + "events": { + "system": { + "onStartup": { + "config": { + "script": "\twhid \u003d self.session.custom.fc\n\tsession_id \u003d self.session.props.id\n\tpage_id \u003d self.view.params.page_name\n\tCommands.analytics.send_page_details(whid, session_id, page_id)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root" + }, + "props": { + "style": { + "classes": "Background-Styles/Main-Background" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "activityLogger-TabChanged", + "pageScope": true, + "script": "\t# implement your handler here\n\tif payload:\n\t\tactivityLog.productMetrics.callActivityLoggerAPI(payload)", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/8accdd98bfd11bededc8d40429c6f6b766f0c5e41d0dd322bc0f36d8226b0835 b/.resources/8accdd98bfd11bededc8d40429c6f6b766f0c5e41d0dd322bc0f36d8226b0835 new file mode 100644 index 0000000..71794c5 --- /dev/null +++ b/.resources/8accdd98bfd11bededc8d40429c6f6b766f0c5e41d0dd322bc0f36d8226b0835 @@ -0,0 +1,146 @@ +{ + "custom": {}, + "params": { + "page_id": "value", + "text": "enter text" + }, + "propConfig": { + "params.page_id": { + "paramDirection": "input", + "persistent": true + }, + "params.text": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 48, + "width": 136 + } + }, + "root": { + "children": [ + { + "custom": { + "PLC": "none" + }, + "meta": { + "name": "text_label" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "custom.text": { + "binding": { + "config": { + "path": "view.params.text" + }, + "type": "property" + } + }, + "props.elements[1].elements[0].text": { + "binding": { + "config": { + "path": "this.custom.text" + }, + "type": "property" + } + } + }, + "props": { + "elements": [ + { + "name": "defs", + "type": "defs" + }, + { + "elements": [ + { + "fill": { + "paint": "#000000" + }, + "name": "tspan", + "stroke": { + "paint": "#020202", + "width": ".165" + }, + "text-anchor": "middle", + "type": "tspan", + "x": 5.7088058, + "y": 6.8615942 + } + ], + "fill": { + "paint": "#000000" + }, + "fontSize": "4.4316px", + "name": "text", + "stroke": { + "linecap": "round", + "linejoin": "round", + "paint": "#020202", + "width": ".165" + }, + "style": { + "paintOrder": "stroke fill markers" + }, + "transform": "scale(.99694 1.0031)", + "type": "text", + "x": "3.7088058", + "y": "6.8615942" + } + ], + "style": { + "backgroundColor": "#FFFFFF", + "borderBottomLeftRadius": "5px", + "borderBottomRightRadius": "5px", + "borderStyle": "solid", + "borderTopLeftRadius": "5px", + "borderTopRightRadius": "5px", + "borderWidth": "1px" + }, + "viewBox": "0 0 10.583 10.583" + }, + "type": "ia.shapes.svg" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tsystem.perspective.navigate(\"/\" + self.view.params.page_id)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root", + "tooltip": { + "enabled": true + } + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "path": "view.params.page_id" + }, + "type": "property" + } + } + }, + "props": { + "mode": "percent", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/.resources/8ae2f2d3e126f6f11883ca1044d366a4c0285ea0782a052efddefd1c92a4f775 b/.resources/8ae2f2d3e126f6f11883ca1044d366a4c0285ea0782a052efddefd1c92a4f775 new file mode 100644 index 0000000..d11998f --- /dev/null +++ b/.resources/8ae2f2d3e126f6f11883ca1044d366a4c0285ea0782a052efddefd1c92a4f775 @@ -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/.resources/8b21cb94fdd864f689b817758b9c05087ed06d005cde05b8bc1cfa16044745f9 b/.resources/8b21cb94fdd864f689b817758b9c05087ed06d005cde05b8bc1cfa16044745f9 new file mode 100644 index 0000000..e674279 --- /dev/null +++ b/.resources/8b21cb94fdd864f689b817758b9c05087ed06d005cde05b8bc1cfa16044745f9 @@ -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/.resources/8b30cb94d641c2385d566c9420c54df03e86df7581eba71fb5d0c2e3dc232465 b/.resources/8b30cb94d641c2385d566c9420c54df03e86df7581eba71fb5d0c2e3dc232465 new file mode 100644 index 0000000..1bb31fc --- /dev/null +++ b/.resources/8b30cb94d641c2385d566c9420c54df03e86df7581eba71fb5d0c2e3dc232465 @@ -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/.resources/8cd9e1f19cc72affbb2078761dacf0f3110ca2bcb73dc3a3c8f39e7125288a40 b/.resources/8cd9e1f19cc72affbb2078761dacf0f3110ca2bcb73dc3a3c8f39e7125288a40 new file mode 100644 index 0000000..9a95243 --- /dev/null +++ b/.resources/8cd9e1f19cc72affbb2078761dacf0f3110ca2bcb73dc3a3c8f39e7125288a40 @@ -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/.resources/8ddc6c539ed4b014833ef10912a99091165d710028eece07f326a43ddc0d4519 b/.resources/8ddc6c539ed4b014833ef10912a99091165d710028eece07f326a43ddc0d4519 new file mode 100644 index 0000000..343918d --- /dev/null +++ b/.resources/8ddc6c539ed4b014833ef10912a99091165d710028eece07f326a43ddc0d4519 @@ -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/.resources/8e976e66614ca0574983c6f858add9e565d2899b1039c2b45b3372d65d721dea b/.resources/8e976e66614ca0574983c6f858add9e565d2899b1039c2b45b3372d65d721dea new file mode 100644 index 0000000..99c639f --- /dev/null +++ b/.resources/8e976e66614ca0574983c6f858add9e565d2899b1039c2b45b3372d65d721dea @@ -0,0 +1,589 @@ +{ + "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": 40 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Network" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "props.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": [ + { + "d": "m 0,0 c 13.333333,0 26.666667,0 40,0 0,8.3333333 0,16.666667 0,25 C 26.666667,25 13.333333,25 0,25 0,16.666667 0,8.3333333 0,0 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m 24,6 a 4,4 0 0 1 -4,4 4,4 0 0 1 -4,-4 4,4 0 0 1 4,-4 4,4 0 0 1 4,4 z m 4,12 h 8 v 5 h -8 z m -12,0 h 8 v 5 H 16 Z M 4,18 h 8 v 5 H 4 Z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m 20,10 c 0,2.666667 0,5.333333 0,8", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m 7.5,14 c 8.333333,0 16.666667,0 25,0", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m 8,14 c 0,1.333333 0,2.666667 0,4", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "m 32,14 c 0,1.333333 0,2.666667 0,4", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + } + ], + "style": {}, + "viewBox": "-0.5 -0.5 41 26" + }, + "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/.resources/8fdc3c86f295f5f0adbfd5b9bdd4ed9fa870348b6bfadba5cc54090120e32dd7 b/.resources/8fdc3c86f295f5f0adbfd5b9bdd4ed9fa870348b6bfadba5cc54090120e32dd7 new file mode 100644 index 0000000..f8810a1 --- /dev/null +++ b/.resources/8fdc3c86f295f5f0adbfd5b9bdd4ed9fa870348b6bfadba5cc54090120e32dd7 @@ -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/.resources/90c168f2da462905fb567e0226dd94e4e97b66f75f825c3ba98bfed99636bf14 b/.resources/90c168f2da462905fb567e0226dd94e4e97b66f75f825c3ba98bfed99636bf14 new file mode 100644 index 0000000..7497e54 --- /dev/null +++ b/.resources/90c168f2da462905fb567e0226dd94e4e97b66f75f825c3ba98bfed99636bf14 @@ -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/.resources/93912b2ca6fbfd11077ba29b8660339b6342542c41225fb5c32cd8c520a6e4a9 b/.resources/93912b2ca6fbfd11077ba29b8660339b6342542c41225fb5c32cd8c520a6e4a9 new file mode 100644 index 0000000..ec8c9ef --- /dev/null +++ b/.resources/93912b2ca6fbfd11077ba29b8660339b6342542c41225fb5c32cd8c520a6e4a9 @@ -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/.resources/93bccd01338ea80e459fd431c49ca4b6e37a7ca525f43f79a69bca0375c49054 b/.resources/93bccd01338ea80e459fd431c49ca4b6e37a7ca525f43f79a69bca0375c49054 new file mode 100644 index 0000000..6c7eb4b --- /dev/null +++ b/.resources/93bccd01338ea80e459fd431c49ca4b6e37a7ca525f43f79a69bca0375c49054 @@ -0,0 +1,155 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 192, + "width": 167 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Label_0", + "tooltip": { + "enabled": true, + "text": "Uncontrolled Stop" + } + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "borderBottomStyle": "solid", + "classes": "State-Styles/Background-Fill/State1", + "textAlign": "center" + }, + "text": "Fault" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_1", + "tooltip": { + "enabled": true, + "text": "Controlled Stop" + } + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "borderBottomStyle": "solid", + "classes": "State-Styles/Background-Fill/State2", + "textAlign": "center" + }, + "text": "Stop" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_2", + "tooltip": { + "enabled": true, + "text": "Process Alarm" + } + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "borderBottomStyle": "solid", + "classes": "State-Styles/Background-Fill/State3", + "textAlign": "center" + }, + "text": "Process Alarm" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_3", + "tooltip": { + "enabled": true, + "text": "Diagnostic" + } + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "borderBottomStyle": "solid", + "classes": "State-Styles/Background-Fill/State4", + "textAlign": "center" + }, + "text": "Diagnostic" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_4", + "tooltip": { + "enabled": true, + "text": "Running" + } + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "classes": "State-Styles/Background-Fill/State5", + "textAlign": "center" + }, + "text": "Running" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_5", + "tooltip": { + "enabled": true, + "text": "Unknown" + } + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "borderTopStyle": "solid", + "classes": "State-Styles/Background-Fill/State6", + "textAlign": "center" + }, + "text": "Unknown" + }, + "type": "ia.display.label" + } + ], + "custom": { + "display": true + }, + "meta": { + "name": "root", + "tooltip": { + "text": "key" + } + }, + "props": { + "direction": "column", + "style": { + "borderStyle": "solid" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/966937954daefcc3da8fa2b40ed349b7b53d05c1b63ab602af4bc9bf4a6b920c b/.resources/966937954daefcc3da8fa2b40ed349b7b53d05c1b63ab602af4bc9bf4a6b920c new file mode 100644 index 0000000..3ade6ba --- /dev/null +++ b/.resources/966937954daefcc3da8fa2b40ed349b7b53d05c1b63ab602af4bc9bf4a6b920c @@ -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/.resources/96f1908d88057ded84eab1192981aa28154ccb002069f777c5bb4ccb122a790c b/.resources/96f1908d88057ded84eab1192981aa28154ccb002069f777c5bb4ccb122a790c new file mode 100644 index 0000000..4e694c2 --- /dev/null +++ b/.resources/96f1908d88057ded84eab1192981aa28154ccb002069f777c5bb4ccb122a790c @@ -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/.resources/97699c0519d0e238c01e01d39e14bfa47c192f36cf0660e7e89a645876f9d7ce b/.resources/97699c0519d0e238c01e01d39e14bfa47c192f36cf0660e7e89a645876f9d7ce new file mode 100644 index 0000000..5c8a4fc --- /dev/null +++ b/.resources/97699c0519d0e238c01e01d39e14bfa47c192f36cf0660e7e89a645876f9d7ce @@ -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/.resources/97863ff34fb93495d76f65374cbdf2c0ec8ae553628c505827deed1f11334b45 b/.resources/97863ff34fb93495d76f65374cbdf2c0ec8ae553628c505827deed1f11334b45 new file mode 100644 index 0000000..a355cbf --- /dev/null +++ b/.resources/97863ff34fb93495d76f65374cbdf2c0ec8ae553628c505827deed1f11334b45 @@ -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/.resources/9854a491c7c889c1b51d5593cdd6e2889fa105acb682cb79b33c54650af81e32 b/.resources/9854a491c7c889c1b51d5593cdd6e2889fa105acb682cb79b33c54650af81e32 new file mode 100644 index 0000000..ef23621 --- /dev/null +++ b/.resources/9854a491c7c889c1b51d5593cdd6e2889fa105acb682cb79b33c54650af81e32 @@ -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/.resources/9a91c9b0da1f454bb77175c6198d548265adc9416164f324578fc0fb9ca564e7 b/.resources/9a91c9b0da1f454bb77175c6198d548265adc9416164f324578fc0fb9ca564e7 new file mode 100644 index 0000000..7b9f3df --- /dev/null +++ b/.resources/9a91c9b0da1f454bb77175c6198d548265adc9416164f324578fc0fb9ca564e7 @@ -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/.resources/9bbc5d5b3801b16d07e4bcbe945efa2396161f6bfc5e42d4730e68bbe8583ae6 b/.resources/9bbc5d5b3801b16d07e4bcbe945efa2396161f6bfc5e42d4730e68bbe8583ae6 new file mode 100644 index 0000000..9e5f0ea --- /dev/null +++ b/.resources/9bbc5d5b3801b16d07e4bcbe945efa2396161f6bfc5e42d4730e68bbe8583ae6 @@ -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/.resources/9c6243872d01b8d4c6f5d480034e3385e63ea872b4ea8a2e1989d2137d8a0cb4 b/.resources/9c6243872d01b8d4c6f5d480034e3385e63ea872b4ea8a2e1989d2137d8a0cb4 new file mode 100644 index 0000000..4f60c4b --- /dev/null +++ b/.resources/9c6243872d01b8d4c6f5d480034e3385e63ea872b4ea8a2e1989d2137d8a0cb4 @@ -0,0 +1,280 @@ +{ + "custom": {}, + "params": { + "tagProps": [ + "PLC15/OPC/inAlarms0", + "1_Profinet node fault", + "", + "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": "State-Styles/State106", + "inputType": "scalar", + "mappings": [ + { + "input": 0, + "output": "State-Styles/State0" + }, + { + "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": 6, + "output": "State-Styles/State6" + }, + { + "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" + } + ], + "outputType": "style-list", + "type": "map" + } + ], + "type": "expr" + } + } + }, + "props": { + "path": "material/place" + }, + "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\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_priority_int": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}", + "1": "{view.params.tagProps[1]}" + }, + "tagPath": "{0}/Alarms/{1}.Priority" + }, + "transforms": [ + { + "expression": "case({value},\n\"Critical\",1,\n\"High\",1,\n\"Medium\",2,\n\"Low\",3,\n\"Diagnostic\",4,0)", + "type": "expression" + } + ], + "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,{this.custom.alarm_priority_int} + 100,\nif({this.custom.state}\u003d1 \u0026\u0026 {this.custom.isMatch}\u003d0,{this.custom.alarm_priority_int},\nif({this.custom.state}\u003d0 \u0026\u0026 {this.custom.isMatch}\u003d1,105,5)))" + }, + "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},0,\nif({this.custom.alarm_active},1,0))" + }, + "type": "expr" + } + } + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/9e2cbc5851523fa1e6c52dbad38d1ff163ee10ecb33ecdeaf78e0eacad06a635 b/.resources/9e2cbc5851523fa1e6c52dbad38d1ff163ee10ecb33ecdeaf78e0eacad06a635 new file mode 100644 index 0000000..4192b88 --- /dev/null +++ b/.resources/9e2cbc5851523fa1e6c52dbad38d1ff163ee10ecb33ecdeaf78e0eacad06a635 @@ -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/.resources/9ffb6d296b657b2217a535a0e015029503465a25ad5e55c1b21f9ae5ef236c37 b/.resources/9ffb6d296b657b2217a535a0e015029503465a25ad5e55c1b21f9ae5ef236c37 new file mode 100644 index 0000000..018e3d1 --- /dev/null +++ b/.resources/9ffb6d296b657b2217a535a0e015029503465a25ad5e55c1b21f9ae5ef236c37 @@ -0,0 +1,53 @@ +import com.amazonaws.auth.profile.ProfileCredentialsProvider as ProfileCredentialsProvider +import com.amazonaws.services.securitytoken.AWSSecurityTokenService as AWSSecurityTokenService +import com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClientBuilder as AWSSecurityTokenServiceClientBuilder +import com.amazonaws.auth.AWSStaticCredentialsProvider as AWSStaticCredentialsProvider +import com.amazonaws.services.securitytoken.model.GetCallerIdentityRequest as GetCallerIdentityRequest +import com.amazonaws.services.securitytoken.model.AssumeRoleRequest as AssumeRoleRequest + +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() + + 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 + +def assume_role(**kwargs): + aws_credentials_file_path = kwargs.get("credentials_file_path") + aws_profile_name = kwargs.get("profile_name") + aws_region = kwargs.get("region") + aws_arn = kwargs.get("arn") + aws_api_id = kwargs.get("api_id") + aws_stage = kwargs.get("stage") + aws_arn_role = kwargs.get("arn_role") + arn_role = "arn:aws:iam::%s:role/client-api-access-role" % (aws_arn) + #Query the credentials on the ec2 instance, they are found at CREDENTIALS_FILE_PATH +# aws = AWS.credentials.GetCredentials(aws_credentials_file_path, aws_profile_name, aws_region ) +# aws_creds = aws.get_credentials() + sts_client = AWSSecurityTokenServiceClientBuilder.standard().build() + identity_request = GetCallerIdentityRequest() + identity = sts_client.getCallerIdentity(identity_request) + assumeRoleRequest = AssumeRoleRequest().withRoleArn(arn_role).withRoleSessionName("Ignition8"); + response = sts_client.assumeRole(assumeRoleRequest); + session_creds = response.getCredentials(); + access_key = session_creds.getAccessKeyId() + secret_key = session_creds.getSecretAccessKey() + session_token = session_creds.getSessionToken() + credentials = {"AccessKey":access_key, "SecretKey":secret_key, "SessionKey":session_token} + return credentials diff --git a/.resources/a00e2564e93fa9e6fbd795311f1e05a6334e208b9ae9cf97953d22797683e8f0 b/.resources/a00e2564e93fa9e6fbd795311f1e05a6334e208b9ae9cf97953d22797683e8f0 new file mode 100644 index 0000000..05f423e --- /dev/null +++ b/.resources/a00e2564e93fa9e6fbd795311f1e05a6334e208b9ae9cf97953d22797683e8f0 @@ -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/.resources/a1d881bea6a6c85e0e7e5826b103a301a1ad0e1f7cfefd57069aabdde5f52125 b/.resources/a1d881bea6a6c85e0e7e5826b103a301a1ad0e1f7cfefd57069aabdde5f52125 new file mode 100644 index 0000000..82b52a1 --- /dev/null +++ b/.resources/a1d881bea6a6c85e0e7e5826b103a301a1ad0e1f7cfefd57069aabdde5f52125 @@ -0,0 +1,537 @@ +{ + "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))\n\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_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": "ARSAW" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "props.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": [ + { + "d": "m 25,50.5 a 25,25 0 0 1 -25,-25 25,25 0 0 1 25,-25 25,25 0 0 1 25,25 25,25 0 0 1 -25,25 z", + "fill": {}, + "name": "Circle", + "stroke": { + "paint": "#000000", + "width": 1 + }, + "type": "path" + }, + { + "d": "M 8.3000002,34.740002 H 31.04 v 4.26 H 8.3000002 Z M 26.77,12 h 4.260001 V 34.74 H 26.77 Z M 16.110001,12 H 24.64 v 17.049999 h -8.529999 z m 17.059997,0 h 8.53 v 17.049999 h -8.53 z", + "fill": { + "paint": "#000000" + }, + "name": "ARSAW", + "type": "path" + } + ], + "style": {}, + "viewBox": "-0.5 -0.5 51 52" + }, + "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/.resources/a351e2a124db0fe74886b7dfd3010fe62dc0784d7462d058f66a5f815c0cdbee b/.resources/a351e2a124db0fe74886b7dfd3010fe62dc0784d7462d058f66a5f815c0cdbee new file mode 100644 index 0000000..35bc754 --- /dev/null +++ b/.resources/a351e2a124db0fe74886b7dfd3010fe62dc0784d7462d058f66a5f815c0cdbee @@ -0,0 +1,141 @@ +{ + "custom": {}, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\tself.params.request_focus \u003d True\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": { + "enabled": true, + "placeholder": "enter password...", + "request_focus": false, + "text": "" + }, + "propConfig": { + "params.enabled": { + "paramDirection": "input", + "persistent": true + }, + "params.placeholder": { + "paramDirection": "input", + "persistent": true + }, + "params.request_focus": { + "onChange": { + "enabled": null, + "script": "\t# if focus request set externally, set focus via message and clear request\n\tif currentValue.value:\n\t\tsystem.perspective.sendMessage(\u0027request_focus\u0027, scope\u003d\u0027view\u0027)\n\t\tself.params.request_focus \u003d False\n\t" + }, + "paramDirection": "inout", + "persistent": true + }, + "params.text": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 50, + "width": 200 + } + }, + "root": { + "children": [ + { + "events": { + "dom": { + "onKeyPress": { + "config": { + "script": "\tif event.key \u003d\u003d \u0027Enter\u0027:\n\t\tsystem.perspective.sendMessage(\u0027password_entered\u0027, {\u0027value\u0027: self.props.text}, scope\u003d\u0027session\u0027)\n\t\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "PasswordField" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "path": "view.params.enabled" + }, + "type": "property" + } + }, + "props.placeholder": { + "binding": { + "config": { + "path": "view.params.placeholder" + }, + "type": "property" + } + }, + "props.style.classes": { + "binding": { + "config": { + "expression": "if({this.props.enabled},\u0027Input/Text/text_field_enabled\u0027,\u0027Input/Text/text_field_disabled\u0027)" + }, + "type": "expr" + } + }, + "props.text": { + "binding": { + "config": { + "path": "view.params.text" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "margin": "1%", + "padding": "1%" + } + }, + "scripts": { + "customMethods": [ + { + "name": "set_focus", + "params": [], + "script": "\tfrom time import sleep\n\tsleep(0.50)\n\tself.focus()\n\t" + } + ], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "request_focus", + "pageScope": false, + "script": "\tsystem.util.invokeAsynchronous(self.set_focus())\n\t", + "sessionScope": false, + "viewScope": true + } + ] + }, + "type": "ia.input.password-field" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/a4005cc3c6f7c97f9823e7c2479f41f5c0fa75abacb3765f25e6fd7685843c51 b/.resources/a4005cc3c6f7c97f9823e7c2479f41f5c0fa75abacb3765f25e6fd7685843c51 new file mode 100644 index 0000000..5a3f367 --- /dev/null +++ b/.resources/a4005cc3c6f7c97f9823e7c2479f41f5c0fa75abacb3765f25e6fd7685843c51 @@ -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/.resources/a614044f01c3d51d89c6dcf14705b79eb518cbf5bffbb9f5c06c58db21da97d0 b/.resources/a614044f01c3d51d89c6dcf14705b79eb518cbf5bffbb9f5c06c58db21da97d0 new file mode 100644 index 0000000..d11dd64 --- /dev/null +++ b/.resources/a614044f01c3d51d89c6dcf14705b79eb518cbf5bffbb9f5c06c58db21da97d0 @@ -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/.resources/a70d5e4d2b96ac0c853db9f50ea36ed5c8e673223a645c30d37d2cf710618307 b/.resources/a70d5e4d2b96ac0c853db9f50ea36ed5c8e673223a645c30d37d2cf710618307 new file mode 100644 index 0000000..60cc4c5 --- /dev/null +++ b/.resources/a70d5e4d2b96ac0c853db9f50ea36ed5c8e673223a645c30d37d2cf710618307 @@ -0,0 +1,31 @@ +def create_web_socket_tags(whid): + + logger = system.util.getLogger("%s-Create-Web-Socket-Tags" % (whid)) + if whid != "" and whid != None: + provider = "[%s_SCADA_TAG_PROVIDER]" % (whid) + tag_paths = {"aws_data":{"name":"aws_data", "valueSource": "memory", + "dataType": "String", "value" : "{}"}, + "close_socket":{"name":"close_socket", "valueSource": "memory", + "dataType": "Boolean", "value" : True}, + "device_count":{"name":"device_count", "valueSource": "memory", + "dataType": "String", "value" : "{}"}, + "IdToStatus":{"name":"IdToStatus", "valueSource": "memory", + "dataType": "String", "value" : "{}"}, + "wbsckt_heartbeat_interval":{"name":"wbsckt_heartbeat_interval", "valueSource": "memory", + "dataType": "DateTime", "value" : 0}, + "wbsckt_logging":{"name":"wbsckt_logging", "valueSource": "memory", + "dataType": "Boolean", "value" : False}, + "wbsckt_messages_send":{"name":"wbsckt_messages_send", "valueSource": "memory", + "dataType": "String", "value" : "{}"}, + "thread_id":{"name":"thread_id", "valueSource": "memory", + "dataType": "String", "value" : ""}, + "wbsckt_running":{"name":"wbsckt_running", "valueSource": "memory", + "dataType": "Boolean", "value" : False}, + "download":{"name":"download", "valueSource": "memory", + "dataType": "String", "value" : ""}} + + for k,v in tag_paths.items(): + if not system.tag.exists("%sSystem/%s" % (provider, k)): + base_path = "%s/System" % (provider) + system.tag.configure(base_path, v) + logger.info("Created tag %s" % (k)) \ No newline at end of file diff --git a/.resources/ac901d7957bc85ea1acc2dd47d7dfdf33c9c1e2d9ea314ef4da20d737cb47dfa b/.resources/ac901d7957bc85ea1acc2dd47d7dfdf33c9c1e2d9ea314ef4da20d737cb47dfa new file mode 100644 index 0000000..1e5a023 --- /dev/null +++ b/.resources/ac901d7957bc85ea1acc2dd47d7dfdf33c9c1e2d9ea314ef4da20d737cb47dfa @@ -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/.resources/ad8099bb47552ada05968195a6f8e6da15a4c18dd7fc01427a4a8f89bc682347 b/.resources/ad8099bb47552ada05968195a6f8e6da15a4c18dd7fc01427a4a8f89bc682347 new file mode 100644 index 0000000..c494368 --- /dev/null +++ b/.resources/ad8099bb47552ada05968195a6f8e6da15a4c18dd7fc01427a4a8f89bc682347 @@ -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/.resources/adab22a32349343ad93c1380af1f3c9636949e7513d33bde648ca52f0cbed5aa b/.resources/adab22a32349343ad93c1380af1f3c9636949e7513d33bde648ca52f0cbed5aa new file mode 100644 index 0000000..db8eb0f --- /dev/null +++ b/.resources/adab22a32349343ad93c1380af1f3c9636949e7513d33bde648ca52f0cbed5aa @@ -0,0 +1,3875 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "image" + }, + "position": { + "height": 1080, + "width": 1920 + }, + "propConfig": { + "props.source": { + "binding": { + "config": { + "expression": "\"http://127.0.0.1:5500/MCM02-MCM03%20Fluid%20Inbound.svg?var\" + toMillis(now(100))" + }, + "enabled": false, + "type": "expr" + } + } + }, + "props": { + "fit": { + "mode": "fill" + }, + "source": "http://127.0.0.1:5500/MCM03%20Fluid%20Inbound.svg?var1744995181039", + "style": { + "backgroundColor": "#EEEEEE" + } + }, + "type": "ia.display.image" + }, + { + "meta": { + "name": "UL7-3" + }, + "position": { + "height": 20, + "rotate": { + "angle": -50 + }, + "width": 20, + "x": 590.411, + "y": 463.649 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL7-3", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL8-4" + }, + "position": { + "height": 20, + "rotate": { + "angle": -50 + }, + "width": 20, + "x": 666.25, + "y": 474.186 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL8-4", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL9-4" + }, + "position": { + "height": 20, + "rotate": { + "angle": -50 + }, + "width": 20, + "x": 742.12, + "y": 487.41 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL9-4", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL9-5" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 780.32, + "y": 462.504 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL9-5", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL8-5" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 691.11, + "y": 457.066 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL8-5", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL8-6" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 711.41, + "y": 446.444 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL8-6", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL8-7" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 732.16, + "y": 435.576 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL8-7", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL8-9" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 789.57, + "y": 406.281 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL8-9", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL8-8" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 760.72, + "y": 420.163 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL8-8", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL7-4" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 618.839, + "y": 444.831 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL7-4", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL7-5" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 644.063, + "y": 430.895 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL7-5", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL7-6" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 671.251, + "y": 416.229 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL7-6", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL7-7" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 696.03, + "y": 404.809 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL7-7", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL9-6" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 814.51, + "y": 443.074 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL9-6", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL9-7" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 839.55, + "y": 430.125 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL9-7", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL9-8" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 866.09, + "y": 415.552 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL9-8", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL9-9" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 891.52, + "y": 404.68 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL9-9", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL10-4" + }, + "position": { + "height": 20, + "rotate": { + "angle": -50 + }, + "width": 20, + "x": 817.07, + "y": 509.086 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL10-4", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL12-3" + }, + "position": { + "height": 20, + "rotate": { + "angle": -50 + }, + "width": 20, + "x": 992.56, + "y": 521.461 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL12-3", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL10-5" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 845.12, + "y": 489.304 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL10-5", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL10-6" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 870.16, + "y": 476.356 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL10-6", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL10-7" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 896.7, + "y": 461.783 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL10-7", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL10-8" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 922.13, + "y": 450.911 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL10-8", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL11-5" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 927.72, + "y": 496.722 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL11-5", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL11-6" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 947.81, + "y": 486.183 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL11-6", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL11-7" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 968.24, + "y": 475.208 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL11-7", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL11-4" + }, + "position": { + "height": 20, + "rotate": { + "angle": -50 + }, + "width": 20, + "x": 895.23, + "y": 520.982 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL11-4", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL11-9" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 1016.15, + "y": 451.149 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL11-9", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL11-8" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 992.28, + "y": 462.441 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL11-8", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL12-4" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 1025.58, + "y": 497.046 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL12-5", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL12-5" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 1045.66, + "y": 486.318 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL12-6", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL12-6" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 1066.09, + "y": 475.343 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL12-7", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS4-4A" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1239.17, + "y": 229.103 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS4-4AB", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS4-7" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1239.79, + "y": 137.863 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS4-7", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS4-6" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1239.68, + "y": 160.567 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS4-6", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS4-5" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1239.43, + "y": 183.566 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS4-5", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS3-4A" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1092.24, + "y": 228.55 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS3-4AB", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS3-7" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1092.75, + "y": 137.203 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS3-7", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS3-6" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1092.63, + "y": 159.908 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS3-6", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS3-5" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1092.39, + "y": 182.907 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS3-5", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS4-3" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1239.39, + "y": 319.9 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS4-3", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS3-3" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1092.57, + "y": 296.242 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS3-3", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS4-2" + }, + "position": { + "height": 20, + "rotate": { + "angle": -40 + }, + "width": 20, + "x": 1227.56, + "y": 419.943 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS4-2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS4-1" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 1040.95, + "y": 433.276 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS4-1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS3-2" + }, + "position": { + "height": 20, + "rotate": { + "angle": -40 + }, + "width": 20, + "x": 1080.81, + "y": 373.945 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS3-2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS3-1" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 846.62, + "y": 387.097 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS3-1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL12-2" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 986.08, + "y": 674.701 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL12-2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL12-1" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 985.85, + "y": 851.02 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL12-1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL7-2" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 584.563, + "y": 647.082 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL7-2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL7-1" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 584.546, + "y": 850.5 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL7-1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL11-2" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 887.51, + "y": 835.49 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL11-2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL11-3" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 888.5, + "y": 657.938 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL11-3", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL12-8" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 1114, + "y": 451.283 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL12-9", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL12-7" + }, + "position": { + "height": 20, + "rotate": { + "angle": -28 + }, + "width": 20, + "x": 1090.13, + "y": 462.575 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL12-8", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL10-2" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 809.98, + "y": 837.65 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL10-2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL9-2" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 734.73, + "y": 837.28 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL9-2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL8-2" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 659.594, + "y": 836.74 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL8-2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL10-3" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 811.21, + "y": 652.177 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL10-3", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL9-3" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 735.05, + "y": 641.509 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL9-3", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL8-3" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 660.466, + "y": 634.226 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "UL8-3", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL7-1-SS1" + }, + "position": { + "height": 13, + "width": 13, + "x": 588.949, + "y": 904 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL12-1-SS1" + }, + "position": { + "height": 13, + "width": 13, + "x": 989, + "y": 905 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL7-2_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 610, + "y": 503 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL8-3_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 685, + "y": 514 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL9-3_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 760, + "y": 530 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL10-3_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 836, + "y": 546 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL11-3_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 914, + "y": 560 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL12-3_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1012, + "y": 561 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS3-1_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 854, + "y": 366.181 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS3-1_JR2" + }, + "position": { + "height": 13, + "width": 13, + "x": 1062, + "y": 363.181 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS4-1_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1081, + "y": 413.77 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS4-1_JR2" + }, + "position": { + "height": 13, + "width": 13, + "x": 1206, + "y": 404.391 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "MCM03" + }, + "position": { + "height": 15, + "rotate": { + "angle": 0 + }, + "width": 30, + "x": 1178, + "y": 122.854 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/ControlCabinet/UL17_DPM1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/ControlCabinet" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "MCM02" + }, + "position": { + "height": 15, + "rotate": { + "angle": 0 + }, + "width": 30, + "x": 1028.01, + "y": 124.01 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/ControlCabinet/UL17_DPM1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/ControlCabinet" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS3-7-EPC1" + }, + "position": { + "height": 32, + "rotate": { + "angle": 0 + }, + "width": 16, + "x": 1073, + "y": 133.37 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord/UL20-3_EPC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS3-7-EPC1_Line" + }, + "position": { + "height": 6, + "rotate": { + "angle": 90 + }, + "width": 110, + "x": 1026, + "y": 212.288 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS3-7-EPC1_End" + }, + "position": { + "height": 30, + "rotate": { + "angle": 0 + }, + "width": 14, + "x": 1074, + "y": 266.37 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS3-7-EPC2_End" + }, + "position": { + "height": 30, + "rotate": { + "angle": 0 + }, + "width": 14, + "x": 1116, + "y": 266.37 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS3-7-EPC2_Line" + }, + "position": { + "height": 6, + "rotate": { + "angle": 90 + }, + "width": 106, + "x": 1070, + "y": 210.29 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS3-7-EPC2" + }, + "position": { + "height": 32, + "rotate": { + "angle": 0 + }, + "width": 16, + "x": 1116, + "y": 133.37 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord/UL20-3_EPC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS3-7_S2" + }, + "position": { + "height": 13, + "width": 13, + "x": 1136, + "y": 143.37 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS4-7-EPC1" + }, + "position": { + "height": 32, + "rotate": { + "angle": 0 + }, + "width": 16, + "x": 1220, + "y": 133.37 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord/UL20-3_EPC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS4-7-EPC_Line" + }, + "position": { + "height": 6, + "rotate": { + "angle": 90 + }, + "width": 110, + "x": 1173, + "y": 212.288 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS4-7-EPC1_End" + }, + "position": { + "height": 30, + "rotate": { + "angle": 0 + }, + "width": 14, + "x": 1221, + "y": 266.37 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS4-7-EPC2_End" + }, + "position": { + "height": 30, + "rotate": { + "angle": 0 + }, + "width": 14, + "x": 1263, + "y": 266.37 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS4-7-EPC2_Line" + }, + "position": { + "height": 6, + "rotate": { + "angle": 90 + }, + "width": 107, + "x": 1216.5, + "y": 210.79 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS4-7-EPC2" + }, + "position": { + "height": 32, + "rotate": { + "angle": 0 + }, + "width": 16, + "x": 1263, + "y": 133.37 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord/UL20-3_EPC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS4-7_S2" + }, + "position": { + "height": 13, + "width": 13, + "x": 1283, + "y": 143.37 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL7-1-EPC1_End" + }, + "position": { + "height": 30, + "rotate": { + "angle": 0 + }, + "width": 14, + "x": 567.3, + "y": 656 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL7-1-EPC1_Line" + }, + "position": { + "height": 6, + "rotate": { + "angle": 90 + }, + "width": 191, + "x": 478.3, + "y": 779 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL7-1-EPC1" + }, + "position": { + "height": 32, + "rotate": { + "angle": -180 + }, + "width": 16, + "x": 564.3, + "y": 870 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord/UL20-3_EPC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL7-1-EPC2" + }, + "position": { + "height": 32, + "rotate": { + "angle": -180 + }, + "width": 16, + "x": 609.3, + "y": 870 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord/UL20-3_EPC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL7-1-EPC2_Line" + }, + "position": { + "height": 6, + "rotate": { + "angle": 90 + }, + "width": 194, + "x": 520.3, + "y": 774 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL7-1-EPC2_End" + }, + "position": { + "height": 30, + "rotate": { + "angle": 0 + }, + "width": 14, + "x": 610.3, + "y": 656 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL12-1-EPC1_End" + }, + "position": { + "height": 30, + "rotate": { + "angle": 0 + }, + "width": 14, + "x": 968.3, + "y": 657 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL12-1-EPC2_End" + }, + "position": { + "height": 30, + "rotate": { + "angle": 0 + }, + "width": 14, + "x": 1011.3, + "y": 657 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord_End" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL12-1-EPC1_Line" + }, + "position": { + "height": 6, + "rotate": { + "angle": 90 + }, + "width": 191, + "x": 879.3, + "y": 779 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL12-1-EPC2_Line" + }, + "position": { + "height": 6, + "rotate": { + "angle": 90 + }, + "width": 190, + "x": 923.3, + "y": 778 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/Good Pull Chord/UL20-3_EPC2_Line", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Custom-Views/Pull Chord Line" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL12-1-EPC1" + }, + "position": { + "height": 32, + "rotate": { + "angle": -180 + }, + "width": 16, + "x": 965.3, + "y": 871 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord/UL20-3_EPC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL12-1-EPC2" + }, + "position": { + "height": 32, + "rotate": { + "angle": -180 + }, + "width": 16, + "x": 1010.3, + "y": 871 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord/UL20-3_EPC2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/PullChord" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL7-2-FIO1" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 585.013, + "y": 714.47 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL8-3-FIO1" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 660.01, + "y": 656.47 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL9-3-FIO1" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 735.01, + "y": 610.47 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL10-3-FIO1" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 812.01, + "y": 610.47 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL11-3-FIO1" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 888.99, + "y": 609.47 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "UL12-2-FIO1" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 985.99, + "y": 756.47 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/PullChord_End/UL20-3_EPC2_END", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS3-4B" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1092.24, + "y": 209.55 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS3-4AB", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS4-4B" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1239.17, + "y": 210.1 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "PS4-4AB", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "MCM04-MCM5_Button" + }, + "position": { + "height": 46.01, + "width": 292.03, + "x": 734.7, + "y": 10.453 + }, + "props": { + "params": { + "pageid": "DetailedView/MCM04 \u0026 MCM05 Sorter Destination,chutes and bypass", + "panel_id": "value", + "text": "MCM04 \u0026 MCM05 Sorter Destination,chutes and bypass" + }, + "path": "Custom-Views/Area_Nav_Button" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS4-7_S1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1203, + "y": 143 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "PS3-7_S1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1057, + "y": 144 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL11_4_S1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "root" + }, + "props": { + "style": { + "backgroundColor": "#FFFFFF" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/.resources/adbd026cb7c486b2fdc49ae214da74f4153de48ed328e120e5e9d8e03ca7d1bd b/.resources/adbd026cb7c486b2fdc49ae214da74f4153de48ed328e120e5e9d8e03ca7d1bd new file mode 100644 index 0000000..596b166 --- /dev/null +++ b/.resources/adbd026cb7c486b2fdc49ae214da74f4153de48ed328e120e5e9d8e03ca7d1bd @@ -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/.resources/ae7bd53c73ac75514cea21ad014c39166ded430ffe7e6cca4437c1357918f0fb b/.resources/ae7bd53c73ac75514cea21ad014c39166ded430ffe7e6cca4437c1357918f0fb new file mode 100644 index 0000000..2aa006e --- /dev/null +++ b/.resources/ae7bd53c73ac75514cea21ad014c39166ded430ffe7e6cca4437c1357918f0fb @@ -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/.resources/aee6a0d16f9b5364e9327d36f44766cca5b6ab47d090bebd4fba4dc7aeaa0d79 b/.resources/aee6a0d16f9b5364e9327d36f44766cca5b6ab47d090bebd4fba4dc7aeaa0d79 new file mode 100644 index 0000000..a26f93d --- /dev/null +++ b/.resources/aee6a0d16f9b5364e9327d36f44766cca5b6ab47d090bebd4fba4dc7aeaa0d79 @@ -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/.resources/b075120ed231a18b3a400bded5d8ec72aee9e59c27e91777620b6abf4369eba0 b/.resources/b075120ed231a18b3a400bded5d8ec72aee9e59c27e91777620b6abf4369eba0 new file mode 100644 index 0000000..7c71dff --- /dev/null +++ b/.resources/b075120ed231a18b3a400bded5d8ec72aee9e59c27e91777620b6abf4369eba0 @@ -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/.resources/b0b612af32dc9e46160dccc49e19fa5bce4b6aa5c7f124c055a472c33d2870b8 b/.resources/b0b612af32dc9e46160dccc49e19fa5bce4b6aa5c7f124c055a472c33d2870b8 new file mode 100644 index 0000000..636cdc5 --- /dev/null +++ b/.resources/b0b612af32dc9e46160dccc49e19fa5bce4b6aa5c7f124c055a472c33d2870b8 @@ -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/.resources/b2a892a9a1575eba189706eeb53d56385d4f7a51e7558316a9751ba945e7d4fa b/.resources/b2a892a9a1575eba189706eeb53d56385d4f7a51e7558316a9751ba945e7d4fa new file mode 100644 index 0000000..de19572 --- /dev/null +++ b/.resources/b2a892a9a1575eba189706eeb53d56385d4f7a51e7558316a9751ba945e7d4fa @@ -0,0 +1,709 @@ +{ + "custom": { + "no_items_selected": true, + "numberOfRows": 3, + "transformedData": [ + { + "checkedState": false, + "index": 0, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + }, + "rowData": [ + [ + "Seq", + 1 + ], + [ + "Type", + "StateChanged" + ], + [ + "When", + 1692112814922 + ], + [ + "Source", + "PLC01/054BV51" + ], + [ + "CurrentState", + "" + ], + [ + "ReasonCode", + "" + ] + ] + }, + { + "checkedState": false, + "index": 1, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + }, + "rowData": [ + [ + "Seq", + "1" + ], + [ + "Type", + "ModeChanged" + ], + [ + "When", + 1692112814922 + ], + [ + "Source", + "PLC01/054BV51" + ], + [ + "CurrentMode", + "" + ] + ] + }, + { + "checkedState": false, + "index": 2, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + }, + "rowData": [ + [ + "Seq", + "2" + ], + [ + "Type", + "MeasurementEvent" + ], + [ + "When", + 1692112814922 + ], + [ + "Source", + "PLC01/054BV51" + ], + [ + "MeasurementName", + "" + ], + [ + "SamplingInterval", + "" + ], + [ + "Unit", + "" + ], + [ + "DeltaValue", + "" + ] + ] + } + ] + }, + "params": { + "last_message_index": 0, + "tabledata": [ + { + "CurrentMode": "", + "CurrentState": "", + "DeltaValue": "", + "EventID": "", + "EventState": "", + "MeasurementName": "", + "ReasonCode": "", + "SamplingInterval": "", + "Selected": false, + "Seq": 1, + "Source": "PLC01/054BV51", + "Type": "StateChanged", + "Unit": "", + "When": 1692112814922 + }, + { + "CurrentMode": "", + "CurrentState": "", + "DeltaValue": "", + "EventID": "", + "EventState": "", + "MeasurementName": "", + "ReasonCode": "", + "SamplingInterval": "", + "Selected": false, + "Seq": "1", + "Source": "PLC01/054BV51", + "Type": "ModeChanged", + "Unit": "", + "When": 1692112814922 + }, + { + "CurrentMode": "", + "CurrentState": "", + "DeltaValue": "", + "EventID": "", + "EventState": "", + "MeasurementName": "", + "ReasonCode": "", + "SamplingInterval": "", + "Selected": false, + "Seq": "2", + "Source": "PLC01/054BV51", + "Type": "MeasurementEvent", + "Unit": "", + "When": 1692112814922 + } + ] + }, + "propConfig": { + "custom.no_items_selected": { + "binding": { + "config": { + "path": "view.params.tabledata" + }, + "transforms": [ + { + "code": "\tno_items_selected \u003d True\n\t\n\tfor i in value :\n\t\tif i[\"Selected\"]:\n\t\t\tno_items_selected \u003d False\n\t \t\n\treturn no_items_selected", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.transformedData": { + "onChange": { + "enabled": false, + "script": "\t\n\tinstances \u003d[]\n\t\n\tfor i , value in enumerate(self.custom.transformedData):\n\t\tinstance \u003d {\n\t\t\t\t \"instanceStyle\": {\n\t\t\t\t \"classes\": \"\"\n\t\t\t\t },\n\t\t\t\t \"instancePosition\": {},\n\t\t\t\t \"index\": i,\n\t\t\t\t \"rowData\": value\n\t\t\t\t }\n\t\tinstances.append(instance)\n\t\t\n\tself.getChild(\"root\").getChild(\"FlexRepeater\").props.instances \u003d instances\n\t" + }, + "persistent": true + }, + "params.last_message_index": { + "paramDirection": "input", + "persistent": true + }, + "params.tabledata": { + "onChange": { + "enabled": null, + "script": "\n\ttransformed_data \u003d []\n\t\n\tstateChangeParams \u003d [\"CurrentState\" , \"ReasonCode\"]\n\tmodeChangeParams \u003d [\"CurrentMode\"]\n\teventParams \u003d [\"EventID\" , \"EventState\"]\n\tmeasurementParams \u003d [\"MeasurementName\", \"SamplingInterval\", \"Unit\", \"DeltaValue\" ]\n\t\t\t\t\t\n\tfor item in self.params.tabledata:\n\t\trow_data \u003d []\n\t\tcol1 \u003d (\"Seq\", item[\"Seq\"])\n\t\trow_data.append(col1)\n\t\tcol2 \u003d (\"Type\",item[\"Type\"])\n\t\trow_data.append(col2)\n\t\tcol3 \u003d (\"When\",item[\"When\"])\n\t\trow_data.append(col3)\n\t\tcol4 \u003d (\"Source\", item[\"Source\"])\n\t\trow_data.append(col4)\n\t\t\n\t\tif item[\"Type\"] \u003d\u003d \"StateChanged\":\n\t\t\tcol5 \u003d (\"CurrentState\", item[\"CurrentState\"])\n\t\t\trow_data.append(col5)\n\t\t\tcol6 \u003d (\"ReasonCode\", item[\"ReasonCode\"]) \n\t\t\trow_data.append(col6)\n\t\t\n\t\tif item[\"Type\"] \u003d\u003d \"ModeChanged\":\n\t\t\tcol5 \u003d (\"CurrentMode\", item[\"CurrentMode\"])\n\t\t\trow_data.append(col5)\n\t\t\n\t\tif item[\"Type\"] \u003d\u003d \"Event\":\n\t\t\tcol5 \u003d (\"EventID\", item[\"EventID\"])\n\t\t\trow_data.append(col5)\n\t\t\t\n\t\t\tcol6 \u003d (\"EventState\", item[\"EventState\"])\n\t\t\trow_data.append(col6)\n\t\t\t\n\t\tif item[\"Type\"] \u003d\u003d \"MeasurementEvent\":\n\t\t\tcol5 \u003d (\"MeasurementName\", item[\"MeasurementName\"])\n\t\t\trow_data.append(col5)\n\t\t\tcol6 \u003d (\"SamplingInterval\", item[\"SamplingInterval\"])\n\t\t\trow_data.append(col6)\n\t\t\tcol7 \u003d (\"Unit\", item[\"Unit\"])\n\t\t\trow_data.append(col7)\n\t\t\tcol8 \u003d (\"DeltaValue\", item[\"DeltaValue\"])\n\t\t\trow_data.append(col8)\n\t\t\n\t\tselected \u003d item[\"Selected\"]\t\t\n\t\t\t\t\t\t\t\t\n\t\tsystem.perspective.print((row_data, selected ))\n\t\ttransformed_data.append((row_data, selected))\n\t\n\tself.custom.numberOfRows \u003d len(self.params.tabledata)\n\t\n\tsystem.perspective.print(transformed_data)\n\tself.custom.transformedData \u003d transformed_data\n\t\n\t\n\tsystem.perspective.print(type(self.custom.transformedData))\n\t\n\t\t\n\tinstances \u003d[]\n\t\n\tfor i , row in enumerate(transformed_data):\n\t\tinstance \u003d {\n\t\t\t\t \"instanceStyle\": {\n\t\t\t\t \"classes\": \"\"\n\t\t\t\t },\n\t\t\t\t \"instancePosition\": {},\n\t\t\t\t \"index\": i,\n\t\t\t\t \"rowData\": row[0], \n\t\t\t\t \"checkedState\": row[1]\n\t\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.transformedData \u003d instances\n\t\t" + }, + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 788, + "width": 1314 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "fontWeight": "bolder" + }, + "text": "Sequence" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "FlexRepeater" + }, + "position": { + "basis": "320px", + "grow": 1, + "shrink": 0 + }, + "props": { + "direction": "column", + "elementPosition": { + "basis": "800px" + }, + "elementStyle": { + "max-height": "75px", + "min-height": "75px" + }, + "instances": [ + { + "checkedState": false, + "index": 0, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + }, + "rowData": [ + [ + "Seq", + 1 + ], + [ + "Type", + "StateChanged" + ], + [ + "When", + 1692112814922 + ], + [ + "Source", + "PLC01/054BV51" + ], + [ + "CurrentState", + "" + ], + [ + "ReasonCode", + "" + ] + ] + }, + { + "checkedState": false, + "index": 1, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + }, + "rowData": [ + [ + "Seq", + "1" + ], + [ + "Type", + "ModeChanged" + ], + [ + "When", + 1692112814922 + ], + [ + "Source", + "PLC01/054BV51" + ], + [ + "CurrentMode", + "" + ] + ] + }, + { + "checkedState": false, + "index": 2, + "instancePosition": {}, + "instanceStyle": { + "classes": "" + }, + "rowData": [ + [ + "Seq", + "2" + ], + [ + "Type", + "MeasurementEvent" + ], + [ + "When", + 1692112814922 + ], + [ + "Source", + "PLC01/054BV51" + ], + [ + "MeasurementName", + "" + ], + [ + "SamplingInterval", + "" + ], + [ + "Unit", + "" + ], + [ + "DeltaValue", + "" + ] + ] + } + ], + "path": "Main-Views/Commissioning Tool/Row", + "useDefaultViewHeight": false + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "delete-instance", + "pageScope": true, + "script": "\t# implement your handler here\n\tsystem.perspective.print(payload)", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.display.flex-repeater" + }, + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tif self.view.custom.no_items_selected :\n\t\tsystem.perspective.sendMessage(\"SelectAll\", None , \"page\")\n\t\tMsg \u003d \"Selecting all messages \"\n\telse:\n\t\tsystem.perspective.sendMessage(\"ClearSelection\", None , \"page\")\n\t\tMsg \u003d \"Clearing selection \"\n\t\n\tpayload \u003d {\n\t\t\t\"Msg\":Msg\n\t}\n\t\t\n\tsystem.perspective.sendMessage(\"addFeedback\" , payload , \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "ClearSelection" + }, + "position": { + "basis": "55px", + "shrink": 0 + }, + "propConfig": { + "props.image.icon.path": { + "binding": { + "config": { + "path": "view.custom.no_items_selected" + }, + "transforms": [ + { + "code": "\tif not value:\n\t\treturn \"material/clear\"\n\telse:\n\t\treturn \"material/check_box\"", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "image": { + "icon": {} + }, + "primary": false, + "style": { + "marginLeft": "10px" + }, + "text": "" + }, + "type": "ia.input.button" + }, + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t\n\tMsg \u003d \"Adding a State Message to the Sequence \"\n\tpayload \u003d {\n\t\t\t\"Msg\":Msg\n\t}\n\t\t\n\tsystem.perspective.sendMessage(\"addFeedback\" , payload , \"page\")\n\tpayload \u003d {\"messageType\":\"StateChanged\"}\n\tsystem.perspective.sendMessage(\"measurementTab_addRow\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "basis": "115px" + }, + "props": { + "image": { + "icon": { + "path": "material/control_point" + } + }, + "primary": false, + "text": "State" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t\n\tMsg \u003d \"Adding a Mode Message to the Sequence \"\n\tpayload \u003d {\n\t\t\t\"Msg\":Msg\n\t}\n\t\t\n\tsystem.perspective.sendMessage(\"addFeedback\" , payload , \"page\")\n\tpayload \u003d {\"messageType\":\"ModeChanged\"}\n\tsystem.perspective.sendMessage(\"measurementTab_addRow\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_0" + }, + "position": { + "basis": "115px" + }, + "props": { + "image": { + "icon": { + "path": "material/control_point" + } + }, + "primary": false, + "text": "Mode" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tMsg \u003d \"Adding a Event Message to the Sequence \"\n\tpayload \u003d {\n\t\t\t\"Msg\":Msg\n\t}\n\t\t\n\tsystem.perspective.sendMessage(\"addFeedback\" , payload , \"page\")\n\t\n\tpayload \u003d {\"messageType\":\"Event\"}\n\tsystem.perspective.sendMessage(\"measurementTab_addRow\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_1" + }, + "position": { + "basis": "115px" + }, + "props": { + "image": { + "icon": { + "path": "material/control_point" + } + }, + "primary": false, + "text": "Event" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tMsg \u003d \"Adding a Measurement Message to the Sequence \"\n\tpayload \u003d {\n\t\t\t\"Msg\":Msg\n\t}\n\t\t\n\tsystem.perspective.sendMessage(\"addFeedback\" , payload , \"page\")\n\t\n\tpayload \u003d {\"messageType\":\"MeasurementEvent\"}\n\tsystem.perspective.sendMessage(\"measurementTab_addRow\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_2" + }, + "position": { + "basis": "140px" + }, + "props": { + "image": { + "icon": { + "path": "material/control_point" + } + }, + "primary": false, + "text": "Measurement" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "500px", + "grow": 1, + "shrink": 0 + }, + "props": { + "justify": "space-around", + "style": { + "marginLeft": "10px", + "marginRight": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Label_1" + }, + "position": { + "basis": "32px", + "grow": 1 + }, + "props": { + "style": { + "fontWeight": "ClearAll", + "min-width": "value" + } + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "50px", + "grow": 1 + }, + "props": { + "text": "Row of last message sent:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "TextField" + }, + "position": { + "basis": "150px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.last_message_index" + }, + "type": "property" + } + } + }, + "props": { + "deferUpdates": false, + "enabled": false, + "style": { + "max-width": "50px", + "textAlign": "center" + } + }, + "type": "ia.input.text-field" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "250px", + "shrink": 0 + }, + "props": { + "justify": "space-between" + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "32px", + "grow": 1 + }, + "props": { + "style": { + "fontWeight": "ClearAll", + "min-width": "value" + } + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tMsg \u003d \"Removing All Messages from the Sequence\"\n\tpayload \u003d {\n\t\t\t\"Msg\":Msg\n\t}\n\t\t\n\tsystem.perspective.sendMessage(\"addFeedback\" , payload , \"page\")\n\t\n\tsystem.perspective.sendMessage(\"ClearAll\", None , \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "ClearAll", + "tooltip": { + "enabled": true, + "text": "Clear All" + } + }, + "position": { + "basis": "40px", + "shrink": 0 + }, + "props": { + "image": { + "icon": { + "path": "material/delete_forever" + } + }, + "primary": false, + "style": { + "marginLeft": "15px" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "40px", + "shrink": 0 + }, + "props": { + "justify": "space-around", + "style": { + "margin": "5px", + "overflow": "visible" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "margin": "5px" + }, + "wrap": "wrap" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/b3282887ace7d6fda2cb5651d735a8374f1d121aa37343d49e9348f372274c80 b/.resources/b3282887ace7d6fda2cb5651d735a8374f1d121aa37343d49e9348f372274c80 new file mode 100644 index 0000000..05d8d29 --- /dev/null +++ b/.resources/b3282887ace7d6fda2cb5651d735a8374f1d121aa37343d49e9348f372274c80 @@ -0,0 +1,55 @@ +{ + "custom": {}, + "params": {}, + "props": {}, + "root": { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "fontFamily": "Arial", + "fontSize": 22, + "fontWeight": "bold", + "textAlign": "center" + }, + "text": "OIL MONITORING" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Table" + }, + "position": { + "basis": "400px" + }, + "propConfig": { + "props.data": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "direct", + "tagPath": "[IEC_SCADA_TAG_PROVIDER]Oil/oil_condition_monitoring" + }, + "type": "tag" + } + } + }, + "type": "ia.display.table" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/b352173c988e0ef0bec6fc1d3c924ee99f6268088fa46c0662acd0fb8536cbed b/.resources/b352173c988e0ef0bec6fc1d3c924ee99f6268088fa46c0662acd0fb8536cbed new file mode 100644 index 0000000..220ba6c --- /dev/null +++ b/.resources/b352173c988e0ef0bec6fc1d3c924ee99f6268088fa46c0662acd0fb8536cbed @@ -0,0 +1,888 @@ +{ + "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": false, + "searchId": "value", + "show_error": false, + "show_running": true, + "state": 5, + "state_string": "Unknown", + "visible_status": false + }, + "params": { + "directionDown": 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} || {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" + } + }, + "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.directionDown": { + "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": 29, + "width": 20 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "ErrorStatus", + "tooltip": { + "style": { + "fontSize": 16 + } + } + }, + "position": { + "grow": 1 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "{view.custom.display_icon} \u0026\u0026 {view.custom.error} \u0026! {view.params.directionDown}" + }, + "type": "expr" + } + }, + "position.display": { + "binding": { + "config": { + "expression": "{view.custom.display_icon} \u0026\u0026 {view.custom.error} \u0026! {view.params.directionDown} \u0026\u0026 {view.custom.show_error}" + }, + "type": "expr" + } + }, + "props.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" + } + ], + "type": "property" + } + }, + "props.elements[1].fill.paint": { + "binding": { + "config": { + "expression": "if({view.custom.show_running}, \"#FFFFFF\", \"#00000000\")" + }, + "type": "expr" + } + }, + "props.elements[1].stroke.width": { + "binding": { + "config": { + "expression": "if({session.custom.alarm_filter.show_running},2,0)" + }, + "type": "expr" + } + }, + "props.elements[2].fill": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired}, \r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#FFFFFF\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#000000\u0027,\r\n\t\t\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\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[2].text": { + "binding": { + "config": { + "path": "view.custom.priority" + }, + "type": "property" + } + } + }, + "props": { + "elements": [ + { + "d": "M 31,26 C 41,36 51,46 61,56 51,66 41,76 31,86 21,76 11,66 1,56 11,46 21,36 31,26 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 2 + }, + "type": "path" + }, + { + "d": "M 61,50 C 61,43.346667 61,36.693333 61,30.04 51,20.026667 41,10.013333 31,0 21,10.013333 11,20.026667 1,30.04 1,36.693333 1,43.346667 1,50 11,40.013333 21,30.026667 31,20.04 41,30.026667 51,40.013333 61,50 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000" + }, + "type": "path" + }, + { + "style": { + "classes": "", + "fontSize": 42, + "fontWeight": "bolder" + }, + "type": "text", + "x": 20, + "y": 70 + } + ], + "style": { + "overflow": "hidden" + }, + "viewBox": "-0.5 -0.5 64 89" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "ErrorStatus_Down" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "{view.custom.display_icon} \u0026\u0026 {view.custom.error} \u0026\u0026 {view.params.directionDown}" + }, + "type": "expr" + } + }, + "position.display": { + "binding": { + "config": { + "expression": "{view.custom.display_icon} \u0026\u0026 {view.custom.error} \u0026\u0026 {view.params.directionDown} \u0026\u0026 {view.custom.show_error}" + }, + "type": "expr" + } + }, + "props.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" + } + ], + "type": "property" + } + }, + "props.elements[1].fill.paint": { + "binding": { + "config": { + "expression": "if({view.custom.show_running}, \"#FFFFFF\", \"#00000000\")" + }, + "type": "expr" + } + }, + "props.elements[1].stroke.width": { + "binding": { + "config": { + "expression": "if({session.custom.alarm_filter.show_running},2,0)" + }, + "type": "expr" + } + }, + "props.elements[2].fill": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired}, \r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#FFFFFF\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#000000\u0027,\r\n\t\t\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\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[2].text": { + "binding": { + "config": { + "path": "view.custom.priority" + }, + "type": "property" + } + } + }, + "props": { + "elements": [ + { + "d": "M 32,2 C 42,12 52,22 62,32 52,42 42,52 32,62 22,52 12,42 2,32 12,22 22,12 32,2 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 2 + }, + "type": "path" + }, + { + "d": "M 2,38 C 2,44.653333 2,51.306667 2,57.96 12,67.973333 22,77.986667 32,88 42,77.986667 52,67.973333 62,57.96 62,51.306667 62,44.653333 62,38 52,47.986667 42,57.973333 32,67.96 22,57.973333 12,47.986667 2,38 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000" + }, + "type": "path" + }, + { + "style": { + "classes": "", + "fontSize": 42, + "fontWeight": "bolder", + "textOrientation": "upright", + "writingMode": "horizontal-tb" + }, + "type": "text", + "x": 20, + "y": 44.5 + } + ], + "style": { + "overflow": "hidden" + }, + "viewBox": "-0.5 -0.5 65 89" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "RunningStatus" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "if((({view.custom.display_icon} \u0026\u0026 !{view.custom.error}) || ({view.custom.show_running} \u0026! {view.custom.show_error})) \u0026! {view.params.directionDown},True,False)" + }, + "type": "expr" + } + }, + "position.rotate.angle": { + "binding": { + "config": { + "path": "view.params.directionLeft" + }, + "transforms": [ + { + "expression": "if({value}, \u0027180deg\u0027, \u00270deg\u0027)", + "type": "expression" + } + ], + "type": "property" + } + } + }, + "props": { + "elements": [ + { + "d": "M 0,70 C 0,56.666667 0,43.333333 0,30 10,20 20,10 30,0 40,10 50,20 60,30 60,43.333333 60,56.666667 60,70 50,60 40,50 30,40 20,50 10,60 0,70 Z", + "fill": { + "paint": "#FFFFFF" + }, + "name": "path", + "stroke": { + "paint": "#4c4c4c", + "width": 3 + }, + "type": "path" + } + ], + "style": { + "overflow": "hidden" + }, + "viewBox": "-0.5 -0.5 61 71" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "RunningStatus_Down" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "if((({view.custom.display_icon} \u0026\u0026 !{view.custom.error}) || ({view.custom.show_running} \u0026! {view.custom.show_error})) \u0026\u0026 {view.params.directionDown},True,False)" + }, + "type": "expr" + } + }, + "position.rotate.angle": { + "binding": { + "config": { + "path": "view.params.directionLeft" + }, + "transforms": [ + { + "expression": "if({value}, \u0027180deg\u0027, \u00270deg\u0027)", + "type": "expression" + } + ], + "type": "property" + } + } + }, + "props": { + "elements": [ + { + "d": "m 60,0 c 0,13.333333 0,26.666667 0,40 C 50,50 40,60 30,70 20,60 10,50 0,40 0,26.666667 0,13.333333 0,0 10,10 20,20 30,30 40,20 50,10 60,0 Z", + "fill": { + "paint": "#FFFFFF" + }, + "name": "path", + "stroke": { + "paint": "#4c4c4c", + "width": 3 + }, + "type": "path" + } + ], + "style": { + "overflow": "hidden" + }, + "viewBox": "-0.5 -0.5 61 71" + }, + "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.borderStyle": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "solid" + }, + { + "input": false, + "output": "none" + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "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": { + "direction": "column", + "justify": "center", + "style": { + "borderColor": "#FF0000", + "borderWidth": "2px", + "cursor": "pointer" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/b386b14f5113800be826af3b4e048519812922ee590ba6f9cf4b7b2e48bb9067 b/.resources/b386b14f5113800be826af3b4e048519812922ee590ba6f9cf4b7b2e48bb9067 new file mode 100644 index 0000000..5a47f4f --- /dev/null +++ b/.resources/b386b14f5113800be826af3b4e048519812922ee590ba6f9cf4b7b2e48bb9067 @@ -0,0 +1,887 @@ +{ + "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": false, + "searchId": "value", + "show_error": false, + "show_running": true, + "state": 5, + "state_string": "Unknown", + "visible_status": false + }, + "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} || {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" + } + }, + "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.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": 20, + "width": 29 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "ErrorStatus", + "tooltip": { + "style": { + "fontSize": 16 + } + } + }, + "position": { + "grow": 1 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "{view.custom.display_icon} \u0026\u0026 {view.custom.error} \u0026! {view.params.directionLeft}" + }, + "type": "expr" + } + }, + "position.display": { + "binding": { + "config": { + "expression": "{view.custom.display_icon} \u0026\u0026 {view.custom.error} \u0026! {view.params.directionLeft} \u0026\u0026 {view.custom.show_error}" + }, + "type": "expr" + } + }, + "props.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" + } + ], + "type": "property" + } + }, + "props.elements[1].fill.paint": { + "binding": { + "config": { + "expression": "if({view.custom.show_running}, \"#FFFFFF\", \"#00000000\")" + }, + "type": "expr" + } + }, + "props.elements[1].stroke.width": { + "binding": { + "config": { + "expression": "if({session.custom.alarm_filter.show_running},2,0)" + }, + "type": "expr" + } + }, + "props.elements[2].fill": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired}, \r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#FFFFFF\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#000000\u0027,\r\n\t\t\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\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[2].text": { + "binding": { + "config": { + "path": "view.custom.priority" + }, + "type": "property" + } + } + }, + "props": { + "elements": [ + { + "d": "M 32 2 L 62 32 L 32 62 L 2 32 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 2 + }, + "type": "path" + }, + { + "d": "M 38 2 L 57.96 2 L 57.96 2 L 88 32 L 57.96 62 L 57.96 62 L 38 62 L 67.96 32 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000" + }, + "type": "path" + }, + { + "style": { + "classes": "", + "fontSize": 42, + "fontWeight": "bolder" + }, + "type": "text", + "x": 20, + "y": 44.5 + } + ], + "style": { + "overflow": "hidden" + }, + "viewBox": "0.5 0.5 89 64" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "ErrorStatus_Left" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "{view.custom.display_icon} \u0026\u0026 {view.custom.error} \u0026\u0026 {view.params.directionLeft}" + }, + "type": "expr" + } + }, + "position.display": { + "binding": { + "config": { + "expression": "{view.custom.display_icon} \u0026\u0026 {view.custom.error} \u0026\u0026 {view.params.directionLeft} \u0026\u0026 {view.custom.show_error}" + }, + "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" + } + ], + "type": "property" + } + }, + "props.elements[1].fill.paint": { + "binding": { + "config": { + "expression": "if({view.custom.show_running}, \"#FFFFFF\", \"#00000000\")" + }, + "type": "expr" + } + }, + "props.elements[1].stroke.width": { + "binding": { + "config": { + "expression": "if({session.custom.alarm_filter.show_running},2,0)" + }, + "type": "expr" + } + }, + "props.elements[2].fill": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired}, \r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#FFFFFF\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#000000\u0027,\r\n\t\t\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\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[2].text": { + "binding": { + "config": { + "path": "view.custom.priority" + }, + "type": "property" + } + } + }, + "props": { + "elements": [ + { + "d": "M 56,2 C 66,12 76,22 86,32 76,42 66,52 56,62 46,52 36,42 26,32 36,22 46,12 56,2 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 2 + }, + "type": "path" + }, + { + "d": "M 50,2 C 43.346667,2 36.693333,2 30.04,2 20.026667,12 10.013333,22 0,32 10.013333,42 20.026667,52 30.04,62 36.693333,62 43.346667,62 50,62 40.013333,52 30.026667,42 20.04,32 30.026667,22 40.013333,12 50,2 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000" + }, + "type": "path" + }, + { + "style": { + "classes": "", + "fontSize": 42, + "fontWeight": "bolder", + "textOrientation": "upright", + "writingMode": "horizontal-tb" + }, + "type": "text", + "x": 44.5, + "y": 44.5 + } + ], + "style": { + "overflow": "hidden" + }, + "viewBox": "0.5 0.5 89 64" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "RunningStatus" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "if((({view.custom.display_icon} \u0026\u0026 !{view.custom.error}) || ({view.custom.show_running} \u0026! {view.custom.show_error})) \u0026! {view.params.directionLeft},True, False)" + }, + "type": "expr" + } + }, + "position.rotate.angle": { + "binding": { + "config": { + "path": "view.params.directionLeft" + }, + "transforms": [ + { + "expression": "if({value}, \u0027180deg\u0027, \u00270deg\u0027)", + "type": "expression" + } + ], + "type": "property" + } + } + }, + "props": { + "elements": [ + { + "d": "M 0 0 L 40 0 L 40 0 L 70 30 L 40 60 L 40 60 L 0 60 L 30 30 Z", + "fill": { + "paint": "#FFFFFF" + }, + "name": "path", + "stroke": { + "paint": "#4c4c4c", + "width": 3 + }, + "type": "path" + } + ], + "style": { + "overflow": "hidden" + }, + "viewBox": "-1.5 -1.5 73 63" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "RunningStatus_Left" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "if((({view.custom.display_icon} \u0026\u0026 !{view.custom.error}) || ({view.custom.show_running} \u0026! {view.custom.show_error})) \u0026\u0026 {view.params.directionLeft},True, False)" + }, + "type": "expr" + } + }, + "position.rotate.angle": { + "binding": { + "config": { + "path": "view.params.directionLeft" + }, + "transforms": [ + { + "expression": "if({value}, \u0027180deg\u0027, \u00270deg\u0027)", + "type": "expression" + } + ], + "type": "property" + } + } + }, + "props": { + "elements": [ + { + "d": "M 70,60 C 56.666667,60 43.333333,60 30,60 20,50 10,40 0,30 10,20 20,10 30,0 43.333333,0 56.666667,0 70,0 60,10 50,20 40,30 50,40 60,50 70,60 Z", + "fill": { + "paint": "#FFFFFF" + }, + "name": "path", + "stroke": { + "paint": "#4c4c4c", + "width": 3 + }, + "type": "path" + } + ], + "style": { + "overflow": "hidden" + }, + "viewBox": "-0.5 -0.5 71 61" + }, + "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.borderStyle": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "solid" + }, + { + "input": false, + "output": "none" + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "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": { + "borderColor": "#FF0000", + "borderWidth": "2px", + "cursor": "pointer" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/b4263577e6c6c97c83d07aa7ea05d12dc0cf52d80c38a3e867f8e80031bd6605 b/.resources/b4263577e6c6c97c83d07aa7ea05d12dc0cf52d80c38a3e867f8e80031bd6605 new file mode 100644 index 0000000..d701dd5 --- /dev/null +++ b/.resources/b4263577e6c6c97c83d07aa7ea05d12dc0cf52d80c38a3e867f8e80031bd6605 @@ -0,0 +1,954 @@ +{ + "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" + }, + { + "custom": { + "show": false + }, + "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" + }, + { + "custom": { + "show": false + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.navigate(\"/Windows/Statistics\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Statistic", + "tooltip": { + "enabled": true, + "text": "Notifications" + } + }, + "position": { + "basis": "70px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "if(isNull({session.custom.download_url}), False, True)" + }, + "enabled": false, + "type": "expr" + } + } + }, + "props": { + "image": { + "height": 32, + "icon": { + "color": "#FCFFFC", + "path": "material/leaderboard" + }, + "position": "top", + "width": 32 + }, + "style": { + "classes": "Buttons/Button-Menu", + "color": "#FFFFFF", + "margin": 1 + }, + "text": "Statistic", + "textStyle": { + "classes": "Text-Styles/Docked-Buttons" + } + }, + "type": "ia.input.button" + }, + { + "custom": { + "show": false + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.navigate(\"/Windows/Status\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Status", + "tooltip": { + "enabled": true, + "text": "Notifications" + } + }, + "position": { + "basis": "70px" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "" + }, + "enabled": false, + "type": "expr" + } + } + }, + "props": { + "image": { + "height": 32, + "icon": { + "color": "#FFFFFD", + "path": "material/done" + }, + "position": "top", + "width": 32 + }, + "style": { + "classes": "Buttons/Button-Menu", + "color": "#FFFFFF", + "margin": 1 + }, + "text": "Status", + "textStyle": { + "classes": "Text-Styles/Docked-Buttons" + } + }, + "type": "ia.input.button" + }, + { + "custom": { + "show": false + }, + "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": "#FFFAF1", + "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/.resources/b559c48eacc55053855683931fae805de0093324f335ed6ddf158d7279201696 b/.resources/b559c48eacc55053855683931fae805de0093324f335ed6ddf158d7279201696 new file mode 100644 index 0000000..923c43f --- /dev/null +++ b/.resources/b559c48eacc55053855683931fae805de0093324f335ed6ddf158d7279201696 @@ -0,0 +1,9 @@ +{ + "type": "AllOf", + "securityLevels": [ + { + "name": "Authenticated", + "children": [] + } + ] +} \ No newline at end of file diff --git a/.resources/b6b41b08ae1f50d2483c77ad1007ae0527e2622234a713d83e9aaadad1356a1d b/.resources/b6b41b08ae1f50d2483c77ad1007ae0527e2622234a713d83e9aaadad1356a1d new file mode 100644 index 0000000..b25c166 --- /dev/null +++ b/.resources/b6b41b08ae1f50d2483c77ad1007ae0527e2622234a713d83e9aaadad1356a1d @@ -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/.resources/b6c6e2da5556b83dfb30654cf5a3d1154be8255001d7e2c911a4cde4ecae7660 b/.resources/b6c6e2da5556b83dfb30654cf5a3d1154be8255001d7e2c911a4cde4ecae7660 new file mode 100644 index 0000000..2a7d0d3 --- /dev/null +++ b/.resources/b6c6e2da5556b83dfb30654cf5a3d1154be8255001d7e2c911a4cde4ecae7660 @@ -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/.resources/b70e3dbbe704d1c2a42aee61c1d3713af4f539c5474c80f0361a11ecab3753ed b/.resources/b70e3dbbe704d1c2a42aee61c1d3713af4f539c5474c80f0361a11ecab3753ed new file mode 100644 index 0000000..880cdb0 --- /dev/null +++ b/.resources/b70e3dbbe704d1c2a42aee61c1d3713af4f539c5474c80f0361a11ecab3753ed @@ -0,0 +1,778 @@ +{ + "custom": {}, + "params": { + "params": "value" + }, + "propConfig": { + "params.params": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 1080, + "width": 400 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "50px", + "display": false + }, + "props": { + "text": "Invalid Device List Data . Make sure format is correct E.g [\"\u003cPLCiD\u003e\", \"\u003cPLCiD\u003e\"]" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "device-list-error", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.position.display \u003d not payload", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "basis": "32px" + }, + "props": { + "path": "material/view_list", + "style": { + "marginLeft": "10px" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "129px", + "grow": 1 + }, + "props": { + "style": { + "marginLeft": "10px" + }, + "text": "Add Detailed View", + "textStyle": { + "fontFamily": "Arial", + "fontSize": "20px", + "fontWeight": "bolder", + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "basis": "40px" + }, + "props": { + "justify": "space-around", + "style": { + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "129px" + }, + "props": { + "style": { + "marginLeft": "0px" + }, + "text": "View", + "textStyle": { + "fontFamily": "Arial", + "fontSize": "16px", + "fontWeight": "bold" + } + }, + "type": "ia.display.label" + }, + { + "custom": { + "Device": "", + "tagPath": "Configuration/FC" + }, + "meta": { + "name": "TextField" + }, + "position": { + "basis": "150px" + }, + "propConfig": { + "props.text": { + "onChange": { + "enabled": null, + "script": "\tsystem.perspective.sendMessage(\"update-view-data\", currentValue.value)" + } + } + }, + "props": { + "placeholder": "\u003cView Id\u003e" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "multiple_selection", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.props.enabled \u003d not payload", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "missing-data", + "pageScope": true, + "script": "\t# implement your handler here\n\t", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.text-field" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "40px" + }, + "props": { + "justify": "space-around", + "style": { + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "130px" + }, + "props": { + "style": { + "marginLeft": "0px" + }, + "text": "Device List :", + "textStyle": { + "fontFamily": "Arial", + "fontSize": "16px", + "fontWeight": "bold" + } + }, + "type": "ia.display.label" + }, + { + "custom": { + "dataToAdd": "[\"PLC01\"]", + "key": "prefix", + "tagPath": "Configuration/DetailedViews" + }, + "meta": { + "name": "TextField_0" + }, + "position": { + "basis": "150px" + }, + "propConfig": { + "props.text": { + "onChange": { + "enabled": null, + "script": "\timport ast\n\t\t\n\tdef is_valid_list(s):\n\t try:\n\t # Try to evaluate the string\n\t result \u003d ast.literal_eval(s)\n\t # Check if the result is a list\n\t return isinstance(result, list)\n\t except (ValueError, SyntaxError):\n\t # If there is a ValueError or SyntaxError, the string is not a valid list\n\t return False\n\n\t\n\tif is_valid_list(currentValue.value):\n\t\tself.custom.dataToAdd \u003d currentValue.value\n\t\tsystem.perspective.sendMessage(\"update-devicelist-data\", currentValue.value)\n\telse:\n\t\tsystem.perspective.sendMessage(\"update-devicelist-data\", \"\")\n\t\tsystem.perspective.print(\"Not a valid list \")\n\t\n\tsystem.perspective.sendMessage(\"device-list-error\", is_valid_list(currentValue.value))" + } + } + }, + "props": { + "placeholder": "[\"PLC02\", \"PLC03\"]" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "multiple_selection", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.props.enabled \u003d not payload", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.text-field" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "40px" + }, + "props": { + "justify": "space-around", + "style": { + "marginTop": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Checkbox" + }, + "position": { + "basis": "130px" + }, + "propConfig": { + "props.selected": { + "onChange": { + "enabled": null, + "script": "\tsystem.perspective.sendMessage(\"multiple_selection\", payload\u003dcurrentValue.value)" + } + } + }, + "props": { + "text": "Upload" + }, + "type": "ia.input.checkbox" + }, + { + "custom": { + "data": { + "BOB": [ + "THE", + "NOB" + ], + "FSC1": [ + "FSC1" + ], + "FSC2": [ + "FSC2" + ], + "FSC_Cells": [ + "FSC_Cells" + ], + "FSC_Induct_1-4": [ + "FSC_Induct_1-4" + ], + "FSC_Induct_5-8": [ + "FSC10" + ], + "PLC01": [ + "PLC01" + ], + "PLC02": [ + "PLC02", + "PLC98" + ], + "PLC03": [ + "PLC03" + ], + "PLC06": [ + "PLC06", + "PLC07" + ], + "PLC08": [ + "PLC08", + "PLC99" + ], + "PLC09": [ + "PLC09" + ], + "PLC09_Receiving2": [ + "PLC09_Receiving2" + ], + "PLC09_Receiving3": [ + "PLC09_Receiving3" + ], + "PLC1000": [ + "PLC1000" + ], + "PLC1000_Receiving4": [ + "PLC1000_Receiving4" + ], + "PLC1301": [ + "ARSAW1301" + ], + "PLC1302": [ + "ARSAW1302" + ], + "PLC1303": [ + "ARSAW1303" + ], + "PLC1304": [ + "ARSAW1304" + ], + "PLC1305": [ + "ARSAW1305" + ], + "PLC1306": [ + "ARSAW1306" + ], + "PLC1307": [ + "ARSAW1307" + ], + "PLC1308": [ + "ARSAW1308" + ], + "PLC1309": [ + "ARSAW1309" + ], + "PLC1310": [ + "ARSAW1310" + ], + "PLC1311": [ + "ARSAW1311" + ], + "PLC1312": [ + "ARSAW1312" + ], + "PLC13_SC1": [ + "PLC13" + ], + "PLC13_SC2": [ + "PLC13_SC2" + ], + "PLC14": [ + "PLC14" + ], + "PLC1501": [ + "ARSAW1501" + ], + "PLC1502": [ + "ARSAW1502" + ], + "PLC1503": [ + "ARSAW1503" + ], + "PLC1504": [ + "ARSAW1504" + ], + "PLC1505": [ + "ARSAW1505" + ], + "PLC1506": [ + "ARSAW1506" + ], + "PLC1507": [ + "ARSAW1507" + ], + "PLC1508": [ + "ARSAW1508" + ], + "PLC1509": [ + "ARSAW1509" + ], + "PLC1510": [ + "ARSAW1510" + ], + "PLC1511": [ + "ARSAW1511" + ], + "PLC1512": [ + "ARSAW1512" + ], + "PLC15_SC1": [ + "PLC15" + ], + "PLC15_SC2": [ + "PLC15_SC2" + ], + "PLC16": [ + "PLC16" + ], + "PLC20_Tote1-3": [ + "PLC20" + ], + "PLC20_Tote4-8": [ + "PLC20_Tote4-8" + ], + "PLC21_22": [ + "PLC21", + "PLC22" + ], + "PLC23": [ + "PLC23" + ], + "PLC24": [ + "PLC24", + "PLC97" + ], + "PLC25": [ + "PLC25" + ], + "PLC26": [ + "PLC26" + ], + "PLC27": [ + "PLC27" + ], + "PLC30": [ + "PLC30" + ], + "PLC31": [ + "PLC31" + ], + "PLC32": [ + "PLC32" + ], + "PLC60": [ + "PLC60" + ], + "PLC61": [ + "PLC61" + ], + "PLC69": [ + "PLC69" + ], + "PLC70": [ + "PLC70", + "PLC71" + ], + "PLC80_81_82": [ + "PLC80", + "PLC81", + "PLC82" + ] + }, + "fileString": "\"PageId\",\"DeviceList\"\n\"PLC1301\",\"ARSAW1301\"\n\"PLC03\",\"PLC03\"\n\"PLC1302\",\"ARSAW1302\"\n\"PLC01\",\"PLC01\"\n\"PLC02\",\"PLC02#PLC98\"\n\"PLC1305\",\"ARSAW1305\"\n\"PLC1503\",\"ARSAW1503\"\n\"PLC08\",\"PLC08#PLC99\"\n\"PLC1306\",\"ARSAW1306\"\n\"PLC1504\",\"ARSAW1504\"\n\"PLC1501\",\"ARSAW1501\"\n\"PLC1303\",\"ARSAW1303\"\n\"PLC06\",\"PLC06#PLC07\"\n\"PLC1304\",\"ARSAW1304\"\n\"PLC1502\",\"ARSAW1502\"\n\"PLC09_Receiving3\",\"PLC09_Receiving3\"\n\"PLC09_Receiving2\",\"PLC09_Receiving2\"\n\"PLC1309\",\"ARSAW1309\"\n\"PLC1507\",\"ARSAW1507\"\n\"PLC1508\",\"ARSAW1508\"\n\"PLC1505\",\"ARSAW1505\"\n\"PLC1307\",\"ARSAW1307\"\n\"PLC09\",\"PLC09\"\n\"PLC1308\",\"ARSAW1308\"\n\"PLC1506\",\"ARSAW1506\"\n\"PLC20_Tote1-3\",\"PLC20\"\n\"PLC1509\",\"ARSAW1509\"\n\"PLC14\",\"PLC14\"\n\"PLC80_81_82\",\"PLC80#PLC81#PLC82\"\n\"PLC16\",\"PLC16\"\n\"FSC_Induct_1-4\",\"FSC_Induct_1-4\"\n\"FSC_Induct_5-8\",\"FSC10\"\n\"FSC_Cells\",\"FSC_Cells\"\n\"PLC21_22\",\"PLC21#PLC22\"\n\"PLC25\",\"PLC25\"\n\"PLC69\",\"PLC69\"\n\"PLC26\",\"PLC26\"\n\"PLC23\",\"PLC23\"\n\"PLC24\",\"PLC24#PLC97\"\n\"PLC27\",\"PLC27\"\n\"PLC61\",\"PLC61\"\n\"PLC60\",\"PLC60\"\n\"PLC1000\",\"PLC1000\"\n\"PLC20_Tote4-8\",\"PLC20_Tote4-8\"\n\"PLC13_SC2\",\"PLC13_SC2\"\n\"PLC13_SC1\",\"PLC13\"\n\"PLC1312\",\"ARSAW1312\"\n\"PLC1510\",\"ARSAW1510\"\n\"PLC1511\",\"ARSAW1511\"\n\"PLC1310\",\"ARSAW1310\"\n\"PLC1311\",\"ARSAW1311\"\n\"PLC1512\",\"ARSAW1512\"\n\"PLC70\",\"PLC70#PLC71\"\n\"PLC32\",\"PLC32\"\n\"PLC30\",\"PLC30\"\n\"PLC31\",\"PLC31\"\n\"FSC1\",\"FSC1\"\n\"PLC15_SC2\",\"PLC15_SC2\"\n\"FSC2\",\"FSC2\"\n\"PLC1000_Receiving4\",\"PLC1000_Receiving4\"\n\"PLC15_SC1\",\"PLC15\"\n", + "list_data": [ + "PLC1301", + "ARSAW1301\r", + "PLC03", + "PLC03\r", + "PLC1302", + "ARSAW1302\r", + "PLC01", + "PLC01\r", + "PLC02", + "PLC02#PLC98\r", + "PLC1305", + "ARSAW1305\r", + "PLC1503", + "ARSAW1503\r", + "PLC08", + "PLC08#PLC99\r", + "PLC1306", + "ARSAW1306\r", + "PLC1504", + "ARSAW1504\r", + "PLC1501", + "ARSAW1501\r", + "PLC1303", + "ARSAW1303\r", + "PLC06", + "PLC06#PLC07\r", + "PLC1304", + "ARSAW1304\r", + "PLC1502", + "ARSAW1502\r", + "PLC09_Receiving3", + "PLC09_Receiving3\r", + "PLC09_Receiving2", + "PLC09_Receiving2\r", + "PLC1309", + "ARSAW1309\r", + "PLC1507", + "ARSAW1507\r", + "PLC1508", + "ARSAW1508\r", + "PLC1505", + "ARSAW1505\r", + "PLC1307", + "ARSAW1307\r", + "PLC09", + "PLC09\r", + "PLC1308", + "ARSAW1308\r", + "PLC1506", + "ARSAW1506\r", + "PLC20_Tote1-3", + "PLC20\r", + "PLC1509", + "ARSAW1509\r", + "PLC14", + "PLC14\r", + "PLC80_81_82", + "PLC80#PLC81#PLC82\r", + "PLC16", + "PLC16\r", + "FSC_Induct_1-4", + "FSC_Induct_1-4\r", + "FSC_Induct_5-8", + "FSC10\r", + "FSC_Cells", + "FSC_Cells\r", + "PLC21_22", + "PLC21#PLC22\r", + "PLC25", + "PLC25\r", + "PLC69", + "PLC69\r", + "PLC26", + "PLC26\r", + "PLC23", + "PLC23\r", + "PLC24", + "PLC24#PLC97\r", + "PLC27", + "PLC27\r", + "PLC61", + "PLC61\r", + "PLC60", + "PLC60\r", + "PLC1000", + "PLC1000\r", + "PLC20_Tote4-8", + "PLC20_Tote4-8\r", + "PLC13_SC2", + "PLC13_SC2\r", + "PLC13_SC1", + "PLC13\r", + "PLC1312", + "ARSAW1312\r", + "PLC1510", + "ARSAW1510\r", + "PLC1511", + "ARSAW1511\r", + "PLC1310", + "ARSAW1310\r", + "PLC1311", + "ARSAW1311\r", + "PLC1512", + "ARSAW1512\r", + "PLC70", + "PLC70#PLC71\r", + "PLC32", + "PLC32\r", + "PLC30", + "PLC30\r", + "PLC31", + "PLC31\r", + "FSC1", + "FSC1\r", + "PLC15_SC2", + "PLC15_SC2\r", + "FSC2", + "FSC2\r", + "PLC1000_Receiving4", + "PLC1000_Receiving4\r", + "PLC15_SC1", + "PLC15\r", + "BOB", + "THE#NOB" + ], + "testParsing": true + }, + "events": { + "component": { + "onFileReceived": { + "config": { + "script": "\t\n#\tdef compare_dicts(dict1, dict2):\n#\t # Check if dictionaries have the same keys\n#\t if set(dict1.keys()) !\u003d set(dict2.keys()):\n#\t return False\n#\t \n#\t # Check if values for each key are equal\n#\t for key in dict1:\n#\t if dict1[key] !\u003d dict2[key]:\n#\t \tsystem.perspective.print(\"Uploaded data Value : %s\"%dict1[key])\n#\t \tsystem.perspective.print(\"Tag data Value : %s\"%dict2[key])\n#\t \treturn False\n#\t \n#\t # If all values are equal, return True\n#\t return True\n#\t\n#\tpayload\u003d{\"fileContent\":event.file.getString(),\"fileName\":event.file.name}\n#\twhid \u003d self.session.custom.fc\n#\tdata \u003d{}\n#\t\n#\tdef convert_csv_string_list(string):\n#\t\t# removes new line chars and \n#\t\treturn string.replace(\"\\n\",\",\").replace(\"\\\"\",\"\").split(\",\")[2:]\n#\t\n#\tdef convert_dict_value_to_list(string):\n#\t\tdevice_list \u003d []\n#\t\tfor i in string.replace(\"#\", \",\").split(\",\"):\n#\t\t\tdevice_list.append(i.strip())\n#\t\treturn device_list\n#\t\n#\tlist_data \u003d convert_csv_string_list(event.file.getString())\n#\n#\tself.custom.list_data \u003d list_data\n#\t\n#\tdata \u003d {}\n#\tfor i in range(0, len(list_data),2):\n#\t\n#\t\tdata[list_data[i]]\u003d convert_dict_value_to_list(list_data[i+1])\n#\n#\tself.custom.data \u003d data\n#\tif self.custom.testParsing:\n#\t\ttag_dict \u003dsystem.util.jsonDecode(system.tag.readBlocking(\"[%s_SCADA_TAG_PROVIDER]Configuration/DetailedViews\"%whid)[0].value)\n#\t\t\n#\t\tsystem.perspective.print(\"TestResult : %s\"%compare_dicts(data, tag_dict))\n#\n#\tsystem.tag.writeBlocking([\"[%s_SCADA_TAG_PROVIDER]Configuration/DetailedViews\"%whid], system.util.jsonEncode(data))\n\n\twhid \u003d self.session.custom.fc\n\tFileHandler.uploader.add_detailed_view_btn_code(whid, event)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "FileUpload" + }, + "position": { + "basis": "150px", + "display": false + }, + "props": { + "style": { + "classes": "" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "multiple_selection", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.position.display \u003d payload ", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.fileupload" + }, + { + "custom": { + "rowToAdd": { + "deviceList": "", + "view": "" + } + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\twhid \u003d self.session.custom.fc\n\ttagPath \u003d \"[%s_SCADA_TAG_PROVIDER]Configuration/DetailedViews\"%(whid)\n\t\n\ttagData \u003d system.util.jsonDecode(system.tag.readBlocking(tagPath)[0].value)\n\tself.custom.tagData.append(self.custom.rowToAdd)\n\t\n\tdata \u003d []\n\tfor i in system.util.jsonDecode(self.custom.rowToAdd[\"deviceList\"]):\n\t\tdata.append(i)\n\t\n\ttagData[self.custom.rowToAdd[\"view\"]] \u003d data\n\t\t\t\n\t\n\tsystem.tag.writeBlocking([tagPath], [system.util.jsonEncode(tagData)])\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button", + "tooltip": { + "enabled": true, + "text": "Missing Data for : [u\u0027deviceList\u0027, u\u0027view\u0027]" + } + }, + "position": { + "basis": "150px" + }, + "propConfig": { + "custom.tagData": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "fc": "{session.custom.fc}" + }, + "tagPath": "[{fc}_SCADA_TAG_PROVIDER]Configuration/DetailedViews" + }, + "transforms": [ + { + "code": "\treturn [{\"PageId\":k,\"DeviceList\":v}for k,v in system.util.jsonDecode(value).items()]", + "type": "script" + } + ], + "type": "tag" + } + }, + "props.enabled": { + "binding": { + "config": { + "path": "this.custom.rowToAdd" + }, + "transforms": [ + { + "code": "\n\tmissing_data \u003d []\n\tfor k, v in value.items():\n\t\tif not v:\n\t\t\tmissing_data.append(k)\n\t\n\tif missing_data:\n\t\tenabled \u003d False\n\t\tmsg \u003d \"Missing Data for : %s\"%missing_data\n\telse:\n\t\tenabled \u003d True\n\t\tmsg \u003d \"\"\n\t\n\tself.meta.tooltip.text \u003d msg \n\t\n\treturn enabled\n\t", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/add_circle" + }, + "position": "right" + }, + "primary": false, + "text": "Submit" + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update-devicelist-data", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.custom.rowToAdd[\"deviceList\"] \u003d payload", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "update-view-data", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.custom.rowToAdd[\"view\"] \u003d payload", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "multiple_selection", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.position.display \u003d not payload", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer_5" + }, + "position": { + "basis": "40px" + }, + "props": { + "justify": "space-around", + "style": { + "margin-top": "10px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "borderBottomLeftRadius": "5px", + "borderBottomRightRadius": "5px", + "borderStyle": "solid", + "borderTopLeftRadius": "5px", + "borderTopRightRadius": "5px", + "margin": "10px" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/b85aab4af251fffae5184ce219434ecca96644049abb47cecf8ee7d47e0ab989 b/.resources/b85aab4af251fffae5184ce219434ecca96644049abb47cecf8ee7d47e0ab989 new file mode 100644 index 0000000..8c494ee --- /dev/null +++ b/.resources/b85aab4af251fffae5184ce219434ecca96644049abb47cecf8ee7d47e0ab989 @@ -0,0 +1,7467 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "height": 0.9124, + "width": 0.2638, + "x": 0.0026, + "y": 0.0626 + }, + "props": { + "style": { + "borderStyle": "solid", + "borderWidth": "1px", + "box-shadow": "5px 5px 5px grey", + "marginBottom": 10, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 10 + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "FlexContainer_2" + }, + "position": { + "height": 0.0529, + "width": 0.9791, + "x": 0.0025, + "y": -0.002 + }, + "props": { + "style": { + "borderStyle": "solid", + "borderWidth": "1px", + "box-shadow": "5px 5px 5px grey", + "marginBottom": 10, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 10 + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "FlexContainer_1", + "visible": false + }, + "position": { + "height": 0.1482, + "width": 0.3717, + "x": 0.2761, + "y": 0.8209 + }, + "props": { + "style": { + "borderStyle": "solid", + "borderWidth": "1px", + "box-shadow": "5px 5px 5px grey", + "marginBottom": 10, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 10 + } + }, + "type": "ia.container.flex" + }, + { + "events": { + "component": { + "onEditCellCommit": { + "config": { + "script": "\tpayload \u003d {\n\t\t\"Msg\":\"Event is %s\"%str(event)\n\t}\n\tsystem.perspective.sendMessage(\"addFeedback\" , payload , \"page\")\n\t\n\tsystem.perspective.sendMessage(\"updateAlarmNote\", event, \"page\")" + }, + "scope": "G", + "type": "script" + }, + "onRowDoubleClick": { + "config": { + "script": "\tselectedRowValue\u003devent[\"value\"]\n\tpayload\u003d{\"ID\":selectedRowValue[\"ID\"],\"Name\":selectedRowValue[\"Name\"],\"Priority\":selectedRowValue[\"Priority\"]}\n\tsystem.perspective.sendMessage(\"alarmsTab_selectAlarm\",payload)\n" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "tableAlarms" + }, + "position": { + "height": 0.7411, + "width": 0.708, + "x": 0.2749, + "y": 0.0632 + }, + "propConfig": { + "props.data": { + "binding": { + "config": { + "bidirectional": true, + "path": "session.custom.alarms" + }, + "type": "property" + } + } + }, + "props": { + "cells": { + "style": { + "overflow": "hidden" + } + }, + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Row", + "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": "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": false, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "ID", + "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": "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": true, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 80 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Name", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": true, + "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", + "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": "string", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": true, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 400 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Priority", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": true, + "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", + "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": "string", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": true, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 150 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Type", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": true, + "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", + "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": "string", + "resizable": false, + "sort": "none", + "sortable": false, + "strictWidth": false, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": false, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Tested_date_UTC", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": true, + "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", + "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": "string", + "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": "Result", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": true, + "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", + "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": "string", + "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": "Notes", + "filter": { + "boolean": { + "condition": "" + }, + "date": { + "condition": "", + "value": "" + }, + "enabled": true, + "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", + "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": "string", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + } + ], + "dragOrderable": false, + "pager": { + "bottom": false, + "initialOption": 1000 + }, + "style": { + "borderStyle": "solid", + "borderWidth": "1px", + "box-shadow": "5px 5px 5px grey", + "marginBottom": 10, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 10, + "overflow": "auto" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "updateAlarmNote", + "pageScope": true, + "script": "\t# implement your handler here\n\trow_index \u003d payload[\"rowIndex\"]\n\tcolumn \u003d payload[\"column\"]\n\t\n\tself.props.data[row_index][column] \u003d payload[\"value\"]", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.display.table" + }, + { + "meta": { + "name": "Label_7" + }, + "position": { + "height": 0.0318, + "width": 0.0626, + "x": -0.0988, + "y": 0.3665 + }, + "props": { + "text": "Timestamp ms" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_4", + "visible": false + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "75% 137%" + }, + "width": 0.1666, + "x": 0.2988, + "y": 0.8376 + }, + "props": { + "style": { + "fontWeight": "bolder" + }, + "text": "Information" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{}\n\tpayload[\"containerName\"]\u003dself.parent.meta.name\n\tpayload[\"targetTable\"]\u003d\"tableAlarms\"\n\tsystem.perspective.sendMessage(\"exportFile\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_18", + "tooltip": { + "enabled": true, + "text": "Exports Alarms Table Data" + } + }, + "position": { + "height": 0.0385, + "width": 0.0683, + "x": 0.1933, + "y": 0.9258 + }, + "props": { + "image": { + "icon": { + "color": "#000000", + "path": "material/import_export" + } + }, + "primary": false, + "text": "Export" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.sendMessage(\"alarmsTab_init\")\n\tself.session.custom.alarms \u003d[]" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "buttonInit", + "tooltip": { + "enabled": true, + "text": "Reset Alarm List and User Inputs" + } + }, + "position": { + "height": 0.0385, + "width": 0.0683, + "x": 0.1224, + "y": 0.9258 + }, + "props": { + "image": { + "height": 32, + "icon": { + "color": "#000000", + "path": "material/refresh" + } + }, + "primary": false, + "text": "Reset" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.getChild(\"root\").custom.displayUpload \u003d True" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Uploads" + }, + "position": { + "height": 0.0385, + "width": 0.0683, + "x": 0.0193, + "y": 0.0173 + }, + "props": { + "image": { + "icon": { + "path": "material/import_export" + } + }, + "primary": false, + "text": "Uploads" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"status\":1,\"containerName\":self.parent.meta.name}\n\tsystem.perspective.sendMessage(\"sendSimulationEvent\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_12", + "tooltip": { + "enabled": true, + "text": "Send Alarm Active Message" + } + }, + "position": { + "height": 0.0385, + "width": 0.1408, + "x": 0.1223, + "y": 0.3082 + }, + "props": { + "image": { + "icon": { + "color": "#FFFFFF", + "path": "material/power_settings_new" + } + }, + "text": "Activate" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"status\":0,\"containerName\":self.parent.meta.name}\n\tsystem.perspective.sendMessage(\"sendSimulationEvent\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_13", + "tooltip": { + "enabled": true, + "text": "Send Alarm De-active Message" + } + }, + "position": { + "height": 0.0385, + "width": 0.1408, + "x": 0.1223, + "y": 0.3515 + }, + "props": { + "image": { + "icon": { + "color": "#000000", + "path": "material/not_interested" + } + }, + "primary": false, + "text": "De-activate" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "textFieldEventsCommandParams_Timestamp", + "visible": false + }, + "position": { + "height": 0.0318, + "width": 0.1079, + "x": 0.1223, + "y": 0.2716 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "expression": "toStr(toMillis({../DateTimeInput.props.value}))" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "textAlign": "right" + }, + "tex": "" + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "Label_10" + }, + "position": { + "height": 0.0318, + "width": 0.0803, + "x": 0.0287, + "y": 0.1251 + }, + "props": { + "text": "Controller" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "dropdownEventsCommandParams_Target" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "50% 169%" + }, + "width": 0.142, + "x": 0.1223, + "y": 0.0886 + }, + "propConfig": { + "props.options": { + "binding": { + "config": { + "path": "session.custom.sources" + }, + "transforms": [ + { + "code": "\toptions \u003d []\n\tfor source in value :\n\t\topt \u003d {\n\t\t \"value\":source[\"Source\"],\n\t\t \"label\":source[\"Source\"]\n\t\t}\n\t\toptions.append(opt)\n\t\t\n\treturn options ", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "showClearIcon": true, + "value": null + }, + "type": "ia.input.dropdown" + }, + { + "meta": { + "name": "textFieldEventsCommandParams_EventDescription" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "375% -109%" + }, + "width": 0.1418, + "x": 0.1223, + "y": 0.1617 + }, + "props": { + "enabled": false, + "style": { + "textAlign": "right" + }, + "tex": "" + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "Label_8" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "75% 137%" + }, + "width": 0.0803, + "x": 0.0287, + "y": 0.0886 + }, + "props": { + "text": "Source ID" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_14" + }, + "position": { + "height": 0.0318, + "width": 0.0803, + "x": 0.0287, + "y": 0.1617 + }, + "props": { + "text": "Alarm Description" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"testResult\":\"PASSED\",\"containerName\":self.parent.meta.name}\n\tsystem.perspective.sendMessage(\"setTestResult\", payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_14", + "tooltip": { + "enabled": true, + "text": "Scada State Matches Alarms State " + } + }, + "position": { + "height": 0.0385, + "width": 0.0683, + "x": 0.1223, + "y": 0.4429 + }, + "props": { + "image": { + "icon": { + "color": "#323232", + "path": "material/check_circle_outline" + } + }, + "primary": false, + "text": "Passed" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"testResult\":\"FAILED\",\"containerName\":self.parent.meta.name}\n\tsystem.perspective.sendMessage(\"setTestResult\", payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_15", + "tooltip": { + "enabled": true, + "text": "Scada State Does Not Matche Alarms State " + } + }, + "position": { + "height": 0.0385, + "width": 0.0683, + "x": 0.1932, + "y": 0.4429 + }, + "props": { + "image": { + "icon": { + "color": "#323232", + "path": "material/highlight_off" + } + }, + "primary": false, + "text": "Failed" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_6" + }, + "position": { + "height": 0.0318, + "width": 0.0803, + "x": 0.0287, + "y": 0.1983 + }, + "props": { + "text": "ID" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "textFieldEventsCommandParams_EventID" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "375% -109%" + }, + "width": 0.1418, + "x": 0.1223, + "y": 0.1983 + }, + "props": { + "enabled": false, + "style": { + "textAlign": "right" + }, + "tex": "" + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "Label_13" + }, + "position": { + "height": 0.0318, + "width": 0.0803, + "x": 0.0287, + "y": 0.2348 + }, + "props": { + "text": "Priority" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "textField_alarmPriority", + "tooltip": { + "style": { + "classes": "Alarms-Styles/Critical" + } + } + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "375% -109%" + }, + "width": 0.1418, + "x": 0.1223, + "y": 0.2348 + }, + "props": { + "enabled": false, + "style": { + "textAlign": "right" + }, + "tex": "" + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "Label_20" + }, + "position": { + "height": 0.0318, + "width": 0.0803, + "x": 0.0287, + "y": 0.2714 + }, + "props": { + "text": "Date and time" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "DateTimeInput" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "-58% 268%" + }, + "width": 0.1079, + "x": 0.1223, + "y": 0.2714 + }, + "props": { + "format": "YYYY-MM-DD hh:mm:ss", + "formattedValue": "2023-08-29 12:11:39", + "tex": "", + "text": "", + "value": 1693311099006 + }, + "type": "ia.input.date-time-input" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t\n\tnow \u003d system.date.now()\n\t\n\ttimeNow\u003dsystem.date.toMillis(now)\n\tself.getSibling(\"DateTimeInput\").props.value \u003d timeNow\n\t\n\t\n\tMsg \u003d \"Setting time of message to %s\"%now\n\tpayload \u003d {\n\t\t\"Msg\":Msg\n\t}\n\tsystem.perspective.sendMessage(\"addFeedback\" , payload , \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "buttonInit_2" + }, + "position": { + "height": 0.0318, + "width": 0.0308, + "x": 0.2328, + "y": 0.2727 + }, + "props": { + "image": { + "icon": { + "color": "#000000", + "path": "material/access_time" + } + }, + "primary": false, + "text": "" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "textFieldTargetPLC" + }, + "position": { + "height": 0.0318, + "width": 0.142, + "x": 0.1223, + "y": 0.1251 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "../dropdownEventsCommandParams_Target.props.value" + }, + "transforms": [ + { + "code": "\ttry:\n\t\treturn value.split(\"/\")[0]\n\texcept:\n\t\treturn \"\"", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "enabled": false, + "style": { + "textAlign": "right" + }, + "tex": "" + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "EmbeddedView", + "tooltip": { + "enabled": true, + "text": "User Feedback" + } + }, + "position": { + "height": 0.153, + "width": 0.708, + "x": 0.2742, + "y": 0.82 + }, + "props": { + "path": "Main-Views/Commissioning Tool/UserFeedBack", + "style": { + "borderStyle": "solid", + "borderWidth": "1px", + "box-shadow": "5px 5px 5px grey", + "marginBottom": 10, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 10, + "overflow": "auto" + } + }, + "type": "ia.display.view" + } + ], + "custom": { + "dateTimeCommandSent": { + "$": [ + "ts", + 192, + 1668596541256 + ], + "$ts": 1668596541109 + }, + "testingAlarmPriority1": "", + "testingAlarmPriority2": "", + "testingAlarmPriority3": "", + "testingAlarmPriority4": "" + }, + "meta": { + "name": "ContainerAlarms" + }, + "props": { + "mode": "percent" + }, + "type": "ia.container.coord" + }, + { + "children": [ + { + "meta": { + "name": "FlexContainer_3" + }, + "position": { + "height": 0.9105, + "width": 0.2664, + "x": 0.0021, + "y": 0.0644 + }, + "props": { + "style": { + "borderStyle": "solid", + "borderWidth": "1px", + "box-shadow": "5px 5px 5px grey", + "marginBottom": 10, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 10 + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "FlexContainer_2" + }, + "position": { + "height": 0.0549, + "width": 0.9776, + "x": 0.0026, + "y": -0.001 + }, + "props": { + "style": { + "borderStyle": "solid", + "borderWidth": "1px", + "box-shadow": "5px 5px 5px grey", + "marginBottom": 10, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 10 + } + }, + "type": "ia.container.flex" + }, + { + "events": { + "component": { + "onEditCellCommit": { + "config": { + "script": "\tpayload \u003d {\n\t\t\"Msg\":\"Event is %s\"%str(event)\n\t}\n\tsystem.perspective.sendMessage(\"addFeedback\" , payload , \"page\")\n\t\n\tsystem.perspective.sendMessage(\"updateSourceNote\", event, \"page\")" + }, + "scope": "G", + "type": "script" + }, + "onRowDoubleClick": { + "config": { + "script": "\tselectedRowValue\u003devent[\"value\"]\n\tpayload\u003d{\"Source\":selectedRowValue[\"Source\"]}\n\tsystem.perspective.sendMessage(\"sourcesTab_selectSource\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "tableSources" + }, + "position": { + "height": 0.7382, + "width": 0.7049, + "x": 0.2751, + "y": 0.0649 + }, + "propConfig": { + "props.data": { + "binding": { + "config": { + "bidirectional": true, + "path": "session.custom.sources" + }, + "type": "property" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Row", + "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", + "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": "ID", + "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": "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": true, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 80 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Source", + "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", + "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": "Tested_date_UTC", + "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", + "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": "Result", + "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", + "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": "Notes", + "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", + "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": "" + } + ], + "pager": { + "initialOption": 1000 + }, + "style": { + "borderStyle": "solid", + "borderWidth": "1px", + "box-shadow": "5px 5px 5px grey", + "marginBottom": 10, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 10, + "overflow": "auto" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "updateSourceNote", + "pageScope": true, + "script": "\t# implement your handler here\n\trow_index \u003d payload[\"rowIndex\"]\n\tcolumn \u003d payload[\"column\"]\n\t\n\tself.props.data[row_index][column] \u003d payload[\"value\"]", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.display.table" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.sendMessage(\"sourcesTab_init\")\n\tself.session.custom.sources \u003d []\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "buttonInit" + }, + "position": { + "height": 0.0385, + "width": 0.0683, + "x": 0.1286, + "y": 0.9241 + }, + "props": { + "image": { + "icon": { + "color": "#000000", + "path": "material/refresh" + } + }, + "primary": false, + "text": "Reset" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_8" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "75% 133%" + }, + "width": 0.0808, + "x": 0.0293, + "y": 0.0898 + }, + "props": { + "text": "Source ID" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "textFieldEventsCommandParams_Timestamp", + "visible": false + }, + "position": { + "height": 0.0318, + "width": 0.1084, + "x": 0.1231, + "y": 0.2387 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "expression": "toStr(toMillis({../DateTimeInput.props.value}))" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "textAlign": "right" + } + }, + "type": "ia.input.text-field" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t\n\ttimeNow\u003dsystem.date.toMillis(system.date.now())\n\tself.getSibling(\"DateTimeInput\").props.value \u003d timeNow\n\tself.getSibling(\"textFieldEventsCommandParams_Timestamp\").props.text \u003d timeNow\n\t\n\tMsg \u003d \"Setting time of message to %s\"%system.date.now()\n\tpayload \u003d {\n\t\t\t\"Msg\":Msg\n\t}\n\t\n\tsystem.perspective.sendMessage(\"addFeedback\" , payload , \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "buttonInit_1" + }, + "position": { + "height": 0.0318, + "width": 0.0287, + "x": 0.2364, + "y": 0.2387 + }, + "props": { + "image": { + "icon": { + "color": "#000000", + "path": "material/access_time" + } + }, + "primary": false, + "text": "" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_6" + }, + "position": { + "height": 0.0318, + "width": 0.0808, + "x": 0.0291, + "y": 0.3118 + }, + "props": { + "text": "ID" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "textFieldEventsCommandParams_EventID" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "375% -109%" + }, + "width": 0.1403, + "x": 0.1246, + "y": 0.3118 + }, + "props": { + "enabled": false, + "style": { + "textAlign": "right" + }, + "text": "1" + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "Label_14" + }, + "position": { + "height": 0.0318, + "width": 0.0808, + "x": 0.0291, + "y": 0.2013 + }, + "props": { + "text": "Alarm Description" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "textFieldEventsCommandParams_EventDescription" + }, + "position": { + "height": 0.0318, + "width": 0.1423, + "x": 0.124, + "y": 0.2013 + }, + "props": { + "enabled": false, + "style": { + "textAlign": "right" + }, + "text": "AccessDoorOpenedFault1" + }, + "type": "ia.input.text-field" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"status\":1,\"containerName\":self.parent.meta.name}\n\tsystem.perspective.sendMessage(\"sendSimulationEvent\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_12" + }, + "position": { + "height": 0.0385, + "width": 0.1387, + "x": 0.1251, + "y": 0.3484 + }, + "props": { + "image": { + "icon": { + "color": "#000000", + "path": "material/power_settings_new" + } + }, + "text": "Activate" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"status\":0,\"containerName\":self.parent.meta.name}\n\tsystem.perspective.sendMessage(\"sendSimulationEvent\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_13" + }, + "position": { + "height": 0.0385, + "width": 0.1387, + "x": 0.1251, + "y": 0.3917 + }, + "props": { + "image": { + "icon": { + "color": "000000", + "path": "material/not_interested" + } + }, + "primary": false, + "text": "De-activate" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"testResult\":\"PASSED\",\"containerName\":self.parent.meta.name}\n\tsystem.perspective.sendMessage(\"setTestResult\", payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_15" + }, + "position": { + "height": 0.0385, + "width": 0.0683, + "x": 0.1242, + "y": 0.5462 + }, + "props": { + "image": { + "icon": { + "color": "#000000", + "path": "material/check_circle_outline" + } + }, + "primary": false, + "text": "Passed" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"testResult\":\"FAILED\",\"containerName\":self.parent.meta.name}\n\tsystem.perspective.sendMessage(\"setTestResult\", payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_16" + }, + "position": { + "height": 0.0385, + "width": 0.0683, + "x": 0.1961, + "y": 0.5462 + }, + "props": { + "image": { + "icon": { + "color": "#000000", + "path": "material/highlight_off" + } + }, + "primary": false, + "text": "Failed" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{}\n\tpayload[\"containerName\"]\u003dself.parent.meta.name\n\tpayload[\"targetTable\"]\u003d\"tableSources\"\n\tsystem.perspective.sendMessage(\"exportFile\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_18" + }, + "position": { + "height": 0.0385, + "width": 0.0683, + "x": 0.2007, + "y": 0.9243 + }, + "props": { + "image": { + "icon": { + "color": "#000000", + "path": "material/import_export" + } + }, + "primary": false, + "text": "Export" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\talarm \u003d self.parent.custom.testingAlarmPriority1\n\tpayload\u003d{\"alarm\":alarm}\n\tsystem.perspective.sendMessage(\"sourcesTab_setAlarm\", payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_17" + }, + "position": { + "height": 0.0318, + "width": 0.0261, + "x": 0.1254, + "y": 0.1631 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "if({parent.custom.testingAlarmPriority1}\u003d\u0027{}\u0027 || {parent.custom.testingAlarmPriority1}\u003d\u0027\u0027, False, True) " + }, + "type": "expr" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "session.custom.colours.colour_impaired" + }, + "transforms": [ + { + "code": "\tif not value:\n\t\treturn \"Alarms-Styles/Diagnostic\"\n\telse:\n\t\treturn \"Alarms-Styles/Alt-Colours/Diagnostic\"\n\t\t ", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "image": { + "icon": { + "color": "#AAAAAA" + } + }, + "style": {}, + "text": 1 + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\talarm \u003d self.parent.custom.testingAlarmPriority2\n\tpayload\u003d{\"alarm\":alarm}\n\tsystem.perspective.sendMessage(\"sourcesTab_setAlarm\", payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_19" + }, + "position": { + "height": 0.0318, + "width": 0.0266, + "x": 0.1566, + "y": 0.1631 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "if({parent.custom.testingAlarmPriority2}\u003d\u0027{}\u0027 || {parent.custom.testingAlarmPriority2}\u003d\u0027\u0027, False, True) " + }, + "type": "expr" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "session.custom.colours.colour_impaired" + }, + "transforms": [ + { + "code": "\tif not value:\n\t\treturn \"Alarms-Styles/Low\"\n\telse:\n\t\treturn \"Alarms-Styles/Alt-Colours/Low\"\n\t\t ", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "image": { + "icon": { + "color": "#AAAAAA" + } + }, + "style": {}, + "text": 2 + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\talarm \u003d self.parent.custom.testingAlarmPriority3\n\tpayload\u003d{\"alarm\":alarm}\n\tsystem.perspective.sendMessage(\"sourcesTab_setAlarm\", payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_20" + }, + "position": { + "height": 0.0318, + "width": 0.0261, + "x": 0.1879, + "y": 0.1631 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "if({parent.custom.testingAlarmPriority3}\u003d\u0027{}\u0027 || {parent.custom.testingAlarmPriority3}\u003d\u0027\u0027, False, True) " + }, + "type": "expr" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "session.custom.colours.colour_impaired" + }, + "transforms": [ + { + "code": "\tif not value:\n\t\treturn \"Alarms-Styles/Medium\"\n\telse:\n\t\treturn \"Alarms-Styles/Alt-Colours/Medium\"\n\t\t ", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "image": { + "icon": { + "color": "#AAAAAA" + } + }, + "style": {}, + "text": 3 + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\talarm \u003d self.parent.custom.testingAlarmPriority4\n\tpayload\u003d{\"alarm\":alarm}\n\tsystem.perspective.sendMessage(\"sourcesTab_setAlarm\", payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_21" + }, + "position": { + "height": 0.0318, + "width": 0.0261, + "x": 0.2192, + "y": 0.1631 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "if({parent.custom.testingAlarmPriority4}\u003d\u0027{}\u0027 || {parent.custom.testingAlarmPriority4}\u003d\u0027\u0027, False, True) " + }, + "type": "expr" + } + }, + "props.style.classes": { + "binding": { + "config": { + "path": "session.custom.colours.colour_impaired" + }, + "transforms": [ + { + "code": "\tif not value:\n\t\treturn \"Alarms-Styles/High\"\n\telse:\n\t\treturn \"Alarms-Styles/Alt-Colours/High\"\n\t\t ", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "image": { + "icon": { + "color": "#AAAAAA" + } + }, + "style": {}, + "text": 4 + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_13" + }, + "position": { + "height": 0.0318, + "width": 0.0808, + "x": 0.0291, + "y": 0.2752 + }, + "props": { + "text": "Priority" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "textField_alarmPriority", + "tooltip": { + "style": { + "classes": "Alarms-Styles/Critical" + } + } + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "375% -109%" + }, + "width": 0.1403, + "x": 0.1241, + "y": 0.2752 + }, + "props": { + "enabled": false, + "style": { + "textAlign": "right" + }, + "text": "High" + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "Label_20" + }, + "position": { + "height": 0.0318, + "width": 0.0808, + "x": 0.0291, + "y": 0.2361 + }, + "props": { + "text": "Date and time" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "DateTimeInput" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "50% 62%" + }, + "width": 0.1074, + "x": 0.1242, + "y": 0.2377 + }, + "props": { + "format": "YYYY-MM-DD hh:mm:ss", + "formattedValue": "2023-08-30 12:28:29", + "text": "", + "value": 1693398509608 + }, + "type": "ia.input.date-time-input" + }, + { + "meta": { + "name": "Label_11" + }, + "position": { + "height": 0.0318, + "width": 0.0808, + "x": 0.0291, + "y": 0.1264 + }, + "props": { + "text": "Controller" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "textFieldTargetPLC" + }, + "position": { + "height": 0.0318, + "width": 0.1418, + "x": 0.1242, + "y": 0.1264 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "../textField_SelectedTarget.props.text" + }, + "transforms": [ + { + "code": "\treturn value.split(\"/\")[0]", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "enabled": false, + "style": { + "textAlign": "right" + }, + "tex": "" + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "Label_16" + }, + "position": { + "height": 0.0318, + "width": 0.0808, + "x": 0.0294, + "y": 0.1631 + }, + "props": { + "text": "Alarm Priority" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "textField_SelectedTarget" + }, + "position": { + "height": 0.0318, + "width": 0.1423, + "x": 0.124, + "y": 0.0898 + }, + "props": { + "enabled": false, + "style": { + "textAlign": "right" + }, + "tex": "", + "text": "PLC01/UL5-2/ESTOP2" + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "StatusIcon" + }, + "position": { + "height": 0.0799, + "rotate": { + "anchor": "50% 40%" + }, + "width": 0.0693, + "x": 0.1954, + "y": 0.4562 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "if({this.props.params.tagProps[0]}\u003d\u0027\u0027,False,True)" + }, + "type": "expr" + } + }, + "props.params.tagProps[0]": { + "binding": { + "config": { + "path": "../dropdownEventsCommandParams_Target.props.value" + }, + "type": "property" + } + } + }, + "props": { + "params": { + "tagProps": [ + null, + "", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/ControlCabinet", + "useDefaultViewWidth": true + }, + "type": "ia.display.view" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.getChild(\"root\").custom.displayUpload \u003d True" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Uploads" + }, + "position": { + "height": 0.0385, + "width": 0.0683, + "x": 0.0193, + "y": 0.0163 + }, + "props": { + "image": { + "icon": { + "path": "material/import_export" + } + }, + "primary": false, + "text": "Uploads" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "EmbeddedView" + }, + "position": { + "height": 0.153, + "width": 0.7044, + "x": 0.2763, + "y": 0.8212 + }, + "props": { + "path": "Main-Views/Commissioning Tool/UserFeedBack", + "style": { + "borderStyle": "solid", + "borderWidth": "1px", + "box-shadow": "5px 5px 5px grey", + "marginBottom": 10, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 10, + "overflow": "auto" + } + }, + "type": "ia.display.view" + } + ], + "custom": { + "testingAlarmPriority1": { + "id": "3", + "message": "BufferBatteryErrorSystemWarning1", + "priority": "Diagnostic", + "type": "0" + }, + "testingAlarmPriority2": "", + "testingAlarmPriority3": { + "id": "22", + "message": "ExternalUnitFault1", + "priority": "Medium", + "type": "0" + }, + "testingAlarmPriority4": { + "id": "1", + "message": "AccessDoorOpenedFault1", + "priority": "High", + "type": "1" + } + }, + "meta": { + "name": "ContainerSources" + }, + "position": { + "tabIndex": 1 + }, + "props": { + "mode": "percent" + }, + "type": "ia.container.coord" + }, + { + "children": [ + { + "meta": { + "name": "FlexContainer_3" + }, + "position": { + "height": 0.9192, + "width": 0.2534, + "x": 0.003, + "y": 0.0635 + }, + "props": { + "style": { + "borderStyle": "solid", + "borderWidth": "1px", + "box-shadow": "5px 5px 5px grey", + "marginBottom": 10, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 10 + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "FlexContainer_5" + }, + "position": { + "height": 0.0597, + "width": 0.9797, + "x": 0.0032, + "y": -0.0058 + }, + "props": { + "style": { + "borderStyle": "solid", + "borderWidth": "1px", + "box-shadow": "5px 5px 5px grey", + "marginBottom": 10, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 10 + } + }, + "type": "ia.container.flex" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"fileFormat\":\"csv\"}\n\tsystem.perspective.sendMessage(\"measurementTab_exportFile\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_18" + }, + "position": { + "height": 0.0385, + "width": 0.0673, + "x": 0.1884, + "y": 0.9278 + }, + "props": { + "image": { + "height": 32, + "icon": { + "color": "#000000", + "path": "material/import_export" + } + }, + "primary": false, + "text": "Export" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onFileReceived": { + "config": { + "script": "\tpayload\u003d{\"fileContent\":event.file.getString(),\"fileExtension\":event.file.name.split(\".\")[1]}\n\tsystem.perspective.sendMessage(\"measurementTab_importFile\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "FileUpload_0" + }, + "position": { + "height": 0.0385, + "width": 0.0683, + "x": 0.0197, + "y": 0.0159 + }, + "props": { + "fileUploadIcon": { + "color": "#000000", + "path": "material/import_export", + "style": { + "borderStyle": "none" + } + }, + "maxUploads": 1, + "style": { + "backgroundColor": "#FAFAFA", + "borderStyle": "solid", + "classes": "" + }, + "supportedFileTypes": [ + "csv" + ] + }, + "type": "ia.input.fileupload" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.sendMessage(\"measurementTab_changeSelectedPLC\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "dropdownTargetPLC" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "50% 169%" + }, + "width": 0.1413, + "x": 0.1141, + "y": 0.1304 + }, + "propConfig": { + "props.options": { + "binding": { + "config": { + "path": "session.custom.sources" + }, + "transforms": [ + { + "code": "\toptions \u003d []\n\tlist_of_controllers \u003d []\n\tfor source in value :\n\t\ttry:\n\t\t\tcontroller \u003d source[\"Source\"].split(\"/\")[0]\n\t\texcept:\n\t\t\tcontinue\n\t\t\n\t\tif controller in list_of_controllers:\n\t\t\tcontinue\t\n\t\t\n\t\tlist_of_controllers.append(controller)\n\t\t\n\t\topt \u003d {\n\t\t \"value\":controller,\n\t\t \"label\": controller\n\t\t}\n\t\toptions.append(opt)\n\t\t\n\treturn options ", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "placeholder": { + "text": "Select Controller..." + }, + "showClearIcon": true, + "value": "PLC01" + }, + "type": "ia.input.dropdown" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.sendMessage(\"measurementTab_init\")\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "buttonInit" + }, + "position": { + "height": 0.0385, + "width": 0.0683, + "x": 0.1126, + "y": 0.9278 + }, + "props": { + "image": { + "height": 32, + "icon": { + "color": "#000000", + "path": "material/refresh" + } + }, + "primary": false, + "text": "Reset" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_11" + }, + "position": { + "height": 0.0318, + "width": 0.0933, + "x": 0.022, + "y": 0.1312 + }, + "props": { + "text": "Controller" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.sendMessage(\"measurementTab_sendEvent\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_17" + }, + "position": { + "height": 0.0385, + "width": 0.1449, + "x": 0.1126, + "y": 0.8263 + }, + "props": { + "image": { + "icon": { + "color": "#FFFFFF", + "path": "material/power_settings_new" + } + }, + "text": "Send Sequence" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "rowOfLastMessageSent", + "visible": false + }, + "position": { + "height": 0.0308, + "rotate": { + "anchor": "50% 38%" + }, + "width": 0.0313, + "x": 0.6155, + "y": 0.9464 + }, + "props": { + "enabled": false, + "value": 1 + }, + "type": "ia.input.numeric-entry-field" + }, + { + "meta": { + "name": "Label_13" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "75% 137%" + }, + "width": 0.0933, + "x": 0.022, + "y": 0.0935 + }, + "props": { + "text": "Source ID" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "dropdownEventsCommandParams_Target" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "50% 169%" + }, + "width": 0.1413, + "x": 0.1141, + "y": 0.0928 + }, + "propConfig": { + "props.options": { + "binding": { + "config": { + "path": "session.custom.sources" + }, + "transforms": [ + { + "code": "\toptions \u003d []\n\tfor source in value :\n\t\topt \u003d {\n\t\t \"value\":source[\"Source\"],\n\t\t \"label\": source[\"Source\"]\n\t\t}\n\t\toptions.append(opt)\n\t\t\n\treturn options ", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "placeholder": { + "text": "Select Source ID..." + }, + "showClearIcon": true, + "value": "PLC01/UL5-1" + }, + "type": "ia.input.dropdown" + }, + { + "meta": { + "name": "dropdownMeasurementName" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "50% 169%" + }, + "width": 0.1444, + "x": 0.1148, + "y": 0.3525 + }, + "props": { + "options": [ + { + "label": "RESULT_NOREAD", + "value": "RESULT_NOREAD" + }, + { + "label": "RESULT_MULTIREAD", + "value": "RESULT_MULTIREAD" + }, + { + "label": "RESULT_SAL_CODE_AT_INFEED", + "value": "RESULT_SAL_CODE_AT_INFEED" + }, + { + "label": "RESULT_INSUFFICIENT_GAP_AT_INFEED", + "value": "RESULT_INSUFFICIENT_GAP_AT_INFEED" + }, + { + "label": "RESULT_NOT_ALIGNED", + "value": "RESULT_NOT_ALIGNED" + }, + { + "label": "RESULT_WRONG_ORIENTATION", + "value": "RESULT_WRONG_ORIENTATION" + }, + { + "label": "RESULT_OVER_LENGTH", + "value": "RESULT_OVER_LENGTH" + }, + { + "label": "RESULT_NODATA", + "value": "RESULT_NODATA" + }, + { + "label": "RESULT_BAD_REQUEST", + "value": "RESULT_BAD_REQUEST" + }, + { + "label": "RESULT_AEG_ERROR", + "value": "RESULT_AEG_ERROR" + }, + { + "label": "RESULT_VERIFY_SALNOREAD", + "value": "RESULT_VERIFY_SALNOREAD" + }, + { + "label": "RESULT_VERIFY_SHIPNOREAD", + "value": "RESULT_VERIFY_SHIPNOREAD" + }, + { + "label": "RESULT_VERIFY_SALMISMATCH", + "value": "RESULT_VERIFY_SALMISMATCH" + }, + { + "label": "RESULT_SAFETY_STOP_FLUSH", + "value": "RESULT_SAFETY_STOP_FLUSH" + }, + { + "label": "RESULT_VERIFY_SAL_MULTIREAD", + "value": "RESULT_VERIFY_SAL_MULTIREAD" + }, + { + "label": "RESULT_MISMATCH_FLUSH", + "value": "RESULT_MISMATCH_FLUSH" + }, + { + "label": "RESULT_PITCH_OR_TRACKING_ERROR", + "value": "RESULT_PITCH_OR_TRACKING_ERROR" + }, + { + "label": "RESULT_CAMERA_ERROR_INDUCT", + "value": "RESULT_CAMERA_ERROR_INDUCT" + }, + { + "label": "RESULT_CAMERA_ERROR_VERIFY", + "value": "RESULT_CAMERA_ERROR_VERIFY" + }, + { + "label": "RESULT_TAMP_FAILED_TO_EXTEND", + "value": "RESULT_TAMP_FAILED_TO_EXTEND" + }, + { + "label": "RESULT_MISC_ERROR_OPERATIONS", + "value": "RESULT_MISC_ERROR_OPERATIONS" + }, + { + "label": "RESULT_MISC_ERROR_MACHINE", + "value": "RESULT_MISC_ERROR_MACHINE" + }, + { + "label": "RESULT_UNKNOWN", + "value": "RESULT_UNKNOWN" + }, + { + "label": "RESULT_SUCCESS_SIDELINE", + "value": "RESULT_SUCCESS_SIDELINE" + }, + { + "label": "RESULT_SUCCESS", + "value": "RESULT_SUCCESS" + } + ], + "showClearIcon": true, + "value": "RESULT_INSUFFICIENT_GAP_AT_INFEED" + }, + "type": "ia.input.dropdown" + }, + { + "meta": { + "name": "delta" + }, + "position": { + "height": 0.0318, + "width": 0.1444, + "x": 0.1143, + "y": 0.3891 + }, + "props": { + "inputBounds": { + "maximum": 10000, + "minimum": 1 + }, + "value": 100 + }, + "type": "ia.input.numeric-entry-field" + }, + { + "meta": { + "name": "Label_16" + }, + "position": { + "height": 0.0318, + "width": 0.0792, + "x": 0.0218, + "y": 0.3911 + }, + "props": { + "text": "Delta" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_17" + }, + "position": { + "height": 0.0318, + "width": 0.0808, + "x": 0.0218, + "y": 0.3545 + }, + "props": { + "text": "Measurement name" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.sendMessage(\"measurementTab_setMeasurementInTable\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_29" + }, + "position": { + "height": 0.0385, + "width": 0.1444, + "x": 0.1143, + "y": 0.4988 + }, + "props": { + "image": { + "icon": { + "color": "#323232", + "path": "material/control_point" + } + }, + "primary": false, + "text": "Set Measurement" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_18" + }, + "position": { + "height": 0.0318, + "width": 0.0792, + "x": 0.0218, + "y": 0.4276 + }, + "props": { + "text": "Unit" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_19" + }, + "position": { + "height": 0.0318, + "width": 0.0792, + "x": 0.0218, + "y": 0.4642 + }, + "props": { + "text": "Sampling ms" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "sampling" + }, + "position": { + "height": 0.0318, + "width": 0.1444, + "x": 0.1143, + "y": 0.4622 + }, + "props": { + "inputBounds": { + "minimum": 1 + }, + "value": 1 + }, + "type": "ia.input.numeric-entry-field" + }, + { + "meta": { + "name": "textFieldUnit" + }, + "position": { + "height": 0.0318, + "width": 0.1444, + "x": 0.1143, + "y": 0.4256 + }, + "props": { + "style": { + "textAlign": "right" + }, + "text": "un" + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "Label_22" + }, + "position": { + "height": 0.0318, + "width": 0.0975, + "x": 0.0222, + "y": 0.7102 + }, + "props": { + "text": "Current state" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"targetEventState\":\"1\"}\n\tsystem.perspective.sendMessage(\"measurementTab_setEventState\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_30" + }, + "position": { + "height": 0.0385, + "width": 0.0683, + "x": 0.115, + "y": 0.6 + }, + "props": { + "image": { + "height": 32, + "icon": { + "color": "#323232", + "path": "material/power_settings_new" + } + }, + "primary": false, + "text": "Set On" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"targetEventState\":\"0\"}\n\tsystem.perspective.sendMessage(\"measurementTab_setEventState\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_31" + }, + "position": { + "height": 0.0385, + "width": 0.0683, + "x": 0.189, + "y": 0.6 + }, + "props": { + "image": { + "icon": { + "color": "#000000", + "path": "material/not_interested" + } + }, + "primary": false, + "text": "Set Off" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_24" + }, + "position": { + "height": 0.0318, + "width": 0.0928, + "x": 0.022, + "y": 0.5628 + }, + "props": { + "text": "Alarm ID" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_23" + }, + "position": { + "height": 0.0318, + "width": 0.0975, + "x": 0.022, + "y": 0.6 + }, + "props": { + "text": "Signal state" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"targetState\":\"1\"}\n\tsystem.perspective.sendMessage(\"measurementTab_setState\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_33" + }, + "position": { + "height": 0.0385, + "width": 0.0454, + "x": 0.1145, + "y": 0.7094 + }, + "props": { + "image": { + "icon": { + "color": "#000000", + "path": "material/control_point" + } + }, + "primary": false, + "text": "Fault" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"targetState\":\"2\"}\n\tsystem.perspective.sendMessage(\"measurementTab_setState\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_34" + }, + "position": { + "height": 0.0385, + "width": 0.0454, + "x": 0.1635, + "y": 0.7094 + }, + "props": { + "image": { + "icon": { + "color": "#000000", + "path": "material/control_point" + } + }, + "primary": false, + "text": "Stop" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"targetState\":\"3\"}\n\tsystem.perspective.sendMessage(\"measurementTab_setState\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_35" + }, + "position": { + "height": 0.0385, + "width": 0.0459, + "x": 0.2126, + "y": 0.7094 + }, + "props": { + "image": { + "icon": { + "color": "#000000", + "path": "material/control_point" + } + }, + "primary": false, + "text": "Run" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "EmbeddedView" + }, + "position": { + "height": 0.7584, + "width": 0.7226, + "x": 0.2591, + "y": 0.0641 + }, + "propConfig": { + "props.params.last_message_index": { + "binding": { + "config": { + "path": "../rowOfLastMessageSent.props.value" + }, + "type": "property" + } + }, + "props.params.tabledata": { + "binding": { + "config": { + "path": "../tableSequence.props.data" + }, + "type": "property" + } + } + }, + "props": { + "path": "Main-Views/Commissioning Tool/SequenceTester", + "style": { + "borderStyle": "solid", + "borderWidth": "1px", + "box-shadow": "5px 5px 5px grey", + "marginBottom": 10, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 10, + "overflow": "visible" + } + }, + "type": "ia.display.view" + }, + { + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\tselectedRowValue\u003devent[\"value\"]\n\t#payload\u003d{\"Source\":selectedRowValue[\"Source\"]}\n\t#system.perspective.sendMessage(\"sourcesTab_selectSource\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "tableSequence", + "visible": false + }, + "position": { + "height": 0.5938, + "width": 0.6747, + "x": 0.3011, + "y": 0.2369 + }, + "propConfig": { + "props.selection.data": { + "onChange": { + "enabled": null, + "script": "\tsystem.perspective.sendMessage(\"tableSelectionData\", self.props.selection.data, \"page\")" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Seq", + "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": true, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 100 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "", + "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": "", + "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": "", + "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": "", + "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": "", + "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": "", + "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": "", + "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": "", + "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": "", + "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": "", + "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": "", + "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": "", + "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": "", + "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": "", + "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": "", + "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": "" + } + ], + "dragOrderable": false, + "items": [], + "pager": { + "initialOption": 1000 + }, + "resizeMode": "fixed", + "selection": { + "mode": "multiple interval" + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "update_selectionData", + "pageScope": true, + "script": "\tself.props.data\n\t\n\t# implement your handler here\n\tseq\u003d payload[\"index\"]\n\tstate \u003d payload[\"state\"]\n\tsystem.perspective.print(seq)\n\tsystem.perspective.print(state)\n\t\n\tself.props.data[seq][\"Selected\"] \u003d state\n", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "ClearSelection", + "pageScope": true, + "script": "\tsystem.perspective.print(\"clearSelection\")\n\tfor item in self.props.data:\n\t\titem[\"Selected\"] \u003d False", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "ClearAll", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.props.data \u003d []", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "SelectAll", + "pageScope": true, + "script": "\t# implement your handler here\n\t\n\tfor item in self.props.data:\n\t\titem[\"Selected\"] \u003d True", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.display.table" + }, + { + "meta": { + "name": "Label_20" + }, + "position": { + "height": 0.0318, + "width": 0.1251, + "x": 0.0185, + "y": 0.5318 + }, + "props": { + "text": "Events", + "textStyle": { + "fontSize": 12, + "fontStyle": "italic", + "fontWeight": "bolder", + "textDecoration": "underline" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_26" + }, + "position": { + "height": 0.0318, + "width": 0.0912, + "x": 0.0185, + "y": 0.3163 + }, + "props": { + "text": "Measurement Event", + "textStyle": { + "fontSize": 12, + "fontStyle": "italic", + "fontWeight": "bolder", + "textDecoration": "underline" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_27" + }, + "position": { + "height": 0.0318, + "width": 0.0912, + "x": 0.0185, + "y": 0.6356 + }, + "props": { + "text": "State Changed Event", + "textStyle": { + "fontSize": 12, + "fontStyle": "italic", + "fontWeight": "bolder", + "textDecoration": "underline" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_15" + }, + "position": { + "height": 0.0318, + "width": 0.0813, + "x": 0.0208, + "y": 0.208 + }, + "props": { + "text": "Offset ms" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_25" + }, + "position": { + "height": 0.0318, + "width": 0.0778, + "x": 0.0208, + "y": 0.1693 + }, + "props": { + "text": "Date and time" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_8" + }, + "position": { + "height": 0.0318, + "width": 0.0892, + "x": 0.0206, + "y": 0.2433 + }, + "props": { + "text": "Delay between Msg" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "textFieldEventsCommandParams_Timestamp", + "visible": false + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "117% 50%" + }, + "width": 0.109, + "x": 0.114, + "y": 0.1989 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "expression": "toStr(toMillis({../DateTimeInput_0.props.value}))" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "textAlign": "right" + } + }, + "type": "ia.input.text-field" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\ttimeNow\u003dsystem.date.now()\n\ttimestamp \u003d system.date.toMillis(timeNow)\n\t\n\tself.getSibling(\"DateTimeInput_0\").props.value \u003d timestamp\n\tself.getSibling(\"textFieldEventsCommandParams_Timestamp\").props.text \u003d timestamp\n\t\n\tMsg \u003d \"Setting time of messages to %s\"%timeNow\n\tpayload \u003d {\n\t\t\t\"Msg\":Msg\n\t}\n\t\n\tsystem.perspective.sendMessage(\"addFeedback\" , payload , \"page\")\n" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "buttonInit_1" + }, + "position": { + "height": 0.0318, + "width": 0.0292, + "x": 0.2262, + "y": 0.1675 + }, + "props": { + "image": { + "icon": { + "color": "#323232", + "path": "material/access_time" + } + }, + "primary": false, + "text": "" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "textFieldInterval" + }, + "position": { + "height": 0.0318, + "width": 0.1413, + "x": 0.1142, + "y": 0.2414 + }, + "props": { + "inputBounds": { + "minimum": 1 + }, + "value": 100 + }, + "type": "ia.input.numeric-entry-field" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.sendMessage(\"measurementTab_setTimestampInTable\")\n" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_22" + }, + "position": { + "height": 0.0385, + "width": 0.1413, + "x": 0.1143, + "y": 0.2798 + }, + "props": { + "image": { + "icon": { + "color": "#323232", + "path": "material/control_point" + } + }, + "primary": false, + "text": "Set Sequence Data" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "timestampOffset" + }, + "position": { + "height": 0.0318, + "width": 0.1408, + "x": 0.1143, + "y": 0.2061 + }, + "props": { + "inputBounds": { + "minimum": 1 + }, + "value": 1000 + }, + "type": "ia.input.numeric-entry-field" + }, + { + "meta": { + "name": "DateTimeInput_0" + }, + "position": { + "height": 0.0318, + "width": 0.109, + "x": 0.1128, + "y": 0.1674 + }, + "props": { + "format": "YYYY-MM-DD hh:mm:ss", + "formattedValue": "2023-08-29 12:18:17", + "value": 1693311497777 + }, + "type": "ia.input.date-time-input" + }, + { + "meta": { + "name": "Label_28" + }, + "position": { + "height": 0.0318, + "width": 0.0959, + "x": 0.0222, + "y": 0.6698 + }, + "props": { + "text": "Reason Code" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "dropdownReasonCode" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "50% 169%" + }, + "width": 0.1439, + "x": 0.1146, + "y": 0.6698 + }, + "propConfig": { + "props.options": { + "binding": { + "config": { + "path": ".../ContainerAlarms/tableAlarms.props.data" + }, + "transforms": [ + { + "code": "\toptions \u003d []\n\t\n\tfor item in value:\n\t\topt \u003d{\n\t\t\"label\": item[\"Name\"],\n\t\t\"value\": item[\"ID\"]\n\t\t}\n\t\toptions.append(opt)\n\treturn options", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "placeholder": { + "text": "Select Reason Code..." + }, + "showClearIcon": true, + "value": "2" + }, + "type": "ia.input.dropdown" + }, + { + "meta": { + "name": "eventID" + }, + "position": { + "height": 0.0318, + "width": 0.1444, + "x": 0.1135, + "y": 0.5624 + }, + "propConfig": { + "props.options": { + "binding": { + "config": { + "path": ".../ContainerAlarms/tableAlarms.props.data" + }, + "transforms": [ + { + "code": "\toptions \u003d []\n\t\t\n\tfor item in value:\n\t\topt \u003d{\n\t\t\"label\": item[\"ID\"],\n\t\t\"value\": item[\"ID\"]\n\t\t}\n\t\toptions.append(opt)\n\treturn options", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "placeholder": { + "text": "Select Alarm ID..." + }, + "value": "69" + }, + "type": "ia.input.dropdown" + }, + { + "meta": { + "name": "Label_29" + }, + "position": { + "height": 0.0318, + "width": 0.1, + "x": 0.0194, + "y": 0.7412 + }, + "props": { + "text": "Mode Changed Event", + "textStyle": { + "fontSize": 12, + "fontStyle": "italic", + "fontWeight": "bolder", + "textDecoration": "underline" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_30" + }, + "position": { + "height": 0.0318, + "width": 0.0975, + "x": 0.0225, + "y": 0.7737 + }, + "props": { + "text": "Current Mode" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"targetState\":\"0\"}\n\tsystem.perspective.sendMessage(\"measurementTab_setMode\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_36" + }, + "position": { + "height": 0.0385, + "width": 0.0454, + "x": 0.1141, + "y": 0.7729 + }, + "props": { + "image": { + "icon": { + "color": "#000000", + "path": "material/control_point" + } + }, + "primary": false, + "text": "Auto" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"targetState\":\"1\"}\n\tsystem.perspective.sendMessage(\"measurementTab_setMode\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_37" + }, + "position": { + "height": 0.0385, + "width": 0.0454, + "x": 0.1627, + "y": 0.7729 + }, + "props": { + "image": { + "height": 32, + "icon": { + "color": "#000000", + "path": "material/control_point" + } + }, + "primary": false, + "text": "Maint" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"targetState\":\"2\"}\n\tsystem.perspective.sendMessage(\"measurementTab_setMode\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_38" + }, + "position": { + "height": 0.0385, + "width": 0.0459, + "x": 0.2114, + "y": 0.7729 + }, + "props": { + "image": { + "icon": { + "color": "#000000", + "path": "material/control_point" + } + }, + "primary": false, + "text": "Man" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "EmbeddedView_0" + }, + "position": { + "height": 0.1482, + "width": 0.7226, + "x": 0.2592, + "y": 0.8335 + }, + "props": { + "path": "Main-Views/Commissioning Tool/UserFeedBack", + "style": { + "borderStyle": "solid", + "borderWidth": "1px", + "box-shadow": "5px 5px 5px grey", + "marginBottom": 10, + "marginLeft": 20, + "marginRight": 20, + "marginTop": 10, + "overflow": "auto" + } + }, + "type": "ia.display.view" + } + ], + "custom": { + "testingAlarmPriority1": "", + "testingAlarmPriority2": "", + "testingAlarmPriority3": "", + "testingAlarmPriority4": "" + }, + "meta": { + "name": "ContainerMeasurement" + }, + "position": { + "tabIndex": 2 + }, + "props": { + "mode": "percent" + }, + "type": "ia.container.coord" + }, + { + "children": [ + { + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\tselectedRowValue\u003devent[\"value\"]\n\tself.getSibling(\"textFieldEventID\").props.text \u003d selectedRowValue[\"ID\"]" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "tableAlarms" + }, + "position": { + "height": 0.8758, + "width": 0.7497, + "x": 0.2462, + "y": 0.0434 + }, + "props": { + "pager": { + "bottom": false, + "initialOption": 1000 + }, + "selection": { + "mode": "multiple interval" + } + }, + "type": "ia.display.table" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.sendMessage(\"utilsTab_changeSelectedPLC\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "dropdownTargetPLC" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "50% 169%" + }, + "width": 0.1382, + "x": 0.1042, + "y": 0.0515 + }, + "props": { + "options": [ + { + "label": "PLC01", + "value": "PLC01" + }, + { + "label": "PLC02", + "value": "PLC02" + }, + { + "label": "PLC03", + "value": "PLC03" + }, + { + "label": "PLC09", + "value": "PLC09" + } + ], + "showClearIcon": true, + "textAlign": "right", + "value": "PLC01" + }, + "type": "ia.input.dropdown" + }, + { + "meta": { + "name": "Label_11" + }, + "position": { + "height": 0.0318, + "width": 0.0975, + "x": 0.003, + "y": 0.0515 + }, + "props": { + "text": "Target PLC" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tsystem.perspective.sendMessage(\"utilsTab_init\")\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "buttonInit" + }, + "position": { + "height": 0.0318, + "width": 0.1366, + "x": 0.1045, + "y": 0.8535 + }, + "props": { + "image": { + "icon": { + "color": "#AAAAAA" + } + }, + "primary": false, + "text": "Reset" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onFileReceived": { + "config": { + "script": "\tpayload\u003d{\"fileContent\":event.file.getString(),\"fileExtension\":event.file.name.split(\".\")[1]}\n\tsystem.perspective.sendMessage(\"utilsTab_importFile\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "FileUpload_0" + }, + "position": { + "height": 0.0318, + "width": 0.1137, + "x": 0.0027, + "y": 0.0062 + }, + "props": { + "maxUploads": 1 + }, + "type": "ia.input.fileupload" + }, + { + "meta": { + "name": "dropdownCommandTarget" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "50% 169%" + }, + "width": 0.1382, + "x": 0.1042, + "y": 0.1175 + }, + "props": { + "options": [ + { + "label": "PLC01/10", + "value": "PLC01/10" + }, + { + "label": "PLC01/30", + "value": "PLC01/30" + }, + { + "label": "PLC01/40", + "value": "PLC01/40" + }, + { + "label": "PLC01/50", + "value": "PLC01/50" + }, + { + "label": "PLC01/60", + "value": "PLC01/60" + }, + { + "label": "PLC01/210", + "value": "PLC01/210" + }, + { + "label": "PLC01/220", + "value": "PLC01/220" + }, + { + "label": "PLC01/AIR", + "value": "PLC01/AIR" + }, + { + "label": "PLC01/P1", + "value": "PLC01/P1" + }, + { + "label": "PLC01/S01", + "value": "PLC01/S01" + }, + { + "label": "PLC01/State", + "value": "PLC01/State" + }, + { + "label": "PLC01/ZM1", + "value": "PLC01/ZM1" + }, + { + "label": "PLC01/ZM2", + "value": "PLC01/ZM2" + } + ], + "placeholder": { + "text": "Select Target..." + }, + "showClearIcon": true, + "textAlign": "right", + "value": "PLC01/30" + }, + "type": "ia.input.dropdown" + }, + { + "meta": { + "name": "textFieldEventState", + "visible": false + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "0% 37%" + }, + "width": 0.013, + "x": 0.2449, + "y": 0.6909 + }, + "props": { + "enabled": false, + "text": "0" + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "Label_8" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "75% 137%" + }, + "width": 0.097, + "x": 0.0036, + "y": 0.1175 + }, + "props": { + "text": "Command Target" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"command\":\"synchStatus\"}\n\tsystem.perspective.sendMessage(\"utilsTab_handleCommands\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_20" + }, + "position": { + "height": 0.0318, + "width": 0.0652, + "x": 0.1054, + "y": 0.4845 + }, + "props": { + "image": { + "icon": { + "color": "#AAAAAA" + } + }, + "primary": false, + "text": "Synch status" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"command\":\"synchAlarms\"}\n\tsystem.perspective.sendMessage(\"utilsTab_handleCommands\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_21" + }, + "position": { + "height": 0.0318, + "width": 0.0693, + "x": 0.1732, + "y": 0.4845 + }, + "props": { + "image": { + "icon": { + "color": "#AAAAAA" + } + }, + "primary": false, + "text": "Synch alarms" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"command\":\"restoreFromDisconnection\"}\n\tsystem.perspective.sendMessage(\"utilsTab_handleCommands\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_7" + }, + "position": { + "height": 0.0318, + "width": 0.0688, + "x": 0.1735, + "y": 0.4078 + }, + "props": { + "image": { + "icon": { + "color": "#AAAAAA" + } + }, + "primary": false, + "text": "Reconnect" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"command\":\"simulateDisconnection\"}\n\tsystem.perspective.sendMessage(\"utilsTab_handleCommands\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_6" + }, + "position": { + "height": 0.0318, + "width": 0.0662, + "x": 0.1046, + "y": 0.4078 + }, + "props": { + "image": { + "icon": { + "color": "#AAAAAA" + } + }, + "primary": false, + "text": "Disconnect" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "textFieldDisconnectionDuration" + }, + "position": { + "height": 0.0318, + "width": 0.1382, + "x": 0.1042, + "y": 0.3694 + }, + "props": { + "text": "5000" + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "Label_15" + }, + "position": { + "height": 0.0288, + "width": 0.1522, + "x": 0.5459, + "y": 0.0113 + }, + "props": { + "text": "Alarm list", + "textStyle": { + "fontWeight": "bolder", + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_13" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "75% 137%" + }, + "width": 0.097, + "x": 0.0036, + "y": 0.1541 + }, + "props": { + "text": "Command Code" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "textFieldCommandCode", + "visible": false + }, + "position": { + "height": 0.0298, + "width": 0.0141, + "x": 0.2438, + "y": 0.2227 + }, + "props": { + "enabled": false, + "text": "1" + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "Label_14" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "75% 137%" + }, + "width": 0.097, + "x": 0.0036, + "y": 0.1907 + }, + "props": { + "text": "Command Params" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "textFieldCommandParameters" + }, + "position": { + "height": 0.0318, + "width": 0.1382, + "x": 0.1042, + "y": 0.1907 + }, + "props": { + "enabled": false, + "style": { + "textAlign": "right" + } + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "Label_17" + }, + "position": { + "height": 0.0318, + "width": 0.097, + "x": 0.0036, + "y": 0.2638 + }, + "props": { + "text": "Timestamp" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "textFieldCommandTimestamp" + }, + "position": { + "height": 0.0318, + "width": 0.1011, + "x": 0.1042, + "y": 0.2638 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "expression": "toStr(toMillis({../dateTimeInputCommandTime.props.value}))" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "textAlign": "right" + } + }, + "type": "ia.input.text-field" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\ttimeNow\u003dsystem.date.now()\n\ttimestamp \u003d system.date.toMillis(timeNow)\n\tself.getSibling(\"textFieldCommandTimestamp\").props.text \u003d timestamp" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "buttonInit_2" + }, + "position": { + "height": 0.0318, + "width": 0.0328, + "x": 0.2085, + "y": 0.2638 + }, + "props": { + "image": { + "icon": { + "color": "#000000", + "path": "material/access_time" + } + }, + "primary": false, + "text": "" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "dateTimeInputCommandTime" + }, + "position": { + "height": 0.0318, + "width": 0.1382, + "x": 0.1042, + "y": 0.2273 + }, + "props": { + "format": "YYYY-MM-DD hh:mm:ss", + "formattedValue": "2022-12-23 04:14:00", + "value": { + "$": [ + "ts", + 0, + 1691659021617 + ], + "$ts": 1671812040000 + } + }, + "type": "ia.input.date-time-input" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload\u003d{\"command\":\"sendCommand\"}\n\tsystem.perspective.sendMessage(\"utilsTab_handleCommands\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_15" + }, + "position": { + "height": 0.0318, + "width": 0.1382, + "x": 0.1042, + "y": 0.3004 + }, + "props": { + "image": { + "icon": { + "color": "#AAAAAA" + } + }, + "primary": false, + "text": "Send command" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label_4" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "75% 137%" + }, + "width": 0.097, + "x": 0.0036, + "y": 0.9033 + }, + "props": { + "text": "Information" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "textAreaResult" + }, + "position": { + "height": 0.0616, + "width": 0.9619, + "x": 0.0039, + "y": 0.9324 + }, + "props": { + "enabled": false, + "text": "Init completed" + }, + "type": "ia.input.text-area" + }, + { + "meta": { + "name": "Label_19" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "75% 137%" + }, + "width": 0.0959, + "x": 0.004, + "y": 0.3694 + }, + "props": { + "text": "Disconnection duration" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_20" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "75% 137%" + }, + "width": 0.0959, + "x": 0.004, + "y": 0.4078 + }, + "props": { + "text": "Connection" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_21" + }, + "position": { + "height": 0.0318, + "rotate": { + "anchor": "75% 137%" + }, + "width": 0.0959, + "x": 0.004, + "y": 0.4845 + }, + "props": { + "text": "Sync" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_18" + }, + "position": { + "height": 0.0318, + "width": 0.1382, + "x": 0.1042, + "y": 0.0839 + }, + "props": { + "text": "Commands", + "textStyle": { + "fontWeight": "bolder", + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_22" + }, + "position": { + "height": 0.0318, + "width": 0.1382, + "x": 0.1042, + "y": 0.3328 + }, + "props": { + "text": "Comms Connection", + "textStyle": { + "fontWeight": "bolder", + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label_23" + }, + "position": { + "height": 0.0288, + "width": 0.1366, + "x": 0.1046, + "y": 0.4508 + }, + "props": { + "text": "Synchronisation", + "textStyle": { + "fontWeight": "bolder", + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown" + }, + "position": { + "height": 0.0318, + "width": 0.1382, + "x": 0.1042, + "y": 0.1541 + }, + "propConfig": { + "props.value": { + "onChange": { + "enabled": null, + "script": "\tself.getSibling(\"textFieldCommandCode\").props.text \u003d str(self.props.value)" + } + } + }, + "props": { + "options": [ + { + "label": "Start", + "value": 1 + }, + { + "label": "Stop", + "value": 2 + }, + { + "label": "Reset", + "value": 3 + }, + { + "label": "Get", + "value": 4 + }, + { + "label": "Set", + "value": 5 + }, + { + "label": "Enable", + "value": 6 + }, + { + "label": "Disable", + "value": 7 + } + ], + "placeholder": { + "text": "Select Command..." + }, + "textAlign": "right", + "value": 1 + }, + "type": "ia.input.dropdown" + }, + { + "meta": { + "name": "Label_25" + }, + "position": { + "height": 0.0318, + "width": 0.097, + "x": 0.0036, + "y": 0.2273 + }, + "props": { + "text": "Date and time" + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "ContainerUtils" + }, + "position": { + "tabIndex": 3 + }, + "props": { + "mode": "percent" + }, + "type": "ia.container.coord" + } + ], + "custom": { + "Admin": false, + "AdminTabs": [ + "Alarms", + "Sources", + "Sequence", + "Utils" + ], + "Default": [ + "Alarms", + "Sources", + "Sequence" + ] + }, + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tindex \u003d self.props.currentTabIndex\n\tif index \u003d\u003d 4:\n\t\tsystem.perspective.navigate(url \u003d \"https://w.amazon.com/bin/view/EURME/MAP/Projects/Amazon_SCADA/SCADA/Manual/CommissioningTools/\" , newTab \u003d True)\t\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "TabContainer" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "parent.custom.displayUpload" + }, + "transforms": [ + { + "expression": "!{value}", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.tabs": { + "binding": { + "config": { + "path": "this.custom.Admin" + }, + "transforms": [ + { + "code": "\t\n\tif value:\n\t\treturn self.custom.AdminTabs\n\telse:\n\t\treturn self.custom.Default", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "tabSize": { + "height": 40, + "width": 120 + } + }, + "type": "ia.container.tab" + }, + { + "children": [ + { + "meta": { + "name": "Header" + }, + "position": { + "basis": "75px" + }, + "props": { + "style": { + "opacity": "0.73", + "overflow": "auto", + "textShadow": "#AAAAAA 1px 2px 2px" + }, + "text": "Commissioning Tool", + "textStyle": { + "fontSize": 30, + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Header" + }, + "position": { + "basis": "32px" + }, + "props": { + "text": "Start From Fresh ?", + "textStyle": { + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Header" + }, + "position": { + "basis": "32px" + }, + "props": { + "text": "Upload Alarms.csv", + "textStyle": { + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onFileReceived": { + "config": { + "script": "\tpayload\u003d{\"fileContent\":event.file.getString(),\"fileName\":event.file.name}\n\tsystem.perspective.sendMessage(\"alarmsTab_importFile\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "FileUpload" + }, + "position": { + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#F2F3F4", + "borderStyle": "none", + "classes": "FadeInFast, background, background-none", + "cursor": "pointer", + "max-height": "400px", + "overflow": "visible" + }, + "supportedFileTypes": [ + "csv" + ] + }, + "type": "ia.input.fileupload" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "grow": 1 + }, + "props": { + "direction": "column", + "style": { + "margin": "10px", + "padding": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Header" + }, + "position": { + "basis": "32px" + }, + "props": { + "text": "Upload Sources.csv", + "textStyle": { + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onFileReceived": { + "config": { + "script": "\tpayload\u003d{\"fileContent\":event.file.getString(),\"fileName\":event.file.name}\n\tsystem.perspective.sendMessage(\"sourcesTab_importFile\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "FileUpload" + }, + "position": { + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#F2F3F4", + "borderStyle": "none", + "classes": "FadeInFast, background, background-none", + "cursor": "pointer", + "max-height": "400px", + "overflow": "visible" + }, + "supportedFileTypes": [ + "csv" + ] + }, + "type": "ia.input.fileupload" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "grow": 1 + }, + "props": { + "direction": "column", + "style": { + "margin": "10px", + "padding": "10px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "grow": 1 + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "grow": 1 + }, + "props": { + "direction": "column", + "style": { + "borderBottomLeftRadius": "2px", + "borderBottomRightRadius": "2px", + "borderColor": "#D4D4D4", + "borderStyle": "dotted", + "borderTopLeftRadius": "2px", + "borderTopRightRadius": "2px", + "borderWidth": "1px", + "margin": "25px", + "max-height": "500px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Header" + }, + "position": { + "basis": "32px" + }, + "props": { + "text": "Pick Up Where You Left Off ?", + "textStyle": { + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Header" + }, + "position": { + "basis": "32px" + }, + "props": { + "text": "Upload Alarms Export", + "textStyle": { + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onFileReceived": { + "config": { + "script": "\tpayload\u003d{\"fileContent\":event.file.getString(),\"fileName\":event.file.name}\n\tsystem.perspective.sendMessage(\"uploadBackup\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "FileUpload" + }, + "position": { + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#F2F3F4", + "borderStyle": "none", + "classes": "FadeInFast, background, background-none", + "cursor": "pointer", + "max-height": "400px", + "overflow": "visible" + }, + "supportedFileTypes": [ + "csv" + ] + }, + "type": "ia.input.fileupload" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "grow": 1 + }, + "props": { + "direction": "column", + "style": { + "margin": "10px", + "padding": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Header" + }, + "position": { + "basis": "32px" + }, + "props": { + "text": "Upload Sources Export", + "textStyle": { + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onFileReceived": { + "config": { + "script": "\tpayload\u003d{\"fileContent\":event.file.getString(),\"fileName\":event.file.name}\n\tsystem.perspective.sendMessage(\"uploadBackup\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "FileUpload" + }, + "position": { + "grow": 1 + }, + "props": { + "style": { + "backgroundColor": "#F2F3F4", + "borderStyle": "none", + "classes": "FadeInFast, background, background-none", + "cursor": "pointer", + "max-height": "400px", + "overflow": "visible" + }, + "supportedFileTypes": [ + "csv" + ] + }, + "type": "ia.input.fileupload" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "grow": 1 + }, + "props": { + "direction": "column", + "style": { + "margin": "10px", + "padding": "10px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "grow": 1 + }, + "props": { + "style": { + "max-height": "value" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "grow": 1 + }, + "props": { + "direction": "column", + "style": { + "borderBottomLeftRadius": "2px", + "borderBottomRightRadius": "2px", + "borderColor": "#D4D4D4", + "borderStyle": "dotted", + "borderTopLeftRadius": "2px", + "borderTopRightRadius": "2px", + "borderWidth": "1px", + "margin": "25px", + "max-height": "500px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "props": { + "style": { + "margin": "10px", + "padding": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Footer" + }, + "props": { + "style": { + "margin": "10px", + "max-height": "75px", + "overflow": "visible" + }, + "text": "Required Data ", + "textStyle": { + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "meta": { + "name": "AlarmsData" + }, + "position": { + "basis": "200px" + }, + "propConfig": { + "props.selected": { + "binding": { + "config": { + "path": "session.custom.alarms" + }, + "transforms": [ + { + "code": "\tif value :\n\t\treturn True\n\telse:\n\t\treturn False", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "enabled": false, + "text": "Alarms Data", + "textPosition": "left" + }, + "type": "ia.input.checkbox" + }, + { + "meta": { + "name": "SourceData" + }, + "position": { + "basis": "200px" + }, + "propConfig": { + "props.selected": { + "binding": { + "config": { + "path": "session.custom.sources" + }, + "transforms": [ + { + "code": "\tif value :\n\t\treturn True\n\telse:\n\t\treturn False", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "enabled": false, + "text": "Source Data", + "textPosition": "left" + }, + "type": "ia.input.checkbox" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "grow": 1 + }, + "props": { + "justify": "space-around", + "style": { + "margin": "10px", + "max-height": "75px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.session.custom.alarms \u003d []\n\tself.session.custom.sources \u003d []" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button_0" + }, + "position": { + "basis": "120px", + "grow": 1 + }, + "propConfig": { + "custom.Start": { + "binding": { + "config": { + "expression": "try(if(len({/root.custom.alarms})\u003e0 \u0026\u0026 len({/root.custom.sources})\u003e0, True,False),False)" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/delete_forever" + } + }, + "primary": false, + "style": { + "margin": "5px", + "max-width": "120px" + }, + "text": "Clear" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.view.getChild(\"root\").custom.displayUpload \u003d False" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "basis": "120px", + "grow": 1 + }, + "propConfig": { + "custom.Start": { + "binding": { + "config": { + "expression": "try(if(len({/root.custom.alarms})\u003e0 \u0026\u0026 len({/root.custom.sources})\u003e0, True,False),False)" + }, + "type": "expr" + } + }, + "props.enabled": { + "binding": { + "config": { + "path": "this.custom.Start" + }, + "transforms": [ + { + "code": "\treturn value", + "type": "script" + } + ], + "type": "property" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/play_circle_outline" + } + }, + "style": { + "margin": "5px", + "max-width": "120px" + }, + "text": "Start" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "grow": 1 + }, + "props": { + "justify": "flex-end", + "style": { + "margin": "20px", + "max-height": "75px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "basis": "200px" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "EmbeddedView" + }, + "position": { + "basis": "150px" + }, + "props": { + "path": "Main-Views/Commissioning Tool/UserFeedBack", + "style": { + "margin": "10px", + "overflow": "auto", + "padding": "10px" + } + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "parent.custom.displayUpload" + }, + "type": "property" + } + } + }, + "props": { + "direction": "column", + "style": { + "margin": "10px", + "padding": "5-x" + } + }, + "type": "ia.container.flex" + } + ], + "custom": { + "displayUpload": true + }, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\t\n\tif not self.session.custom.sources or not self.session.custom.alarms:\n\t\tself.custom.displayUpload \u003d True \n\telse:\n\t\tself.custom.displayUpload \u003d False\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "root" + }, + "position": { + "x": 0.0412, + "y": 0.001 + }, + "propConfig": { + "custom.alarms": { + "binding": { + "config": { + "path": "session.custom.alarms" + }, + "type": "property" + } + }, + "custom.sources": { + "binding": { + "config": { + "path": "session.custom.sources" + }, + "type": "property" + } + } + }, + "props": { + "direction": "column" + }, + "scripts": { + "customMethods": [ + { + "name": "sendConsoleMsg", + "params": [ + "Msg" + ], + "script": "\t# implement your method here\n\tpayload \u003d {\n\t\t\t\t\"Msg\":Msg\n\t\t\t}\n\tsystem.perspective.sendMessage(\"addFeedback\" , payload , \"page\")" + } + ], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "alarmsTab_init", + "pageScope": true, + "script": "\tresult\u003d \"Resetting Alarms Page ...\"\n\t\n\t\n\ttry:\n\t import sys\n\t targetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerAlarms\")\n\t #clearing all fields\n\t\n\t targetContainer.getChild(\"textFieldTargetPLC\").props.text \u003d \"\"\n\t targetContainer.getChild(\"dropdownEventsCommandParams_Target\").props.value \u003d None\n\t targetContainer.getChild(\"textFieldEventsCommandParams_EventID\").props.text \u003d \"\"\n\t targetContainer.getChild(\"textField_alarmPriority\").props.text \u003d \"\"\n\t targetContainer.getChild(\"DateTimeInput\").props.text \u003d \"\"\n\t targetContainer.getChild(\"textFieldEventsCommandParams_EventDescription\").props.text \u003d \"\"\n\t targetContainer.getChild(\"textFieldEventsCommandParams_Timestamp\").props.text\u003d \"\"\n\t \n\t targetContainer.getChild(\"tableAlarms\").props.data \u003d []\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)\n\n\tself.sendConsoleMsg(result)\n\n\n", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "setTimeNow", + "pageScope": true, + "script": "\timport sys\n\tresult\u003d\"Setting Time to current time\"\n\ttry:\n\t containerName \u003d payload[\"containerName\"]\n\t targetContainer \u003d self.getChild(\"TabContainer\").getChild(containerName)\n\t targetName\u003dpayload[\"targetName\"]\n\t timeNow\u003dsystem.date.now()\n\t timestamp \u003d system.date.toMillis(timeNow)\n\t targetContainer.getChild(targetName).props.value \u003d timeNow\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)\n\t \n\tself.sendConsoleMsg(result)", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "setEventState", + "pageScope": true, + "script": "\t\n\tresult \u003d \"Setting Event State on %s to %s\"%(payload[\"containerName\"] , payload[\"status\"] )\n\tstatus \u003d payload[\"status\"]\n\tcontainerName \u003d payload[\"containerName\"]\n\t\n\tself.getChild(\"TabContainer\").getChild(containerName).getChild(\"textFieldEventsCommandParams_Status\").props.text \u003d status\n\t\n\tself.sendConsoleMsg(result)", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "sendSimulationEvent", + "pageScope": true, + "script": "\n\t\n\tself.sendConsoleMsg(\"Sending an Event ...\")\n\t\n\tcontainerName \u003d payload[\"containerName\"]\n\ttargetContainer \u003d self.getChild(\"TabContainer\").getChild(containerName)\n\tsimulationEventStatus\u003dpayload[\"status\"]\n\tselectedTagProvider \u003d system.tag.getConfiguration()[0][\"path\"].toString()\n\twhid \u003dstr(system.tag.readBlocking([selectedTagProvider+\"Configuration/FC\"])[0].value)\n\ttimestamp \u003d targetContainer.getChild(\"textFieldEventsCommandParams_Timestamp\").props.text\n\ttargetContainer.getChild(\"textFieldEventsCommandParams_Timestamp\").props.text \u003d timestamp\n\t\n\tplc\u003dstr(targetContainer.getChild(\"textFieldTargetPLC\").props.text)\n\teventParameters_target\u003d\"\"\n\tif containerName\u003d\u003d\"ContainerSources\":\n\t eventParameters_target \u003d str(targetContainer.getChild(\"textField_SelectedTarget\").props.text)#review\n\telse:\n\t eventParameters_target \u003d str(targetContainer.getChild(\"dropdownEventsCommandParams_Target\").props.value)\n\tcommandTarget\u003dplc+\"/-1\"#-1 is used by E2C application to identify a simulation command\n\teventParameters_timestamp\u003dstr(targetContainer.getChild(\"textFieldEventsCommandParams_Timestamp\").props.text)\n\teventParameters_eventID\u003dstr(targetContainer.getChild(\"textFieldEventsCommandParams_EventID\").props.text)\n\teventParameters_status\u003dstr(simulationEventStatus)\n\teventParametersString\u003deventParameters_target+\",\"+eventParameters_timestamp+\",\"+eventParameters_eventID+\",\"+eventParameters_status\n\tcommandParams \u003d \"EVENTS,\"+eventParametersString\n\tactionCode \u003d 5 #SET\n\tparameters\u003d{}\n\tparameters[\"commandTarget\"] \u003d commandTarget\n\tparameters[\"commandCode\"] \u003d actionCode\n\tparameters[\"commandParams\"] \u003d commandParams\n\n\tself.sendConsoleMsg(\"Event Parameters : %s\"%str(parameters))\n\t\n\tresponse \u003d Commands.button_commands.send_request(whid,actionCode,parameters)\n\t\n\tself.sendConsoleMsg(response)\n", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "setTestResult", + "pageScope": true, + "script": "\timport sys\n\t\n\tcontainerName \u003d payload[\"containerName\"]\n\ttargetTable\u003d\"tableAlarms\"\n\tif containerName\u003d\u003d\"ContainerSources\":\n\t\ttargetTable\u003d\"tableSources\"\n\ttestResult\u003dpayload[\"testResult\"]\n\ttargetContainer \u003d self.getChild(\"TabContainer\").getChild(containerName)\n\t\n\tresult\u003d\"Setting test results for %s\"%targetTable\n\t\n\ttry:\n\t\ttargetAlarmIDLastTest\u003dtargetContainer.getChild(\"textFieldEventsCommandParams_EventID\").props.text\n\t\tcurrentDataJSON \u003d targetContainer.getChild(targetTable).props.data\n\t\tselectedRowsJSON\u003dtargetContainer.getChild(targetTable).props.selection.data\t\t\n\t\tfor indexSelectedRow in range(len(selectedRowsJSON)):\n\t\t\tcurrentSelectedRowDic\u003dselectedRowsJSON[indexSelectedRow]\n\t\t\trowNumber\u003dint(currentSelectedRowDic[\"Row\"])\n\t\t\tnewData\u003dcurrentDataJSON[rowNumber]\t\t\t\n\t\t\tcurrentDataJSON[rowNumber][\"Tested_date_UTC\"]\u003dsystem.date.format(system.date.now(),\"YYYY-MM-DD HH:mm:ss\")\n\t\t\tcurrentDataJSON[rowNumber][\"Result\"]\u003dtestResult\n\texcept:\n\t\texc_type, exc_obj, tb \u003d sys.exc_info()\n\t\tlineno \u003d tb.tb_lineno\n\t\terrorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t\tself.sendConsoleMsg(errorMessage)\n\t\n\tself.sendConsoleMsg(result)", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "exportFile", + "pageScope": true, + "script": "\timport sys\n\t\n\tcontainerName\u003dpayload[\"containerName\"]\n\ttargetTable\u003dpayload[\"targetTable\"]\n\ttargetContainer \u003d self.getChild(\"TabContainer\").getChild(containerName)\n\tselectedTagProvider \u003d system.tag.getConfiguration()[0][\"path\"].toString()\n\twhid \u003dstr(system.tag.readBlocking([selectedTagProvider+\"Configuration/FC\"])[0].value)\n\t\n\tfilePrefix\u003d\"Alarms_Testing_\"\n\tif targetTable\u003d\u003d\"tableSources\":\n\t filePrefix\u003d\"Sources_Testing_\"\n\t\n\ttry:\n\t columns \u003d targetContainer.getChild(targetTable).props.columns\n\t headers\u003d[]\n\t for column in columns:\n\t headers.append(column.field)\n\t rows \u003d targetContainer.getChild(targetTable).props.data\n\t data\u003d[]\n\t for row in rows:\n\t rowContent\u003d[]\n\t for column in columns:\n\t rowContent.append(row[column.field])\n\t data.append(rowContent)\n\t\n\t ds\u003dsystem.dataset.toDataSet(headers, data)\n\t Excel_xlsx \u003d system.dataset.toCSV(ds,True)\n\t fileName\u003dfilePrefix+whid\n\t fileName\u003dfileName+\"_\"+str(targetContainer.getChild(\"textFieldTargetPLC\").props.text)\n\t fileName\u003dfileName+\"_\"+system.date.format(system.date.now(),\u0027yyyyMMddHHmmss\u0027)+\".csv\"\n\t \n\t system.perspective.download(fileName,Excel_xlsx)\n\t \n\t result\u003d\"Exporting %s\"%fileName\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)\n\t\n\tself.sendConsoleMsg(result)", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "alarmsTab_importFile", + "pageScope": true, + "script": "\timport sys\n\ttargetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerAlarms\")\n\theaders \u003d [\"Row\",\"ID\",\"Name\",\"Priority\",\"Type\",\"Tested date\",\"Result\",\"Notes\" ]\n\trows\u003d[]\n\ttableContent\u003d[]\n\tresult\u003d\"Importing file: %s \"%payload[\"fileName\"]\n\t\n\tself.sendConsoleMsg(result)\n\t\t\n\ttry:\n\t rowNumber\u003d0\n\t fileContent \u003d payload[\"fileContent\"]\n\t fileName\u003dpayload[\"fileName\"]\n\t \n\t fileExtension \u003d fileName.split(\".\")[1]\n\t if fileName!\u003d\"alarms.csv\":\n\t result+\u003d\"Invalid file name. Please select alarms.csv file\"\n\t targetContainer.getChild(\"textAreaResult\").props.text \u003d str(result)\n\t return\n\t\n\t tableContent\u003d[]\n\t rowsValues\u003d[]\n\t rowsValues \u003d fileContent.splitlines()\n\t for indexRow in range(1,len(rowsValues)):\n\t Row\u003drowNumber\n\t rowFields \u003d rowsValues[indexRow].replace(\"\\\"\",\"\").split(\",\")\n\t ID\u003drowFields[0]\n\t Name\u003drowFields[1]\n\t Priority\u003d\"Invalid\"\n\t\n\t if int(rowFields[2])\u003d\u003d1:\n\t Priority\u003d\"Diagnostic\"\n\t if int(rowFields[2])\u003d\u003d2:\n\t Priority\u003d\"Low\"\n\t if int(rowFields[2])\u003d\u003d3:\n\t Priority\u003d\"Medium\"\n\t if int(rowFields[2])\u003d\u003d4:\n\t Priority\u003d\"High\"\n\t Type\u003d\"Default\"\n\t if rowFields[3]\u003d\u003d\"1\":\n\t Type\u003d\"Critical\"\n\t TestedDate\u003d\"\"\n\t TestedResult\u003d\"\"\n\t Notes\u003d\"\"\n\t rowContent\u003d{}\n\t rowContent[\"Row\"]\u003drowNumber\n\t rowContent[\"ID\"]\u003dID\n\t rowContent[\"Name\"]\u003dName\n\t rowContent[\"Priority\"]\u003dPriority\n\t rowContent[\"Type\"]\u003dType\n\t rowContent[\"Tested_date_UTC\"]\u003d\"\"\n\t rowContent[\"Result\"]\u003d\"\"\n\t rowContent[\"Notes\"]\u003d\"\"\n\t tableContent.append(rowContent)\n\t rowNumber+\u003d1\n\n\t self.session.custom.alarms \u003d tableContent\n\t\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)\n\t\n\tresult \u003d \"File imported succesfully\" \t\n\tself.sendConsoleMsg(result)", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "sourcesTab_importFile", + "pageScope": true, + "script": "\timport sys\n\ttargetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerSources\")\n\tresult\u003d\"\"\n\ttableContent\u003d[]\n\ttry:\n\t rowNumber\u003d0\n\t fileContent \u003d payload[\"fileContent\"]\n\t fileName\u003dpayload[\"fileName\"]\n\t \n\t result\u003d\"Importing file: %s \"%payload[\"fileName\"]\n\t \t\n\t self.sendConsoleMsg(result)\n\t fileExtension \u003d fileName.split(\".\")[1]\n\t\n\t\n\t if fileName!\u003d\"sources.csv\":\n\t result \u003d\"Invalid file name. Please select sources.csv file\"\n\t self.sendConsoleMsg(result)\n\t return\n\t\n\t rowsValues\u003d[]\n\t rowsValues \u003d fileContent.splitlines()\n\t tagProviderSourcesList\u003d[]\n\t for indexRow in range(1,len(rowsValues)):\n\t rowFields \u003d rowsValues[indexRow].replace(\"\\\"\",\"\").split(\",\")\n\t rowContent\u003d{}\n\t rowContent[\"Row\"]\u003drowNumber\n\t rowContent[\"ID\"]\u003drowFields[0]\n\t rowContent[\"Source\"]\u003drowFields[1]\n\t rowContent[\"Tested_date_UTC\"]\u003d\"\"\n\t rowContent[\"Result\"]\u003d\"\"\n\t rowContent[\"Notes\"]\u003d\"\"\n\t tableContent.append(rowContent)\n\t tagProviderSourcesList.append(rowFields[1])\n\t rowNumber+\u003d1\n\t self.session.custom.sources \u003d tableContent\n\t\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)\n\t \t\n\tresult \u003d \"File imported succesfully\" \t\n\tself.sendConsoleMsg(result)", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "sourcesTab_init", + "pageScope": true, + "script": "\tresult\u003d \"Resetting Sources Page ...\"\n\ttry:\n\t import sys\n\t targetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerSources\")\n\t #clearing all fields\n\t targetContainer.getChild(\"textFieldTargetPLC\").props.text \u003d \"\"\n\t targetContainer.getChild(\"textField_SelectedTarget\").props.text \u003d \"\"\n\t targetContainer.getChild(\"textFieldEventsCommandParams_EventID\").props.text \u003d \"\"\n\t targetContainer.getChild(\"textField_alarmPriority\").props.text \u003d \"\"\n\t targetContainer.getChild(\"DateTimeInput\").props.text \u003d \"\"\n\t targetContainer.getChild(\"textFieldEventsCommandParams_EventDescription\").props.text \u003d \"\"\n\t targetContainer.getChild(\"textFieldEventsCommandParams_Timestamp\").props.text\u003d \"\"\n\t targetContainer.getChild(\"StatusIcon\").props.params.tagProps[0]\u003d\"\"\n\t #Creating source table\n\t targetContainer.getChild(\"tableSources\").props.data \u003d []\n\t targetContainer.custom.testingAlarmPriority1 \u003d \u0027\u0027\n\t targetContainer.custom.testingAlarmPriority2 \u003d \u0027\u0027\n\t targetContainer.custom.testingAlarmPriority3 \u003d \u0027\u0027\n\t targetContainer.custom.testingAlarmPriority4 \u003d \u0027\u0027\n\t result+\u003d\"Init completed\"\n\t\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)\n\t \n\tself.sendConsoleMsg(result)", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "alarmsTab_selectAlarm", + "pageScope": true, + "script": "\t\n\t\n\ttargetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerAlarms\")\n\ttargetContainer.getChild(\"textFieldEventsCommandParams_EventID\").props.text \u003d payload[\"ID\"]\n\ttargetContainer.getChild(\"textFieldEventsCommandParams_EventDescription\").props.text \u003d payload[\"Name\"]\n\ttargetContainer.getChild(\"textField_alarmPriority\").props.text\u003dpayload[\"Priority\"]\n\t\n\n\t\n\tself.sendConsoleMsg(\"Setting Alarm ID, Description \u0026 Priority \")", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "sourcesTab_selectSource", + "pageScope": true, + "script": "\ttargetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerSources\")\n\tself.getChild(\"TabContainer\").getChild(\"ContainerSources\").getChild(\"textField_SelectedTarget\").props.text \u003d payload[\"Source\"]\n\ttargetContainer.getChild(\"StatusIcon\").props.params.tagProps[0]\u003dpayload[\"Source\"]\n\t\n\tself.sendConsoleMsg(\"Setting Source ID\")", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "sourcesTab_setAlarm", + "pageScope": true, + "script": "\t# implement your handler here\n\ttargetAlarm\u003dpayload[\"alarm\"]\n\ttargetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerSources\")\n\ttargetContainer.getChild(\"textField_alarmPriority\").props.text\u003dtargetAlarm[\"priority\"]\n\ttargetContainer.getChild(\"textFieldEventsCommandParams_EventID\").props.text \u003d targetAlarm[\"id\"]\n\ttargetContainer.getChild(\"textFieldEventsCommandParams_EventDescription\").props.text\u003dtargetAlarm[\"message\"]\n\t\n\tself.sendConsoleMsg(\"Setting Alarm ID, Description \u0026 Priority \")", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "measurementTab_init", + "pageScope": true, + "script": "\timport sys\n\ttry:\n\t\tresult\u003d\"Restting Sequence Page \"\n\t\tself.sendConsoleMsg(result)\n\t\t\n\t\ttargetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerMeasurement\")\n\t\tselectedTagProvider \u003d system.tag.getConfiguration()[0][\"path\"].toString()\n\t\t#Check if is a valid SCADA 2.0 Tag provider\n\t\t#Filling up the dropdown with the list of the PLCs\n\t\ttagProvidersPLCs \u003d system.tag.browse(path \u003dselectedTagProvider , filter \u003d {})\n\t\ttagProviderPLCsList\u003d[]\n\t\tfor tagProvidersPLC in tagProvidersPLCs.getResults():\n\t\t fullPath\u003dstr(tagProvidersPLC[\u0027fullPath\u0027]).replace(selectedTagProvider,\"\")\n\t\t if \"System\" not in fullPath and \"Config\" not in fullPath and \"_types\" not in fullPath:\n\t\t entry\u003d{}\n\t\t entry[\u0027value\u0027] \u003d fullPath\n\t\t entry[\u0027label\u0027] \u003d fullPath\n\t\t tagProviderPLCsList.append(entry)\n\t\ttargetContainer.getChild(\"dropdownTargetPLC\").props.options \u003d tagProviderPLCsList\n\t\tselectedValue \u003d tagProviderPLCsList[0][\"label\"]\n\t\ttargetContainer.getChild(\"dropdownTargetPLC\").props.value \u003d selectedValue\n\t\t#Filling up the dropdown with the list of the sources\n\t\ttagProvidersSources \u003d system.tag.browse(path \u003dselectedTagProvider+\"/\"+selectedValue , filter \u003d {})\n\t\ttagProviderSourcesList\u003d[]\n\t\tfor tagProvidersSource in tagProvidersSources.getResults():\n\t\t fullPath\u003dstr(tagProvidersSource[\u0027fullPath\u0027]).replace(selectedTagProvider,\"\")\n\t\t if \"System\" not in fullPath and \"Config\" not in fullPath and \"_types\" not in fullPath:\n\t\t entry\u003d{}\n\t\t entry[\u0027value\u0027] \u003d fullPath\n\t\t entry[\u0027label\u0027] \u003d fullPath\n\t\t tagProviderSourcesList.append(entry)\n\t\ttargetContainer.getChild(\"dropdownEventsCommandParams_Target\").props.options \u003d tagProviderSourcesList\n\t\n\t\n\t\ttargetContainer.getChild(\"tableSequence\").props.data \u003d []\n\t\ttargetContainer.custom.testingAlarmPriority1 \u003d \u0027\u0027\n\t\ttargetContainer.custom.testingAlarmPriority2 \u003d \u0027\u0027\n\t\ttargetContainer.custom.testingAlarmPriority3 \u003d \u0027\u0027\n\t\ttargetContainer.custom.testingAlarmPriority4 \u003d \u0027\u0027\n\t\tresult \u003d\"Init completed\"\n\t\t\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t \n\t self.sendConsoleMsg(errorMessage)\n\tself.sendConsoleMsg(result)", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "measurementTab_importFile", + "pageScope": true, + "script": "\timport sys\n\tfrom collections import OrderedDict\n\ttargetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerMeasurement\")\n\ttry:\n\t result\u003d\"Importing file Sequence Backup ... \"\n\t\n\t self.sendConsoleMsg(result)\n\t rowNumber\u003d0\n\t result\u003d\"\"\n\t fileContent \u003d payload[\"fileContent\"]\n\t fileExtension\u003dpayload[\"fileExtension\"]\n\t if fileExtension\u003d\u003d\"csv\":\n\t self.sendConsoleMsg(\"File has correct extension . Importing ...\") \n\t rowsValues\u003d[]\n\t rowsValues \u003d fileContent.splitlines()\n\t tableContent\u003d[]\n\t for indexRow in range(1,len(rowsValues)):\n\t \n\t rowFields \u003d rowsValues[indexRow].replace(\"\\\"\",\"\").split(\",\")\n\t system.perspective.print(rowFields)\n\t messageType\u003drowFields[6]\n\t rowContent \u003d OrderedDict(\n\t [\n\t (\"Seq\",str(rowFields[13])),\n\t (\"Type\", messageType),\n\t (\"When\",rowFields[7]),\n\t (\"Source\", rowFields[5]),\n\t (\"CurrentState\",\"\"),\n\t (\"ReasonCode\", \"\"),\n\t (\"CurrentMode\", \"\"),\n\t (\"EventID\", \"\"),\n\t (\"EventState\", \"\"),\n\t (\"MeasurementName\",\"\"),\n\t (\"SamplingInterval\",\"\"),\n\t (\"Unit\",\"\"),\n\t (\"DeltaValue\",\"\"),\n\t (\"Selected\", \"\")\n\t ]\n\t )\n\t if messageType\u003d\u003d\"StateChanged\":\n\t rowContent[\"CurrentState\"]\u003drowFields[8]\n\t rowContent[\"ReasonCode\"]\u003drowFields[4]\n\t if messageType\u003d\u003d\"ModeChanged\":\n\t rowContent[\"CurrentMode\"]\u003drowFields[0]\n\t if messageType\u003d\u003d\"Event\":\n\t rowContent[\"EventID\"]\u003drowFields[9]\n\t rowContent[\"EventState\"]\u003d rowFields[1]\n\t if messageType\u003d\u003d\"MeasurementEvent\":\n\t rowContent[\"MeasurementName\"]\u003drowFields[10]\n\t rowContent[\"SamplingInterval\"]\u003drowFields[2]\n\t rowContent[\"Unit\"]\u003drowFields[3]\n\t rowContent[\"DeltaValue\"]\u003d rowFields[11]\n\t tableContent.append(rowContent)\n\t \ttargetContainer.getChild(\"tableSequence\").props.data \u003d tableContent\n\t else:\n\t \tresult\u003d\"Importing file must be a CSV file not a %s\"%(fileExtension) \n\t \t\n\t \tself.sendConsoleMsg(result)\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)\n\tself.sendConsoleMsg(\"Sequence Import Sucessful\")", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "measurementTab_sendEvent", + "pageScope": true, + "script": "\t# implement your handler here\n\timport time\n\ttargetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerMeasurement\")\n\tselectedTagProvider \u003d system.tag.getConfiguration()[0][\"path\"].toString()\n\twhid \u003d str(system.tag.readBlocking([selectedTagProvider+\"Configuration/FC\"])[0].value)\n\tcommandTarget\u003d str(targetContainer.getChild(\"dropdownTargetPLC\").props.value)+\"/SPRK\"\n\tinterval \u003d targetContainer.getChild(\"textFieldInterval\").props.value\n\t\n\tselectedRows \u003d targetContainer.getChild(\"tableSequence\").props.data\n\tresult\u003d\"\"\n\ttry:\n\t\tactionCode \u003d 5 #SET\n\t\tfor selectedRow in selectedRows:\n\t\t eventType\u003dselectedRow[\"Type\"]\n\t\t timestamp \u003d selectedRow[\"When\"]\n\t\t source \u003d selectedRow[\"Source\"]\n\t\t indexSeletectedRow\u003dint(selectedRow[\"Seq\"])\n\t\t targetContainer.getChild(\"tableSequence\").props.selection.selectedRow \u003d indexSeletectedRow\n\t\t targetContainer.getChild(\"rowOfLastMessageSent\").props.value \u003d indexSeletectedRow\n\t\t if eventType\u003d\u003d\"StateChanged\":\n\t\t currentState \u003d selectedRow[\"CurrentState\"]\n\t\t reasonCode \u003d selectedRow[\"ReasonCode\"]\n\t\t eventParametersString\u003dstr(source)+\",\"+str(currentState)+\",\"+str(reasonCode)+\",\"+str(timestamp)\n\t\t commandParams \u003d \"STATE,\"+eventParametersString\n\t\t if eventType\u003d\u003d\"ModeChanged\":\n\t\t currentMode \u003d selectedRow[\"CurrentMode\"]\n\t\t eventParametersString\u003dstr(source)+\",\"+str(currentMode)+\",\"+str(timestamp)\n\t\t commandParams \u003d \"MODE,\"+eventParametersString\n\t\t if eventType\u003d\u003d\"Event\":\n\t\t eventID \u003d selectedRow[\"EventID\"]\n\t\t eventState \u003d selectedRow[\"EventState\"]\n\t\t eventParametersString\u003dstr(source)+\",\"+str(timestamp)+\",\"+str(eventID)+\",\"+str(eventState)\n\t\t commandParams \u003d \"EVENTS,\"+eventParametersString\n\t\t if eventType\u003d\u003d\"MeasurementEvent\":\n\t\t measurementName \u003d selectedRow[\"MeasurementName\"]\n\t\t samplingInterval \u003d selectedRow[\"SamplingInterval\"]\n\t\t unit \u003d selectedRow[\"Unit\"]\n\t\t deltaValue \u003d selectedRow[\"DeltaValue\"]\n\t\t eventParametersString\u003dstr(source)+\",\"+str(measurementName)+\",\"+str(samplingInterval)+\",\"+str(unit)+\",\"+str(deltaValue)+\",\"+str(timestamp)\n\t\t commandParams \u003d \"MEASUREMENT,\"+eventParametersString\n\t\t parameters\u003d{}\n\t\t parameters[\"commandTarget\"] \u003d commandTarget\n\t\t parameters[\"commandCode\"] \u003d actionCode\n\t\t parameters[\"commandParams\"] \u003d commandParams\n\t\t\n\t\t self.sendConsoleMsg(\"UI : sending command to whid\u003d\"+whid+\",actionCode\"+str(actionCode)+\",parameters\u003d\"+str(parameters))\n\t\t response \u003d Commands.button_commands.send_request(whid,actionCode,parameters)\n\t\t self.sendConsoleMsg(response)\n\t\t time.sleep(interval)\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "measurementTab_exportFile", + "pageScope": true, + "script": "\timport sys\n\ttargetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerMeasurement\")\n\tresult\u003d\"\"\n\tresult\u003d\"Exporting Sequence data \"\n\tself.sendConsoleMsg(result)\n\ttry:\n\t fileContent\u003dNone\n\t arrayElements \u003d targetContainer.getChild(\"tableSequence\").props.data\n\t selectedTagProvider \u003d system.tag.getConfiguration()[0][\"path\"].toString()\n\t whid \u003d str(system.tag.readBlocking([selectedTagProvider+\"Configuration/FC\"])[0].value)\n\t fileName\u003d\"Sequence_Testing_\"+whid+\"_\"+str(targetContainer.getChild(\"dropdownTargetPLC\").props.value)+\"_\"+system.date.format(system.date.now(),\u0027yyyyMMddHHmmss\u0027)\n\t \n\t fileName+\u003d\".csv\"\n\t headers\u003d[]\n\t rows\u003d[]\n\t for element in arrayElements:\n\t keys\u003delement.keys()\n\t if len(headers)\u003d\u003d0:\n\t headers\u003dkeys\n\t row\u003d[]\n\t for key in keys:\n\t row.append(element[key])\n\t rows.append(row)\n\t\n\t ds \u003d system.dataset.toDataSet(headers,rows)\n\t fileContent \u003d system.dataset.toCSV(ds)\n\t system.perspective.download(fileName,fileContent)\n\t\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)\n\t return\n\t \n\tresult\u003d\"Export Succesful \"\n\tself.sendConsoleMsg(result)", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "measurementTab_addRow", + "pageScope": true, + "script": "\tsystem.perspective.print(\"Add Row ...\")\n\timport sys\n\tfrom collections import OrderedDict\n\ttypeElement \u003d payload[\"messageType\"]\n\ttargetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerMeasurement\")\n\tresult\u003d\"Adding a \"\n\t\n\ttry:\n\t tableElements \u003d targetContainer.getChild(\"tableSequence\").props.data\n\t result \u003d str(type(tableElements))\n\t rowIndex\u003d0\n\t if tableElements is None:\n\t tableElements\u003d[]\n\t else:\n\t rowIndex \u003d len(tableElements)\n\t\n\t newElement \u003d OrderedDict(\n\t [\n\t (\"Seq\",str(rowIndex)),\n\t (\"Type\", typeElement),\n\t (\"When\",targetContainer.getChild(\"textFieldEventsCommandParams_Timestamp\").props.text),\n\t (\"Source\", targetContainer.getChild(\"dropdownEventsCommandParams_Target\").props.value),\n\t (\"CurrentState\",\"\"),\n\t (\"ReasonCode\", \"\"),\n\t (\"CurrentMode\", \"\"),\n\t (\"EventID\", \"\"),\n\t (\"EventState\", \"\"),\n\t (\"MeasurementName\",\"\"),\n\t (\"SamplingInterval\",\"\"),\n\t (\"Unit\",\"\"),\n\t (\"DeltaValue\",\"\"),\n\t (\"Selected\",False)\n\t ]\n\t )\n\t \n\t \n\t result\u003d\"Adding a %s \"%typeElement\n\t self.sendConsoleMsg(result)\n\t \n\t tableElements.append(newElement)\n\t targetContainer.getChild(\"tableSequence\").props.data\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)\n\n", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "measurementTab_deleteRows", + "pageScope": true, + "script": "\timport sys\n\ttry:\n\t \n\t targetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerMeasurement\")\n\t result\u003d\"\"\n\t oldArray \u003d targetContainer.getChild(\"tableSequence\").props.data\n\t selectedRows \u003d [payload[\"index\"]]\n\t \n\t result \u003d \"Removing row %s\"%selectedRows\n\t self.sendConsoleMsg(result)\n\t newArray\u003d[]\n\t rowIndexesToBeDeleted\u003d[]\n\t for selectedRow in selectedRows:\n\t rowIndexesToBeDeleted.append(int(selectedRow))\n\t newRowIndex\u003d0\n\t for element in oldArray:\n\t rowIndex\u003dint(element[\"Seq\"])\n\t if not (rowIndex in rowIndexesToBeDeleted):\n\t newElement\u003d dict(element)\n\t newElement[\"Seq\"]\u003dstr(newRowIndex)\n\t newRowIndex+\u003d1\n\t newArray.append(newElement)\n\t targetContainer.getChild(\"tableSequence\").props.data \u003d newArray\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)\n", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "measurementTab_setTimestampInTable", + "pageScope": true, + "script": "\timport sys\n\tresult\u003d\"Setting TimeStamp \u0026 Source ID for all items in sequence ...\"\n\tself.sendConsoleMsg(result)\n\t\n\ttry:\n\t targetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerMeasurement\")\n\t timestampOffset \u003d targetContainer.getChild(\"timestampOffset\").props.value * 1000\n\t currentTimestamp \u003d long(targetContainer.getChild(\"textFieldEventsCommandParams_Timestamp\").props.text)\n\t commandTarget \u003d targetContainer.getChild(\"dropdownEventsCommandParams_Target\").props.value\n\t tableData \u003d targetContainer.getChild(\"tableSequence\").props.data\n\t newArray\u003d[]\n\t for element in tableData:\n\t newElement\u003d dict(element)\n\t if element[\"Selected\"]:\n\t newElement[\"When\"]\u003dstr(currentTimestamp)\n\t newElement[\"Source\"]\u003dcommandTarget\n\t currentTimestamp+\u003dtimestampOffset\n\t \n\t newArray.append(newElement)\n\t targetContainer.getChild(\"tableSequence\").props.data \u003d newArray\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)\n", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "measurementTab_setState", + "pageScope": true, + "script": "\timport sys\n\tresult\u003d\"Setting State and ReasonCode\"\n\tself.sendConsoleMsg(result)\n\tSTATE_TYPE \u003d \"StateChanged\"\n\ttargetState\u003dpayload[\"targetState\"]\n\ttry:\n\t targetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerMeasurement\")\n\t tableData \u003d targetContainer.getChild(\"tableSequence\").props.data\n\t selectedRows \u003d targetContainer.getChild(\"tableSequence\").props.selection.data\n\t reasonCode \u003d targetContainer.getChild(\"dropdownReasonCode\").props.value\n\t newArray\u003d[]\n\t for element in tableData:\n\t newElement\u003d dict(element)\n\t if element[\"Selected\"] and element[\"Type\"] \u003d\u003d STATE_TYPE :\n\t newElement[\"CurrentState\"]\u003dtargetState\n\t newElement[\"ReasonCode\"]\u003d str(reasonCode)\n\t newArray.append(newElement)\n\t targetContainer.getChild(\"tableSequence\").props.data \u003d newArray\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "measurementTab_setMeasurementInTable", + "pageScope": true, + "script": "\timport sys\n\tresult\u003d\"Setting Mesurement Name , Sample Interval , Unit \u0026 Delta Values\"\n\tself.sendConsoleMsg(result)\n\tMEASUREMENT_EVENT\u003d \"MeasurementEvent\"\n\ttry:\n\t targetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerMeasurement\")\n\t tableData \u003d targetContainer.getChild(\"tableSequence\").props.data\n\t newArray\u003d[]\n\t measurementName \u003d targetContainer.getChild(\"dropdownMeasurementName\").props.value\n\t delta \u003d targetContainer.getChild(\"delta\").props.value\n\t sampling \u003d targetContainer.getChild(\"sampling\").props.value\n\t unit \u003d targetContainer.getChild(\"textFieldUnit\").props.text\n\t for element in tableData:\n\t newElement\u003d dict(element)\n\t if element[\"Selected\"] and element[\"Type\"] \u003d\u003d MEASUREMENT_EVENT:\n\t newElement[\"MeasurementName\"]\u003dmeasurementName\n\t newElement[\"SamplingInterval\"]\u003dstr(sampling)\n\t newElement[\"Unit\"]\u003dunit\n\t newElement[\"DeltaValue\"]\u003dstr(delta)\n\t newArray.append(newElement)\n\t targetContainer.getChild(\"tableSequence\").props.data \u003d newArray\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)\n\t", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "measurementTab_setEventState", + "pageScope": true, + "script": "\timport sys\n\tresult\u003d\"Setting Event ID \u0026 Event State\"\n\tself.sendConsoleMsg(result)\n\ttargetEventState\u003dpayload[\"targetEventState\"]\n\tEVENT_TYPE \u003d \"Event\"\n\ttry:\n\t targetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerMeasurement\")\n\t tableData \u003d targetContainer.getChild(\"tableSequence\").props.data\n\t eventID \u003d targetContainer.getChild(\"eventID\").props.value\n\t newArray\u003d[]\n\t for element in tableData:\n\t newElement\u003d dict(element)\n\t if element[\"Selected\"] and element[\"Type\"] \u003d\u003d EVENT_TYPE:\n\t newElement[\"EventID\"]\u003deventID\n\t newElement[\"EventState\"]\u003dtargetEventState\n\t newArray.append(newElement)\n\t targetContainer.getChild(\"tableSequence\").props.data \u003d newArray\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "utilsTab_handleCommands", + "pageScope": true, + "script": "\timport sys\n\tresult\u003d\"\"\n\ttry:\n\t targetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerUtils\")\n\t command \u003d payload[\"command\"]\n\t selectedTagProvider \u003d system.tag.getConfiguration()[0][\"path\"].toString()\n\t whid \u003dstr(system.tag.readBlocking([selectedTagProvider+\"Configuration/FC\"])[0].value)\n\t\n\t PLC\u003dtargetContainer.getChild(\"dropdownTargetPLC\").props.value\n\t targetSimulation \u003d PLC+\"/-1\"#-1 is used by E2C application to identify a simulation command\n\t commandTarget\u003dtargetContainer.getChild(\"dropdownCommandTarget\").props.value\n\t commandCode\u003dtargetContainer.getChild(\"textFieldCommandCode\").props.text\n\t commandParameters\u003dtargetContainer.getChild(\"textFieldCommandParameters\").props.text\n\t commandTimestamp\u003dtargetContainer.getChild(\"textFieldCommandTimestamp\").props.text\n\t eventSource\u003dtargetContainer.getChild(\"dropdownEventsSource\").props.value\n\t eventTimestamp\u003dtargetContainer.getChild(\"textFieldEventTimestamp\").props.text\n\t eventID\u003dtargetContainer.getChild(\"textFieldEventID\").props.text\n\t eventState\u003dtargetContainer.getChild(\"textFieldEventState\").props.text\n\t disconnectionDuration\u003dtargetContainer.getChild(\"textFieldDisconnectionDuration\").props.text\n\t\n\t\n\t if command\u003d\u003d\"synchStatus\":\n\t commandParameters \u003d \"SYNCH,STATUS\"\n\t actionCode \u003d 1 #Start\n\t functionParameters\u003d{}\n\t functionParameters[\"commandTarget\"] \u003d targetSimulation\n\t functionParameters[\"commandCode\"] \u003d actionCode\n\t functionParameters[\"commandParams\"] \u003d commandParameters\n\t response \u003d Commands.button_commands.send_request(whid,actionCode,functionParameters)\n\t\n\t if command\u003d\u003d\"synchAlarms\":\n\t commandParameters \u003d \"SYNCH,ALARMS\"\n\t actionCode \u003d 1 #Start\n\t functionParameters\u003d{}\n\t functionParameters[\"commandTarget\"] \u003d targetSimulation\n\t functionParameters[\"commandCode\"] \u003d actionCode\n\t functionParameters[\"commandParams\"] \u003d commandParameters\n\t response \u003d Commands.button_commands.send_request(whid,actionCode,functionParameters)\n\t if command\u003d\u003d\"simulateDisconnection\":\n\t commandParams \u003d \"DISCONNECTION,\"+str(disconnectionDuration)\n\t actionCode \u003d 6 #Enable\n\t functionParameters\u003d{}\n\t functionParameters[\"commandTarget\"] \u003d targetSimulation\n\t functionParameters[\"commandCode\"] \u003d actionCode\n\t functionParameters[\"commandParams\"] \u003d commandParameters\n\t response \u003d Commands.button_commands.send_request(whid,actionCode,functionParameters)\n\t if command\u003d\u003d\"restoreFromDisconnection\":\n\t commandParams \u003d \"DISCONNECTION\"\n\t actionCode \u003d 7 #Disable\n\t functionParameters\u003d{}\n\t functionParameters[\"commandTarget\"] \u003d targetSimulation\n\t functionParameters[\"commandCode\"] \u003d actionCode\n\t functionParameters[\"commandParams\"] \u003d commandParameters\n\t response \u003d Commands.button_commands.send_request(whid,actionCode,functionParameters)\n\t if command\u003d\u003d\"sendCommand\":\n\t actionCode \u003d commandCode\n\t functionParameters\u003d{}\n\t functionParameters[\"commandTarget\"] \u003d commandTarget\n\t functionParameters[\"commandCode\"] \u003d commandCode\n\t functionParameters[\"commandParams\"] \u003d \u0027\u0027\n\t functionParameters[\"commandTimestamp\"] \u003d commandTimestamp\n\t response \u003d Commands.button_commands.send_request(whid,actionCode,functionParameters)\n\t if command\u003d\u003d\"sendAlarm\":\n\t actionCode \u003d 5 #SET\n\t functionParameters\u003d{}\n\t functionParameters[\"commandTarget\"] \u003d targetSimulation\n\t functionParameters[\"commandCode\"] \u003d actionCode\n\t functionParameters[\"commandParams\"] \u003d \"EVENTS,\"+str(eventSource)+\",\"+str(eventTimestamp)+\",\"+str(eventID)+\",\"+str(eventState)\n\t response \u003d Commands.button_commands.send_request(whid,actionCode,functionParameters)\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t result +\u003d errorMessage\n\ttargetContainer.getChild(\"textAreaResult\").props.text \u003d result", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "utilsTab_importFile", + "pageScope": true, + "script": "\t# implement your handler hereimport sys\n\ttargetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerUtils\")\n\theaders \u003d [\"Row\",\"ID\",\"Name\",\"Priority\",\"Type\" ]\n\trows\u003d[]\n\ttry:\n\t\tds\u003dsystem.dataset.toDataSet(headers,rows)\n\t\trowNumber\u003d0\n\t\tresult\u003d\"\"\n\t\tfileContent \u003d payload[\"fileContent\"]\n\t\tfileExtension\u003dpayload[\"fileExtension\"]\n\t\tif fileExtension\u003d\u003d\"json\":\n\t\t\t#Importing from a configuration file\n\t\t\tcontentJSON \u003d system.util.jsonDecode(fileContent)\n\t\t\talarmList\u003dcontentJSON[\u0027alarmList\u0027]\n\t\t\tfor alarm in alarmList:\n\t\t\t\tRow\u003drowNumber\n\t\t\t\tID\u003dalarm[\"id\"]\n\t\t\t\tName\u003dalarm[\"message\"]\n\t\t\t\tPriority\u003d\"Invalid\"\n\t\t\t\t\n\t\t\t\tif alarm[\"priority\"]\u003d\u003d\"1\":\n\t\t\t\t\tPriority\u003d\"Diagnostic\"\n\t\t\t\tif alarm[\"priority\"]\u003d\u003d\"2\":\n\t\t\t\t\tPriority\u003d\"Low\"\n\t\t\t\tif alarm[\"priority\"]\u003d\u003d\"3\":\n\t\t\t\t\tPriority\u003d\"Medium\"\n\t\t\t\tif alarm[\"priority\"]\u003d\u003d\"4\":\n\t\t\t\t\tPriority\u003d\"High\"\n\t\t\t\tType\u003d\"Default\"\n\t\t\t\tif alarm[\"type\"]\u003d\u003d\"1\":\n\t\t\t\t\tType\u003d\"Critical\"\n\t\t\t\trows.append([Row,ID,Name,Priority,Type])\n\t\t\t\trowNumber+\u003d1\t\t\n\t\tds \u003d system.dataset.toDataSet(headers,rows)\n\t\ttargetContainer.getChild(\"tableAlarms\").props.data \u003d ds\n\texcept:\n\t\texc_type, exc_obj, tb \u003d sys.exc_info()\n\t\tlineno \u003d tb.tb_lineno\n\t\terrorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t\tresult +\u003d errorMessage\n\ttargetContainer.getChild(\"textAreaResult\").props.text \u003d str(result)", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "utilsTab_init", + "pageScope": true, + "script": "\ttry:\n\t import sys\n\t result\u003d\"\"\n\t targetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerUtils\")\n\t selectedTagProvider \u003d system.tag.getConfiguration()[0][\"path\"].toString()\n\t #Check if is a valid SCADA 2.0 Tag provider\n\t validSCADATagProvider\u003dTrue\n\t if validSCADATagProvider and not system.tag.exists(selectedTagProvider+\"Configuration/FC\"):\n\t result+\u003d\"The tag \\\"Configuration/FC\\\" does not exists in the selected tag provider\"+\"\\r\\n\"\n\t validSCADATagProvider\u003dFalse\n\t if validSCADATagProvider and not system.tag.exists(selectedTagProvider+\"System/aws_data\"):\n\t result+\u003d\"The tag \\\"System/aws_data\\\" does not exists in the selected tag provider\"+\"\\r\\n\"\n\t validSCADATagProvider\u003dFalse\n\t if validSCADATagProvider and not system.tag.exists(selectedTagProvider+\"System/device_count\"):\n\t result+\u003d\"The tag \\\"System/device_count\\\" does not exists in the selected tag provider\"+\"\\r\\n\"\n\t validSCADATagProvider\u003dFalse\n\t if validSCADATagProvider:\n\t #Extracting the target site\n\t #Filling up the dropdown with the list of the PLCs\n\t tagProvidersPLCs \u003d system.tag.browse(path \u003dselectedTagProvider , filter \u003d {})\n\t tagProviderPLCsList\u003d[]\n\t for tagProvidersPLC in tagProvidersPLCs.getResults():\n\t fullPath\u003dstr(tagProvidersPLC[\u0027fullPath\u0027]).replace(selectedTagProvider,\"\")\n\t if \"System\" not in fullPath and \"Config\" not in fullPath and \"_types\" not in fullPath:\n\t entry\u003d{}\n\t entry[\u0027value\u0027] \u003d fullPath\n\t entry[\u0027label\u0027] \u003d fullPath\n\t tagProviderPLCsList.append(entry)\n\t targetContainer.getChild(\"dropdownTargetPLC\").props.options \u003d tagProviderPLCsList\n\t selectedValue \u003d tagProviderPLCsList[0][\"label\"]\n\t targetContainer.getChild(\"dropdownTargetPLC\").props.value \u003d selectedValue\n\t #Filling up the dropdown with the list of the sources\n\t tagProvidersSources \u003d system.tag.browse(path \u003dselectedTagProvider+\"/\"+selectedValue , filter \u003d {})\n\t tagProviderSourcesList\u003d[]\n\t for tagProvidersSource in tagProvidersSources.getResults():\n\t fullPath\u003dstr(tagProvidersSource[\u0027fullPath\u0027]).replace(selectedTagProvider,\"\")\n\t if \"System\" not in fullPath and \"Config\" not in fullPath and \"_types\" not in fullPath:\n\t entry\u003d{}\n\t entry[\u0027value\u0027] \u003d fullPath\n\t entry[\u0027label\u0027] \u003d fullPath\n\t tagProviderSourcesList.append(entry)\n\t targetContainer.getChild(\"dropdownCommandTarget\").props.options \u003d tagProviderSourcesList\n\t targetContainer.getChild(\"dropdownEventsSource\").props.options \u003d tagProviderSourcesList\n\t\n\t\n\t targetContainer.getChild(\"tableAlarms\").props.data \u003d []\n\t targetContainer.getChild(\"textFieldCommandCode\").props.text \u003d \u0027\u0027\n\t targetContainer.getChild(\"textFieldCommandParameters\").props.text \u003d \u0027\u0027\n\t targetContainer.getChild(\"textFieldEventID\").props.text \u003d \u0027\u0027\n\t result+\u003d\"Init completed\"\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t result +\u003d errorMessage\n\ttargetContainer.getChild(\"textAreaResult\").props.text \u003d str(result)", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "alarmsTab_changeSelectedPLC", + "pageScope": true, + "script": "\tresult\u003d\"\"\n\tresult\u003d\"Changing selected PLC for Alarms Page...\"\n\tself.sendConsoleMsg(result)\n\t\n\ttry:\n\t targetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerAlarms\")\n\t selectedTagProvider \u003d system.tag.getConfiguration()[0][\"path\"].toString()\n\t selectedPLC\u003dtargetContainer.getChild(\"dropdownTargetPLC\").props.value\n\t tagProvidersSources \u003d system.tag.browse(path \u003dselectedTagProvider+\"/\"+selectedPLC , filter \u003d {})\n\t tagProviderSourcesList\u003d[]\n\t for tagProvidersSource in tagProvidersSources.getResults():\n\t fullPath\u003dstr(tagProvidersSource[\u0027fullPath\u0027]).replace(selectedTagProvider,\"\")\n\t if \"System\" not in fullPath and \"Config\" not in fullPath and \"_types\" not in fullPath:\n\t entry\u003d{}\n\t entry[\u0027value\u0027] \u003d fullPath\n\t entry[\u0027label\u0027] \u003d fullPath\n\t tagProviderSourcesList.append(entry)\n\t targetContainer.getChild(\"dropdownEventsCommandParams_Target\").props.options \u003d tagProviderSourcesList\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "measurementTab_changeSelectedPLC", + "pageScope": true, + "script": "\tresult\u003d\"Changing selected PLC for Sequnce Page ...\"\n\tself.sendConsoleMsg(result)\n\ttry:\n\t targetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerMeasurment\")\n\t selectedTagProvider \u003d system.tag.getConfiguration()[0][\"path\"].toString()\n\t\n\t selectedPLC\u003dtargetContainer.getChild(\"dropdownTargetPLC\").props.value\n\t tagProvidersSources \u003d system.tag.browse(path \u003dselectedTagProvider+\"/\"+selectedPLC , filter \u003d {})\n\t tagProviderSourcesList\u003d[]\n\t result +\u003d str(tagProvidersSources)\n\t for tagProvidersSource in tagProvidersSources.getResults():\n\t fullPath\u003dstr(tagProvidersSource[\u0027fullPath\u0027]).replace(selectedTagProvider,\"\")\n\t if \"System\" not in fullPath and \"Config\" not in fullPath and \"_types\" not in fullPath:\n\t entry\u003d{}\n\t entry[\u0027value\u0027] \u003d fullPath\n\t entry[\u0027label\u0027] \u003d fullPath\n\t tagProviderSourcesList.append(entry)\n\t targetContainer.getChild(\"dropdownEventsCommandParams_Target\").props.options \u003d tagProviderSourcesList\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)\n\t", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "utilsTab_changeSelectedPLC", + "pageScope": true, + "script": "\tresult\u003d\"\"\n\ttry:\n\t targetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerUtils\")\n\t selectedTagProvider \u003d system.tag.getConfiguration()[0][\"path\"].toString()\n\t selectedPLC\u003dtargetContainer.getChild(\"dropdownTargetPLC\").props.value\n\t tagProvidersSources \u003d system.tag.browse(path \u003dselectedTagProvider+\"/\"+selectedPLC , filter \u003d {})\n\t tagProviderSourcesList\u003d[]\n\t for tagProvidersSource in tagProvidersSources.getResults():\n\t fullPath\u003dstr(tagProvidersSource[\u0027fullPath\u0027]).replace(selectedTagProvider,\"\")\n\t if \"System\" not in fullPath and \"Config\" not in fullPath and \"_types\" not in fullPath:\n\t entry\u003d{}\n\t entry[\u0027value\u0027] \u003d fullPath\n\t entry[\u0027label\u0027] \u003d fullPath\n\t tagProviderSourcesList.append(entry)\n\t targetContainer.getChild(\"dropdownCommandTarget\").props.options \u003d tagProviderSourcesList\n\t targetContainer.getChild(\"dropdownEventsSource\").props.options \u003d tagProviderSourcesList\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t result +\u003d errorMessage\n\ttargetContainer.getChild(\"textAreaResult\").props.text \u003d str(result)", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "uploadBackup", + "pageScope": true, + "script": "\t# implement your handler here\n\tfileContent \u003d payload[\"fileContent\"]\n\tfileName\u003d payload[\"fileName\"]\n\tif \"Alarms\" in fileName:\n\t result\u003d\"Importing an Alarms backup file \"\n\t self.sendConsoleMsg(result)\n\t #Importing the alarms from a previously saved file\n\t targetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerAlarms\")\n\t try:\n\t tableContent\u003d[]\n\t rowsValues\u003d[]\n\t rowsValues \u003d fileContent.splitlines()\n\t for indexRow in range(1,len(rowsValues)):\n\t rowFields \u003d rowsValues[indexRow].replace(\"\\\"\",\"\").split(\",\")\n\t rowContent\u003d{}\n\t rowContent[\"Row\"]\u003drowFields[0]\n\t rowContent[\"ID\"]\u003drowFields[1]\n\t rowContent[\"Name\"]\u003drowFields[2]\n\t rowContent[\"Priority\"]\u003drowFields[3]\n\t rowContent[\"Type\"]\u003drowFields[4]\n\t rowContent[\"Tested_date_UTC\"]\u003drowFields[5]\n\t rowContent[\"Result\"]\u003drowFields[6]\n\t rowContent[\"Notes\"]\u003drowFields[7]\n\t tableContent.append(rowContent)\n\t\t self.session.custom.alarms \u003d tableContent\n\t except:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)\n\t return\n\telif \"Sources\" in fileName:\n\t #Importing the sources from a previously saved file\n\t result\u003d\"Importing an Sources backup file \"\n\t self.sendConsoleMsg(result)\n\t targetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerSources\")\n\t try:\n\t tableContent\u003d[]\n\t rowsValues\u003d[]\n\t rowsValues \u003d fileContent.splitlines()\n\t tagProviderSourcesList\u003d[]\n\t for indexRow in range(1,len(rowsValues)):\n\t system.perspective.print(str(indexRow))\n\t system.perspective.print(str(rowsValues[indexRow]))\n\t rowFields \u003d rowsValues[indexRow].replace(\"\\\"\",\"\").split(\",\")\n\t system.perspective.print(str(rowFields))\n\t rowContent\u003d{}\n\t rowContent[\"Row\"]\u003drowFields[0]\n\t rowContent[\"ID\"]\u003drowFields[1]\n\t rowContent[\"Source\"]\u003drowFields[2]\n\t rowContent[\"Tested_date_UTC\"]\u003drowFields[3]\n\t rowContent[\"Result\"]\u003drowFields[4]\n\t rowContent[\"Notes\"]\u003drowFields[5]\n\t system.perspective.print(str(rowContent))\n\t tableContent.append(rowContent)\n\t \n\t \n\t system.perspective.print(\"Setting Table Sources DATA\")\n\t \t\t\t\t\n\t self.session.custom.sources \u003d tableContent\n\t except:\n\t \tsystem.perspective.print(\"Error\")\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t self.sendConsoleMsg(errorMessage)\t\t\n\t return\n\telif \"Sequence\" in fileName:\n\t result\u003d\"Importing sequence from file is not yet supported\"\n\t self.sendConsoleMsg(result)\n\telse:\n\t result\u003d\"Invalid file name\"\n\t self.sendConsoleMsg(result)\n\t \n\tresult\u003d\"File :%s imported Succesfully \"%fileName\n\tself.sendConsoleMsg(result)", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "measurementTab_setMode", + "pageScope": true, + "script": "\timport sys\n\tresult\u003d\"Setting Current Mode\"\n\tMODE_TYPE \u003d \"ModeChanged\"\n\ttargetState\u003dpayload[\"targetState\"]\n\t\n\tself.sendConsoleMsg(result)\n\ttry:\n\t targetContainer \u003d self.getChild(\"TabContainer\").getChild(\"ContainerMeasurement\")\n\t tableData \u003d targetContainer.getChild(\"tableSequence\").props.data\n\t selectedRows \u003d targetContainer.getChild(\"tableSequence\").props.selection.data\n\t newArray\u003d[]\n\t for element in tableData:\n\t newElement\u003d dict(element)\n\t if element[\"Selected\"] and element[\"Type\"] \u003d\u003d MODE_TYPE :\n\t newElement[\"CurrentMode\"]\u003dtargetState\n\t newArray.append(newElement)\n\t targetContainer.getChild(\"tableSequence\").props.data \u003d newArray\n\texcept:\n\t exc_type, exc_obj, tb \u003d sys.exc_info()\n\t lineno \u003d tb.tb_lineno\n\t errorMessage\u003dstr(lineno)+\" -\u003e \"+str(exc_type)+\" -\u003e \"+str(exc_obj)\n\t result +\u003d errorMessage\n\ttargetContainer.getChild(\"textAreaResult\").props.text \u003d result", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/ba37b574b3838b53f0161f0a22701fce17641f213e8abb34a7b100b4769d6094 b/.resources/ba37b574b3838b53f0161f0a22701fce17641f213e8abb34a7b100b4769d6094 new file mode 100644 index 0000000..00c9572 --- /dev/null +++ b/.resources/ba37b574b3838b53f0161f0a22701fce17641f213e8abb34a7b100b4769d6094 @@ -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/.resources/ba3c312a4e2be0fa7930407b450745034e520bf70267d4902135376199c71020 b/.resources/ba3c312a4e2be0fa7930407b450745034e520bf70267d4902135376199c71020 new file mode 100644 index 0000000..eed4f35 --- /dev/null +++ b/.resources/ba3c312a4e2be0fa7930407b450745034e520bf70267d4902135376199c71020 @@ -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/.resources/bba4b1de48612f08ad6e51a77ba40354c9c2764cc3e4452566d0627ee1866540 b/.resources/bba4b1de48612f08ad6e51a77ba40354c9c2764cc3e4452566d0627ee1866540 new file mode 100644 index 0000000..0c15c08 --- /dev/null +++ b/.resources/bba4b1de48612f08ad6e51a77ba40354c9c2764cc3e4452566d0627ee1866540 @@ -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/.resources/bbb999bd7836e6de7f19b8337eaf2f806ad745fba0c7574d7324a8211da1daa8 b/.resources/bbb999bd7836e6de7f19b8337eaf2f806ad745fba0c7574d7324a8211da1daa8 new file mode 100644 index 0000000..d2127d3 --- /dev/null +++ b/.resources/bbb999bd7836e6de7f19b8337eaf2f806ad745fba0c7574d7324a8211da1daa8 @@ -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/.resources/bbc617038466d1e05aa30b16629393c301387966fc7a45bed1b1f59fc77a3ea6 b/.resources/bbc617038466d1e05aa30b16629393c301387966fc7a45bed1b1f59fc77a3ea6 new file mode 100644 index 0000000..e027654 --- /dev/null +++ b/.resources/bbc617038466d1e05aa30b16629393c301387966fc7a45bed1b1f59fc77a3ea6 @@ -0,0 +1,1004 @@ +{ + "custom": {}, + "params": { + "btnActionClose": "closePopup", + "btnActionPrimary": "closePopup", + "btnActionSecondary": "closePopup", + "btnIconAlignment": "left", + "btnIconPrimary": "chevron_right", + "btnIconSecondary": "", + "btnTextPrimary": "Primary", + "btnTextSecondary": "Secondary", + "editField1": "editField", + "editField2": "", + "editField3": "", + "field1Description": "Description goes here.", + "field2Description": "Description goes here.", + "field3Description": "Description goes here.", + "key": "value", + "message": "Message goes here.", + "path": "", + "payload": { + "key": "The payload to return to the caller would go here. DLC 2021-09-23" + }, + "showCloseBtn": true, + "state": "info", + "title": "title", + "userRole": true + }, + "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.editField1": { + "paramDirection": "input", + "persistent": true + }, + "params.editField2": { + "paramDirection": "input", + "persistent": true + }, + "params.editField3": { + "paramDirection": "input", + "persistent": true + }, + "params.field1Description": { + "paramDirection": "input", + "persistent": true + }, + "params.field2Description": { + "paramDirection": "input", + "persistent": true + }, + "params.field3Description": { + "paramDirection": "input", + "persistent": true + }, + "params.key": { + "paramDirection": "input", + "persistent": true + }, + "params.message": { + "paramDirection": "input", + "persistent": true + }, + "params.path": { + "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 + }, + "params.userRole": { + "binding": { + "config": { + "path": "session.props.auth.user.roles" + }, + "transforms": [ + { + "code": "\tif any(item \u003d\u003d \"eurme-ignition-admins\" for item in value):\n\t\treturn True\n\telse:\n\t\treturn False\n\t\t\n", + "type": "script" + } + ], + "type": "property" + }, + "paramDirection": "inout", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 675, + "width": 858 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "iconMain" + }, + "position": { + "basis": "32px", + "display": false, + "shrink": 0 + }, + "propConfig": { + "props.color": { + "binding": { + "config": { + "expression": "{view.params.state}" + }, + "transforms": [ + { + "fallback": "var(--info)", + "inputType": "scalar", + "mappings": [ + { + "input": "warning", + "output": "var(--warning)" + }, + { + "input": "success", + "output": "var(--success)" + }, + { + "input": "error", + "output": "var(--error)" + }, + { + "input": "info", + "output": "var(--info)" + } + ], + "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": "#FFFFFF" + } + }, + "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": "BreakpointContainer_0" + }, + "position": { + "basis": "20px" + }, + "type": "ia.container.breakpt" + }, + { + "meta": { + "name": "message_0" + }, + "position": { + "grow": 1, + "shrink": 0 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.field1Description" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Alerts/alertMessage" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Field1" + }, + "position": { + "basis": "30px", + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.editField1" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "textAlign": "start" + } + }, + "type": "ia.input.text-field" + }, + { + "meta": { + "name": "BreakpointContainer_1" + }, + "position": { + "basis": "20px" + }, + "type": "ia.container.breakpt" + }, + { + "meta": { + "name": "message_1" + }, + "position": { + "grow": 1, + "shrink": 0 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.field2Description" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Alerts/alertMessage" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Field2" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.editField2" + }, + "type": "property" + } + } + }, + "props": { + "resize": "both" + }, + "type": "ia.input.text-area" + }, + { + "meta": { + "name": "BreakpointContainer" + }, + "position": { + "basis": "20px" + }, + "type": "ia.container.breakpt" + }, + { + "meta": { + "name": "message_2" + }, + "position": { + "grow": 1, + "shrink": 0 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.field3Description" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "classes": "Alerts/alertMessage" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Field3" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.editField3" + }, + "type": "property" + } + } + }, + "props": { + "resize": "both" + }, + "type": "ia.input.text-area" + } + ], + "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": { + "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 + }, + "props": { + "alignItems": "flex-start", + "justify": "center", + "style": { + "boxSizing": "content-box", + "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", + "margin": "5px", + "marginRight": "30px" + } + }, + "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": "\t#############################################################################################\n\t# Purpose:\tSubmits Current form data to the selected destination from the parameters.\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# 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\timport os\n\timport boto3\n\tfrom pprint import pprint, pformat\n\tfrom SymbolLibrary import fetch_library, list_backups, write_library, update_symbol_library, rollback\n\t\n\tsystem.perspective.print(self.session.props.auth.user.roles)\n\t\n\tif not self.view.params.userRole: \n\t\tmsg \u003d \"Contact MAP Team\tCTI: Distribution Center \u003e Maintenance Automation Platform \u003e SCADA Issue\" \n\t\tself.show_error_dialog(msg)\n\t\tsystem.perspective.closePopup(\u0027editItem\u0027)\n\t\treturn\n\n\tsymbolpath \u003d self.view.params.path\n\tcurrentuser \u003d self.session.props.auth.user.id\n\tcurrentcategory \u003d self.view.params.editField1\n\tcurrentinfo \u003d self.view.params.editField2\n\tcurrentdesc \u003d self.view.params.editField3\n\n\tresp \u003d update_symbol_library(symbolpath, category\u003dcurrentcategory, info\u003dcurrentinfo, description\u003dcurrentdesc, username\u003dcurrentuser)\n\tmsg \u003d pformat(resp)\n\t\n\tself.show_success_dialog(msg)\n\tsystem.perspective.print(msg)\n\tsystem.perspective.print(fetch_library(username\u003dcurrentuser))\n\tsystem.perspective.print(symbolpath)\n\tsystem.perspective.print(self.session.props.auth.user.id)\n\t\n\tsystem.perspective.sendMessage(\"UserClickRefresh\", scope \u003d \"page\")\n\tsystem.perspective.closePopup(\u0027editItem\u0027)\n" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "actionPrimary" + }, + "position": { + "basis": "109px", + "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": {}, + "style": { + "margin": 5 + }, + "width": 20 + }, + "style": { + "classes": "Alerts/alertButton", + "margin": "5px" + }, + "textStyle": { + "textAlign": "center" + } + }, + "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\"Update Symbol Library Results\", \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\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\"Not Authorized\", \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\t" + } + ], + "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/.resources/bbf929ac0021efb4bc4b3697b74def4ea0cc89909b37b7f5b24b0374cfe5e82c b/.resources/bbf929ac0021efb4bc4b3697b74def4ea0cc89909b37b7f5b24b0374cfe5e82c new file mode 100644 index 0000000..cbf08c4 --- /dev/null +++ b/.resources/bbf929ac0021efb4bc4b3697b74def4ea0cc89909b37b7f5b24b0374cfe5e82c @@ -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/.resources/c06f2a883a677a3f4c8e59acdb0cd3266270ea1f10bfd8d887acc680684330f3 b/.resources/c06f2a883a677a3f4c8e59acdb0cd3266270ea1f10bfd8d887acc680684330f3 new file mode 100644 index 0000000..00dc9bb --- /dev/null +++ b/.resources/c06f2a883a677a3f4c8e59acdb0cd3266270ea1f10bfd8d887acc680684330f3 @@ -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/.resources/c0f488c45609f57c5f3e2f007a9eddfea32f8f26cfbcd6f142b5f25e0b1bbef4 b/.resources/c0f488c45609f57c5f3e2f007a9eddfea32f8f26cfbcd6f142b5f25e0b1bbef4 new file mode 100644 index 0000000..9c7decd --- /dev/null +++ b/.resources/c0f488c45609f57c5f3e2f007a9eddfea32f8f26cfbcd6f142b5f25e0b1bbef4 @@ -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/.resources/c2fdbe76dd00b5773fa7b62e5f2823c932005ad3aae5d92f9f4e1261ecf02779 b/.resources/c2fdbe76dd00b5773fa7b62e5f2823c932005ad3aae5d92f9f4e1261ecf02779 new file mode 100644 index 0000000..e539819 --- /dev/null +++ b/.resources/c2fdbe76dd00b5773fa7b62e5f2823c932005ad3aae5d92f9f4e1261ecf02779 @@ -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/.resources/c3308ec23c1ce79b763dd78adcb05fffa8749282f875208d51620246c35a275b b/.resources/c3308ec23c1ce79b763dd78adcb05fffa8749282f875208d51620246c35a275b new file mode 100644 index 0000000..7fe9f01 --- /dev/null +++ b/.resources/c3308ec23c1ce79b763dd78adcb05fffa8749282f875208d51620246c35a275b @@ -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/.resources/c418c29d4d751adbafbbdad6cef94489983aa4d09918d19cf51b1c404b336a5a b/.resources/c418c29d4d751adbafbbdad6cef94489983aa4d09918d19cf51b1c404b336a5a new file mode 100644 index 0000000..3979a58 --- /dev/null +++ b/.resources/c418c29d4d751adbafbbdad6cef94489983aa4d09918d19cf51b1c404b336a5a @@ -0,0 +1,659 @@ +{ + "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": "SmartPac" + }, + "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.614583", + "cy": "6.614583", + "fill": {}, + "id": "path1", + "name": "path1", + "rx": "6.2085829", + "ry": "6.2085834", + "stroke": { + "dasharray": "none", + "linecap": "round", + "paint": "#000000", + "width": "0.282833" + }, + "type": "ellipse" + }, + { + "cx": "9.5583372", + "cy": "6.7405353", + "fill": { + "paint": "transparent" + }, + "id": "path3", + "name": "path3", + "rx": "2.1170385", + "ry": "2.1170387", + "stroke": { + "dasharray": "none", + "linecap": "butt", + "linejoin": "miter", + "paint": "#000000", + "width": "0.263839" + }, + "type": "ellipse" + }, + { + "cx": "3.6387777", + "cy": "6.7405353", + "fill": { + "paint": "transparent" + }, + "id": "ellipse3", + "name": "ellipse3", + "rx": "2.1170385", + "ry": "2.1170387", + "stroke": { + "dasharray": "none", + "linecap": "butt", + "linejoin": "miter", + "paint": "#000000", + "width": "0.263839" + }, + "type": "ellipse" + }, + { + "d": "m 6.614583,6.0733902 2e-7,3.9748358", + "fill": { + "paint": "transparent" + }, + "id": "path4", + "name": "path4", + "stroke": { + "dasharray": "none", + "linecap": "butt", + "linejoin": "miter", + "paint": "#000000", + "width": "0.278874" + }, + "type": "path" + }, + { + "d": "m 6.6145826,3.367424 2.3434352,4.0589491 -4.6868706,-2e-7 z", + "fill": { + "paint": "transparent" + }, + "id": "path5", + "name": "path5", + "stroke": { + "dasharray": "none", + "linecap": "butt", + "linejoin": "miter", + "paint": "#000000", + "width": "0.28489252" + }, + "transform": "matrix(-1.0350965,0,0,-0.83326286,13.461314,8.9334953)", + "type": "path" + } + ], + "id": "layer1", + "name": "layer1", + "type": "group" + } + ], + "style": {}, + "viewBox": "0 0 13.229167 13.229166" + }, + "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/.resources/c55a611e69770bd8b888eb081a9e370cd4b333847ed64e467eaea20107dfd45f b/.resources/c55a611e69770bd8b888eb081a9e370cd4b333847ed64e467eaea20107dfd45f new file mode 100644 index 0000000..1e3209b --- /dev/null +++ b/.resources/c55a611e69770bd8b888eb081a9e370cd4b333847ed64e467eaea20107dfd45f @@ -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/.resources/c67d3a171e6dea9dbc310a2341570349d38a8af60b32c5f2df30e94e85481829 b/.resources/c67d3a171e6dea9dbc310a2341570349d38a8af60b32c5f2df30e94e85481829 new file mode 100644 index 0000000..ef0dc6f --- /dev/null +++ b/.resources/c67d3a171e6dea9dbc310a2341570349d38a8af60b32c5f2df30e94e85481829 @@ -0,0 +1,66 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 1080, + "width": 400 + } + }, + "root": { + "children": [ + { + "custom": { + "params": {}, + "path": "value" + }, + "meta": { + "name": "EmbeddedView" + }, + "position": { + "basis": "320px", + "grow": 1 + }, + "propConfig": { + "props.params.params": { + "binding": { + "config": { + "path": "this.custom.params" + }, + "type": "property" + } + }, + "props.path": { + "binding": { + "config": { + "path": "this.custom.path" + }, + "type": "property" + } + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "select-side-view", + "pageScope": true, + "script": "\t# implement your handler here\n\tself.custom.path \u003d payload.get(\"path\")\n\tself.custom.params \u003d payload.get(\"params\")\n\tsystem.perspective.print(payload)\n\t", + "sessionScope": true, + "viewScope": false + } + ] + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/c6f640b4cf5d49bd397a1b07491cddc436842c662b2a476ed260ab6480e6f802 b/.resources/c6f640b4cf5d49bd397a1b07491cddc436842c662b2a476ed260ab6480e6f802 new file mode 100644 index 0000000..0845b6f --- /dev/null +++ b/.resources/c6f640b4cf5d49bd397a1b07491cddc436842c662b2a476ed260ab6480e6f802 @@ -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/.resources/c76ea0cbc53b199318612ab1ebd6396ee31f95391dfcec6a6c9bdce2b0feeb2c b/.resources/c76ea0cbc53b199318612ab1ebd6396ee31f95391dfcec6a6c9bdce2b0feeb2c new file mode 100644 index 0000000..32b4840 --- /dev/null +++ b/.resources/c76ea0cbc53b199318612ab1ebd6396ee31f95391dfcec6a6c9bdce2b0feeb2c @@ -0,0 +1,16 @@ +def check_heartbeat(tag_provider, timeout): + current_time = system.date.now() + tag_path = "%sSystem/wbsckt_heartbeat_interval" % (tag_provider) + tag_to_read = system.tag.readBlocking([tag_path]) + heartbeat = tag_to_read[0].value + time_diff = system.date.secondsBetween(heartbeat, current_time) + if time_diff > 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/.resources/c83cbc9eaa22734f2bd1b02f628ea0e776153887385d65cc78ffa17a0256ae50 b/.resources/c83cbc9eaa22734f2bd1b02f628ea0e776153887385d65cc78ffa17a0256ae50 new file mode 100644 index 0000000..dd3e5d8 --- /dev/null +++ b/.resources/c83cbc9eaa22734f2bd1b02f628ea0e776153887385d65cc78ffa17a0256ae50 @@ -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/.resources/c92eef8cc54fbbf4ed0ad05fc3249a35b03f7ec252118c7088c1c1b1a67dc5da b/.resources/c92eef8cc54fbbf4ed0ad05fc3249a35b03f7ec252118c7088c1c1b1a67dc5da new file mode 100644 index 0000000..6307483 --- /dev/null +++ b/.resources/c92eef8cc54fbbf4ed0ad05fc3249a35b03f7ec252118c7088c1c1b1a67dc5da @@ -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/.resources/c974afaba5e478536e7dbc681270f4f28a57cd7a86ed3420c3bf00f883aedd18 b/.resources/c974afaba5e478536e7dbc681270f4f28a57cd7a86ed3420c3bf00f883aedd18 new file mode 100644 index 0000000..fd6d3e2 --- /dev/null +++ b/.resources/c974afaba5e478536e7dbc681270f4f28a57cd7a86ed3420c3bf00f883aedd18 @@ -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/.resources/c978307aa5bca3d30e1d0203fcd22f594869eb74e10512fb9921745939d15aea b/.resources/c978307aa5bca3d30e1d0203fcd22f594869eb74e10512fb9921745939d15aea new file mode 100644 index 0000000..6ec79bf --- /dev/null +++ b/.resources/c978307aa5bca3d30e1d0203fcd22f594869eb74e10512fb9921745939d15aea @@ -0,0 +1,6459 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Image" + }, + "position": { + "height": 1080, + "width": 1920 + }, + "propConfig": { + "props.source": { + "binding": { + "config": { + "expression": "\"http://127.0.0.1:5500/MCM04%20Sorter%20Destination%2C%20chutes%20and%20Bypass.svg?var\" + toMillis(now(100))" + }, + "type": "expr" + } + } + }, + "props": { + "fit": { + "mode": "fill" + }, + "style": { + "backgroundColor": "#EEEEEE" + } + }, + "type": "ia.display.image" + }, + { + "meta": { + "elementPrefix": null, + "id": "rect1-6-2-0-0-6-8-3-4-8-07", + "name": "BYAB-3", + "originalName": "rect1-6-2-0-0-6-8-3-4-8-07" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 973.058, + "y": 518.36 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": null, + "id": "rect1-6-2-0-0-6-8-3-4-8-0-0", + "name": "BYAB-2", + "originalName": "rect1-6-2-0-0-6-8-3-4-8-0-0" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 972.958, + "y": 629.32 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": null, + "id": "rect131", + "name": "S011014", + "originalName": "rect131" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 557.98, + "y": 713.37 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": null, + "id": "rect144", + "name": "BYCB-3", + "originalName": "rect144" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1059.3, + "y": 518.26 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": null, + "id": "rect145", + "name": "BYCB-2", + "originalName": "rect145" + }, + "position": { + "height": 20, + "rotate": { + "angle": -90 + }, + "width": 20, + "x": 1059.3, + "y": 629.22 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/Status" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": null, + "id": "rect277", + "name": "S011076", + "originalName": "rect277" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1287.33, + "y": 736.69 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect61", + "inheritedGroupPrefix": "CON", + "name": "S013079", + "originalName": "rect61" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 184.36, + "y": 546.12 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect62", + "inheritedGroupPrefix": "CON", + "name": "S013081", + "originalName": "rect62" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 184.52, + "y": 567.73 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect63", + "inheritedGroupPrefix": "CON", + "name": "S013085", + "originalName": "rect63" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 184.84, + "y": 616.87 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect64", + "inheritedGroupPrefix": "CON", + "name": "S013087", + "originalName": "rect64" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 185.01, + "y": 638.16 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect65", + "inheritedGroupPrefix": "CON", + "name": "S013086", + "originalName": "rect65" + }, + "position": { + "height": 20, + "rotate": { + "angle": 180 + }, + "width": 20, + "x": 110.31, + "y": 616.6 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect66", + "inheritedGroupPrefix": "CON", + "name": "S013088", + "originalName": "rect66" + }, + "position": { + "height": 20, + "rotate": { + "angle": 180 + }, + "width": 20, + "x": 110.2, + "y": 638.08 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect67", + "inheritedGroupPrefix": "CON", + "name": "S013083", + "originalName": "rect67" + }, + "position": { + "height": 20, + "rotate": { + "angle": 0 + }, + "width": 20, + "x": 184.88, + "y": 592.81 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect68", + "inheritedGroupPrefix": "CON", + "name": "S013080", + "originalName": "rect68" + }, + "position": { + "height": 20, + "rotate": { + "angle": 180 + }, + "width": 20, + "x": 110.47, + "y": 549.04 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect69", + "inheritedGroupPrefix": "CON", + "name": "S013082", + "originalName": "rect69" + }, + "position": { + "height": 20, + "rotate": { + "angle": 180 + }, + "width": 20, + "x": 110.36, + "y": 570.52 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect70", + "inheritedGroupPrefix": "CON", + "name": "S013084", + "originalName": "rect70" + }, + "position": { + "height": 20, + "rotate": { + "angle": 180 + }, + "width": 20, + "x": 110.28, + "y": 593.59 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect74", + "inheritedGroupPrefix": "CON", + "name": "S011049", + "originalName": "rect74" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 993.94, + "y": 656.77 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect92", + "inheritedGroupPrefix": "CON", + "name": "S011045", + "originalName": "rect92" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 922.75, + "y": 655.77 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect93", + "inheritedGroupPrefix": "CON", + "name": "S011043", + "originalName": "rect93" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 901.55, + "y": 655.65 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect94", + "inheritedGroupPrefix": "CON", + "name": "S011039", + "originalName": "rect94" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 858.47, + "y": 655.65 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect95", + "inheritedGroupPrefix": "CON", + "name": "S011037", + "originalName": "rect95" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 838.17, + "y": 655.77 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect96", + "inheritedGroupPrefix": "CON", + "name": "S011035", + "originalName": "rect96" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 816.03, + "y": 655.77 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect97", + "inheritedGroupPrefix": "CON", + "name": "S011033", + "originalName": "rect97" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 792.29, + "y": 655.93 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect98", + "inheritedGroupPrefix": "CON", + "name": "S011031", + "originalName": "rect98" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 762.09, + "y": 655.93 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect100", + "inheritedGroupPrefix": "CON", + "name": "S011029", + "originalName": "rect100" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 739.9, + "y": 655.81 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect101", + "inheritedGroupPrefix": "CON", + "name": "S011027", + "originalName": "rect101" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 718.82, + "y": 655.81 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect102", + "inheritedGroupPrefix": "CON", + "name": "S011025", + "originalName": "rect102" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 697.51, + "y": 655.93 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect103", + "inheritedGroupPrefix": "CON", + "name": "S011023", + "originalName": "rect103" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 676.38, + "y": 655.93 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect104", + "inheritedGroupPrefix": "CON", + "name": "S011021", + "originalName": "rect104" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 652.89, + "y": 655.99 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect105", + "inheritedGroupPrefix": "CON", + "name": "S011019", + "originalName": "rect105" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 630.7, + "y": 655.99 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect107", + "inheritedGroupPrefix": "CON", + "name": "S011017", + "originalName": "rect107" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 609.51, + "y": 655.88 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect108", + "inheritedGroupPrefix": "CON", + "name": "S011015", + "originalName": "rect108" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 578.43, + "y": 655.88 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect109", + "inheritedGroupPrefix": "CON", + "name": "S011013", + "originalName": "rect109" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 558.12, + "y": 655.99 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect110", + "inheritedGroupPrefix": "CON", + "name": "S011011", + "originalName": "rect110" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 534.98, + "y": 655.99 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect111", + "inheritedGroupPrefix": "CON", + "name": "S011048", + "originalName": "rect111" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 944.32, + "y": 713.62 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect113", + "inheritedGroupPrefix": "CON", + "name": "S011046", + "originalName": "rect113" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 923.12, + "y": 713.62 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect114", + "inheritedGroupPrefix": "CON", + "name": "S011044", + "originalName": "rect114" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 900.79, + "y": 713.51 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect115", + "inheritedGroupPrefix": "CON", + "name": "S011042", + "originalName": "rect115" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 879.71, + "y": 713.51 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect116", + "inheritedGroupPrefix": "CON", + "name": "S011040", + "originalName": "rect116" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 858.41, + "y": 713.62 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect117", + "inheritedGroupPrefix": "CON", + "name": "S011038", + "originalName": "rect117" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 837.27, + "y": 713.62 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect118", + "inheritedGroupPrefix": "CON", + "name": "S011036", + "originalName": "rect118" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 814.29, + "y": 713.3 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect119", + "inheritedGroupPrefix": "CON", + "name": "S011034", + "originalName": "rect119" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 793.09, + "y": 713.3 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect121", + "inheritedGroupPrefix": "CON", + "name": "S011032", + "originalName": "rect121" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 762.9, + "y": 713.19 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect122", + "inheritedGroupPrefix": "CON", + "name": "S011030", + "originalName": "rect122" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 741.82, + "y": 713.19 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect123", + "inheritedGroupPrefix": "CON", + "name": "S011028", + "originalName": "rect123" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 720.51, + "y": 713.3 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect124", + "inheritedGroupPrefix": "CON", + "name": "S011026", + "originalName": "rect124" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 698.38, + "y": 713.3 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect125", + "inheritedGroupPrefix": "CON", + "name": "S011024", + "originalName": "rect125" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 676.89, + "y": 713.37 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect126", + "inheritedGroupPrefix": "CON", + "name": "S011022", + "originalName": "rect126" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 655.7, + "y": 713.37 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect128", + "inheritedGroupPrefix": "CON", + "name": "S011020", + "originalName": "rect128" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 634.51, + "y": 713.25 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect129", + "inheritedGroupPrefix": "CON", + "name": "S011018", + "originalName": "rect129" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 613.43, + "y": 713.25 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect130", + "inheritedGroupPrefix": "CON", + "name": "S011016", + "originalName": "rect130" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 579.12, + "y": 713.37 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect132", + "inheritedGroupPrefix": "CON", + "name": "S011060", + "originalName": "rect132" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1081.66, + "y": 713.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect134", + "inheritedGroupPrefix": "CON", + "name": "S011058", + "originalName": "rect134" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1060.47, + "y": 713.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect135", + "inheritedGroupPrefix": "CON", + "name": "S011056", + "originalName": "rect135" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1039.28, + "y": 713.32 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect136", + "inheritedGroupPrefix": "CON", + "name": "S011054", + "originalName": "rect136" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1018.2, + "y": 713.32 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect137", + "inheritedGroupPrefix": "CON", + "name": "S011052", + "originalName": "rect137" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 995.89, + "y": 713.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect138", + "inheritedGroupPrefix": "CON", + "name": "S011050", + "originalName": "rect138" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 976.41, + "y": 713.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect139", + "inheritedGroupPrefix": "CON", + "name": "S011064", + "originalName": "rect139" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1123.85, + "y": 713.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect140", + "inheritedGroupPrefix": "CON", + "name": "S011062", + "originalName": "rect140" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1103.65, + "y": 713.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect141", + "inheritedGroupPrefix": "CON", + "name": "S011051", + "originalName": "rect141" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1015.07, + "y": 657 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect142", + "inheritedGroupPrefix": "CON", + "name": "S011059", + "originalName": "rect142" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1080.25, + "y": 657 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect143", + "inheritedGroupPrefix": "CON", + "name": "S011053", + "originalName": "rect143" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1036.19, + "y": 657 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect146", + "inheritedGroupPrefix": "CON", + "name": "S011063", + "originalName": "rect146" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1122.25, + "y": 657 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect147", + "inheritedGroupPrefix": "CON", + "name": "S011061", + "originalName": "rect147" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1102.06, + "y": 657 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect148", + "inheritedGroupPrefix": "CON", + "name": "S011070", + "originalName": "rect148" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1219.91, + "y": 713.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect149", + "inheritedGroupPrefix": "CON", + "name": "S011068", + "originalName": "rect149" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1198.72, + "y": 713.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect150", + "inheritedGroupPrefix": "CON", + "name": "S011066", + "originalName": "rect150" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1176.52, + "y": 713.32 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect151", + "inheritedGroupPrefix": "CON", + "name": "S011074", + "originalName": "rect151" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1263.09, + "y": 713.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect152", + "inheritedGroupPrefix": "CON", + "name": "S011072", + "originalName": "rect152" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 1241.9, + "y": 713.43 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect153", + "inheritedGroupPrefix": "CON", + "name": "S011069", + "originalName": "rect153" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1220.63, + "y": 656.26 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect154", + "inheritedGroupPrefix": "CON", + "name": "S011067", + "originalName": "rect154" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1199.44, + "y": 656.26 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect155", + "inheritedGroupPrefix": "CON", + "name": "S011065", + "originalName": "rect155" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1177.24, + "y": 656.15 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect156", + "inheritedGroupPrefix": "CON", + "name": "S011073", + "originalName": "rect156" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1263.81, + "y": 656.26 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect157", + "inheritedGroupPrefix": "CON", + "name": "S011071", + "originalName": "rect157" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1242.62, + "y": 656.26 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": null, + "id": "rect131", + "name": "S011002", + "originalName": "rect131" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 428.98, + "y": 713.37 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect130", + "inheritedGroupPrefix": "CON", + "name": "S011004", + "originalName": "rect130" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 450.12, + "y": 713.37 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect129", + "inheritedGroupPrefix": "CON", + "name": "S011006", + "originalName": "rect129" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 471.43, + "y": 713.25 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect128", + "inheritedGroupPrefix": "CON", + "name": "S011008", + "originalName": "rect128" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 492.51, + "y": 713.25 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect126", + "inheritedGroupPrefix": "CON", + "name": "S011010", + "originalName": "rect126" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 513.7, + "y": 713.37 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect125", + "inheritedGroupPrefix": "CON", + "name": "S011012", + "originalName": "rect125" + }, + "position": { + "height": 20, + "rotate": { + "angle": 90 + }, + "width": 20, + "x": 534.89, + "y": 713.37 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect125", + "inheritedGroupPrefix": "CON", + "name": "S011009", + "originalName": "rect125" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 513.89, + "y": 656.37 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect126", + "inheritedGroupPrefix": "CON", + "name": "S011007", + "originalName": "rect126" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 492.7, + "y": 656.37 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect128", + "inheritedGroupPrefix": "CON", + "name": "S011005", + "originalName": "rect128" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 471.51, + "y": 656.25 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect129", + "inheritedGroupPrefix": "CON", + "name": "S011003", + "originalName": "rect129" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 450.43, + "y": 656.25 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect130", + "inheritedGroupPrefix": "CON", + "name": "S011001", + "originalName": "rect130" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 429.12, + "y": 656.37 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect93", + "inheritedGroupPrefix": "CON", + "name": "S011041", + "originalName": "rect93" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 880.55, + "y": 655.65 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect226", + "inheritedGroupPrefix": "CON", + "name": "BYAB-4CH", + "originalName": "rect226" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 973.058, + "y": 445.531 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "elementPrefix": "CON", + "forcedPrefix": "CON", + "groupSuffix": "u", + "id": "rect226", + "inheritedGroupPrefix": "CON", + "name": "BYCB-4CH", + "originalName": "rect226" + }, + "position": { + "height": 20, + "rotate": { + "angle": "270deg" + }, + "width": 20, + "x": 1059.3, + "y": 445.53 + }, + "props": { + "path": "Symbol-Views/Equipment-Views/StatusNonPowered" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "MCM01_Button" + }, + "position": { + "height": 47, + "width": 222, + "x": 177.91, + "y": 823.96 + }, + "props": { + "params": { + "pageid": "DetailedView/MCM01 Bulk Inbound", + "panel_id": "value", + "text": "MCM01 Bulk Inbound" + }, + "path": "Custom-Views/Area_Nav_Button" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "MCM02-MCM03_Button" + }, + "position": { + "height": 45.04, + "width": 206.98, + "x": 1449.79, + "y": 850.93 + }, + "props": { + "params": { + "pageid": "DetailedView/MCM02 \u0026 MCM03 Fluid Inbound", + "panel_id": "value", + "text": "MCM02 \u0026 MCM03 Fluid Inbound" + }, + "path": "Custom-Views/Area_Nav_Button" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM16" + }, + "position": { + "height": 20, + "width": 20, + "x": 117, + "y": 524 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM17" + }, + "position": { + "height": 20, + "width": 20, + "x": 158, + "y": 524 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM18" + }, + "position": { + "height": 20, + "width": 20, + "x": 135, + "y": 571 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM19" + }, + "position": { + "height": 20, + "width": 20, + "x": 160.545, + "y": 593 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_FIOM20" + }, + "position": { + "height": 20, + "width": 20, + "x": 135, + "y": 593 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_PB_CH5_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 231, + "y": 548 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "ULC1-7-JR19" + }, + "position": { + "height": 13, + "width": 13, + "x": 233, + "y": 643 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_DTC_CH1_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 89, + "y": 541 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_DTC_CH1_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 89, + "y": 555 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_DTC_CH2_N1" + }, + "position": { + "height": 13, + "width": 13, + "x": 89, + "y": 573 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_DTC_CH3_N1" + }, + "position": { + "height": 13, + "width": 13, + "x": 89, + "y": 597 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01C_DTC_CH4_N1" + }, + "position": { + "height": 13, + "width": 13, + "x": 89, + "y": 620 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_PB_CH5_N1" + }, + "position": { + "height": 13, + "width": 13, + "x": 89, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_PB_CH1_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 89, + "y": 649 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011001_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 419, + "y": 634 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011001_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 435, + "y": 634 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011003_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 454, + "y": 634 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011005_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 472, + "y": 634 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011007_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 491, + "y": 634 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011009_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 508, + "y": 634 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011009_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 523, + "y": 634 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011011_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 541, + "y": 634 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011013_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 561, + "y": 634 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011015_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 582, + "y": 634 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011017_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 601, + "y": 634 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011017_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 617, + "y": 634 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011019_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 635, + "y": 634 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011021_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 657, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011023_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 676, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011025_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 707, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011025_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 691, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011027_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 723, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011029_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 744, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011031_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 765, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011033_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 803.109, + "y": 635.292 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011033_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 787, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011035_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 820, + "y": 636 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011037_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 838, + "y": 636 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011039_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 858, + "y": 636 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S0110341_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 872, + "y": 636 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011041_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 886, + "y": 636 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011043_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 905, + "y": 637 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011045_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 926, + "y": 636 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011049_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 996, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011049_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1011, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011051_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1027, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011053_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1043, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011059_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1081, + "y": 636 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011059_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1096, + "y": 636 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011061_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1112, + "y": 636 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011063_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1128, + "y": 636 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011067_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1212, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011069_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1228, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011065_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1196, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011065_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1181, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011071_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1247, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011073_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1267, + "y": 635 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011002_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 420, + "y": 742 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011002_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 436, + "y": 742 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011004_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 455, + "y": 742 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011006_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 473, + "y": 742 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011008_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 492, + "y": 742 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S0110010_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 509, + "y": 742 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011010_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 524, + "y": 742 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011012_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 542, + "y": 742 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011014_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 562, + "y": 742 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011016_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 583, + "y": 742 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM1" + }, + "position": { + "height": 20, + "width": 20, + "x": 443, + "y": 685 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM2" + }, + "position": { + "height": 20, + "width": 20, + "x": 456, + "y": 685 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM3" + }, + "position": { + "height": 20, + "width": 20, + "x": 548, + "y": 685 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM4" + }, + "position": { + "height": 20, + "width": 20, + "x": 562, + "y": 685 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM5" + }, + "position": { + "height": 20, + "width": 20, + "x": 576, + "y": 685 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM6" + }, + "position": { + "height": 20, + "width": 20, + "x": 611, + "y": 685 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM7" + }, + "position": { + "height": 20, + "width": 20, + "x": 625, + "y": 685 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM8" + }, + "position": { + "height": 20, + "width": 20, + "x": 742, + "y": 684 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM9" + }, + "position": { + "height": 20, + "width": 20, + "x": 757, + "y": 684 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM10" + }, + "position": { + "height": 20, + "width": 20, + "x": 796, + "y": 684 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM11" + }, + "position": { + "height": 20, + "width": 20, + "x": 812, + "y": 684 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM12" + }, + "position": { + "height": 20, + "width": 20, + "x": 888, + "y": 684 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM13" + }, + "position": { + "height": 20, + "width": 20, + "x": 903, + "y": 684 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM14" + }, + "position": { + "height": 20, + "width": 20, + "x": 919, + "y": 684 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM15" + }, + "position": { + "height": 20, + "width": 20, + "x": 1017, + "y": 685 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM16" + }, + "position": { + "height": 20, + "width": 20, + "x": 1033, + "y": 685 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM17" + }, + "position": { + "height": 20, + "width": 20, + "x": 1096, + "y": 685 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM18" + }, + "position": { + "height": 20, + "width": 20, + "x": 1112, + "y": 685 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM19" + }, + "position": { + "height": 20, + "width": 20, + "x": 1183, + "y": 686 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM20" + }, + "position": { + "height": 20, + "width": 20, + "x": 1217, + "y": 686 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM21" + }, + "position": { + "height": 20, + "width": 20, + "x": 1242, + "y": 685 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM22" + }, + "position": { + "height": 20, + "width": 20, + "x": 1265, + "y": 685 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "VS01A_FIOM23" + }, + "position": { + "height": 20, + "width": 20, + "x": 1287, + "y": 710 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/PS3_3_JR1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Device-Views/DeviceStatus" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011074_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1272, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011074_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1257, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011072_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1241, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011070_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1223, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011068_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1201, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011066_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1180, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011064_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1131, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011062_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1111, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011060_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1092, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011058_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1077, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011058_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1063, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011056_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1046, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011054_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1024, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011052_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 1003, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011050_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 987, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011050_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 971, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "DPM01_VS01A" + }, + "position": { + "height": 15, + "rotate": { + "angle": 0 + }, + "width": 30, + "x": 508.1962014160156, + "y": 616.01 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/ControlCabinet/UL17_DPM1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/ControlCabinet" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "DPM02_VS01A" + }, + "position": { + "height": 15, + "rotate": { + "angle": 0 + }, + "width": 30, + "x": 685, + "y": 617 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/ControlCabinet/UL17_DPM1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/ControlCabinet" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "DPM03_VS01A" + }, + "position": { + "height": 15, + "rotate": { + "angle": 0 + }, + "width": 30, + "x": 845, + "y": 617 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/ControlCabinet/UL17_DPM1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/ControlCabinet" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "DPM02_VS01C" + }, + "position": { + "height": 15, + "rotate": { + "angle": 0 + }, + "width": 30, + "x": 165, + "y": 659 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/ControlCabinet/UL17_DPM1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/ControlCabinet" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "DPM04_VS01A" + }, + "position": { + "height": 15, + "rotate": { + "angle": 0 + }, + "width": 30, + "x": 1013, + "y": 616 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/ControlCabinet/UL17_DPM1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/ControlCabinet" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "DPM05_VS01A" + }, + "position": { + "height": 15, + "rotate": { + "angle": 0 + }, + "width": 30, + "x": 1218, + "y": 617 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/ControlCabinet/UL17_DPM1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/ControlCabinet" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "MCM04" + }, + "position": { + "height": 15, + "rotate": { + "angle": 0 + }, + "width": 30, + "x": 713, + "y": 759 + }, + "props": { + "params": { + "directionLeft": false, + "forceFaultStatus": null, + "forceRunningStatus": null, + "tagProps": [ + "System/MCM02/ControlCabinet/UL17_DPM1", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/ControlCabinet" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011018_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 606, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011018_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 621, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011020_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 639, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011022_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 658, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011024_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 676, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011026_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 691, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011026_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 706, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011028_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 723, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011030_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 743, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011032_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 765, + "y": 743 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011034_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 785, + "y": 744 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011034_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 799, + "y": 744 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011036_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 815, + "y": 744 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011038_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 836, + "y": 744 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011040_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 855, + "y": 744 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011042_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 871, + "y": 744 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011042_JR1" + }, + "position": { + "height": 13, + "width": 13, + "x": 886, + "y": 744 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011044_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 905, + "y": 744 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011046_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 924, + "y": 744 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "S011048_EN1" + }, + "position": { + "height": 13, + "width": 13, + "x": 944, + "y": 744 + }, + "props": { + "params": { + "forceFaultStatus": null, + "forceRunningStatus": null, + "has_state": false, + "tagProps": [ + "System/MCM01/Estop/UL7_3_S2", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "path": "Symbol-Views/Equipment-Views/Estop" + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "root" + }, + "props": { + "style": { + "backgroundColor": "#FFFFFF" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/.resources/cb256c897d139582c611d76f3c512eaece1450eb4666090c905a5902048894f5 b/.resources/cb256c897d139582c611d76f3c512eaece1450eb4666090c905a5902048894f5 new file mode 100644 index 0000000..ed00255 --- /dev/null +++ b/.resources/cb256c897d139582c611d76f3c512eaece1450eb4666090c905a5902048894f5 @@ -0,0 +1,58 @@ +{ + "custom": {}, + "params": {}, + "props": {}, + "root": { + "children": [ + { + "meta": { + "name": "Icon" + }, + "position": { + "height": 100, + "width": 101, + "x": 148, + "y": 179 + }, + "props": { + "color": "#AC0065", + "path": "material/location_on", + "style": { + "backgroundImage": "", + "classes": "State-Styles/AAA-Style", + "fill": "url(\"/system/images/Backgrounds/hexagons1.svg\")" + } + }, + "type": "ia.display.icon" + }, + { + "meta": { + "name": "Dropdown" + }, + "position": { + "height": 63, + "width": 325, + "x": 157, + "y": 72 + }, + "props": { + "options": [ + { + "label": "This is selected", + "value": "This is selected" + } + ], + "placeholder": { + "text": "" + }, + "value": "This is selected" + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "root" + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/.resources/cb7fed479e2ef8b5bfa6fa83bec3d20863d75dc3281c96429026bd570e3e5096 b/.resources/cb7fed479e2ef8b5bfa6fa83bec3d20863d75dc3281c96429026bd570e3e5096 new file mode 100644 index 0000000..8f56c7d --- /dev/null +++ b/.resources/cb7fed479e2ef8b5bfa6fa83bec3d20863d75dc3281c96429026bd570e3e5096 @@ -0,0 +1,123 @@ +{ + "custom": {}, + "params": { + "breakpointLarge": 768, + "breakpointMedium": 480, + "params": {}, + "path": "Header/Header" + }, + "propConfig": { + "params.breakpointLarge": { + "paramDirection": "input", + "persistent": true + }, + "params.breakpointMedium": { + "paramDirection": "input", + "persistent": true + }, + "params.params": { + "paramDirection": "input", + "persistent": true + }, + "params.path": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 58, + "width": 818 + } + }, + "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": "large" + } + }, + "type": "ia.display.view" + }, + { + "meta": { + "name": "Small" + }, + "propConfig": { + "props.params.breakpoint": { + "binding": { + "config": { + "path": "view.params.breakpointMedium" + }, + "type": "property" + } + }, + "props.params.params": { + "binding": { + "config": { + "path": "view.params.params" + }, + "type": "property" + } + }, + "props.params.path": { + "binding": { + "config": { + "path": "view.params.path" + }, + "type": "property" + } + } + }, + "props": { + "path": "Framework/Breakpoint Embedded" + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "root" + }, + "propConfig": { + "props.breakpoint": { + "binding": { + "config": { + "path": "view.params.breakpointLarge" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "backgroundColor": "#2B2B2B" + } + }, + "type": "ia.container.breakpt" + } +} \ No newline at end of file diff --git a/.resources/cbfa32673e62fbc4b2e33c1e10f352026a2a9faf34c4080472f93d873fff24ef b/.resources/cbfa32673e62fbc4b2e33c1e10f352026a2a9faf34c4080472f93d873fff24ef new file mode 100644 index 0000000..e772522 --- /dev/null +++ b/.resources/cbfa32673e62fbc4b2e33c1e10f352026a2a9faf34c4080472f93d873fff24ef @@ -0,0 +1,598 @@ +{ + "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": 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.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": { + "props.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": [ + { + "elements": [ + { + "d": "M 50.120001,25 C 50.827803,42.132141 31.110082,55.307098 15.552912,48.096988 -0.54598581,42.194727 -5.1724173,18.93609 7.4423281,7.3223305 18.432808,-4.6472699 39.878022,-1.2374264 47.061975,13.018775 49.062621,16.67345 50.124426,20.833557 50.120001,25 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 1.5 + }, + "type": "path" + }, + { + "d": "m 18.74,8 c 4.25,0 8.5,0 12.75,0 0,0.5666667 0,1.1333333 0,1.7 -4.25,0 -8.5,0 -12.75,0 0,-0.5666667 0,-1.1333333 0,-1.7 z m 0,2.68 c 4.25,0 8.5,0 12.75,0 0,0.566667 0,1.133333 0,1.7 -4.25,0 -8.5,0 -12.75,0 0,-0.566667 0,-1.133333 0,-1.7 z m 0,2.69 c 4.25,0 8.5,0 12.75,0 0,0.566667 0,1.133333 0,1.7 -4.25,0 -8.5,0 -12.75,0 0,-0.566667 0,-1.133333 0,-1.7 z m 0,2.679999 c 4.25,0 8.5,0 12.75,0 0,0.566667 0,1.133333 0,1.7 -4.25,0 -8.5,0 -12.75,0 0,-0.566667 0,-1.133333 0,-1.7 z M 31.5,18.73 c -0.426667,3.296667 -0.853333,6.593333 -1.28,9.89 -3.4,0 -6.8,0 -10.2,0 -0.423333,-3.296667 -0.846667,-6.593333 -1.27,-9.89 4.25,0 8.5,0 12.75,0 z m 0,13.39 c -0.426667,3.296667 -0.853333,6.593333 -1.28,9.89 -3.4,0 -6.8,0 -10.2,0 -0.423333,-3.296667 -0.846667,-6.593333 -1.27,-9.89 4.25,0 8.5,0 12.75,0 z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 0.5 + }, + "type": "path" + }, + { + "d": "m 10.24,8 c 1.416667,0 2.833333,0 4.25,0 0,11.333333 0,22.666667 0,34 -1.416667,0 -2.833333,0 -4.25,0 0,-11.333333 0,-22.666667 0,-34 z m 4.25,12.75 c 7.083333,0 14.166667,0 21.25,0 0,0.566667 0,1.133333 0,1.7 -7.083333,0 -14.166667,0 -21.25,0 0,-0.566667 0,-1.133333 0,-1.7 z M 35.740002,8 c 1.416667,0 2.833333,0 4.25,0 0,11.333333 0,22.666667 0,34 -1.416667,0 -2.833333,0 -4.25,0 0,-11.333333 0,-22.666667 0,-34 z", + "fill": { + "paint": "#000000" + }, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 0.5 + }, + "type": "path" + } + ], + "transform": "matrix(0.98146771,0,0,0.97925914,0.29387469,0.4508585)", + "type": "group" + } + ], + "style": { + "overflow": "hidden" + }, + "viewBox": "-0.5 -0.5 51 51" + }, + "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/.resources/cca63b54da8169908a9315279984cfbd07bf26ff984ce5c2f7ded3790a5d9e01 b/.resources/cca63b54da8169908a9315279984cfbd07bf26ff984ce5c2f7ded3790a5d9e01 new file mode 100644 index 0000000..c742d8d --- /dev/null +++ b/.resources/cca63b54da8169908a9315279984cfbd07bf26ff984ce5c2f7ded3790a5d9e01 @@ -0,0 +1,32559 @@ +{ + "custom": {}, + "params": { + "Tab_ID": 6, + "Table": "Statistics" + }, + "propConfig": { + "params.Tab_ID": { + "binding": { + "config": { + "path": "/root/Statistics.props.currentTabIndex" + }, + "type": "property" + }, + "paramDirection": "output", + "persistent": true + }, + "params.Table": { + "binding": { + "config": { + "path": "/root/Statistics.meta.name" + }, + "type": "property" + }, + "paramDirection": "output", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 930, + "width": 1920 + } + }, + "root": { + "children": [ + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Hourly_Scanner" + }, + "position": { + "basis": "50%" + }, + "propConfig": { + "custom.mode": { + "binding": { + "config": { + "expression": "{..../Statistics.props.currentTabIndex} + {..../Period_not_Global_0/Period.props.value} + {..../Period_not_Global_0/EndTime.custom.Selected}+{..../Period_not_Global_0/StartTime.custom.Selected} + {this.custom.time} + {..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value}" + }, + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": "\t\t\t\n\t\t\t\t\n\tpath \u003d \"\"\n\theaders \u003d []\n\tgraph \u003d []\n\t\n\tif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\tpath \u003d \"Statistics/Hourly Scanner Count\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (#)\",\"Good Read (#)\",\"No Read (#)\",\"Multi Read (#)\",\"No Code (#)\"]\n\t\tself.getSibling(\"Hourly Scanner\").props.series[0].tooltip.text \u003d \"Good Read (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Scanner\").props.series[1].tooltip.text \u003d \"No Read (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Scanner\").props.series[2].tooltip.text \u003d \"Multi Read (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Scanner\").props.series[3].tooltip.text \u003d \"No Code (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Scanner\").props.yAxes[0].value.range.max \u003d \"\"\n\telif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\tpath \u003d \"Statistics/Hourly Scanner Percent\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (%)\",\"Good Read (%)\",\"No Read (%)\",\"Multi Read (%)\",\"No Code (%)\"]\n\t\tself.getSibling(\"Hourly Scanner\").props.series[0].tooltip.text \u003d \"Good Read (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Scanner\").props.series[1].tooltip.text \u003d \"No Read (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Scanner\").props.series[2].tooltip.text \u003d \"Multi Read (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Scanner\").props.series[3].tooltip.text \u003d \"No Code (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Scanner\").props.yAxes[0].value.range.max \u003d 100\n\telse:\n\t\tpath \u003d \"Statistics/Hourly Scanner Rate\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (pph)\",\"Good Read (pph)\",\"No Read (pph)\",\"Multi Read (pph)\",\"No Code (pph)\"]\n\t\tself.getSibling(\"Hourly Scanner\").props.series[0].tooltip.text \u003d \"Good Read (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Scanner\").props.series[1].tooltip.text \u003d \"No Read (pph): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Scanner\").props.series[2].tooltip.text \u003d \"Multi Read (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Scanner\").props.series[3].tooltip.text \u003d \"No Code (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Scanner\").props.yAxes[0].value.range.max \u003d \"\"\n\t\t\n\tparams \u003d {\"starttime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.StartDate,\"endtime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.EndDate}\n\t\n\tdata \u003d system.dataset.toPyDataSet(system.db.runNamedQuery(path,params))\n\tfor row in data:\t\n\t\tdict \u003d {}\n\t\tdict[\u0027Hour\u0027] \u003d \trow[\u0027Hour\u0027]\n\t\tdict[\u0027GoodRead\u0027] \u003d row[\u0027GoodRead\u0027]\n\t\tdict[\u0027NoRead\u0027] \u003d row[\u0027NoRead\u0027]\n\t\tdict[\u0027MultiRead\u0027] \u003d row[\u0027MultiRead\u0027]\n\t\tdict[\u0027NoCode\u0027] \u003d row[\u0027NoCode\u0027]\n\t\tgraph.append(dict)\n\t\n\t\n\tself.getSibling(\"Hourly Scanner\").props.dataSources.example \u003d graph\n\tself.props.data \u003d system.dataset.toDataSet(headers,data)" + } + }, + "custom.time": { + "binding": { + "config": { + "expression": "now(10000000)" + }, + "type": "expr" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "", + "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 HH:mm:ss", + "editable": false, + "field": "endt", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Start Timestamp" + }, + "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": "date", + "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 HH:mm:ss", + "editable": false, + "field": "rownumber", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Hour" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Total_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Total (#)" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "GoodRead_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Good Read (#)" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "NoRead_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "No Read (#)" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "MultiLabelRead_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Multi Read (#)" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "NoCode_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "No Code (#)" + }, + "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": "" + } + ], + "data": { + "$": [ + "ds", + 192, + 1699296819952 + ], + "$columns": [ + { + "data": [ + "2023-11-06 9:00", + "2023-11-06 10:00" + ], + "name": "Start Timestamp", + "type": "String" + }, + { + "data": [ + "H1", + "H0" + ], + "name": "Hour", + "type": "String" + }, + { + "data": [ + 362, + 5956 + ], + "name": "Total (#)", + "type": "Long" + }, + { + "data": [ + 332, + 5458 + ], + "name": "Good Read (#)", + "type": "Double" + }, + { + "data": [ + 13, + 225 + ], + "name": "No Read (#)", + "type": "Double" + }, + { + "data": [ + 16, + 271 + ], + "name": "Multi Read (#)", + "type": "Double" + }, + { + "data": [ + 1, + 2 + ], + "name": "No Code (#)", + "type": "Double" + } + ] + }, + "filter": { + "enabled": true, + "results": { + "enabled": true + } + }, + "pager": { + "bottom": false + }, + "rows": { + "data": {} + }, + "virtualized": false + }, + "type": "ia.display.table" + }, + { + "meta": { + "name": "Hourly Scanner" + }, + "position": { + "basis": "50%" + }, + "props": { + "dataSources": { + "example": [ + { + "GoodRead": 332, + "Hour": "H1", + "MultiRead": 16, + "NoCode": 1, + "NoRead": 13 + }, + { + "GoodRead": 5458, + "Hour": "H0", + "MultiRead": 271, + "NoCode": 2, + "NoRead": 225 + } + ] + }, + "series": [ + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "GoodRead" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Good Read" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "GoodRead", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Good Read (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Reads", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "#FF0000", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "#FF0000", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "NoRead" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "No Read" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "NoRead", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "No Read (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Reads", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "#FF8C00", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "#FF8C00", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "MultiRead" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "MultiRead" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "MultiRead", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Multi Read (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Reads", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "#00FF00", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "#00FF00", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "NoCode" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "No Code" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "NoCode", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "No Code (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Reads", + "zIndex": 0 + } + ], + "xAxes": [ + { + "appearance": { + "font": { + "size": "", + "weight": 500 + }, + "grid": { + "color": "", + "dashArray": "", + "minDistance": 60, + "opacity": 1, + "position": 0.5 + }, + "inside": false, + "labels": { + "color": "", + "horizontalCenter": "middle", + "opacity": 1, + "rotation": 0, + "verticalCenter": "middle" + }, + "opposite": false + }, + "category": { + "break": { + "enabled": false, + "endCategory": "", + "size": 0.05, + "startCategory": "" + } + }, + "date": { + "baseInterval": { + "count": 1, + "enabled": false, + "skipEmptyPeriods": false, + "timeUnit": "hour" + }, + "break": { + "enabled": false, + "endDate": "", + "size": 0.05, + "startDate": "" + }, + "format": "M/d", + "inputFormat": "yyyy-MM-dd kk:mm:ss", + "range": { + "max": "", + "min": "", + "useStrict": true + } + }, + "inversed": false, + "label": { + "color": "", + "enabled": true, + "text": "Hour" + }, + "name": "Hour", + "render": "category", + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "" + }, + "value": { + "break": { + "enabled": false, + "endValue": 100, + "size": 0.05, + "startValue": 0 + }, + "format": "#,###.##", + "logarithmic": false, + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "visible": true + } + ], + "yAxes": [ + { + "appearance": { + "font": { + "size": "", + "weight": 500 + }, + "grid": { + "color": "", + "dashArray": "", + "minDistance": null, + "opacity": 1, + "position": 0.5 + }, + "inside": false, + "labels": { + "color": "", + "horizontalCenter": "middle", + "opacity": 1, + "rotation": 0, + "verticalCenter": "middle" + }, + "opposite": false + }, + "category": { + "break": { + "enabled": false, + "endCategory": "", + "size": 0.05, + "startCategory": "" + } + }, + "date": { + "baseInterval": { + "count": 1, + "enabled": false, + "skipEmptyPeriods": false, + "timeUnit": "hour" + }, + "break": { + "enabled": false, + "endDate": "", + "size": 0.05, + "startDate": "" + }, + "format": "M/d/yyyy HH:mm:ss", + "inputFormat": "yyyy-MM-dd kk:mm:ss", + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "inversed": false, + "label": { + "color": "", + "enabled": true, + "text": "" + }, + "name": "Reads", + "render": "value", + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "" + }, + "value": { + "break": { + "enabled": false, + "endValue": 100, + "size": 0.05, + "startValue": 0 + }, + "format": "#,###.##", + "logarithmic": false, + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "visible": true + } + ] + }, + "type": "ia.chart.xy" + } + ], + "meta": { + "name": "Hourly_Scanner" + }, + "position": { + "tabIndex": 6 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Hourly_Induct" + }, + "position": { + "basis": "50%" + }, + "propConfig": { + "custom.mode": { + "binding": { + "config": { + "expression": "{..../Statistics.props.currentTabIndex} + {..../Period_not_Global_0/Period.props.value} + {..../Period_not_Global_0/EndTime.custom.Selected}+{..../Period_not_Global_0/StartTime.custom.Selected} + {this.custom.time} + {..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value}" + }, + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": "\t\n\tpath \u003d \"\"\n\theaders \u003d []\n\tgraph \u003d []\n\t\n\tif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\tpath \u003d \"Statistics/Hourly Induct Count\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (#)\",\"Single Carrier (#)\",\"Double Carrier (#)\"]\n\t\tself.getSibling(\"Hourly Induct\").props.series[0].tooltip.text \u003d \"Single Carrier (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Induct\").props.series[1].tooltip.text \u003d \"Double Carrier (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Induct\").props.yAxes[0].value.range.max \u003d \"\"\n\telif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\tpath \u003d \"Statistics/Hourly Induct Percent\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (%)\",\"Single Carrier (%)\",\"Double Carrier (%)\"]\n\t\tself.getSibling(\"Hourly Induct\").props.series[0].tooltip.text \u003d \"Single Carrier (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Induct\").props.series[1].tooltip.text \u003d \"Double Carrier (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Induct\").props.yAxes[0].value.range.max \u003d 100\n\telse:\n\t\tpath \u003d \"Statistics/Hourly Induct Rate\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (pph)\",\"Single Carrier (pph)\",\"Double Carrier (pph)\"]\n\t\tself.getSibling(\"Hourly Induct\").props.series[0].tooltip.text \u003d \"Single Carrier (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Induct\").props.series[1].tooltip.text \u003d \"Double Carrier (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Induct\").props.yAxes[0].value.range.max \u003d \"\"\n\t\t\n\tparams \u003d {\"starttime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.StartDate,\"endtime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.EndDate}\n\t\n\tdata \u003d system.dataset.toPyDataSet(system.db.runNamedQuery(path,params))\n\tfor row in data:\t\n\t\tdict \u003d {}\n\t\tdict[\u0027Hour\u0027] \u003d \trow[\u0027Hour\u0027]\n\t\tdict[\u0027SingleCarrier\u0027] \u003d row[\u0027SingleCarrier\u0027]\n\t\tdict[\u0027DoubleCarrier\u0027] \u003d row[\u0027DoubleCarrier\u0027]\n\t\tgraph.append(dict)\n\t\n\t\n\tself.getSibling(\"Hourly Induct\").props.dataSources.example \u003d graph\n\tself.props.data \u003d system.dataset.toDataSet(headers,data)" + } + }, + "custom.time": { + "binding": { + "config": { + "expression": "now(10000000)" + }, + "type": "expr" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "StartTimestamp", + "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 hh:mm:ss", + "editable": false, + "field": "", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "" + }, + "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": "date", + "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 HH:mm:ss", + "editable": false, + "field": "", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "center", + "number": "value", + "numberFormat": "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, + 1699296823712 + ], + "$columns": [ + { + "data": [ + "2023-11-06 9:00", + "2023-11-06 10:00" + ], + "name": "Start Timestamp", + "type": "String" + }, + { + "data": [ + "H1", + "H0" + ], + "name": "Hour", + "type": "String" + }, + { + "data": [ + 351, + 5956 + ], + "name": "Total (#)", + "type": "Long" + }, + { + "data": [ + 341, + 5738 + ], + "name": "Single Carrier (#)", + "type": "Double" + }, + { + "data": [ + 9, + 209 + ], + "name": "Double Carrier (#)", + "type": "Double" + } + ] + }, + "filter": { + "enabled": true, + "results": { + "enabled": true + } + }, + "pager": { + "bottom": false + }, + "rows": { + "data": {} + }, + "selection": { + "data": [ + { + "Double Carrier (#)": 209, + "Hour": "H0", + "Single Carrier (#)": 5738, + "Start Timestamp": "2023-11-06 10:00", + "Total (#)": 5956 + } + ], + "selectedRow": 1 + }, + "style": { + "fontFamily": "Arial" + }, + "virtualized": false + }, + "type": "ia.display.table" + }, + { + "meta": { + "name": "Hourly Induct" + }, + "position": { + "basis": "50%" + }, + "props": { + "dataSources": { + "example": [ + { + "DoubleCarrier": 9, + "Hour": "H1", + "SingleCarrier": 341 + }, + { + "DoubleCarrier": 209, + "Hour": "H0", + "SingleCarrier": 5738 + } + ] + }, + "series": [ + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "SingleCarrier" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Single Carrier" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "SingleCarrier", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Single Carrier (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Carriers", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "#FF0000", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "#FF0000", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "DoubleCarrier" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Double Carrier" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "NoRead", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Double Carrier (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Carriers", + "zIndex": 0 + } + ], + "xAxes": [ + { + "appearance": { + "font": { + "size": "", + "weight": 500 + }, + "grid": { + "color": "", + "dashArray": "", + "minDistance": 60, + "opacity": 1, + "position": 0.5 + }, + "inside": false, + "labels": { + "color": "", + "horizontalCenter": "middle", + "opacity": 1, + "rotation": 0, + "verticalCenter": "middle" + }, + "opposite": false + }, + "category": { + "break": { + "enabled": false, + "endCategory": "", + "size": 0.05, + "startCategory": "" + } + }, + "date": { + "baseInterval": { + "count": 1, + "enabled": false, + "skipEmptyPeriods": false, + "timeUnit": "hour" + }, + "break": { + "enabled": false, + "endDate": "", + "size": 0.05, + "startDate": "" + }, + "format": "M/d", + "inputFormat": "yyyy-MM-dd kk:mm:ss", + "range": { + "max": "", + "min": "", + "useStrict": true + } + }, + "inversed": false, + "label": { + "color": "", + "enabled": true, + "text": "Hour" + }, + "name": "Hour", + "render": "category", + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "" + }, + "value": { + "break": { + "enabled": false, + "endValue": 100, + "size": 0.05, + "startValue": 0 + }, + "format": "#,###.##", + "logarithmic": false, + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "visible": true + } + ], + "yAxes": [ + { + "appearance": { + "font": { + "size": "", + "weight": 500 + }, + "grid": { + "color": "", + "dashArray": "", + "minDistance": null, + "opacity": 1, + "position": 0.5 + }, + "inside": false, + "labels": { + "color": "", + "horizontalCenter": "middle", + "opacity": 1, + "rotation": 0, + "verticalCenter": "middle" + }, + "opposite": false + }, + "category": { + "break": { + "enabled": false, + "endCategory": "", + "size": 0.05, + "startCategory": "" + } + }, + "date": { + "baseInterval": { + "count": 1, + "enabled": false, + "skipEmptyPeriods": false, + "timeUnit": "hour" + }, + "break": { + "enabled": false, + "endDate": "", + "size": 0.05, + "startDate": "" + }, + "format": "M/d/yyyy HH:mm:ss", + "inputFormat": "yyyy-MM-dd kk:mm:ss", + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "inversed": false, + "label": { + "color": "", + "enabled": true, + "text": "" + }, + "name": "Carriers", + "render": "value", + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "" + }, + "value": { + "break": { + "enabled": false, + "endValue": 100, + "size": 0.05, + "startValue": 0 + }, + "format": "#,###.##", + "logarithmic": false, + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "visible": true + } + ] + }, + "type": "ia.chart.xy" + } + ], + "meta": { + "name": "Hourly_Induct" + }, + "position": { + "tabIndex": 5 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Hourly_Sorter_Summary" + }, + "position": { + "basis": "50%" + }, + "propConfig": { + "custom.mode": { + "binding": { + "config": { + "expression": "{..../Statistics.props.currentTabIndex} + {..../Period_not_Global_0/Period.props.value} + {..../Period_not_Global_0/EndTime.custom.Selected}+{..../Period_not_Global_0/StartTime.custom.Selected} + {this.custom.time} + {..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value}" + }, + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": "\t\n\tpath \u003d \"\"\n\theaders \u003d []\n\tgraph \u003d []\n\t\n\tif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\tpath \u003d \"Statistics/Hourly Sorter Summary Count\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Inducted (#)\",\"Sorted (#)\",\"Awcs Recirc (#)\",\"Operational Recirc (#)\",\"Machine Recirc (#)\"]\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[0].tooltip.text \u003d \"Sorted (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[1].tooltip.text \u003d \"Awcs Recirc (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[2].tooltip.text \u003d \"Operational Recirc (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[3].tooltip.text \u003d \"Machine Recirc (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.yAxes[0].value.range.max \u003d \"\"\n\telif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\tpath \u003d \"Statistics/Hourly Sorter Summary Percent\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Inducted (%)\",\"Sorted (%)\",\"Awcs Recirc (%)\",\"Operational Recirc (%)\",\"Machine Recirc (%)\"]\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[0].tooltip.text \u003d \"Sorted (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[1].tooltip.text \u003d \"Awcs Recirc (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[2].tooltip.text \u003d \"Operational Recirc (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[3].tooltip.text \u003d \"Machine Recirc (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.yAxes[0].value.range.max \u003d 100\n\telse:\n\t\tpath \u003d \"Statistics/Hourly Sorter Summary Rate\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Inducted (pph)\",\"Sorted (pph)\",\"Awcs Recirc (pph)\",\"Operational Recirc (pph)\",\"Machine Recirc (pph)\"]\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[0].tooltip.text \u003d \"Sorted (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[1].tooltip.text \u003d \"Awcs Recirc (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[2].tooltip.text \u003d \"Operational Recirc (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.series[3].tooltip.text \u003d \"Machine Recirc (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Sorter Summary\").props.yAxes[0].value.range.max \u003d \"\"\n\t\t\n\tparams \u003d {\"starttime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.StartDate,\"endtime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.EndDate}\n\t\n\tdata \u003d system.dataset.toPyDataSet(system.db.runNamedQuery(path,params))\n\tfor row in data:\t\n\t\tdict \u003d {}\n\t\tdict[\u0027Hour\u0027] \u003d \trow[\u0027Hour\u0027]\n\t\tdict[\u0027Sorted\u0027] \u003d row[\u0027Sorted\u0027]\n\t\tdict[\u0027AwcsRecirc\u0027] \u003d row[\u0027AwcsRecirc\u0027]\n\t\tdict[\u0027OperationalRecirc\u0027] \u003d row[\u0027OperationalRecirc\u0027]\n\t\tdict[\u0027MachineRecirc\u0027] \u003d row[\u0027MachineRecirc\u0027]\n\t\tgraph.append(dict)\n\t\n\t\n\tself.getSibling(\"Hourly Sorter Summary\").props.dataSources.example \u003d graph\n\tself.props.data \u003d system.dataset.toDataSet(headers,data)" + } + }, + "custom.time": { + "binding": { + "config": { + "expression": "now(10000000)" + }, + "type": "expr" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "", + "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 HH:mm:ss", + "editable": false, + "field": "endt", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Start Timestamp" + }, + "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": "date", + "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 HH:mm:ss", + "editable": false, + "field": "rownumber", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Hour" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Induct_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Induct (%)" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Sorted_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Sorted (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "AWCSRecirc_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "AWCS Recirculate (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "OperRecirc_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Operational Recirculate (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "MachineRecirc_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Machine Recirculate (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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, + 1699296819972 + ], + "$columns": [ + { + "data": [ + "2023-11-06 9:00", + "2023-11-06 10:00" + ], + "name": "Start Timestamp", + "type": "String" + }, + { + "data": [ + "H1", + "H0" + ], + "name": "Hour", + "type": "String" + }, + { + "data": [ + 362, + 5956 + ], + "name": "Inducted (#)", + "type": "Long" + }, + { + "data": [ + 349, + 5891 + ], + "name": "Sorted (#)", + "type": "Double" + }, + { + "data": [ + 0, + 2 + ], + "name": "Awcs Recirc (#)", + "type": "Double" + }, + { + "data": [ + 0, + 17 + ], + "name": "Operational Recirc (#)", + "type": "Double" + }, + { + "data": [ + 13, + 46 + ], + "name": "Machine Recirc (#)", + "type": "Double" + } + ] + }, + "filter": { + "enabled": true, + "results": { + "enabled": true + } + }, + "pager": { + "bottom": false + }, + "rows": { + "data": {} + } + }, + "type": "ia.display.table" + }, + { + "meta": { + "name": "Hourly Sorter Summary" + }, + "position": { + "basis": "50%" + }, + "props": { + "dataSources": { + "example": [ + { + "AwcsRecirc": 0, + "Hour": "H1", + "MachineRecirc": 13, + "OperationalRecirc": 0, + "Sorted": 349 + }, + { + "AwcsRecirc": 2, + "Hour": "H0", + "MachineRecirc": 46, + "OperationalRecirc": 17, + "Sorted": 5891 + } + ] + }, + "series": [ + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "Sorted" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Sorted" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "Sorted", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Sorted (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Induct", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "#FF0000", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "#FF0000", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "AwcsRecirc" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Operational Recirculator" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "AwcsRecirc", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Awcs Recirc (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Induct", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "#FF8C00", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "#FF8C00", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "OperationalRecirc" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "AWCS Recirculator" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "OperationalRecirc", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Operational Recirc (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Induct", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "#00FF00", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "#00FF00", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "MachineRecirc" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Machine Recirculator" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "MachineRecirc", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Machine Recirc (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Induct", + "zIndex": 0 + } + ], + "xAxes": [ + { + "appearance": { + "font": { + "size": "", + "weight": 500 + }, + "grid": { + "color": "", + "dashArray": "", + "minDistance": 60, + "opacity": 1, + "position": 0.5 + }, + "inside": false, + "labels": { + "color": "", + "horizontalCenter": "middle", + "opacity": 1, + "rotation": 0, + "verticalCenter": "middle" + }, + "opposite": false + }, + "category": { + "break": { + "enabled": false, + "endCategory": "", + "size": 0.05, + "startCategory": "" + } + }, + "date": { + "baseInterval": { + "count": 1, + "enabled": false, + "skipEmptyPeriods": false, + "timeUnit": "hour" + }, + "break": { + "enabled": false, + "endDate": "", + "size": 0.05, + "startDate": "" + }, + "format": "M/d", + "inputFormat": "yyyy-MM-dd kk:mm:ss", + "range": { + "max": "", + "min": "", + "useStrict": true + } + }, + "inversed": false, + "label": { + "color": "", + "enabled": true, + "text": "Hour" + }, + "name": "Hour", + "render": "category", + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "" + }, + "value": { + "break": { + "enabled": false, + "endValue": 100, + "size": 0.05, + "startValue": 0 + }, + "format": "#,###.##", + "logarithmic": false, + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "visible": true + } + ], + "yAxes": [ + { + "appearance": { + "font": { + "size": "", + "weight": 500 + }, + "grid": { + "color": "", + "dashArray": "", + "minDistance": null, + "opacity": 1, + "position": 0.5 + }, + "inside": false, + "labels": { + "color": "", + "horizontalCenter": "middle", + "opacity": 1, + "rotation": 0, + "verticalCenter": "middle" + }, + "opposite": false + }, + "category": { + "break": { + "enabled": false, + "endCategory": "", + "size": 0.05, + "startCategory": "" + } + }, + "date": { + "baseInterval": { + "count": 1, + "enabled": false, + "skipEmptyPeriods": false, + "timeUnit": "hour" + }, + "break": { + "enabled": false, + "endDate": "", + "size": 0.05, + "startDate": "" + }, + "format": "M/d/yyyy HH:mm:ss", + "inputFormat": "yyyy-MM-dd kk:mm:ss", + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "inversed": false, + "label": { + "color": "", + "enabled": true, + "text": "" + }, + "name": "Induct", + "render": "value", + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "" + }, + "value": { + "break": { + "enabled": false, + "endValue": 100, + "size": 0.05, + "startValue": 0 + }, + "format": "#,###.##", + "logarithmic": false, + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "visible": true + } + ] + }, + "type": "ia.chart.xy" + } + ], + "meta": { + "name": "Hourly_Sorter_Summary" + }, + "position": { + "tabIndex": 7 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Hourly_Sorter_Details" + }, + "position": { + "basis": "50%" + }, + "propConfig": { + "custom.mode": { + "binding": { + "config": { + "expression": "{..../Statistics.props.currentTabIndex} + {..../Period_not_Global_0/Period.props.value} + {..../Period_not_Global_0/EndTime.custom.Selected}+{..../Period_not_Global_0/StartTime.custom.Selected} + {this.custom.time} + {..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value}" + }, + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": "\t\n\tpath \u003d \"\"\n\theaders \u003d []\n\tgraph \u003d []\n\t\n\tif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\tpath \u003d \"Statistics/Hourly Sorter Details Count\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Inducted (#)\",\"Sorted (#)\",\"Dest Inv (#)\",\"Dest None (#)\",\"Dest Dis (#)\",\"Dest Full (#)\",\"Unexpected (#)\",\"Dest Fault (#)\",\"Div Fail (#)\",\"Gap Err (#)\",\"Lost (#)\",\"Track Err (#)\",\"Unknown (#)\",\"Unsafe (#)\"]\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[0].tooltip.text \u003d \"Sorted (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[1].tooltip.text \u003d \"Dest Invalid (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[2].tooltip.text \u003d \"Dest None (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[3].tooltip.text \u003d \"Dest Disabled (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[4].tooltip.text \u003d \"Dest Full (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[5].tooltip.text \u003d \"Unexpected (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[6].tooltip.text \u003d \"Dest Fault (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[7].tooltip.text \u003d \"Div Fail (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[8].tooltip.text \u003d \"Gap Error (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[9].tooltip.text \u003d \"Lost (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[10].tooltip.text \u003d \"Tracking Err (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[11].tooltip.text \u003d \"Unknown (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[12].tooltip.text \u003d \"Unsafe (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.yAxes[0].value.range.max \u003d \"\"\n\telif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\tpath \u003d \"Statistics/Hourly Sorter Details Percent\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Inducted (%)\",\"Sorted (%)\",\"Dest Inv (%)\",\"Dest None (%)\",\"Dest Dis (%)\",\"Dest Full (%)\",\"Unexpected (%)\",\"Dest Fault (%)\",\"Div Fail (%)\",\"Gap Err (%)\",\"Lost (%)\",\"Track Err (%)\",\"Unknown (%)\",\"Unsafe (%)\"]\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[0].tooltip.text \u003d \"Sorted (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[1].tooltip.text \u003d \"Dest Invalid (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[2].tooltip.text \u003d \"Dest None (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[3].tooltip.text \u003d \"Dest Disabled (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[4].tooltip.text \u003d \"Dest Full (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[5].tooltip.text \u003d \"Unexpected (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[6].tooltip.text \u003d \"Dest Fault (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[7].tooltip.text \u003d \"Div Fail (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[8].tooltip.text \u003d \"Gap Error (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[9].tooltip.text \u003d \"Lost (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[10].tooltip.text \u003d \"Tracking Err (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[11].tooltip.text \u003d \"Unknown (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[12].tooltip.text \u003d \"Unsafe (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.yAxes[0].value.range.max \u003d 100\n\telse:\n\t\tpath \u003d \"Statistics/Hourly Sorter Details Rate\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Inducted (pph)\",\"Sorted (pph)\",\"Dest Inv (pph)\",\"Dest None (pph)\",\"Dest Dis (pph)\",\"Dest Full (pph)\",\"Unexpected (pph)\",\"Dest Fault (pph)\",\"Div Fail (pph)\",\"Gap Err (pph)\",\"Lost (pph)\",\"Track Err (pph)\",\"Unknown (pph)\",\"Unsafe (pph)\"]\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[0].tooltip.text \u003d \"Sorted (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[1].tooltip.text \u003d \"Dest Invalid (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[2].tooltip.text \u003d \"Dest None (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[3].tooltip.text \u003d \"Dest Disabled (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[4].tooltip.text \u003d \"Dest Full (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[5].tooltip.text \u003d \"Unexpected (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[6].tooltip.text \u003d \"Dest Fault (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[7].tooltip.text \u003d \"Div Fail (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[8].tooltip.text \u003d \"Gap Error (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[9].tooltip.text \u003d \"Lost (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[10].tooltip.text \u003d \"Tracking Err (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[11].tooltip.text \u003d \"Unknown (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.series[12].tooltip.text \u003d \"Unsafe (pph): [bold]{valueY}[/]pph\"\n\t\tself.getSibling(\"Hourly Sorter Details\").props.yAxes[0].value.range.max \u003d \"\"\n\t\t\n\tparams \u003d {\"starttime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.StartDate,\"endtime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.EndDate}\t\n\t\n\tdata \u003d system.dataset.toPyDataSet(system.db.runNamedQuery(path,params))\n\tfor row in data:\t\n\t\tdict \u003d {}\n\t\tdict[\u0027Hour\u0027] \u003d \trow[\u0027Hour\u0027]\n\t\tdict[\u0027Sorted\u0027] \u003d row[\u0027Sorted\u0027]\n\t\tdict[\u0027DestinationInvalid\u0027] \u003d row[\u0027DestinationInvalid\u0027]\n\t\tdict[\u0027DestinationNone\u0027] \u003d row[\u0027DestinationNone\u0027]\n\t\tdict[\u0027DestinationDisabled\u0027] \u003d row[\u0027DestinationDisabled\u0027]\n\t\tdict[\u0027DestinationFull\u0027] \u003d row[\u0027DestinationFull\u0027]\n\t\tdict[\u0027Unexpected\u0027] \u003d row[\u0027Unexpected\u0027]\n\t\tdict[\u0027DestinationFault\u0027] \u003d row[\u0027DestinationFault\u0027]\n\t\tdict[\u0027DivertFail\u0027] \u003d row[\u0027DivertFail\u0027]\n\t\tdict[\u0027GapError\u0027] \u003d row[\u0027GapError\u0027]\n\t\tdict[\u0027Lost\u0027] \u003d row[\u0027Lost\u0027]\n\t\tdict[\u0027TrackingError\u0027] \u003d row[\u0027TrackingError\u0027]\n\t\tdict[\u0027Unknown\u0027] \u003d row[\u0027Unknown\u0027]\n\t\tdict[\u0027Unsafe\u0027] \u003d row[\u0027Unsafe\u0027]\n\t\tgraph.append(dict)\n\t\n\t\n\tself.getSibling(\"Hourly Sorter Details\").props.dataSources.example \u003d graph\n\tself.props.data \u003d system.dataset.toDataSet(headers,data)" + } + }, + "custom.time": { + "binding": { + "config": { + "expression": "now(10000000)" + }, + "type": "expr" + } + } + }, + "props": { + "cells": { + "style": { + "fontSize": 14 + } + }, + "data": { + "$": [ + "ds", + 192, + 1699296809918 + ], + "$columns": [ + { + "data": [ + "2023-11-06 9:00", + "2023-11-06 10:00" + ], + "name": "Start Timestamp", + "type": "String" + }, + { + "data": [ + "H1", + "H0" + ], + "name": "Hour", + "type": "String" + }, + { + "data": [ + 386, + 5956 + ], + "name": "Inducted (#)", + "type": "Long" + }, + { + "data": [ + 373, + 5891 + ], + "name": "Sorted (#)", + "type": "Double" + }, + { + "data": [ + 0, + 0 + ], + "name": "Dest Inv (#)", + "type": "Double" + }, + { + "data": [ + 0, + 0 + ], + "name": "Dest None (#)", + "type": "Double" + }, + { + "data": [ + 0, + 2 + ], + "name": "Dest Dis (#)", + "type": "Double" + }, + { + "data": [ + 0, + 17 + ], + "name": "Dest Full (#)", + "type": "Double" + }, + { + "data": [ + 0, + 0 + ], + "name": "Unexpected (#)", + "type": "Double" + }, + { + "data": [ + 0, + 2 + ], + "name": "Dest Fault (#)", + "type": "Double" + }, + { + "data": [ + 0, + 20 + ], + "name": "Div Fail (#)", + "type": "Double" + }, + { + "data": [ + 8, + 61 + ], + "name": "Gap Err (#)", + "type": "Double" + }, + { + "data": [ + 2, + 13 + ], + "name": "Lost (#)", + "type": "Double" + }, + { + "data": [ + 0, + 0 + ], + "name": "Track Err (#)", + "type": "Double" + }, + { + "data": [ + 0, + 0 + ], + "name": "Unknown (#)", + "type": "Double" + }, + { + "data": [ + 12, + 13 + ], + "name": "Unsafe (#)", + "type": "Double" + } + ] + }, + "filter": { + "enabled": true, + "results": { + "enabled": true + } + }, + "pager": { + "bottom": false + }, + "rows": { + "style": { + "textAlign": "center" + } + }, + "selection": { + "selectedRow": 3 + } + }, + "type": "ia.display.table" + }, + { + "meta": { + "name": "Hourly Sorter Details" + }, + "position": { + "basis": "50%" + }, + "props": { + "dataSources": { + "example": [ + { + "DestinationDisabled": 0, + "DestinationFault": 0, + "DestinationFull": 0, + "DestinationInvalid": 0, + "DestinationNone": 0, + "DivertFail": 0, + "GapError": 8, + "Hour": "H1", + "Lost": 2, + "Sorted": 373, + "TrackingError": 0, + "Unexpected": 0, + "Unknown": 0, + "Unsafe": 12 + }, + { + "DestinationDisabled": 2, + "DestinationFault": 2, + "DestinationFull": 17, + "DestinationInvalid": 0, + "DestinationNone": 0, + "DivertFail": 20, + "GapError": 61, + "Hour": "H0", + "Lost": 13, + "Sorted": 5891, + "TrackingError": 0, + "Unexpected": 0, + "Unknown": 0, + "Unsafe": 13 + } + ] + }, + "series": [ + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "Sorted" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Sorted" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "Sorted", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Sorted (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Induct", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "#FF8C00", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "#FF8C00", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "DestinationInvalid" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Dest Inv" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "DestinationInvalid", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Dest Invalid (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Induct", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "#00FF00", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "#00FF00", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "DestinationNone" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Dest None" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "DestinationNone", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Dest None (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Induct", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "DestinationDisabled" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Dest Dis" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "DestinationDisabled", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Dest Disabled (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Induct", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "DestinationFull" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Dest Full" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "DestinationFull", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Dest Full (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Induct", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "Unexpected" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Unexpected" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "Unexpected", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Unexpected (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Induct", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "DestinationFault" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Dest Fault" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "DestinationFault", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Dest Fault (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Induct", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "DivertFail" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Div Fail" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "DivertFail", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Div Fail (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Induct", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "GapError" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Gap Err" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "GapError", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Gap Error (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Induct", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "Lost" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Lost" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "Lost", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Lost (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Induct", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "TrackingError" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Track Err" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "TrackingErr", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Tracking Err (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Induct", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "Unknown" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Unknown" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "Unknown", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Unknown (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Induct", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "Unsafe" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Unsafe" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "unsafe", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Unsafe (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Induct", + "zIndex": 0 + } + ], + "xAxes": [ + { + "appearance": { + "font": { + "size": "", + "weight": 500 + }, + "grid": { + "color": "", + "dashArray": "", + "minDistance": 60, + "opacity": 1, + "position": 0.5 + }, + "inside": false, + "labels": { + "color": "", + "horizontalCenter": "middle", + "opacity": 1, + "rotation": 0, + "verticalCenter": "middle" + }, + "opposite": false + }, + "category": { + "break": { + "enabled": false, + "endCategory": "", + "size": 0.05, + "startCategory": "" + } + }, + "date": { + "baseInterval": { + "count": 1, + "enabled": false, + "skipEmptyPeriods": false, + "timeUnit": "hour" + }, + "break": { + "enabled": false, + "endDate": "", + "size": 0.05, + "startDate": "" + }, + "format": "M/d", + "inputFormat": "yyyy-MM-dd kk:mm:ss", + "range": { + "max": "", + "min": "", + "useStrict": true + } + }, + "inversed": false, + "label": { + "color": "", + "enabled": true, + "text": "Hour" + }, + "name": "Hour", + "render": "category", + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "" + }, + "value": { + "break": { + "enabled": false, + "endValue": 100, + "size": 0.05, + "startValue": 0 + }, + "format": "#,###.##", + "logarithmic": false, + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "visible": true + } + ], + "yAxes": [ + { + "appearance": { + "font": { + "size": "", + "weight": 500 + }, + "grid": { + "color": "", + "dashArray": "", + "minDistance": null, + "opacity": 1, + "position": 0.5 + }, + "inside": false, + "labels": { + "color": "", + "horizontalCenter": "middle", + "opacity": 1, + "rotation": 0, + "verticalCenter": "middle" + }, + "opposite": false + }, + "category": { + "break": { + "enabled": false, + "endCategory": "", + "size": 0.05, + "startCategory": "" + } + }, + "date": { + "baseInterval": { + "count": 1, + "enabled": false, + "skipEmptyPeriods": false, + "timeUnit": "hour" + }, + "break": { + "enabled": false, + "endDate": "", + "size": 0.05, + "startDate": "" + }, + "format": "M/d/yyyy HH:mm:ss", + "inputFormat": "yyyy-MM-dd kk:mm:ss", + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "inversed": false, + "label": { + "color": "", + "enabled": true, + "text": "" + }, + "name": "Induct", + "render": "value", + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "" + }, + "value": { + "break": { + "enabled": false, + "endValue": 100, + "size": 0.05, + "startValue": 0 + }, + "format": "#,###.##", + "logarithmic": false, + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "visible": true + } + ] + }, + "type": "ia.chart.xy" + } + ], + "meta": { + "name": "Hourly_Sorter_Details" + }, + "position": { + "tabIndex": 8 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Hourly_Lane" + }, + "position": { + "basis": "50%" + }, + "propConfig": { + "custom.mode": { + "binding": { + "config": { + "expression": "{..../Statistics.props.currentTabIndex} + {..../Period_not_Global_0/Period.props.value} + {..../Period_not_Global_0/EndTime.custom.Selected}+{..../Period_not_Global_0/StartTime.custom.Selected} + {this.custom.time} + {..../Lane Drop Down/Lane.props.value} + {..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value}" + }, + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": "\t\n\tpath \u003d \"\"\n\theaders \u003d []\n\tgraph \u003d []\n\t\n\tif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\tpath \u003d \"Statistics/Hourly Lane Count\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (#)\",\"Diverted (#)\",\"Dest Full (#)\",\"Dest Jam (#)\",\"Dest Disabled (#)\",\"Dest Fault (#)\",\"Divert Fail (#)\",\"Lost (#)\",\"Unsafe (#)\",\"Dim Err (#)\",\"Gap Err (#)\",\"Unknown (#)\"]\n\t\tself.getSibling(\"Hourly Lane\").props.series[0].tooltip.text \u003d \"Diverted (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[1].tooltip.text \u003d \"Dest Full (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[2].tooltip.text \u003d \"Dest Jam (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[3].tooltip.text \u003d \"Dest Disabled (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[4].tooltip.text \u003d \"Dest Fault (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[5].tooltip.text \u003d \"Divert Fail (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[6].tooltip.text \u003d \"Lost (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[7].tooltip.text \u003d \"Unsafe (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[8].tooltip.text \u003d \"Dim Err (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[9].tooltip.text \u003d \"Gap Err (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[10].tooltip.text \u003d \"Unknown (#): [bold]{valueY}[/]\"\t\t\n\t\tself.getSibling(\"Hourly Lane\").props.yAxes[0].value.range.max \u003d \"\"\n\telif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\tpath \u003d \"Statistics/Hourly Lane Percent\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (%)\",\"Diverted (%)\",\"Dest Full (%)\",\"Dest Jam (%)\",\"Dest Disabled (%)\",\"Dest Fault (%)\",\"Divert Fail (%)\",\"Lost (%)\",\"Unsafe (%)\",\"Dim Err (%)\",\"Gap Err (%)\",\"Unknown (%)\"]\n\t\tself.getSibling(\"Hourly Lane\").props.series[0].tooltip.text \u003d \"Diverted (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[1].tooltip.text \u003d \"Dest Full (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[2].tooltip.text \u003d \"Dest Jam (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[3].tooltip.text \u003d \"Dest Disabled (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[4].tooltip.text \u003d \"Dest Fault (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[5].tooltip.text \u003d \"Divert Fail (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[6].tooltip.text \u003d \"Lost (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[7].tooltip.text \u003d \"Unsafe (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[8].tooltip.text \u003d \"Dim Err (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[9].tooltip.text \u003d \"Gap Err (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[10].tooltip.text \u003d \"Unknown (%): [bold]{valueY}[/]%\"\t\t\n\t\tself.getSibling(\"Hourly Lane\").props.yAxes[0].value.range.max \u003d 100\n\telse:\n\t\tpath \u003d \"Statistics/Hourly Lane Rate\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (pph)\",\"Diverted (pph)\",\"Dest Full (pph)\",\"Dest Jam (pph)\",\"Dest Disabled (pph)\",\"Dest Fault (pph)\",\"Divert Fail (pph)\",\"Lost (pph)\",\"Unsafe (pph)\",\"Dim Err (pph)\",\"Gap Err (pph)\",\"Unknown (pph)\"]\n\t\tself.getSibling(\"Hourly Lane\").props.series[0].tooltip.text \u003d \"Diverted (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[1].tooltip.text \u003d \"Dest Full (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[2].tooltip.text \u003d \"Dest Jam (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[3].tooltip.text \u003d \"Dest Disabled (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[4].tooltip.text \u003d \"Dest Fault (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[5].tooltip.text \u003d \"Divert Fail (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[6].tooltip.text \u003d \"Lost (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[7].tooltip.text \u003d \"Unsafe (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[8].tooltip.text \u003d \"Dim Err (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[9].tooltip.text \u003d \"Gap Err (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"Hourly Lane\").props.series[10].tooltip.text \u003d \"Unknown (pph): [bold]{valueY}[/] pph\"\t\n\t\tself.getSibling(\"Hourly Lane\").props.yAxes[0].value.range.max \u003d \"\"\n\t\t\n\tparams \u003d {\"starttime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.StartDate,\"endtime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.EndDate,\"lane\":self.parent.parent.parent.getChild(\"Lane Drop Down\").getChild(\"Lane\").props.value}\t\n\t\n\tdata \u003d system.dataset.toPyDataSet(system.db.runNamedQuery(path,params))\n\t\n\tfor row in data:\t\n\t\tdict \u003d {}\n\t\tdict[\u0027Hour\u0027] \u003d \trow[\u0027Hour\u0027]\n\t\tdict[\u0027Diverted\u0027] \u003d row[\u0027Diverted\u0027]\n\t\tdict[\u0027DestinationFull\u0027] \u003d row[\u0027DestinationFull\u0027]\n\t\tdict[\u0027DestinationJam\u0027] \u003d row[\u0027DestinationJam\u0027]\n\t\tdict[\u0027DestinationDisabled\u0027] \u003d row[\u0027DestinationDisabled\u0027]\n\t\tdict[\u0027DestinationFault\u0027] \u003d row[\u0027DestinationFault\u0027]\n\t\tdict[\u0027DivertFail\u0027] \u003d row[\u0027DivertFail\u0027]\n\t\tdict[\u0027Lost\u0027] \u003d row[\u0027Lost\u0027]\n\t\tdict[\u0027Unsafe\u0027] \u003d row[\u0027Unsafe\u0027]\n\t\tdict[\u0027DimError\u0027] \u003d row[\u0027DimError\u0027]\n\t\tdict[\u0027GapError\u0027] \u003d row[\u0027GapError\u0027]\n\t\tdict[\u0027Unknown\u0027] \u003d row[\u0027Unknown\u0027]\n\t\tgraph.append(dict)\n\t\n\tself.getSibling(\"Hourly Lane\").props.dataSources.example \u003d graph\n\tself.props.data \u003d system.dataset.toDataSet(headers,data)" + } + }, + "custom.time": { + "binding": { + "config": { + "expression": "now(10000000)" + }, + "type": "expr" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "center", + "number": "value", + "numberFormat": "00:00:00", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "date", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": false, + "width": "" + }, + { + "align": "center", + "boolean": "value", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "endt", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Start Timestamp" + }, + "justify": "center", + "number": "value", + "numberFormat": "none", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "date", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 150 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "rownumber", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Hour" + }, + "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": 150 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "total_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Total (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "Diverted_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Diverted (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "destfull_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest Full (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "destjam_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest Jam (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "destdisabled_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest Disabled (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "destfault_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest Fault (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "DivertFail_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Divert Fail (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "lost_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Lost (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "unsafe_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Unsafe (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "dim_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dim Error (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "gaperr_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Gap Error (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "unknown_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Unknown (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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, + 1699296819967 + ], + "$columns": [ + { + "data": [], + "name": "Start Timestamp", + "type": "String" + }, + { + "data": [], + "name": "Hour", + "type": "String" + }, + { + "data": [], + "name": "Total (#)", + "type": "String" + }, + { + "data": [], + "name": "Diverted (#)", + "type": "String" + }, + { + "data": [], + "name": "Dest Full (#)", + "type": "String" + }, + { + "data": [], + "name": "Dest Jam (#)", + "type": "String" + }, + { + "data": [], + "name": "Dest Disabled (#)", + "type": "String" + }, + { + "data": [], + "name": "Dest Fault (#)", + "type": "String" + }, + { + "data": [], + "name": "Divert Fail (#)", + "type": "String" + }, + { + "data": [], + "name": "Lost (#)", + "type": "String" + }, + { + "data": [], + "name": "Unsafe (#)", + "type": "String" + }, + { + "data": [], + "name": "Dim Err (#)", + "type": "String" + }, + { + "data": [], + "name": "Gap Err (#)", + "type": "String" + }, + { + "data": [], + "name": "Unknown (#)", + "type": "String" + } + ] + }, + "filter": { + "enabled": true, + "results": { + "enabled": true + } + }, + "pager": { + "bottom": false + }, + "rows": { + "style": { + "textAlign": "center" + } + }, + "virtualized": false + }, + "type": "ia.display.table" + }, + { + "meta": { + "name": "Hourly Lane" + }, + "position": { + "basis": "50%" + }, + "props": { + "dataSources": { + "example": [] + }, + "series": [ + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "Diverted" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Diverted" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "Diverted", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Diverted (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Total", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "#FF0000", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "#FF0000", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "DestinationFull" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Dest Full" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "DestFull", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Dest Full (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Total", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "#FF8C00", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "#FF8C00", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "DestinationJam" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Dest Jam" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "DestJam", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Dest Jam (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Total", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "#00FF00", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "#00FF00", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "DestinationDisabled" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Dest Disabled" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "DestDisabled", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Dest Disabled (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Total", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "DestinationFault" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Dest Fault" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "DestFault", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Dest Fault (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Total", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "DivertFail" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Div Fail" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "DivFail", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Divert Fail (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Total", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "Lost" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Gap Err" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "Lost", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Lost (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Total", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "Unsafe" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Lost" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "Unsafe", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Unsafe (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Total", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "DimError" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Unknown" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "Dim Err", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Dim Err (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Total", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "GapError" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Unsafe" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "Gap Err", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Gap Err (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Total", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "Unknown" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Dim Error" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "Unknown", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Unknown (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Total", + "zIndex": 0 + } + ], + "xAxes": [ + { + "appearance": { + "font": { + "size": "", + "weight": 500 + }, + "grid": { + "color": "", + "dashArray": "", + "minDistance": 60, + "opacity": 1, + "position": 0.5 + }, + "inside": false, + "labels": { + "color": "", + "horizontalCenter": "middle", + "opacity": 1, + "rotation": 0, + "verticalCenter": "middle" + }, + "opposite": false + }, + "category": { + "break": { + "enabled": false, + "endCategory": "", + "size": 0.05, + "startCategory": "" + } + }, + "date": { + "baseInterval": { + "count": 1, + "enabled": false, + "skipEmptyPeriods": false, + "timeUnit": "hour" + }, + "break": { + "enabled": false, + "endDate": "", + "size": 0.05, + "startDate": "" + }, + "format": "M/d", + "inputFormat": "yyyy-MM-dd kk:mm:ss", + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "inversed": false, + "label": { + "color": "", + "enabled": true, + "text": "Hour" + }, + "name": "Hour", + "render": "category", + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "" + }, + "value": { + "break": { + "enabled": false, + "endValue": 100, + "size": 0.05, + "startValue": 0 + }, + "format": "#,###.##", + "logarithmic": false, + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "visible": true + } + ], + "yAxes": [ + { + "appearance": { + "font": { + "size": "", + "weight": 500 + }, + "grid": { + "color": "", + "dashArray": "", + "minDistance": null, + "opacity": 1, + "position": 0.5 + }, + "inside": false, + "labels": { + "color": "", + "horizontalCenter": "middle", + "opacity": 1, + "rotation": 0, + "verticalCenter": "middle" + }, + "opposite": false + }, + "category": { + "break": { + "enabled": false, + "endCategory": "", + "size": 0.05, + "startCategory": "" + } + }, + "date": { + "baseInterval": { + "count": 1, + "enabled": false, + "skipEmptyPeriods": false, + "timeUnit": "hour" + }, + "break": { + "enabled": false, + "endDate": "", + "size": 0.05, + "startDate": "" + }, + "format": "M/d/yyyy HH:mm:ss", + "inputFormat": "yyyy-MM-dd kk:mm:ss", + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "inversed": false, + "label": { + "color": "", + "enabled": true, + "text": "" + }, + "name": "Total", + "render": "value", + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "" + }, + "value": { + "break": { + "enabled": false, + "endValue": 100, + "size": 0.05, + "startValue": 0 + }, + "format": "#,###.##", + "logarithmic": false, + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "visible": true + } + ] + }, + "type": "ia.chart.xy" + } + ], + "meta": { + "name": "Hourly_Lane" + }, + "position": { + "tabIndex": 9 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "custom": { + "ddd": { + "$": [ + "ts", + 192, + 1745574470639 + ], + "$ts": 1745570870000 + } + }, + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\tself.props.selection.selectedRow \u003d \"null\"" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Scanner Details" + }, + "propConfig": { + "position.basis": { + "binding": { + "config": { + "expression": "if ({../Scanner Details_graph.position.display} \u003d true, \"50%\", \"100%\")" + }, + "type": "expr" + } + }, + "props.columns[10].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[11].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[12].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[13].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[14].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[15].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[16].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[17].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[18].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[4].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[5].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[6].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[7].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[8].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[9].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.data": { + "binding": { + "config": { + "designerUseLimit": false, + "parameters": { + "endtime": "{..../Period_not_Global_0.custom.EndDate}", + "starttime": "{..../Period_not_Global_0.custom.StartDate}" + }, + "polling": { + "enabled": true, + "rate": "1" + }, + "queryPath": "Statistics/Scanner Details" + }, + "type": "query" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "Startstamp", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Start Timestamp" + }, + "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": "date", + "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 HH:mm:ss", + "editable": false, + "field": "Endtstamp", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "End Timestamp" + }, + "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": "date", + "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": "SorterName", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Sorter" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "ScannerName", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Scanner" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Total_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Total (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "GoodRead_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Good Read (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "NoRead_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "No Read (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "MultiLabelRead_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Multi Read (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "NoCode_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "No Code (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Total_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Total (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "GoodRead_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Good Read (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "NoRead_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "No Read (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "MultiLabelRead_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Multi Read (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "NoCode_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "No Code (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Total_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Total (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "GoodRead_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Good Read (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "NoRead_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "No Read (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "MultiLabelRead_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Multi Read (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "NoCode_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "No Code (pph)" + }, + "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": "", + "width": "" + } + ], + "filter": { + "enabled": true, + "results": { + "enabled": true + } + }, + "pager": { + "bottom": false + }, + "rows": { + "subviewExpansionMode": "single" + }, + "virtualized": false + }, + "type": "ia.display.table" + }, + { + "meta": { + "name": "Scanner Details_graph" + }, + "position": { + "basis": "50%" + }, + "propConfig": { + "props.plots[0].axes[0].name": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Total_count\",\r\n\"Percentage\",\"Total_perc\",\r\n\"Rate\",\"Total_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].axis": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Total_count\",\r\n\"Percentage\",\"Total_perc\",\r\n\"Rate\",\"Total_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[0].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Total_count\",\r\n\"Percentage\",\"Total_perc\",\r\n\"Rate\",\"Total_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[1].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"GoodRead_count\",\r\n\"Percentage\",\"GoodRead_perc\",\r\n\"Rate\",\"GoodRead_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[2].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"NoRead_count\",\r\n\"Percentage\",\"NoRead_perc\",\r\n\"Rate\",\"NoRead_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[3].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"MultiLabelRead_count\",\r\n\"Percentage\",\"MultiLabelRead_perc\",\r\n\"Rate\",\"MultiLabelRead_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[4].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"NoCode_count\",\r\n\"Percentage\",\"NoCode_perc\",\r\n\"Rate\",\"NoCode_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.series[0].data": { + "binding": { + "config": { + "parameters": { + "Scanner": "\u0027S01aa\u0027", + "endtime": "{..../Period_not_Global_0.custom.EndDate}", + "starttime": "{..../Period_not_Global_0.custom.StartDate}" + }, + "polling": { + "enabled": true, + "rate": "1" + }, + "queryPath": "Statistics/Scanner Details_graph", + "returnFormat": "dataset" + }, + "type": "query" + } + }, + "props.xTrace.infoBox.dataFormat": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"#,###.##\",\r\n\"Percentage\",\"###.##%\",\r\n\"Rate\",\"#,###.##\",\r\nfalse)" + }, + "type": "expr" + } + } + }, + "props": { + "legend": { + "position": "right", + "visible": true + }, + "plots": [ + { + "axes": [ + { + "alignment": "left", + "label": { + "font": { + "color": "", + "size": 10 + }, + "offset": 0, + "style": { + "classes": "" + }, + "text": "", + "visible": true + }, + "max": "", + "min": "", + "style": { + "classes": "" + }, + "tick": { + "color": "", + "label": { + "font": { + "color": "", + "size": 14 + }, + "style": { + "classes": "" + } + }, + "style": { + "classes": "" + } + }, + "width": 60 + } + ], + "markers": [], + "relativeWeight": 1, + "trends": [ + { + "baselines": [], + "breakLine": true, + "columns": [ + { + "color": "#FF0000", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#808080", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#FF8C00", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#FFFF00", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#00FF00", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + } + ], + "interpolation": "curveLinear", + "radius": 2, + "series": "graph", + "stack": true, + "type": "line", + "visible": true + } + ] + } + ], + "series": [ + { + "name": "graph" + } + ], + "timeAxis": { + "tickCount": 10 + }, + "timeRange": { + "dateFormat": "YYYY-MM-DD", + "timeFormat": "HH:mm:ss" + }, + "xTrace": { + "infoBox": { + "dateFormat": "YYYY-MM-DD", + "timeFormat": "HH:mm:ss", + "width": 150 + } + } + }, + "type": "ia.chart.timeseries" + } + ], + "meta": { + "name": "Scanner_Details" + }, + "position": { + "tabIndex": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\tself.props.selection.selectedRow \u003d \"null\"" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Induct Details" + }, + "propConfig": { + "position.basis": { + "binding": { + "config": { + "expression": "if ({../Induct Details_graph.position.display} \u003d true, \"50%\", \"100%\")" + }, + "type": "expr" + } + }, + "props.columns[10].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[11].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[12].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[4].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[5].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[6].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[7].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[8].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[9].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.data": { + "binding": { + "config": { + "parameters": { + "endtime": "{..../Period_not_Global_0.custom.EndDate}", + "starttime": "{..../Period_not_Global_0.custom.StartDate}" + }, + "polling": { + "enabled": true, + "rate": "1" + }, + "queryPath": "Statistics/Induct Details" + }, + "type": "query" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "Startstamp", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Start Timestamp" + }, + "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": "date", + "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 HH:mm:ss", + "editable": false, + "field": "Endtstamp", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "End Timestamp" + }, + "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": "date", + "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": "SorterName", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Sorter" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "InductName", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Induct" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Total_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Total (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "singlecarrier_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Single Carrier (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "doublecarrier_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Double Carrier (#)" + }, + "justify": "center", + "number": "value", + "numberFormat": "none", + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Total_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Total (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "SingleCarrier_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Single Carrier (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "DoubleCarrier_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Double Carrier (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Total_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Total (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "SingleCarrier_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Single Carrier (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "DoubleCarrier_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Double Carrier (pph)" + }, + "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": "", + "width": "" + } + ], + "filter": { + "enabled": true, + "results": { + "enabled": true + } + }, + "pager": { + "bottom": false + }, + "selection": { + "mode": "multiple interval" + }, + "virtualized": false + }, + "type": "ia.display.table" + }, + { + "meta": { + "name": "Induct Details_graph" + }, + "position": { + "basis": "50%" + }, + "propConfig": { + "props.plots[0].axes[0].name": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Total_count\",\r\n\"Percentage\",\"Total_perc\",\r\n\"Rate\",\"Total_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].axis": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Total_count\",\r\n\"Percentage\",\"Total_perc\",\r\n\"Rate\",\"Total_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[0].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Total_count\",\r\n\"Percentage\",\"Total_perc\",\r\n\"Rate\",\"Total_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[1].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"singlecarrier_count\",\r\n\"Percentage\",\"SingleCarrier_perc\",\r\n\"Rate\",\"SingleCarrier_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[2].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"doublecarrier_count\",\r\n\"Percentage\",\"DoubleCarrier_perc\",\r\n\"Rate\",\"DoubleCarrier_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.series[0].data": { + "binding": { + "config": { + "parameters": { + "Induct": "\u0027Induct 1\u0027", + "endtime": "{..../Period_not_Global_0.custom.EndDate}", + "starttime": "{..../Period_not_Global_0.custom.StartDate}" + }, + "polling": { + "enabled": true, + "rate": "1" + }, + "queryPath": "Statistics/Induct Details_graph", + "returnFormat": "dataset" + }, + "type": "query" + } + }, + "props.xTrace.infoBox.dataFormat": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"#,###.##\",\r\n\"Percentage\",\"###.##%\",\r\n\"Rate\",\"#,###.##\",\r\nfalse)" + }, + "type": "expr" + } + } + }, + "props": { + "legend": { + "position": "right", + "visible": true + }, + "plots": [ + { + "axes": [ + { + "alignment": "left", + "label": { + "font": { + "color": "", + "size": 10 + }, + "offset": 0, + "style": { + "classes": "" + }, + "text": "", + "visible": true + }, + "max": "", + "min": "", + "style": { + "classes": "" + }, + "tick": { + "color": "", + "label": { + "font": { + "color": "", + "size": 10 + }, + "style": { + "classes": "" + } + }, + "style": { + "classes": "" + } + }, + "width": 60 + } + ], + "markers": [], + "relativeWeight": 1, + "trends": [ + { + "baselines": [], + "breakLine": true, + "columns": [ + { + "color": "#FF0000", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#808080", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#FF8C00", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + } + ], + "interpolation": "curveLinear", + "radius": 2, + "series": "graph", + "stack": true, + "type": "line", + "visible": true + } + ] + } + ], + "series": [ + { + "name": "graph" + } + ], + "xTrace": { + "infoBox": { + "dateFormat": "YYYY-MM-DD", + "timeFormat": "HH:mm:ss" + } + } + }, + "type": "ia.chart.timeseries" + } + ], + "meta": { + "name": "Induct Details" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\tself.props.selection.selectedRow \u003d \"null\"" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Sorter Summary" + }, + "propConfig": { + "position.basis": { + "binding": { + "config": { + "expression": "if ({../Sorter Summary_graph.position.display} \u003d true, \"50%\", \"100%\")" + }, + "type": "expr" + } + }, + "props.columns[10].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[11].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[12].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[13].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[14].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[15].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[16].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[17].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[3].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[4].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[5].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[6].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[7].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[8].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[9].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.data": { + "binding": { + "config": { + "parameters": { + "endtime": "{..../Period_not_Global_0.custom.EndDate}", + "starttime": "{..../Period_not_Global_0.custom.StartDate}" + }, + "polling": { + "enabled": true, + "rate": "1" + }, + "queryPath": "Statistics/Sorter Summary" + }, + "type": "query" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "Startstamp", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Start Timestamp" + }, + "justify": "center", + "number": "value", + "numberFormat": "00:00:00", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "date", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": "" + }, + { + "align": "center", + "boolean": "value", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "Endtstamp", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "End Timestamp" + }, + "justify": "center", + "number": "value", + "numberFormat": "none", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "date", + "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": "SorterName", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Sorter" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Induct_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Inducted (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Sorted_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Sorted (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "value", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "AWCSRecirc_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Awcs Recirc (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "OperRecirc_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Operational Recirc (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "MachineRecirc_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Machine Recirc (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Induct_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Inducted (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Sorted_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Sorted (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "AWCSRecirc_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Awcs Recirc (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "OperRecirc_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Operational Recirc (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "MachineRecirc_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Machine Recirc (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Induct_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Inducted (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Sorted_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Sorted (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "AWCSRecirc_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Awcs Recirc (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "OperRecirc_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Operational Recirc (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "MachineRecirc_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Machine Recirc (pph)" + }, + "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": "", + "width": "" + } + ], + "filter": { + "enabled": true, + "results": { + "enabled": true + } + }, + "pager": { + "bottom": false + }, + "rows": { + "style": { + "textAlign": "center" + } + }, + "virtualized": false + }, + "type": "ia.display.table" + }, + { + "meta": { + "name": "Sorter Summary_graph" + }, + "position": { + "basis": "50%" + }, + "propConfig": { + "props.plots[0].axes[0].name": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Induct_count\",\r\n\"Percentage\",\"Induct_perc\",\r\n\"Rate\",\"Induct_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].axis": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Induct_count\",\r\n\"Percentage\",\"Induct_perc\",\r\n\"Rate\",\"Induct_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[0].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Induct_count\",\r\n\"Percentage\",\"Induct_perc\",\r\n\"Rate\",\"Induct_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[1].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Sorted_count\",\r\n\"Percentage\",\"Sorted_perc\",\r\n\"Rate\",\"Sorted_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[2].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"OperRecirc_count\",\r\n\"Percentage\",\"OperRecirc_perc\",\r\n\"Rate\",\"OperRecirc_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[3].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"MachineRecirc_count\",\r\n\"Percentage\",\"MachineRecirc_perc\",\r\n\"Rate\",\"MachineRecirc_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[4].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"AWCSRecirc_count\",\r\n\"Percentage\",\"AWCSRecirc_perc\",\r\n\"Rate\",\"AWCSRecirc_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.series[0].data": { + "binding": { + "config": { + "parameters": { + "Sorter": "\u0027S01\u0027", + "endtime": "{..../Period_not_Global_0.custom.EndDate}", + "starttime": "{..../Period_not_Global_0.custom.StartDate}" + }, + "polling": { + "enabled": true, + "rate": "1" + }, + "queryPath": "Statistics/Sorter Summary_graph", + "returnFormat": "dataset" + }, + "type": "query" + } + }, + "props.xTrace.infoBox.dataFormat": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"#,###.##\",\r\n\"Percentage\",\"###.##%\",\r\n\"Rate\",\"#,###.##\",\r\nfalse)" + }, + "type": "expr" + } + } + }, + "props": { + "legend": { + "position": "right", + "visible": true + }, + "plots": [ + { + "axes": [ + { + "alignment": "left", + "label": { + "font": { + "color": "", + "size": 10 + }, + "offset": 0, + "style": { + "classes": "" + }, + "text": "", + "visible": true + }, + "max": "", + "min": "", + "style": { + "classes": "" + }, + "tick": { + "color": "", + "label": { + "font": { + "color": "", + "size": 14 + }, + "style": { + "classes": "" + } + }, + "style": { + "classes": "" + } + }, + "width": 60 + } + ], + "markers": [], + "relativeWeight": 1, + "trends": [ + { + "baselines": [], + "breakLine": true, + "columns": [ + { + "color": "#FF0000", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#808080", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#FF8C00", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#FFFF00", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#00FF00", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + } + ], + "interpolation": "curveLinear", + "radius": 2, + "series": "graph", + "stack": true, + "type": "line", + "visible": true + } + ] + } + ], + "series": [ + { + "name": "graph" + } + ], + "timeAxis": { + "tickCount": 10 + }, + "timeRange": { + "dateFormat": "YYYY-MM-DD", + "timeFormat": "HH:mm:ss" + }, + "xTrace": { + "infoBox": { + "dateFormat": "YYYY-MM-DD", + "timeFormat": "HH:mm:ss", + "width": 150 + } + } + }, + "type": "ia.chart.timeseries" + } + ], + "meta": { + "name": "Sorter Summary" + }, + "position": { + "tabIndex": 2 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\tself.props.selection.selectedRow \u003d \"null\"" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Sorter Details" + }, + "propConfig": { + "position.basis": { + "binding": { + "config": { + "expression": "if ({../Sorter Details_graph.position.display} \u003d true, \"50%\", \"100%\")" + }, + "type": "expr" + } + }, + "props.columns[10].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[11].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[12].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[13].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[14].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[15].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[16].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[17].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[18].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[19].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[20].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[21].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[22].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[23].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[24].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[25].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[26].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[27].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[28].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[29].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[30].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[31].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[32].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[33].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[34].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[35].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[36].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[37].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[38].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[39].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[3].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[40].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[41].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[42].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[43].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[44].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Rate\"" + }, + "type": "expr" + } + }, + "props.columns[4].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[5].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[6].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[7].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[8].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[9].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.data": { + "binding": { + "config": { + "parameters": { + "endtime": "{..../Period_not_Global_0.custom.EndDate}", + "starttime": "{..../Period_not_Global_0.custom.StartDate}" + }, + "queryPath": "Statistics/Sorter Details" + }, + "type": "query" + } + } + }, + "props": { + "cells": { + "style": { + "fontSize": 14 + } + }, + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "Startstamp", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Start Timestamp" + }, + "justify": "center", + "number": "value", + "numberFormat": "00:00:00", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "date", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 150 + }, + { + "align": "center", + "boolean": "value", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "Endtstamp", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "End Timestamp" + }, + "justify": "center", + "number": "value", + "numberFormat": "none", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "date", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 150 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "SorterName", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Sorter" + }, + "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": 65 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "inducted_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Inducted (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "sorted_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Sorted (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "destinv_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest Inv (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "destnone_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest None (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "destdis_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest Dis (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "destfull_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest Full (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "unexpected_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Unexpected (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "destfault_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest Fault (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "divfail_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Div Fail (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "gaperr_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Gap Err (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "lost_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Lost (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "trackerr_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Track Err (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "unknownn_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Unknown (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "unsafe_count", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Unsafe (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "inducted_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Inducted (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "sorted_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Sorted (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "destinv_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest Inv (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "destnone_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest None (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "destdis_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest Dis (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "destfull_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest Full (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "unexpected_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Unexpected (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "destfault_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest Fault (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "divfail_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Div Fail (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "gaperr_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Gap Err (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "lost_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Lost (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "trackerr_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Track Err (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "unknown_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Unknown (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "unsafe_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Unsafe (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "inducted_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Inducted (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "sorted_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Sorted (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "destinv_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest Inv (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "destnone_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest None (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "destdis_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest Dis (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "destfull_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest Full (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "unexpected_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Unexpected (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "destfault_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dest Fault (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "divfail_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Div Fail (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "gaperr_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Gapp Err (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "lost_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Lost (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "trackerr_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Track Err (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "unknown_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Unknown (pph)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "unsafe_rate", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Unsafe (pph)" + }, + "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": "", + "width": "" + } + ], + "filter": { + "enabled": true, + "results": { + "enabled": true + } + }, + "pager": { + "bottom": false + }, + "rows": { + "style": { + "textAlign": "center" + } + }, + "virtualized": false + }, + "type": "ia.display.table" + }, + { + "meta": { + "name": "Sorter Details_graph" + }, + "position": { + "basis": "50%" + }, + "propConfig": { + "props.plots[0].axes[0].name": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"inducted_count\",\r\n\"Percentage\",\"inducted_perc\",\r\n\"Rate\",\"inducted_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].axis": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"inducted_count\",\r\n\"Percentage\",\"inducted_perc\",\r\n\"Rate\",\"inducted_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[0].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"inducted_count\",\r\n\"Percentage\",\"inducted_perc\",\r\n\"Rate\",\"inducted_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[10].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"unknown_count\",\r\n\"Percentage\",\"unknown_perc\",\r\n\"Rate\",\"unknown_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[11].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"unsafe_count\",\r\n\"Percentage\",\"unsafe_perc\",\r\n\"Rate\",\"unsafe_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[12].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"destdis_count\",\r\n\"Percentage\",\"destdis_perc\",\r\n\"Rate\",\"destdis_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[13].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"destnone_count\",\r\n\"Percentage\",\"destnone_perc\",\r\n\"Rate\",\"destnone_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[14].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"assigned_count\",\r\n\"Percentage\",\"assigned_perc\",\r\n\"Rate\",\"assigned_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[1].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"sorted_count\",\r\n\"Percentage\",\"sorted_perc\",\r\n\"Rate\",\"sorted_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[2].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"destinv_count\",\r\n\"Percentage\",\"destinv_perc\",\r\n\"Rate\",\"destinv_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[3].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"destfull_count\",\r\n\"Percentage\",\"destfull_perc\",\r\n\"Rate\",\"destfull_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[4].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"unexpected_count\",\r\n\"Percentage\",\"unexpected_perc\",\r\n\"Rate\",\"unexpected_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[5].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"destfault_count\",\r\n\"Percentage\",\"destfault_perc\",\r\n\"Rate\",\"destfault_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[6].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"divfail_count\",\r\n\"Percentage\",\"divfail_perc\",\r\n\"Rate\",\"divfail_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[7].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"gaperr_count\",\r\n\"Percentage\",\"gaperr_perc\",\r\n\"Rate\",\"gaperr_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[8].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"lost_count\",\r\n\"Percentage\",\"lost_perc\",\r\n\"Rate\",\"lost_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[9].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"trackerr_count\",\r\n\"Percentage\",\"trackerr_perc\",\r\n\"Rate\",\"trackerr_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.series[0].data": { + "binding": { + "config": { + "parameters": { + "Sorter": "\u0027S01\u0027", + "endtime": "{..../Period_not_Global_0.custom.EndDate}", + "starttime": "{..../Period_not_Global_0.custom.StartDate}" + }, + "polling": { + "enabled": true, + "rate": "1" + }, + "queryPath": "Statistics/Sorter Details_graph", + "returnFormat": "dataset" + }, + "type": "query" + } + }, + "props.xTrace.infoBox.dataFormat": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"#,###.##\",\r\n\"Percentage\",\"###.##%\",\r\n\"Rate\",\"#,###.##\",\r\nfalse)" + }, + "type": "expr" + } + } + }, + "props": { + "legend": { + "position": "right", + "visible": true + }, + "plots": [ + { + "axes": [ + { + "alignment": "left", + "label": { + "font": { + "color": "", + "size": 10 + }, + "offset": 0, + "style": { + "classes": "" + }, + "text": "", + "visible": true + }, + "max": "", + "min": "", + "style": { + "classes": "" + }, + "tick": { + "color": "", + "label": { + "font": { + "color": "", + "size": 14 + }, + "style": { + "classes": "" + } + }, + "style": { + "classes": "" + } + }, + "width": 60 + } + ], + "markers": [], + "relativeWeight": 1, + "trends": [ + { + "baselines": [], + "breakLine": true, + "columns": [ + { + "color": "#FF0000", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#808080", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#FF8C00", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#FFFF00", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#00FF00", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#00FFFF", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#0000FF", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#FF00FF", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#D900D9", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#87CEFA", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#CCFFCC", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#AC5F00", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#804600", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#000000", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#008000", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + } + ], + "interpolation": "curveLinear", + "radius": 2, + "series": "graph", + "stack": true, + "type": "line", + "visible": true + } + ] + } + ], + "series": [ + { + "name": "graph" + } + ], + "timeAxis": { + "tickCount": 10 + }, + "timeRange": { + "dateFormat": "YYYY-MM-DD", + "timeFormat": "HH:mm:ss" + }, + "xTrace": { + "infoBox": { + "dateFormat": "YYYY-MM-DD", + "timeFormat": "HH:mm:ss", + "width": 150 + } + } + }, + "type": "ia.chart.timeseries" + } + ], + "meta": { + "name": "Sorter Details" + }, + "position": { + "tabIndex": 3 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\tself.props.selection.selectedRow \u003d \"null\"" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Lane Details" + }, + "propConfig": { + "position.basis": { + "binding": { + "config": { + "expression": "if ({../Lane Details_graph.position.display} \u003d true, \"50%\", \"100%\")" + }, + "type": "expr" + } + }, + "props.columns[10].field": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"DestFault_count\",\r\n\"Percentage\",\"destfault_perc\",\r\n\"Rate\",\"destfault_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[10].header.title": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Dest Fault (#)\",\r\n\"Percentage\",\"Dest Fault (%)\",\r\n\"Rate\",\"Dest Fault (pph)\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[10].numberFormat": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"0,0.##\",\r\n\"Percentage\",\"0.##%\",\r\n\"Rate\",\"0,0.##\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[11].field": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"DivertFail_count\",\r\n\"Percentage\",\"DivertFail_perc\",\r\n\"Rate\",\"DivertFail_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[11].header.title": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Divert Fail (#)\",\r\n\"Percentage\",\"Divert Fail (%)\",\r\n\"Rate\",\"Divert Fail (pph)\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[11].numberFormat": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"0,0.##\",\r\n\"Percentage\",\"0.##%\",\r\n\"Rate\",\"0,0.##\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[12].field": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Lost_count\",\r\n\"Percentage\",\"lost_perc\",\r\n\"Rate\",\"lost_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[12].header.title": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Lost (#)\",\r\n\"Percentage\",\"Lost (%)\",\r\n\"Rate\",\"Lost (pph)\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[12].numberFormat": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"0,0.##\",\r\n\"Percentage\",\"0.##%\",\r\n\"Rate\",\"0,0.##\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[13].field": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Unsafe_count\",\r\n\"Percentage\",\"unsafe_perc\",\r\n\"Rate\",\"unsafe_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[13].header.title": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Unsafe (#)\",\r\n\"Percentage\",\"Unsafe (%)\",\r\n\"Rate\",\"Unsafe (pph)\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[13].numberFormat": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"0,0.##\",\r\n\"Percentage\",\"0.##%\",\r\n\"Rate\",\"0,0.##\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[14].field": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Dim_count\",\r\n\"Percentage\",\"dim_perc\",\r\n\"Rate\",\"dim_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[14].header.title": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Dim Error (#)\",\r\n\"Percentage\",\"Dim Error (%)\",\r\n\"Rate\",\"Dim Error (pph)\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[14].numberFormat": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"0,0.##\",\r\n\"Percentage\",\"0.##%\",\r\n\"Rate\",\"0,0.##\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[15].field": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"GapErr_count\",\r\n\"Percentage\",\"gaperr_perc\",\r\n\"Rate\",\"gaperr_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[15].header.title": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Gap Error (#)\",\r\n\"Percentage\",\"Gap Error (%)\",\r\n\"Rate\",\"Gap Error (pph)\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[15].numberFormat": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"0,0.##\",\r\n\"Percentage\",\"0.##%\",\r\n\"Rate\",\"0,0.##\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[16].field": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Unknown_count\",\r\n\"Percentage\",\"unknown_perc\",\r\n\"Rate\",\"unknown_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[16].header.title": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Unknown (#)\",\r\n\"Percentage\",\"Unknown (%)\",\r\n\"Rate\",\"Unknown (pph)\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[16].numberFormat": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"0,0.##\",\r\n\"Percentage\",\"0.##%\",\r\n\"Rate\",\"0,0.##\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[5].field": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Total_count\",\r\n\"Percentage\",\"total_perc\",\r\n\"Rate\",\"total_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[5].header.title": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Total (#)\",\r\n\"Percentage\",\"Total (%)\",\r\n\"Rate\",\"Total (pph)\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[5].numberFormat": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"0,0.##\",\r\n\"Percentage\",\"0.##%\",\r\n\"Rate\",\"0,0.##\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[6].field": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Diverted_count\",\r\n\"Percentage\",\"Diverted_perc\",\r\n\"Rate\",\"Diverted_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[6].header.title": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Diverted (#)\",\r\n\"Percentage\",\"Diverted (%)\",\r\n\"Rate\",\"Diverted (pph)\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[6].numberFormat": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"0,0.##\",\r\n\"Percentage\",\"0.##%\",\r\n\"Rate\",\"0,0.##\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[7].field": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"DestFull_count\",\r\n\"Percentage\",\"destfull_perc\",\r\n\"Rate\",\"destfull_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[7].header.title": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Dest Full (#)\",\r\n\"Percentage\",\"Dest Full (%)\",\r\n\"Rate\",\"Dest Full (pph)\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[7].numberFormat": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"0,0.##\",\r\n\"Percentage\",\"0.##%\",\r\n\"Rate\",\"0,0.##\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[8].field": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"DestJam_count\",\r\n\"Percentage\",\"destjam_perc\",\r\n\"Rate\",\"destjam_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[8].header.title": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Dest Jam (#)\",\r\n\"Percentage\",\"Dest Jam (%)\",\r\n\"Rate\",\"Dest Jam (pph)\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[8].numberFormat": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"0,0.##\",\r\n\"Percentage\",\"0.##%\",\r\n\"Rate\",\"0,0.##\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[9].field": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"DestDis_count\",\r\n\"Percentage\",\"destdisabled_perc\",\r\n\"Rate\",\"destdisabled_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[9].header.title": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Dest Disabled (#)\",\r\n\"Percentage\",\"Dest Disabled (%)\",\r\n\"Rate\",\"Dest Disabled (pph)\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.columns[9].numberFormat": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"0,0.##\",\r\n\"Percentage\",\"0.##%\",\r\n\"Rate\",\"0,0.##\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.data": { + "binding": { + "config": { + "parameters": { + "endtime": "{..../Period_not_Global_0.custom.EndDate}", + "starttime": "{..../Period_not_Global_0.custom.StartDate}" + }, + "polling": { + "enabled": true, + "rate": "1" + }, + "queryPath": "Statistics/Lane Details" + }, + "type": "query" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "justify": "center", + "number": "value", + "numberFormat": "00:00:00", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "date", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": false, + "width": "" + }, + { + "align": "center", + "boolean": "value", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "Startstamp", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Start Timestamp" + }, + "justify": "center", + "number": "value", + "numberFormat": "none", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "date", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 150 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "Endtstamp", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "End Timestamp" + }, + "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": 150 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "SorterName", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Sorter" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "Lane", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Lane" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + } + }, + "justify": "center", + "number": "value", + "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, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + } + }, + "justify": "center", + "number": "value", + "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, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + } + }, + "justify": "center", + "number": "value", + "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, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + } + }, + "justify": "center", + "number": "value", + "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, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + } + }, + "justify": "center", + "number": "value", + "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, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + } + }, + "justify": "center", + "number": "value", + "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, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + } + }, + "justify": "center", + "number": "value", + "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, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + } + }, + "justify": "center", + "number": "value", + "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, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + } + }, + "justify": "center", + "number": "value", + "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, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + } + }, + "justify": "center", + "number": "value", + "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, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + } + }, + "justify": "center", + "number": "value", + "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, + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + } + }, + "justify": "center", + "number": "value", + "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": "" + } + ], + "filter": { + "enabled": true, + "results": { + "enabled": true + } + }, + "pager": { + "bottom": false + }, + "rows": { + "style": { + "textAlign": "center" + } + }, + "virtualized": false + }, + "type": "ia.display.table" + }, + { + "meta": { + "name": "Lane Details_graph" + }, + "position": { + "basis": "50%" + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "{../Lane Details.props.selection.selectedRow} !\u003d null" + }, + "type": "expr" + } + }, + "props.plots[0].axes[0].name": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Total_count\",\r\n\"Percentage\",\"total_perc\",\r\n\"Rate\",\"total_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].axis": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Total_count\",\r\n\"Percentage\",\"total_perc\",\r\n\"Rate\",\"total_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[0].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Total_count\",\r\n\"Percentage\",\"total_perc\",\r\n\"Rate\",\"total_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[10].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"GapErr_count\",\r\n\"Percentage\",\"gaperr_perc\",\r\n\"Rate\",\"gaperr_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[11].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Unknown_count\",\r\n\"Percentage\",\"unknown_perc\",\r\n\"Rate\",\"unknown_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[1].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Diverted_count\",\r\n\"Percentage\",\"Diverted_perc\",\r\n\"Rate\",\"Diverted_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[2].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"DestFull_count\",\r\n\"Percentage\",\"destfull_perc\",\r\n\"Rate\",\"destfull_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[3].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"DestJam_count\",\r\n\"Percentage\",\"destjam_perc\",\r\n\"Rate\",\"destjam_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[4].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"DestDis_count\",\r\n\"Percentage\",\"destdisabled_perc\",\r\n\"Rate\",\"destdisabled_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[5].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"DestFault_count\",\r\n\"Percentage\",\"destfault_perc\",\r\n\"Rate\",\"destfault_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[6].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"DivertFail_count\",\r\n\"Percentage\",\"DivertFail_perc\",\r\n\"Rate\",\"DivertFail_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[7].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Lost_count\",\r\n\"Percentage\",\"lost_perc\",\r\n\"Rate\",\"lost_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[8].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Unsafe_count\",\r\n\"Percentage\",\"unsafe_perc\",\r\n\"Rate\",\"unsafe_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[9].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Dim_count\",\r\n\"Percentage\",\"dim_perc\",\r\n\"Rate\",\"dim_rate\",\r\nfalse)" + }, + "type": "expr" + } + }, + "props.series[0].data": { + "binding": { + "config": { + "parameters": { + "Lane": "{../Lane Details.props.selection.data[0].Lane}", + "endtime": "{..../Period_not_Global_0.custom.EndDate}", + "starttime": "{..../Period_not_Global_0.custom.StartDate}" + }, + "polling": { + "enabled": true, + "rate": "1" + }, + "queryPath": "Statistics/Lane Details_graph", + "returnFormat": "dataset" + }, + "type": "query" + } + }, + "props.xTrace.infoBox.dataFormat": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"#,###.##\",\r\n\"Percentage\",\"###.##%\",\r\n\"Rate\",\"#,###.##\",\r\nfalse)" + }, + "type": "expr" + } + } + }, + "props": { + "legend": { + "position": "right", + "visible": true + }, + "plots": [ + { + "axes": [ + { + "alignment": "left", + "label": { + "font": { + "color": "", + "size": 10 + }, + "offset": 0, + "style": { + "classes": "" + }, + "text": "", + "visible": true + }, + "max": "", + "min": "", + "style": { + "classes": "" + }, + "tick": { + "color": "", + "label": { + "font": { + "color": "", + "size": 10 + }, + "style": { + "classes": "" + } + }, + "style": { + "classes": "" + } + }, + "width": 60 + } + ], + "markers": [], + "relativeWeight": 1, + "trends": [ + { + "baselines": [], + "breakLine": true, + "columns": [ + { + "color": "#FF0000", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#808080", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#FF8C00", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#FFFF00", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#00FF00", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#00FFFF", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#0000FF", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#FF00FF", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#D900D9", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#87CEFA", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#CCFFCC", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#AC5F00", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + } + ], + "interpolation": "curveLinear", + "radius": 2, + "series": "graph", + "stack": true, + "type": "line", + "visible": true + } + ] + } + ], + "series": [ + { + "name": "graph" + } + ], + "xTrace": { + "infoBox": { + "dateFormat": "YYYY-MM-DD", + "timeFormat": "HH:mm:ss" + } + } + }, + "type": "ia.chart.timeseries" + } + ], + "meta": { + "name": "Lane Details" + }, + "position": { + "tabIndex": 4 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Total Full1" + }, + "position": { + "basis": "50%" + }, + "propConfig": { + "custom.mode": { + "binding": { + "config": { + "expression": "{..../Statistics.props.currentTabIndex} + {..../Period_not_Global_0/Period.props.value} + {..../Period_not_Global_0/EndTime.custom.Selected}+{..../Period_not_Global_0/StartTime.custom.Selected} + {this.custom.time} + {..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value}" + }, + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": "\t\n\tpath \u003d \"\"\n\theaders \u003d []\n\tgraph \u003d []\n\t\n\tif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\tpath \u003d \"Statistics/Total Full Count\"\n\t\theaders \u003d [\"Lane\",\"Total (#)\",\"DestFull (#)\"]\n\t\tself.getSibling(\"TotalFull1\").props.series[0].tooltip.text \u003d \"Total count (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"TotalFull1\").props.series[1].tooltip.text \u003d \"DestFull count (#): [bold]{valueY}[/]\"\n\t\tself.getSibling(\"TotalFull1\").props.yAxes[0].value.range.max \u003d \"\"\n\telif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\tpath \u003d \"Statistics/Total Full Percent\"\n\t\t\n\t\theaders \u003d [\"Lane\",\"Total (%)\",\"DestFull (%)\"]\n\t\tself.getSibling(\"TotalFull1\").props.series[0].tooltip.text \u003d \"Total (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"TotalFull1\").props.series[1].tooltip.text \u003d \"DestFull Carrier (%): [bold]{valueY}[/]%\"\n\t\tself.getSibling(\"TotalFull1\").props.yAxes[0].value.range.max \u003d 100\n\telse:\n\t\tpath \u003d \"Statistics/Total Full Rate\"\n\t\t\n\t\theaders \u003d [\"Lane\",\"Total (pph)\",\"DestFull (pph)\"]\n\t\tself.getSibling(\"TotalFull1\").props.series[0].tooltip.text \u003d \"Total (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"TotalFull1\").props.series[1].tooltip.text \u003d \"DestFull Carrier (pph): [bold]{valueY}[/] pph\"\n\t\tself.getSibling(\"TotalFull1\").props.yAxes[0].value.range.max \u003d \"\"\n\t\t\n\tparams \u003d {\"starttime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.StartDate,\"endtime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.EndDate}\n\t\n\tdata \u003d system.dataset.toPyDataSet(system.db.runNamedQuery(path,params))\n\tfor row in data:\t\n\t\tdict \u003d {}\n\t\tdict[\u0027Lane\u0027] \u003d \trow[\u0027Lane\u0027]\n\t\tdict[\u0027Total_count\u0027] \u003d row[\u0027Total_count\u0027]\n\t\tdict[\u0027DestFull_count\u0027] \u003d row[\u0027DestFull_count\u0027]\n\t\tgraph.append(dict)\n\t \n\t\n\tself.getSibling(\"TotalFull1\").props.dataSources.example \u003d graph\n\tself.props.data \u003d system.dataset.toDataSet(headers,data)" + } + }, + "custom.time": { + "binding": { + "config": { + "expression": "now(10000000)" + }, + "type": "expr" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "StartTimestamp", + "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 hh:mm:ss", + "editable": false, + "field": "", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "" + }, + "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": "date", + "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 HH:mm:ss", + "editable": false, + "field": "", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "" + }, + "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": "" + } + ], + "data": { + "$": [ + "ds", + 192, + 1699296823726 + ], + "$columns": [ + { + "data": [ + "S03001", + "S03002", + "S03005", + "S03006", + "S03007", + "S03008", + "S03009", + "S03010", + "S03014", + "S03016", + "S03018", + "S03021", + "S03024", + "S03025", + "S03026", + "S03027", + "S03028", + "S03029", + "S03030", + "S03031", + "S03032", + "S03033", + "S03035", + "S03036", + "S03039", + "S03040", + "S03045", + "S03046", + "S03048", + "S03052", + "S03054", + "S03055", + "S03056", + "S03057", + "S03059", + "S03060", + "S03062", + "S03063", + "S03065", + "S03066", + "S03067", + "S03068", + "S03073", + "S03074", + "S03075", + "S03080", + "S03081", + "S03082", + "S03085", + "S03086", + "S03087", + "S03091", + "S03092", + "S03095", + "S03096", + "S03097", + "S03099", + "S03100", + "S03101", + "S03102", + "S03104", + "S03105", + "S03107", + "S03108", + "S03999" + ], + "name": "Lane", + "type": "String" + }, + { + "data": [ + 495, + 10, + 355, + 601, + 1, + 1, + 98, + 487, + 1, + 1, + 7, + 5, + 3, + 5, + 5, + 3, + 2, + 4, + 1, + 6, + 2, + 30, + 28, + 535, + 11, + 151, + 193, + 250, + 325, + 1, + 2, + 9, + 3, + 1, + 5, + 53, + 39, + 6, + 3, + 34, + 13, + 46, + 25, + 61, + 15, + 204, + 131, + 443, + 243, + 224, + 24, + 2, + 5, + 3, + 4, + 67, + 50, + 2, + 4, + 1, + 1, + 1, + 496, + 392, + 78 + ], + "name": "Total (#)", + "type": "Long" + }, + { + "data": [ + 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, + 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, + 0, + 0, + 0, + 0, + 17 + ], + "name": "DestFull (#)", + "type": "Double" + } + ] + }, + "filter": { + "enabled": true, + "results": { + "enabled": true + } + }, + "pager": { + "bottom": false + }, + "rows": { + "data": {} + }, + "style": { + "fontFamily": "Arial" + }, + "virtualized": false + }, + "type": "ia.display.table" + }, + { + "meta": { + "name": "TotalFull1" + }, + "position": { + "basis": "50%" + }, + "props": { + "dataSources": { + "example": [ + { + "DestFull_count": 0, + "Lane": "S03001", + "Total_count": 495 + }, + { + "DestFull_count": 0, + "Lane": "S03002", + "Total_count": 10 + }, + { + "DestFull_count": 0, + "Lane": "S03005", + "Total_count": 355 + }, + { + "DestFull_count": 0, + "Lane": "S03006", + "Total_count": 601 + }, + { + "DestFull_count": 0, + "Lane": "S03007", + "Total_count": 1 + }, + { + "DestFull_count": 0, + "Lane": "S03008", + "Total_count": 1 + }, + { + "DestFull_count": 0, + "Lane": "S03009", + "Total_count": 98 + }, + { + "DestFull_count": 0, + "Lane": "S03010", + "Total_count": 487 + }, + { + "DestFull_count": 0, + "Lane": "S03014", + "Total_count": 1 + }, + { + "DestFull_count": 0, + "Lane": "S03016", + "Total_count": 1 + }, + { + "DestFull_count": 0, + "Lane": "S03018", + "Total_count": 7 + }, + { + "DestFull_count": 0, + "Lane": "S03021", + "Total_count": 5 + }, + { + "DestFull_count": 0, + "Lane": "S03024", + "Total_count": 3 + }, + { + "DestFull_count": 0, + "Lane": "S03025", + "Total_count": 5 + }, + { + "DestFull_count": 0, + "Lane": "S03026", + "Total_count": 5 + }, + { + "DestFull_count": 0, + "Lane": "S03027", + "Total_count": 3 + }, + { + "DestFull_count": 0, + "Lane": "S03028", + "Total_count": 2 + }, + { + "DestFull_count": 0, + "Lane": "S03029", + "Total_count": 4 + }, + { + "DestFull_count": 0, + "Lane": "S03030", + "Total_count": 1 + }, + { + "DestFull_count": 0, + "Lane": "S03031", + "Total_count": 6 + }, + { + "DestFull_count": 0, + "Lane": "S03032", + "Total_count": 2 + }, + { + "DestFull_count": 0, + "Lane": "S03033", + "Total_count": 30 + }, + { + "DestFull_count": 0, + "Lane": "S03035", + "Total_count": 28 + }, + { + "DestFull_count": 0, + "Lane": "S03036", + "Total_count": 535 + }, + { + "DestFull_count": 0, + "Lane": "S03039", + "Total_count": 11 + }, + { + "DestFull_count": 0, + "Lane": "S03040", + "Total_count": 151 + }, + { + "DestFull_count": 0, + "Lane": "S03045", + "Total_count": 193 + }, + { + "DestFull_count": 0, + "Lane": "S03046", + "Total_count": 250 + }, + { + "DestFull_count": 0, + "Lane": "S03048", + "Total_count": 325 + }, + { + "DestFull_count": 0, + "Lane": "S03052", + "Total_count": 1 + }, + { + "DestFull_count": 0, + "Lane": "S03054", + "Total_count": 2 + }, + { + "DestFull_count": 0, + "Lane": "S03055", + "Total_count": 9 + }, + { + "DestFull_count": 0, + "Lane": "S03056", + "Total_count": 3 + }, + { + "DestFull_count": 0, + "Lane": "S03057", + "Total_count": 1 + }, + { + "DestFull_count": 0, + "Lane": "S03059", + "Total_count": 5 + }, + { + "DestFull_count": 0, + "Lane": "S03060", + "Total_count": 53 + }, + { + "DestFull_count": 0, + "Lane": "S03062", + "Total_count": 39 + }, + { + "DestFull_count": 0, + "Lane": "S03063", + "Total_count": 6 + }, + { + "DestFull_count": 0, + "Lane": "S03065", + "Total_count": 3 + }, + { + "DestFull_count": 0, + "Lane": "S03066", + "Total_count": 34 + }, + { + "DestFull_count": 0, + "Lane": "S03067", + "Total_count": 13 + }, + { + "DestFull_count": 0, + "Lane": "S03068", + "Total_count": 46 + }, + { + "DestFull_count": 0, + "Lane": "S03073", + "Total_count": 25 + }, + { + "DestFull_count": 0, + "Lane": "S03074", + "Total_count": 61 + }, + { + "DestFull_count": 0, + "Lane": "S03075", + "Total_count": 15 + }, + { + "DestFull_count": 0, + "Lane": "S03080", + "Total_count": 204 + }, + { + "DestFull_count": 0, + "Lane": "S03081", + "Total_count": 131 + }, + { + "DestFull_count": 0, + "Lane": "S03082", + "Total_count": 443 + }, + { + "DestFull_count": 0, + "Lane": "S03085", + "Total_count": 243 + }, + { + "DestFull_count": 0, + "Lane": "S03086", + "Total_count": 224 + }, + { + "DestFull_count": 0, + "Lane": "S03087", + "Total_count": 24 + }, + { + "DestFull_count": 0, + "Lane": "S03091", + "Total_count": 2 + }, + { + "DestFull_count": 0, + "Lane": "S03092", + "Total_count": 5 + }, + { + "DestFull_count": 0, + "Lane": "S03095", + "Total_count": 3 + }, + { + "DestFull_count": 0, + "Lane": "S03096", + "Total_count": 4 + }, + { + "DestFull_count": 0, + "Lane": "S03097", + "Total_count": 67 + }, + { + "DestFull_count": 0, + "Lane": "S03099", + "Total_count": 50 + }, + { + "DestFull_count": 0, + "Lane": "S03100", + "Total_count": 2 + }, + { + "DestFull_count": 0, + "Lane": "S03101", + "Total_count": 4 + }, + { + "DestFull_count": 0, + "Lane": "S03102", + "Total_count": 1 + }, + { + "DestFull_count": 0, + "Lane": "S03104", + "Total_count": 1 + }, + { + "DestFull_count": 0, + "Lane": "S03105", + "Total_count": 1 + }, + { + "DestFull_count": 0, + "Lane": "S03107", + "Total_count": 496 + }, + { + "DestFull_count": 0, + "Lane": "S03108", + "Total_count": 392 + }, + { + "DestFull_count": 17, + "Lane": "S03999", + "Total_count": 78 + } + ] + }, + "series": [ + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "#3C2AF5", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "#FCFCFC", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Lane", + "y": "Total_count" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Total" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "Total_count", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "Total count (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Lane", + "yAxis": "Carriers", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "#FF0000", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "#FF0000", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Lane", + "y": "DestFull_count" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Dest Full" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "DestFull_count", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "DestFull count (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Lane", + "yAxis": "Carriers", + "zIndex": 0 + } + ], + "xAxes": [ + { + "appearance": { + "font": { + "size": "", + "weight": 500 + }, + "grid": { + "color": "", + "dashArray": "", + "minDistance": 60, + "opacity": 1, + "position": 0.5 + }, + "inside": false, + "labels": { + "color": "", + "horizontalCenter": "middle", + "opacity": 1, + "rotation": 315, + "verticalCenter": "middle" + }, + "opposite": false + }, + "category": { + "break": { + "enabled": false, + "endCategory": "", + "size": 0.05, + "startCategory": "" + } + }, + "date": { + "baseInterval": { + "count": 1, + "enabled": false, + "skipEmptyPeriods": false, + "timeUnit": "hour" + }, + "break": { + "enabled": false, + "endDate": "", + "size": 0.05, + "startDate": "" + }, + "format": "M/d", + "inputFormat": "yyyy-MM-dd kk:mm:ss", + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "inversed": false, + "label": { + "color": "", + "enabled": true, + "text": "Lanes" + }, + "name": "Lane", + "render": "category", + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "" + }, + "value": { + "break": { + "enabled": false, + "endValue": 100, + "size": 0.05, + "startValue": 0 + }, + "format": "#,###.##", + "logarithmic": false, + "range": { + "max": 110, + "min": 0, + "useStrict": false + } + }, + "visible": true + } + ], + "yAxes": [ + { + "appearance": { + "font": { + "size": "", + "weight": 500 + }, + "grid": { + "color": "", + "dashArray": "", + "minDistance": null, + "opacity": 1, + "position": 0.5 + }, + "inside": false, + "labels": { + "color": "", + "horizontalCenter": "middle", + "opacity": 1, + "rotation": 0, + "verticalCenter": "middle" + }, + "opposite": false + }, + "category": { + "break": { + "enabled": false, + "endCategory": "", + "size": 0.05, + "startCategory": "" + } + }, + "date": { + "baseInterval": { + "count": 1, + "enabled": false, + "skipEmptyPeriods": false, + "timeUnit": "hour" + }, + "break": { + "enabled": false, + "endDate": "", + "size": 0.05, + "startDate": "" + }, + "format": "M/d/yyyy HH:mm:ss", + "inputFormat": "yyyy-MM-dd kk:mm:ss", + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "inversed": false, + "label": { + "color": "", + "enabled": true, + "text": "" + }, + "name": "Carriers", + "render": "value", + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "" + }, + "value": { + "break": { + "enabled": false, + "endValue": 100, + "size": 0.05, + "startValue": 0 + }, + "format": "#,###.##", + "logarithmic": false, + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "visible": true + } + ] + }, + "type": "ia.chart.xy" + } + ], + "meta": { + "name": "Total Full1" + }, + "position": { + "tabIndex": 10 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "events": { + "component": { + "onRowDoubleClick": { + "config": { + "script": "\tself.props.selection.selectedRow \u003d \"null\"" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Jam Area" + }, + "position": { + "basis": "50%" + }, + "propConfig": { + "position.basis": { + "binding": { + "config": { + "expression": "if ({../Induct Details_graph.position.display} \u003d true, \"50%\", \"100%\")" + }, + "enabled": false, + "type": "expr" + } + }, + "props.columns[10].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[11].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[12].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[3].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[4].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[5].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[6].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Count\"" + }, + "type": "expr" + } + }, + "props.columns[7].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[8].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.columns[9].visible": { + "binding": { + "config": { + "expression": "{..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value} \u003d \"Percentage\"" + }, + "type": "expr" + } + }, + "props.data": { + "binding": { + "config": { + "parameters": { + "endtime": "{..../Period_not_Global_0.custom.EndDate}", + "starttime": "{..../Period_not_Global_0.custom.StartDate}" + }, + "polling": { + "enabled": true, + "rate": "1" + }, + "queryPath": "Jam_Area/Jam" + }, + "type": "query" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "Startstamp", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Start Timestamp" + }, + "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": "date", + "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 HH:mm:ss", + "editable": false, + "field": "Endtstamp", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "End Timestamp" + }, + "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": "date", + "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": "Total_jam", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Total (#)" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Dumpers_jam", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dumpers jam (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Inbound_jam", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Inbound jam (#)" + }, + "justify": "center", + "number": "value", + "numberFormat": "none", + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Runout_jam", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Runout jam(#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Sorter_Recirc_jam", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Sorter Recirc Jam (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Dumpers_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Dumpers Jam (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Inbound_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "Inbound Jam (%)" + }, + "justify": "auto", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Runout_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "Runout Jam (%)" + }, + "justify": "auto", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Sorter_Recirc_perc", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "Sorter Recirc Jam (%)" + }, + "justify": "auto", + "number": "value", + "numberFormat": "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Sorter_jam", + "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": "Sorter Jam (#)" + }, + "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": "", + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Sorter_perc", + "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": "Sorter Jam (%)" + }, + "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": "", + "width": "" + } + ], + "filter": { + "enabled": true, + "results": { + "enabled": true + } + }, + "pager": { + "bottom": false + }, + "selection": { + "mode": "multiple interval" + }, + "virtualized": false + }, + "type": "ia.display.table" + }, + { + "meta": { + "name": "Jam Area_graph" + }, + "position": { + "basis": "50%" + }, + "propConfig": { + "props.plots[0].axes[0].name": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Inbound_jam\",\r\n\"Percentage\",\"Total_perc\",\r\n\"Rate\",\"Total_rate\",\r\nfalse)" + }, + "enabled": false, + "type": "expr" + } + }, + "props.plots[0].trends[0].axis": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"Dumpers_jam\",\r\n\"Percentage\",\"Total_perc\",\r\n\"Rate\",\"Total_rate\",\r\nfalse)" + }, + "enabled": false, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[0].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"uljl_jam\",\r\n\"Percentage\",\"Total_perc\",\r\n\"Rate\",\"Total_rate\",\r\nfalse)" + }, + "enabled": false, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[1].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"ps1_jam\",\r\n\"Percentage\",\"SingleCarrier_perc\",\r\n\"Rate\",\"SingleCarrier_rate\",\r\nfalse)" + }, + "enabled": false, + "type": "expr" + } + }, + "props.plots[0].trends[0].columns[2].key": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"doublecarrier_count\",\r\n\"Percentage\",\"DoubleCarrier_perc\",\r\n\"Rate\",\"DoubleCarrier_rate\",\r\nfalse)" + }, + "enabled": false, + "type": "expr" + } + }, + "props.series[0].data": { + "binding": { + "config": { + "parameters": { + "endtime": "{..../Period_not_Global_0.custom.EndDate}", + "starttime": "{..../Period_not_Global_0.custom.StartDate}" + }, + "polling": { + "enabled": true, + "rate": "1" + }, + "queryPath": "Jam_Area/Jam_graph", + "returnFormat": "dataset" + }, + "type": "query" + } + }, + "props.xTrace.infoBox.dataFormat": { + "binding": { + "config": { + "expression": "case ({..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value},\r\n\"Count\",\"#,###.##\",\r\n\"Percentage\",\"###.##%\",\r\n\"Rate\",\"#,###.##\",\r\nfalse)" + }, + "type": "expr" + } + } + }, + "props": { + "legend": { + "position": "top", + "visible": true + }, + "plots": [ + { + "axes": [ + { + "alignment": "left", + "label": { + "font": { + "color": "", + "size": 10 + }, + "offset": 0, + "style": { + "classes": "" + }, + "text": "", + "visible": true + }, + "max": "", + "min": "", + "name": "qty", + "style": { + "classes": "" + }, + "tick": { + "color": "", + "label": { + "font": { + "color": "", + "size": 10 + }, + "style": { + "classes": "" + } + }, + "style": { + "classes": "" + } + }, + "width": 60 + } + ], + "markers": [], + "relativeWeight": 1, + "trends": [ + { + "axis": "roundtime", + "baselines": [], + "breakLine": true, + "columns": [ + { + "color": "#FF0000", + "key": "roundtime", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#808080", + "key": "Dumpers_jam", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": 0.1, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": "nu" + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#002EFF", + "key": "Inbound_jam", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "", + "key": "Runout_jam", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#48FF13", + "key": "Sorter_Recirc_jam", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + }, + { + "color": "#00640E", + "key": "Sorter_jam", + "styles": { + "highlighted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "muted": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "normal": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + }, + "selected": { + "fill": { + "color": "", + "opacity": null + }, + "stroke": { + "color": "", + "dashArray": null, + "opacity": null, + "width": null + } + } + } + } + ], + "interpolation": "curveLinear", + "radius": 2, + "series": "graph", + "stack": true, + "type": "line", + "visible": true + } + ] + } + ], + "series": [ + { + "name": "graph" + } + ], + "xTrace": { + "infoBox": { + "dateFormat": "YYYY-MM-DD", + "timeFormat": "HH:mm:ss" + } + } + }, + "type": "ia.chart.timeseries" + } + ], + "meta": { + "name": "Jam Area" + }, + "position": { + "tabIndex": 11 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Dumper cycles" + }, + "position": { + "basis": "50%" + }, + "propConfig": { + "custom.mode": { + "binding": { + "config": { + "expression": "{..../Statistics.props.currentTabIndex} + {..../Period_not_Global_0/Period.props.value} + {..../Period_not_Global_0/EndTime.custom.Selected}+{..../Period_not_Global_0/StartTime.custom.Selected} + {this.custom.time} + {..../Lane Drop Down/Lane.props.value} + {..../Aggregation_Mode/Dropdown_Aggregation_mode.props.value}" + }, + "type": "expr" + }, + "onChange": { + "enabled": null, + "script": "\t\n\tpath \u003d \"\"\n\theaders \u003d []\n\tgraph \u003d []\n\t\n\tif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\tpath \u003d \"Dumper/Dumper Lane Count\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Cycles of ULGL1\",\"Cycles of ULGL2\",\"Cycles of ULGL3\"]\n\t\t\n\t\tself.getSibling(\"Dumper_cycles\").props.yAxes[0].value.range.max \u003d \"\"\n\telif self.parent.parent.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\tpath \u003d \"Dumper/Dumper Lane Percent\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Cycles of ULGL1 (%)\",\"Cycles of ULGL2 (%)\",\"Cycles of ULGL3 (%)\"]\n\t\t\n\t\tself.getSibling(\"Dumper_cycles\").props.yAxes[0].value.range.max \u003d 100\n\telse:\n\t\tpath \u003d \"Dumper/Dumper Lane Rate\"\n\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Cycles of ULGL1 (cph)\",\"Cycles of ULGL2 (cph)\",\"Cycles of ULGL3 (cph)\"]\n\t\t\n\t\tself.getSibling(\"Dumper_cycles\").props.yAxes[0].value.range.max \u003d \"\"\n\t\t\n\tparams \u003d {\"starttime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.StartDate,\"endtime\":self.parent.parent.parent.getChild(\"Period_not_Global_0\").custom.EndDate,\"dumper\":self.parent.parent.parent.getChild(\"Dumper Drop Down_0\").getChild(\"Dumper\").props.value}\t\n\t\n\tdata \u003d system.dataset.toPyDataSet(system.db.runNamedQuery(path,params))\n\t\n\tfor row in data:\t\n\t\tdict \u003d {}\n\t\tdict[\u0027Hour\u0027] \u003d \trow[\u0027Hour\u0027]\n\t\tdict[\u0027ULGL1\u0027] \u003d row[\u0027ULGL1\u0027]\n\t\tdict[\u0027ULGL2\u0027] \u003d row[\u0027ULGL2\u0027]\n\t\tdict[\u0027ULGL3\u0027] \u003d row[\u0027ULGL3\u0027]\n\t\n\t\tgraph.append(dict)\n\t\n\tself.getSibling(\"Dumper_cycles\").props.dataSources.example \u003d graph\n\tself.props.data \u003d system.dataset.toDataSet(headers,data)" + } + }, + "custom.time": { + "binding": { + "config": { + "expression": "now(10000000)" + }, + "type": "expr" + } + } + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "ulgl1", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "n/a" + }, + "justify": "center", + "number": "value", + "numberFormat": "00:00:00", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "date", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": false, + "width": "" + }, + { + "align": "center", + "boolean": "value", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "ulgl1", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Start Timestamp" + }, + "justify": "center", + "number": "value", + "numberFormat": "none", + "progressBar": { + "bar": { + "color": "", + "style": { + "classes": "" + } + }, + "max": 100, + "min": 0, + "track": { + "color": "", + "style": { + "classes": "" + } + }, + "value": { + "enabled": true, + "format": "0,0.##", + "justify": "center", + "style": { + "classes": "" + } + } + }, + "render": "date", + "resizable": true, + "sort": "none", + "sortable": true, + "strictWidth": false, + "style": { + "classes": "" + }, + "toggleSwitch": { + "color": { + "selected": "", + "unselected": "" + } + }, + "viewParams": {}, + "viewPath": "", + "visible": true, + "width": 150 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY HH:mm:ss", + "editable": false, + "field": "ulgl2", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Hour" + }, + "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": 150 + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "ulgl3", + "footer": { + "align": "center", + "justify": "left", + "style": { + "classes": "" + }, + "title": "" + }, + "header": { + "align": "center", + "justify": "center", + "style": { + "classes": "" + }, + "title": "Total (%)" + }, + "justify": "center", + "number": "value", + "numberFormat": "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": "", + "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": "", + "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, + 1699296819947 + ], + "$columns": [ + { + "data": [ + "2023-11-06 9:00", + "2023-11-06 10:00" + ], + "name": "Start Timestamp", + "type": "String" + }, + { + "data": [ + "H1", + "H0" + ], + "name": "Hour", + "type": "String" + }, + { + "data": [ + 0, + 15 + ], + "name": "Cycles of ULGL1", + "type": "Double" + }, + { + "data": [ + null, + null + ], + "name": "Cycles of ULGL2", + "type": "String" + }, + { + "data": [ + 1, + 3 + ], + "name": "Cycles of ULGL3", + "type": "Double" + } + ] + }, + "filter": { + "enabled": true, + "results": { + "enabled": true + } + }, + "pager": { + "bottom": false + }, + "rows": { + "style": { + "textAlign": "center" + } + }, + "selection": { + "enableRowSelection": false + }, + "virtualized": false + }, + "type": "ia.display.table" + }, + { + "meta": { + "name": "Dumper_cycles" + }, + "position": { + "basis": "50%" + }, + "props": { + "dataSources": { + "example": [ + { + "Hour": "H1", + "ULGL1": 0, + "ULGL2": null, + "ULGL3": 1 + }, + { + "Hour": "H0", + "ULGL1": 15, + "ULGL2": null, + "ULGL3": 3 + } + ] + }, + "legend": { + "enabled": false + }, + "series": [ + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "ULGL1" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Diverted" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "ULGL1", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "ULGL1 (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Total", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "#FF0000", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "#FF0000", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "ULGL2" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Dest Full" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "ULGL2", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "ULGL2 (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Total", + "zIndex": 0 + }, + { + "candlestick": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "stacked": false, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + } + }, + "high": { + "x": "", + "y": "" + }, + "low": { + "x": "", + "y": "" + }, + "open": { + "x": "", + "y": "" + } + }, + "column": { + "appearance": { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "fill": { + "color": "#FF8C00", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": "", + "min": "" + }, + "height": null, + "stacked": true, + "stroke": { + "color": "#FF8C00", + "opacity": 1, + "width": 1 + }, + "width": null + }, + "open": { + "x": "", + "y": "" + } + }, + "data": { + "source": "example", + "x": "Hour", + "y": "ULGL3" + }, + "defaultState": { + "visible": true + }, + "hiddenInLegend": false, + "label": { + "text": "Dest Jam" + }, + "line": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": false, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "name": "ULGL3", + "render": "column", + "stepLine": { + "appearance": { + "bullets": [ + { + "deriveFieldsFromData": { + "fill": { + "color": "", + "opacity": "" + }, + "rotation": "", + "stroke": { + "color": "", + "opacity": "", + "width": "" + } + }, + "enabled": true, + "fill": { + "color": "", + "opacity": 1 + }, + "heatRules": { + "dataField": "", + "enabled": false, + "max": 100, + "min": 2 + }, + "height": 10, + "label": { + "position": { + "dx": 0, + "dy": 0 + }, + "text": "{value}" + }, + "render": "circle", + "rotation": 0, + "stroke": { + "color": "", + "opacity": 1, + "width": 1 + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "{name}: [bold]{valueY}[/]" + }, + "width": 10 + } + ], + "connect": true, + "fill": { + "color": "", + "opacity": 0 + }, + "minDistance": 0.5, + "stroke": { + "color": "", + "dashArray": "", + "opacity": 1, + "width": 3 + }, + "tensionX": 1, + "tensionY": 1 + }, + "open": { + "x": "", + "y": "" + } + }, + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "ULGL3 (#): [bold]{valueY}[/]" + }, + "visible": true, + "xAxis": "Hour", + "yAxis": "Total", + "zIndex": 0 + } + ], + "xAxes": [ + { + "appearance": { + "font": { + "size": "", + "weight": 500 + }, + "grid": { + "color": "", + "dashArray": "", + "minDistance": 60, + "opacity": 1, + "position": 0.5 + }, + "inside": false, + "labels": { + "color": "", + "horizontalCenter": "middle", + "opacity": 1, + "rotation": 0, + "verticalCenter": "middle" + }, + "opposite": false + }, + "category": { + "break": { + "enabled": false, + "endCategory": "", + "size": 0.05, + "startCategory": "" + } + }, + "date": { + "baseInterval": { + "count": 1, + "enabled": false, + "skipEmptyPeriods": false, + "timeUnit": "hour" + }, + "break": { + "enabled": false, + "endDate": "", + "size": 0.05, + "startDate": "" + }, + "format": "M/d", + "inputFormat": "yyyy-MM-dd kk:mm:ss", + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "inversed": false, + "label": { + "color": "", + "enabled": true, + "text": "Hour" + }, + "name": "Hour", + "render": "category", + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "" + }, + "value": { + "break": { + "enabled": false, + "endValue": 100, + "size": 0.05, + "startValue": 0 + }, + "format": "#,###.##", + "logarithmic": false, + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "visible": true + } + ], + "yAxes": [ + { + "appearance": { + "font": { + "size": "", + "weight": 500 + }, + "grid": { + "color": "", + "dashArray": "", + "minDistance": null, + "opacity": 1, + "position": 0.5 + }, + "inside": false, + "labels": { + "color": "", + "horizontalCenter": "middle", + "opacity": 1, + "rotation": 0, + "verticalCenter": "middle" + }, + "opposite": false + }, + "category": { + "break": { + "enabled": false, + "endCategory": "", + "size": 0.05, + "startCategory": "" + } + }, + "date": { + "baseInterval": { + "count": 1, + "enabled": false, + "skipEmptyPeriods": false, + "timeUnit": "hour" + }, + "break": { + "enabled": false, + "endDate": "", + "size": 0.05, + "startDate": "" + }, + "format": "M/d/yyyy HH:mm:ss", + "inputFormat": "yyyy-MM-dd kk:mm:ss", + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "inversed": false, + "label": { + "color": "", + "enabled": true, + "text": "" + }, + "name": "Total", + "render": "value", + "tooltip": { + "background": { + "color": "", + "opacity": 1 + }, + "cornerRadius": 3, + "enabled": true, + "pointerLength": 4, + "text": "" + }, + "value": { + "break": { + "enabled": false, + "endValue": 100, + "size": 0.05, + "startValue": 0 + }, + "format": "#,###.##", + "logarithmic": false, + "range": { + "max": "", + "min": "", + "useStrict": false + } + }, + "visible": true + } + ] + }, + "type": "ia.chart.xy" + } + ], + "meta": { + "name": "Dumper cycles" + }, + "position": { + "tabIndex": 12 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "Statistics", + "visible": "TRUE" + }, + "position": { + "height": 0.96, + "width": 1, + "y": 0.04 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "" + }, + "enabled": false, + "type": "expr" + } + }, + "props.tabs": { + "persistent": true + } + }, + "props": { + "currentTabIndex": 6, + "menuStyle": { + "backgroundColor": "#FFFFFFBD" + }, + "style": { + "fontFamily": "Arial" + }, + "tabSize": { + "width": 160 + }, + "tabs": [ + "Induct Details", + "Scanner Details", + "Sorter Summary", + "Sorter Details", + "Lane Details", + "Hourly Induct", + "Hourly Scanner", + "Hourly Sorter Summary", + "Hourly Sorter Details", + "Hourly Lane", + "Lane Total Full", + "Jam by Area", + "Dumper cycles" + ] + }, + "type": "ia.container.tab" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "162px" + }, + "props": { + "style": { + "color": "#FFFFFF" + }, + "text": "Aggregation Mode:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown_Aggregation_mode" + }, + "position": { + "basis": "171px" + }, + "props": { + "options": [ + { + "label": "Count", + "value": "Count" + }, + { + "label": "Percentage", + "value": "Percentage" + }, + { + "label": "Rate", + "value": "Rate" + } + ], + "value": "Count" + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "Aggregation_Mode" + }, + "position": { + "height": 0.03, + "width": 0.1766, + "x": 0.7556, + "y": 0.0048 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "{../Statistics.props.currentTabIndex} !\u003d12" + }, + "enabled": false, + "type": "expr" + } + } + }, + "props": { + "style": { + "fontFamily": "Arial" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "63px" + }, + "props": { + "style": { + "color": "#000000" + }, + "text": "Induct:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dropdown_0" + }, + "position": { + "basis": "171px" + }, + "props": { + "options": [ + { + "label": "PS01", + "value": "PS01" + }, + { + "label": "PS02", + "value": "PS02" + }, + { + "label": "PS03", + "value": "PS03" + } + ], + "value": "PS01" + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "Induct Drop Down", + "visible": false + }, + "position": { + "height": 0.0269, + "width": 0.124, + "x": 0.872, + "y": 0.0439 + }, + "props": { + "style": { + "fontFamily": "Arial" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label_Scanner" + }, + "position": { + "basis": "70px" + }, + "props": { + "style": { + "color": "#000000" + }, + "text": "Scanner:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Scanner" + }, + "position": { + "basis": "171px" + }, + "props": { + "options": [ + { + "label": "S01aa", + "value": "S01aa" + }, + { + "label": "S02aa", + "value": "S02aa" + }, + { + "label": "S03aa", + "value": "S03aa" + } + ], + "value": "S01aa" + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "Scanner Drop Down", + "visible": false + }, + "position": { + "height": 0.0269, + "width": 0.124, + "x": 0.872, + "y": 0.0439 + }, + "props": { + "style": { + "fontFamily": "Arial" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label_Lane" + }, + "position": { + "basis": "70px" + }, + "props": { + "style": { + "color": "#000000" + }, + "text": "Lane:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Lane" + }, + "position": { + "basis": "171px" + }, + "props": { + "options": [ + { + "label": "S03001", + "value": "S03001" + }, + { + "label": "S03002", + "value": "S03002" + }, + { + "label": "S03003", + "value": "S03003" + }, + { + "label": "S03005", + "value": "S03005" + }, + { + "label": "S03006", + "value": "S03006" + }, + { + "label": "S03007", + "value": "S03007" + }, + { + "label": "S03008", + "value": "S03008" + }, + { + "label": "S03009", + "value": "S03009" + }, + { + "label": "S03010", + "value": "S03010" + }, + { + "label": "S03011", + "value": "S03011" + }, + { + "label": "S03012", + "value": "S03012" + }, + { + "label": "S03013", + "value": "S03013" + }, + { + "label": "S03014", + "value": "S03014" + }, + { + "label": "S03015", + "value": "S03015" + }, + { + "label": "S03016", + "value": "S03016" + }, + { + "label": "S03017", + "value": "S03017" + }, + { + "label": "S03018", + "value": "S03018" + }, + { + "label": "S03019", + "value": "S03019" + }, + { + "label": "S03020", + "value": "S03020" + }, + { + "label": "S03021", + "value": "S03021" + }, + { + "label": "S03022", + "value": "S03022" + }, + { + "label": "S03023", + "value": "S03023" + }, + { + "label": "S03024", + "value": "S03024" + }, + { + "label": "S03025", + "value": "S03025" + }, + { + "label": "S03026", + "value": "S03026" + }, + { + "label": "S03027", + "value": "S03027" + }, + { + "label": "S03028", + "value": "S03028" + }, + { + "label": "S03029", + "value": "S03029" + }, + { + "label": "S03030", + "value": "S03030" + }, + { + "label": "S03031", + "value": "S03031" + }, + { + "label": "S03032", + "value": "S03032" + }, + { + "label": "S03033", + "value": "S03033" + }, + { + "label": "S03034", + "value": "S03034" + }, + { + "label": "S03035", + "value": "S03035" + }, + { + "label": "S03036", + "value": "S03036" + }, + { + "label": "S03037", + "value": "S03037" + }, + { + "label": "S03038", + "value": "S03038" + }, + { + "label": "S03039", + "value": "S03039" + }, + { + "label": "S03040", + "value": "S03040" + }, + { + "label": "S03041", + "value": "S03041" + }, + { + "label": "S03042", + "value": "S03042" + }, + { + "label": "S03043", + "value": "S03043" + }, + { + "label": "S03044", + "value": "S03044" + }, + { + "label": "S03045", + "value": "S03045" + }, + { + "label": "S03046", + "value": "S03046" + }, + { + "label": "S03047", + "value": "S03047" + }, + { + "label": "S03048", + "value": "S03048" + }, + { + "label": "S03049", + "value": "S03049" + }, + { + "label": "S03050", + "value": "S03050" + }, + { + "label": "S03051", + "value": "S03051" + }, + { + "label": "S03052", + "value": "S03052" + }, + { + "label": "S03053", + "value": "S03053" + }, + { + "label": "S03054", + "value": "S03054" + }, + { + "label": "S03055", + "value": "S03055" + }, + { + "label": "S03056", + "value": "S03056" + }, + { + "label": "S03057", + "value": "S03057" + }, + { + "label": "S03058", + "value": "S03058" + }, + { + "label": "S03059", + "value": "S03059" + }, + { + "label": "S03060", + "value": "S03060" + }, + { + "label": "S03061", + "value": "S03061" + }, + { + "label": "S03062", + "value": "S03062" + }, + { + "label": "S03063", + "value": "S03063" + }, + { + "label": "S03064", + "value": "S03064" + }, + { + "label": "S03065", + "value": "S03065" + }, + { + "label": "S03066", + "value": "S03066" + }, + { + "label": "S03067", + "value": "S03067" + }, + { + "label": "S03068", + "value": "S03068" + }, + { + "label": "S03069", + "value": "S03069" + }, + { + "label": "S03070", + "value": "S03070" + }, + { + "label": "S03071", + "value": "S03071" + }, + { + "label": "S03072", + "value": "S03072" + }, + { + "label": "S03073", + "value": "S03073" + }, + { + "label": "S03074", + "value": "S03074" + }, + { + "label": "S03075", + "value": "S03075" + }, + { + "label": "S03076", + "value": "S03076" + }, + { + "label": "S03077", + "value": "S03077" + }, + { + "label": "S03078", + "value": "S03078" + }, + { + "label": "S03079", + "value": "S03079" + }, + { + "label": "S03080", + "value": "S03080" + }, + { + "label": "S03081", + "value": "S03081" + }, + { + "label": "S03082", + "value": "S03082" + }, + { + "label": "S03083", + "value": "S03083" + }, + { + "label": "S03084", + "value": "S03084" + }, + { + "label": "S03085", + "value": "S03085" + }, + { + "label": "S03086", + "value": "S03086" + }, + { + "label": "S03087", + "value": "S03087" + }, + { + "label": "S03088", + "value": "S03088" + }, + { + "label": "S03089", + "value": "S03089" + }, + { + "label": "S03090", + "value": "S03090" + }, + { + "label": "S03091", + "value": "S03091" + }, + { + "label": "S03092", + "value": "S03092" + }, + { + "label": "S03093", + "value": "S03093" + }, + { + "label": "S03094", + "value": "S03094" + }, + { + "label": "S03095", + "value": "S03095" + }, + { + "label": "S03096", + "value": "S03096" + }, + { + "label": "S03097", + "value": "S03097" + }, + { + "label": "S03098", + "value": "S03098" + }, + { + "label": "S03099", + "value": "S03099" + }, + { + "label": "S03100", + "value": "S03100" + }, + { + "label": "S03101", + "value": "S03101" + }, + { + "label": "S03102", + "value": "S03102" + }, + { + "label": "S03103", + "value": "S03103" + }, + { + "label": "S03104", + "value": "S03104" + }, + { + "label": "S03105", + "value": "S03105" + }, + { + "label": "S03106", + "value": "S03106" + }, + { + "label": "S03107", + "value": "S03107" + }, + { + "label": "S03108", + "value": "S03108" + }, + { + "label": "S03999", + "value": "S03999" + } + ], + "value": "S0101" + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "Lane Drop Down" + }, + "position": { + "height": 0.0269, + "width": 0.0792, + "x": 0.6897, + "y": 0.0922 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "if ({../Statistics.props.currentTabIndex} \u003d 9 ,\r\ntrue,\r\nfalse)" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "fontFamily": "Arial" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label_Scanner" + }, + "position": { + "basis": "70px" + }, + "props": { + "style": { + "color": "#000000" + }, + "text": "Sorter:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Sorter" + }, + "position": { + "basis": "171px" + }, + "props": { + "options": [ + { + "label": "S01", + "value": "S01" + }, + { + "label": "S02", + "value": "S02" + }, + { + "label": "S03", + "value": "S03" + } + ], + "value": "PS01" + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "Sorter Drop Down", + "visible": false + }, + "position": { + "height": 0.0269, + "width": 0.124, + "x": 0.872, + "y": 0.0439 + }, + "props": { + "style": { + "fontFamily": "Arial" + } + }, + "type": "ia.container.flex" + }, + { + "custom": { + "debug": [ + [ + "2020-03-24 03:58:00", + 83.44392609984358, + 93.58514404296875, + 71.81086730957031 + ], + [ + "2020-03-24 03:59:00", + 83.35893577107669, + 106.05998229980469, + 72.54214477539062 + ], + [ + "2020-03-24 04:00:00", + 83.2739454423098, + 102.124267578125, + 72.18306732177734 + ], + [ + "2020-03-24 04:01:00", + 83.26998772600022, + 104.7994155883789, + 72.2726821899414 + ], + [ + "2020-03-24 04:02:00", + 83.09998708000028, + 110.67745971679688, + 72.70557403564453 + ], + [ + "2020-03-24 04:03:00", + 82.95057846075277, + 110.90865325927734, + 72.86494445800781 + ], + [ + "2020-03-24 04:04:00", + 82.87408810123425, + 111.18544006347656, + 72.739990234375 + ], + [ + "2020-03-24 04:05:00", + 82.79759774171573, + 110.57137298583984, + 72.47943878173828 + ], + [ + "2020-03-24 04:06:00", + 82.72110738219722, + 111.59486389160156, + 72.50711059570312 + ], + [ + "2020-03-24 04:07:00", + 82.6446170226787, + 110.79205322265625, + 72.84617614746094 + ], + [ + "2020-03-24 04:08:00", + 82.56812666316019, + 112.36724853515625, + 72.59688568115234 + ], + [ + "2020-03-24 04:09:00", + 82.49163630364167, + 111.96199035644531, + 71.75237274169922 + ], + [ + "2020-03-24 04:10:00", + 82.41514594412317, + 114.09909057617188, + 72.87260437011719 + ], + [ + "2020-03-24 04:11:00", + 82.33865558460465, + 113.22314453125, + 72.4264144897461 + ], + [ + "2020-03-24 04:12:00", + 82.26216522508614, + 112.67841339111328, + 72.77767944335938 + ], + [ + "2020-03-24 04:13:00", + 82.18567486556762, + 109.4883041381836, + 73.2457504272461 + ], + [ + "2020-03-24 04:14:00", + 82.1091845060491, + 109.47913360595703, + 72.0219955444336 + ], + [ + "2020-03-24 04:15:00", + 82.03269414653059, + 109.40910339355469, + 72.11457061767578 + ], + [ + "2020-03-24 04:16:00", + 81.95620378701207, + 108.2085189819336, + 73.03665924072266 + ], + [ + "2020-03-24 04:17:00", + 81.87971342749356, + 109.74492645263672, + 72.89605712890625 + ], + [ + "2020-03-24 04:18:00", + 81.80322306797505, + 110.48381042480469, + 72.340087890625 + ], + [ + "2020-03-24 04:19:00", + 81.72673270845654, + 110.1125259399414, + 72.04779815673828 + ], + [ + "2020-03-24 04:20:00", + 81.65024234893802, + 110.58039855957031, + 72.02574157714844 + ], + [ + "2020-03-24 04:21:00", + 81.5737519894195, + 111.26719665527344, + 72.68399810791016 + ], + [ + "2020-03-24 04:22:00", + 81.57001033599973, + 111.0679931640625, + 72.2317123413086 + ], + [ + "2020-03-24 04:23:00", + 81.40001291999972, + 111.84290313720703, + 73.5782470703125 + ], + [ + "2020-03-24 04:24:00", + 81.22444354734957, + 111.08856201171875, + 74.54239654541016 + ], + [ + "2020-03-24 04:25:00", + 81.13445335130304, + 110.7277603149414, + 73.62892150878906 + ], + [ + "2020-03-24 04:26:00", + 81.04446315525652, + 110.72388458251953, + 74.79293823242188 + ], + [ + "2020-03-24 04:27:00", + 80.95447295921001, + 113.21517944335938, + 73.95577239990234 + ], + [ + "2020-03-24 04:28:00", + 80.86448276316348, + 112.6423568725586, + 74.46560668945312 + ], + [ + "2020-03-24 04:29:00", + 80.77449256711697, + 113.47187805175781, + 75.20769500732422 + ], + [ + "2020-03-24 04:30:00", + 80.68450237107044, + 113.81484985351562, + 74.11184692382812 + ], + [ + "2020-03-24 04:31:00", + 80.59451217502392, + 110.26861572265625, + 73.92262268066406 + ], + [ + "2020-03-24 04:32:00", + 80.50452197897741, + 109.19113159179688, + 74.61058807373047 + ], + [ + "2020-03-24 04:33:00", + 80.41453178293088, + 108.94200134277344, + 74.5039291381836 + ], + [ + "2020-03-24 04:34:00", + 80.32454158688437, + 109.96826934814453, + 74.46529388427734 + ], + [ + "2020-03-24 04:35:00", + 80.23455139083784, + 81.94364929199219, + 73.67473602294922 + ], + [ + "2020-03-24 04:36:00", + 80.14456119479132, + 23.80181121826172, + 73.68876117466887 + ], + [ + "2020-03-24 04:37:00", + 80.0545709987448, + 1.4474921226501465, + 73.68912506103516 + ], + [ + "2020-03-24 04:38:00", + 79.96458080269828, + 4.1637725830078125, + 73.72541046142578 + ], + [ + "2020-03-24 04:39:00", + 79.87459060665176, + 26.945161819458008, + 74.61903381347656 + ], + [ + "2020-03-24 04:40:00", + 79.87000710599979, + 34.11628341674805, + 73.51866149902344 + ], + [ + "2020-03-24 04:41:00", + 79.70000645999983, + 27.773473739624023, + 74.04241180419922 + ], + [ + "2020-03-24 04:42:00", + 79.60965611151889, + 27.49029541015625, + 73.1905517578125 + ], + [ + "2020-03-24 04:43:00", + 79.56329763722199, + 34.070072174072266, + 73.98297882080078 + ], + [ + "2020-03-24 04:44:00", + 79.5169391629251, + 33.60432052612305, + 74.68580627441406 + ], + [ + "2020-03-24 04:45:00", + 79.4705806886282, + 33.17567825317383, + 73.96578216552734 + ], + [ + "2020-03-24 04:46:00", + 79.42422221433131, + 33.235443115234375, + 74.14202880859375 + ], + [ + "2020-03-24 04:47:00", + 79.37786374003441, + 33.624229431152344, + 73.29328918457031 + ], + [ + "2020-03-24 04:48:00", + 79.33150526573752, + 33.59697723388672, + 73.17694091796875 + ], + [ + "2020-03-24 04:49:00", + 79.28514679144062, + 33.403076171875, + 73.81486511230469 + ], + [ + "2020-03-24 04:50:00", + 79.23878831714373, + 33.89695739746094, + 74.30374145507812 + ], + [ + "2020-03-24 04:51:00", + 79.19242984284683, + 32.8265266418457, + 74.06024169921875 + ], + [ + "2020-03-24 04:52:00", + 79.14607136854994, + 48.27207946777344, + 73.2079086303711 + ], + [ + "2020-03-24 04:53:00", + 79.09971289425305, + 74.11988830566406, + 72.95736694335938 + ], + [ + "2020-03-24 04:54:00", + 79.05335441995615, + 85.12024688720703, + 73.62250518798828 + ], + [ + "2020-03-24 04:55:00", + 79.00699594565926, + 89.70301055908203, + 72.9462661743164 + ], + [ + "2020-03-24 04:56:00", + 78.96063747136236, + 98.89726257324219, + 72.34540557861328 + ], + [ + "2020-03-24 04:57:00", + 78.91427899706547, + 104.57252502441406, + 73.3578872680664 + ], + [ + "2020-03-24 04:58:00", + 78.86792052276857, + 103.37727355957031, + 73.94607543945312 + ], + [ + "2020-03-24 04:59:00", + 78.82156204847168, + 103.06717681884766, + 72.9709701538086 + ], + [ + "2020-03-24 05:00:00", + 78.77520357417478, + 102.50790405273438, + 74.46186065673828 + ], + [ + "2020-03-24 05:01:00", + 78.72884509987789, + 102.56554412841797, + 72.30302429199219 + ], + [ + "2020-03-24 05:02:00", + 78.68248662558099, + 100.72061157226562, + 73.90963745117188 + ], + [ + "2020-03-24 05:03:00", + 78.6361281512841, + 84.94855499267578, + 72.5624771118164 + ], + [ + "2020-03-24 05:04:00", + 78.5897696769872, + 73.80229949951172, + 72.40718078613281 + ], + [ + "2020-03-24 05:05:00", + 78.54341120269031, + 66.7529296875, + 73.5855941772461 + ], + [ + "2020-03-24 05:06:00", + 78.49705272839341, + 58.3730354309082, + 73.1899185180664 + ], + [ + "2020-03-24 05:07:00", + 78.45069425409652, + 54.12462615966797, + 73.07763671875 + ], + [ + "2020-03-24 05:08:00", + 78.40433577979962, + 51.171958923339844, + 73.19320678710938 + ], + [ + "2020-03-24 05:09:00", + 78.35797730550273, + 48.614585876464844, + 72.81364440917969 + ], + [ + "2020-03-24 05:10:00", + 78.31161883120583, + 55.98033905029297, + 74.0353775024414 + ], + [ + "2020-03-24 05:11:00", + 78.26526035690894, + 55.769962310791016, + 74.27434539794922 + ], + [ + "2020-03-24 05:12:00", + 78.21890188261204, + 55.67626190185547, + 72.99474334716797 + ], + [ + "2020-03-24 05:13:00", + 78.17254340831515, + 53.84586715698242, + 73.18851470947266 + ], + [ + "2020-03-24 05:14:00", + 78.17000064599996, + 49.15884017944336, + 72.83944702148438 + ], + [ + "2020-03-24 05:15:00", + 78, + 48.674129486083984, + 72.74655151367188 + ], + [ + "2020-03-24 05:16:00", + 77.9366887710829, + 48.823998987048924, + 73.24293518066406 + ], + [ + "2020-03-24 05:17:00", + 77.90413912638326, + 48.8282470703125, + 72.28050994873047 + ], + [ + "2020-03-24 05:18:00", + 77.87158948168361, + 49.756980895996094, + 72.88276672363281 + ], + [ + "2020-03-24 05:19:00", + 77.83903983698399, + 49.47259521484375, + 73.35757446289062 + ], + [ + "2020-03-24 05:20:00", + 77.80649019228434, + 49.850311279296875, + 73.20963287353516 + ], + [ + "2020-03-24 05:21:00", + 77.77394054758471, + 49.637855529785156, + 72.9081039428711 + ], + [ + "2020-03-24 05:22:00", + 77.74139090288507, + 49.61250305175781, + 72.93186950683594 + ], + [ + "2020-03-24 05:23:00", + 77.70884125818544, + 48.27946090698242, + 74.17268371582031 + ], + [ + "2020-03-24 05:24:00", + 77.6762916134858, + 48.74678421020508, + 73.15660858154297 + ], + [ + "2020-03-24 05:25:00", + 77.64374196878616, + 48.357120513916016, + 72.6622543334961 + ], + [ + "2020-03-24 05:26:00", + 77.61119232408653, + 49.31953430175781, + 72.34400177001953 + ], + [ + "2020-03-24 05:27:00", + 77.57864267938689, + 49.709964752197266, + 72.97113037109375 + ], + [ + "2020-03-24 05:28:00", + 77.54609303468726, + 50.2484130859375, + 72.39154052734375 + ], + [ + "2020-03-24 05:29:00", + 77.51354338998762, + 50.60381317138672, + 72.06515502929688 + ], + [ + "2020-03-24 05:30:00", + 77.48099374528799, + 50.00936508178711, + 56.87029266357422 + ], + [ + "2020-03-24 05:31:00", + 77.44844410058835, + 49.875885009765625, + 16.654312133789062 + ], + [ + "2020-03-24 05:32:00", + 77.4158944558887, + 48.563663482666016, + 18.19554901123047 + ], + [ + "2020-03-24 05:33:00", + 77.38334481118908, + 48.847572326660156, + 18.055583953857422 + ], + [ + "2020-03-24 05:34:00", + 77.35079516648943, + 48.35354232788086, + 18.378847122192383 + ], + [ + "2020-03-24 05:35:00", + 77.3182455217898, + 48.75905990600586, + 17.62409782409668 + ], + [ + "2020-03-24 05:36:00", + 77.28569587709016, + 48.05728530883789, + 18.058086395263672 + ], + [ + "2020-03-24 05:37:00", + 77.25314623239053, + 54.909175872802734, + 17.759536743164062 + ], + [ + "2020-03-24 05:38:00", + 77.22059658769089, + 54.575439453125, + 17.888395309448242 + ], + [ + "2020-03-24 05:39:00", + 77.18804694299125, + 55.046234130859375, + 18.210878372192383 + ], + [ + "2020-03-24 05:40:00", + 77.15549729829162, + 54.0140495300293, + 17.824277877807617 + ], + [ + "2020-03-24 05:41:00", + 77.12294765359198, + 53.690467834472656, + 18.451248168945312 + ], + [ + "2020-03-24 05:42:00", + 77.09039800889235, + 53.07158279418945, + 18.209468841552734 + ], + [ + "2020-03-24 05:43:00", + 77.05784836419271, + 53.31936264038086, + 18.179603576660156 + ], + [ + "2020-03-24 05:44:00", + 77.02529871949308, + 53.26475143432617, + 18.342716217041016 + ], + [ + "2020-03-24 05:45:00", + 76.99274907479344, + 51.945220947265625, + 18.539770126342773 + ], + [ + "2020-03-24 05:46:00", + 76.9601994300938, + 51.81389617919922, + 18.015705108642578 + ], + [ + "2020-03-24 05:47:00", + 76.92764978539417, + 51.123085021972656, + 17.368398666381836 + ], + [ + "2020-03-24 05:48:00", + 76.89510014069452, + 51.4550666809082, + 18.14003562927246 + ], + [ + "2020-03-24 05:49:00", + 76.8625504959949, + 50.60249710083008, + 18.289703369140625 + ], + [ + "2020-03-24 05:50:00", + 76.83000085129525, + 50.91603088378906, + 18.2962646484375 + ], + [ + "2020-03-24 05:51:00", + 76.79745120659562, + 53.06449508666992, + 18.563539505004883 + ], + [ + "2020-03-24 05:52:00", + 76.76490156189598, + 54.72663497924805, + 18.568862915039062 + ], + [ + "2020-03-24 05:53:00", + 76.73235191719634, + 54.90778732299805, + 18.28094482421875 + ], + [ + "2020-03-24 05:54:00", + 76.69980227249671, + 53.92911911010742, + 18.02821159362793 + ], + [ + "2020-03-24 05:55:00", + 76.66725262779707, + 53.20056915283203, + 21.20859718322754 + ], + [ + "2020-03-24 05:56:00", + 76.63470298309744, + 53.7746696472168, + 70.31324768066406 + ], + [ + "2020-03-24 05:57:00", + 76.6021533383978, + 54.07472610473633, + 73.2507553100586 + ], + [ + "2020-03-24 05:58:00", + 76.56960369369816, + 53.80739974975586, + 73.81517791748047 + ], + [ + "2020-03-24 05:59:00", + 76.53705404899853, + 53.748661041259766, + 73.31723022460938 + ], + [ + "2020-03-24 06:00:00", + 76.50450440429888, + 54.74142837524414, + 72.85430145263672 + ], + [ + "2020-03-24 06:01:00", + 76.47195475959926, + 56.06607437133789, + 73.29580688476562 + ], + [ + "2020-03-24 06:02:00", + 76.46999418600018, + 55.171714782714844, + 72.67166195723287 + ], + [ + "2020-03-24 06:03:00", + 76.29999354000017, + 55.41927719116211, + 72.6522445678711 + ], + [ + "2020-03-24 06:04:00", + 76.17097911658006, + 55.45018005371094, + 73.24137115478516 + ], + [ + "2020-03-24 06:05:00", + 76.10446483646761, + 55.66059112548828, + 72.9041976928711 + ], + [ + "2020-03-24 06:06:00", + 76.03795055635517, + 49.595481872558594, + 73.65878295898438 + ], + [ + "2020-03-24 06:07:00", + 75.97143627624271, + 47.00128173828125, + 72.86134338378906 + ], + [ + "2020-03-24 06:08:00", + 75.90492199613027, + 47.58378601074219, + 72.69776153564453 + ], + [ + "2020-03-24 06:09:00", + 75.83840771601783, + 49.07365417480469, + 72.17729187011719 + ], + [ + "2020-03-24 06:10:00", + 75.77189343590538, + 56.555606842041016, + 72.93250274658203 + ], + [ + "2020-03-24 06:11:00", + 75.70537915579293, + 56.26713180541992, + 72.06671905517578 + ], + [ + "2020-03-24 06:12:00", + 75.63886487568048, + 55.18650817871094, + 73.08904266357422 + ], + [ + "2020-03-24 06:13:00", + 75.57235059556804, + 48.025177001953125, + 73.17881774902344 + ], + [ + "2020-03-24 06:14:00", + 75.50583631545558, + 47.967350006103516, + 73.10953521728516 + ], + [ + "2020-03-24 06:15:00", + 75.43932203534314, + 49.351463317871094, + 72.9697265625 + ], + [ + "2020-03-24 06:16:00", + 75.3728077552307, + 57.63689041137695, + 73.93919372558594 + ], + [ + "2020-03-24 06:17:00", + 75.30629347511824, + 51.609039306640625, + 73.03306579589844 + ], + [ + "2020-03-24 06:18:00", + 75.2397791950058, + 49.73860549926758, + 73.2399673461914 + ], + [ + "2020-03-24 06:19:00", + 75.17326491489335, + 50.75581359863281, + 72.73904418945312 + ], + [ + "2020-03-24 06:20:00", + 75.1067506347809, + 50.66218566894531, + 72.50445556640625 + ], + [ + "2020-03-24 06:21:00", + 75.04023635466845, + 50.81214141845703, + 72.9201431274414 + ], + [ + "2020-03-24 06:22:00", + 74.97372207455601, + 51.4454231262207, + 72.74983978271484 + ], + [ + "2020-03-24 06:23:00", + 74.90720779444355, + 51.69704055786133, + 72.99396514892578 + ], + [ + "2020-03-24 06:24:00", + 74.84069351433111, + 51.35186767578125, + 73.40730285644531 + ], + [ + "2020-03-24 06:25:00", + 74.77417923421866, + 50.72081756591797, + 72.23859405517578 + ], + [ + "2020-03-24 06:26:00", + 74.76998772600024, + 50.91818618774414, + 73.011474609375 + ], + [ + "2020-03-24 06:27:00", + 74.59998708000028, + 50.9371452331543, + 73.52397918701172 + ], + [ + "2020-03-24 06:28:00", + 74.47115968724424, + 51.061458587646484, + 73.56307220458984 + ], + [ + "2020-03-24 06:29:00", + 74.40464696005053, + 50.900325775146484, + 73.50645446777344 + ], + [ + "2020-03-24 06:30:00", + 74.33813423285682, + 51.356689453125, + 73.11031341552734 + ], + [ + "2020-03-24 06:31:00", + 74.2716215056631, + 51.44089126586914, + 74.34957122802734 + ], + [ + "2020-03-24 06:32:00", + 74.2051087784694, + 51.28786849975586, + 73.98580169677734 + ], + [ + "2020-03-24 06:33:00", + 74.13859605127568, + 51.93085537607588, + 72.36542510986328 + ], + [ + "2020-03-24 06:34:00", + 74.07208332408197, + 51.952125549316406, + 72.51180267333984 + ], + [ + "2020-03-24 06:35:00", + 74.00557059688826, + 57.87371063232422, + 73.43373107910156 + ], + [ + "2020-03-24 06:36:00", + 73.93905786969457, + 80.50335693359375, + 73.54712677001953 + ], + [ + "2020-03-24 06:37:00", + 73.87254514250085, + 86.00247192382812, + 73.6276626586914 + ], + [ + "2020-03-24 06:38:00", + 73.80603241530714, + 92.10163116455078, + 73.07763671875 + ], + [ + "2020-03-24 06:39:00", + 73.73951968811343, + 92.22298431396484, + 72.73919677734375 + ], + [ + "2020-03-24 06:40:00", + 73.67300696091972, + 91.8537368774414, + 72.59422302246094 + ], + [ + "2020-03-24 06:41:00", + 73.60649423372601, + 91.79039764404297, + 72.58702850341797 + ], + [ + "2020-03-24 06:42:00", + 73.5399815065323, + 92.08602905273438, + 73.7885971069336 + ], + [ + "2020-03-24 06:43:00", + 73.47346877933859, + 92.87781524658203, + 72.7099609375 + ], + [ + "2020-03-24 06:44:00", + 73.40695605214488, + 96.19808197021484, + 73.00537872314453 + ], + [ + "2020-03-24 06:45:00", + 73.34044332495118, + 96.97959899902344, + 73.0341567993164 + ], + [ + "2020-03-24 06:46:00", + 73.27393059775747, + 92.9488296508789, + 73.91197967529297 + ], + [ + "2020-03-24 06:47:00", + 73.20741787056376, + 93.09352111816406, + 72.77579498291016 + ], + [ + "2020-03-24 06:48:00", + 73.14090514337005, + 91.96395111083984, + 71.88639831542969 + ], + [ + "2020-03-24 06:49:00", + 73.07439241617634, + 92.7508773803711, + 73.19898986816406 + ], + [ + "2020-03-24 06:50:00", + 73.07001033599973, + 91.7613525390625, + 73.58168029785156 + ], + [ + "2020-03-24 06:51:00", + 72.90001291999972, + 90.88325500488281, + 73.70819854736328 + ], + [ + "2020-03-24 06:52:00", + 72.74429166862062, + 90.33417510986328, + 72.71105194091797 + ], + [ + "2020-03-24 06:53:00", + 72.66377465236994, + 95.02799224853516, + 75.33968353271484 + ], + [ + "2020-03-24 06:54:00", + 72.58325763611924, + 96.9925308227539, + 74.09574890136719 + ], + [ + "2020-03-24 06:55:00", + 72.50274061986855, + 96.695068359375, + 73.8018798828125 + ], + [ + "2020-03-24 06:56:00", + 72.42222360361787, + 95.75796508789062, + 74.43511199951172 + ], + [ + "2020-03-24 06:57:00", + 72.34170658736717, + 96.17393493652344, + 74.73851776123047 + ], + [ + "2020-03-24 06:58:00", + 72.26118957111649, + 88.4173812866211, + 75.60273742675781 + ], + [ + "2020-03-24 06:59:00", + 72.1806725548658, + 88.39751434326172, + 74.84156799316406 + ], + [ + "2020-03-24 07:00:00", + 72.1001555386151, + 87.41456604003906, + 74.45763397216797 + ], + [ + "2020-03-24 07:01:00", + 72.01963852236442, + 87.65657806396484, + 73.62500762939453 + ], + [ + "2020-03-24 07:02:00", + 71.93912150611372, + 87.04649353027344, + 75.57865142822266 + ], + [ + "2020-03-24 07:03:00", + 71.85860448986304, + 87.92521667480469, + 74.86284637451172 + ], + [ + "2020-03-24 07:04:00", + 71.77808747361235, + 85.46574401855469, + 74.23040008544922 + ], + [ + "2020-03-24 07:05:00", + 71.69757045736166, + 51.844181060791016, + 73.2090072631836 + ], + [ + "2020-03-24 07:06:00", + 71.61705344111097, + 36.57521057128906, + 74.82296752929688 + ], + [ + "2020-03-24 07:07:00", + 71.53653642486027, + 34.56216812133789, + 74.66110229492188 + ], + [ + "2020-03-24 07:08:00", + 71.45601940860959, + 48.19200897216797, + 73.77107238769531 + ], + [ + "2020-03-24 07:09:00", + 71.3755023923589, + 52.86350631713867, + 74.53269958496094 + ], + [ + "2020-03-24 07:10:00", + 71.37000710599979, + 52.843929290771484, + 73.5987319946289 + ], + [ + "2020-03-24 07:11:00", + 71.20000645999983, + 52.08213424682617, + 74.15689849853516 + ], + [ + "2020-03-24 07:12:00", + 71.03583251441142, + 51.53842544555664, + 73.91010284423828 + ], + [ + "2020-03-24 07:13:00", + 70.95084242170037, + 43.506919860839844, + 73.70914459228516 + ], + [ + "2020-03-24 07:14:00", + 70.86585232898932, + 43.037841796875, + 73.2168197631836 + ], + [ + "2020-03-24 07:15:00", + 70.78086223627825, + 43.77318572998047, + 74.06806182861328 + ], + [ + "2020-03-24 07:16:00", + 70.6958721435672, + 46.766944885253906, + 74.05726623535156 + ], + [ + "2020-03-24 07:17:00", + 70.61088205085615, + 50.872379302978516, + 74.08291625976562 + ], + [ + "2020-03-24 07:18:00", + 70.5258919581451, + 51.395668029785156, + 74.64201354980469 + ], + [ + "2020-03-24 07:19:00", + 70.44090186543403, + 50.60863494873047, + 73.44953155517578 + ], + [ + "2020-03-24 07:20:00", + 70.35591177272298, + 40.730621337890625, + 72.79737854003906 + ], + [ + "2020-03-24 07:21:00", + 70.27092168001192, + 41.385196685791016, + 73.6615982055664 + ], + [ + "2020-03-24 07:22:00", + 70.18593158730087, + 52.25959777832031, + 73.92058563232422 + ], + [ + "2020-03-24 07:23:00", + 70.10094149458982, + 46.88405990600586, + 74.61308288574219 + ], + [ + "2020-03-24 07:24:00", + 70.01595140187875, + 47.141448974609375, + 73.66790870618443 + ], + [ + "2020-03-24 07:25:00", + 69.9309613091677, + 47.107181549072266, + 73.63360595703125 + ], + [ + "2020-03-24 07:26:00", + 69.84597121645665, + 47.4166259765625, + 74.238525390625 + ], + [ + "2020-03-24 07:27:00", + 69.7609811237456, + 46.56296157836914, + 73.82565307617188 + ], + [ + "2020-03-24 07:28:00", + 69.67599103103453, + 46.3474006652832, + 72.98832702636719 + ], + [ + "2020-03-24 07:29:00", + 69.67000064599995, + 47.08136046272777, + 73.30158233642578 + ], + [ + "2020-03-24 07:30:00", + 69.5, + 47.10820770263672, + 73.27828216552734 + ], + [ + "2020-03-24 07:31:00", + 69.32637243713472, + 47.034088134765625, + 73.60092163085938 + ], + [ + "2020-03-24 07:32:00", + 69.23638277037952, + 45.57647705078125, + 73.87054443359375 + ], + [ + "2020-03-24 07:33:00", + 69.1463931036243, + 51.21367645263672, + 72.25328826904297 + ], + [ + "2020-03-24 07:34:00", + 69.0564034368691, + 70.96977996826172, + 73.15692138671875 + ], + [ + "2020-03-24 07:35:00", + 68.96641377011389, + 76.6375961303711, + 72.21951293945312 + ], + [ + "2020-03-24 07:36:00", + 68.87642410335869, + 83.16655731201172, + 74.12545776367188 + ], + [ + "2020-03-24 07:37:00", + 68.78643443660347, + 83.07859802246094, + 72.88916991454134 + ], + [ + "2020-03-24 07:38:00", + 68.69644476984827, + 92.17417907714844, + 72.8433609008789 + ], + [ + "2020-03-24 07:39:00", + 68.60645510309305, + 92.9948959350586, + 73.65784454345703 + ], + [ + "2020-03-24 07:40:00", + 68.51646543633785, + 92.51905822753906, + 72.56232452392578 + ], + [ + "2020-03-24 07:41:00", + 68.42647576958265, + 91.8058090209961, + 73.06637573242188 + ], + [ + "2020-03-24 07:42:00", + 68.33648610282744, + 90.04006958007812, + 72.91545104980469 + ], + [ + "2020-03-24 07:43:00", + 68.24649643607223, + 85.17295837402344, + 73.79078674316406 + ], + [ + "2020-03-24 07:44:00", + 68.15650676931702, + 95.68914794921875, + 72.5380859375 + ], + [ + "2020-03-24 07:45:00", + 68.06651710256182, + 74.87901306152344, + 73.2021255493164 + ], + [ + "2020-03-24 07:46:00", + 67.9765274358066, + 60.12022018432617, + 73.76215362548828 + ], + [ + "2020-03-24 07:47:00", + 67.96999418600018, + 53.05949020385742, + 73.28720092773438 + ], + [ + "2020-03-24 07:48:00", + 67.79999354000017, + 48.9787483215332, + 73.20462799072266 + ], + [ + "2020-03-24 07:49:00", + 67.60342746002077, + 49.55990219116211, + 72.59485626220703 + ], + [ + "2020-03-24 07:50:00", + 67.50143795130171, + 50.27000427246094, + 73.38900756835938 + ], + [ + "2020-03-24 07:51:00", + 67.39944844258264, + 49.79863766947178, + 72.78111267089844 + ], + [ + "2020-03-24 07:52:00", + 67.29745893386358, + 49.78076171875, + 73.90713500976562 + ], + [ + "2020-03-24 07:53:00", + 67.19546942514451, + 50.86861801147461, + 38.183509826660156 + ], + [ + "2020-03-24 07:54:00", + 67.09347991642545, + 51.039466857910156, + 17.961437225341797 + ], + [ + "2020-03-24 07:55:00", + 66.99149040770638, + 51.160526275634766, + 19.09199333190918 + ], + [ + "2020-03-24 07:56:00", + 66.88950089898731, + 50.949893951416016, + 18.68396759033203 + ], + [ + "2020-03-24 07:57:00", + 66.78751139026825, + 51.169769287109375, + 17.29629898071289 + ], + [ + "2020-03-24 07:58:00", + 66.68552188154918, + 50.19011306762695, + 18.370710372924805 + ] + ] + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tdata \u003d []\n\ttable \u003d []\n\timport datetime\n\tcurrent_datetime\u003ddatetime.datetime.now()\n\tstr_date \u003d current_datetime.strftime(\"%m-%d-%Y %I-%M\")\n\n\n\tif self.getSibling(\"Statistics\").props.currentTabIndex \u003d\u003d 0:\n\t\tresults \u003d self.parent.getChild(\"Statistics\").getChild(\"Induct Details\").getChild(\"Induct Details\").props.filter.results.data\n\t\tif(len(results) \u003e 0):\n\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Induct\",\"Total (#)\",\"Single Carrier (#)\",\"Double Carrier (#)\"]\n\t\t\t\tfor result in results:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027InductName\u0027],result[\u0027Total_count\u0027],result[\u0027singlecarrier_count\u0027],result[\u0027doublecarrier_count\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Induct\",\"Total (%)\",\"Single Carrier (%)\",\"Double Carrier (%)\"]\n\t\t\t\tfor result in results:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027InductName\u0027],result[\u0027Total_perc\u0027],result[\u0027SingleCarrier_perc\u0027],result[\u0027DoubleCarrier_perc\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Induct\",\"Total (pph)\",\"Single Carrier (pph)\",\"Double Carrier (pph)\"]\n\t\t\t\tfor result in results:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027InductName\u0027],result[\u0027Total_rate\u0027],result[\u0027SingleCarrier_rate\u0027],result[\u0027DoubleCarrier_rate\u0027]])\n\t\n\t\telse:\n\t\t\ttest_table \u003d system.dataset.toPyDataSet(self.parent.getChild(\"Statistics\").getChild(\"Induct Details\").getChild(\"Induct Details\").props.data)\n\t\t\n\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Induct\",\"Total (#)\",\"Single Carrier (#)\",\"Double Carrier (#)\"]\n\t\t\t\tfor result in test_table:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027InductName\u0027],result[\u0027Total_count\u0027],result[\u0027singlecarrier_count\u0027],result[\u0027doublecarrier_count\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Induct\",\"Total (%)\",\"Single Carrier (%)\",\"Double Carrier (%)\"]\n\t\t\t\tfor result in test_table:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027InductName\u0027],result[\u0027Total_perc\u0027],result[\u0027SingleCarrier_perc\u0027],result[\u0027DoubleCarrier_perc\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Induct\",\"Total (pph)\",\"Single Carrier (pph)\",\"Double Carrier (pph)\"]\n\t\t\t\tfor result in test_table:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027InductName\u0027],result[\u0027Total_rate\u0027],result[\u0027SingleCarrier_rate\u0027],result[\u0027DoubleCarrier_rate\u0027]])\n\t\t\n\t\ttable \u003d system.dataset.toDataSet(headers, data)\t\n\t\tcsv \u003d system.dataset.toCSV(table,1,0,1)\n\t\tsystem.perspective.download(filename \u003d str_date+\u0027 Induct Details.csv\u0027, data \u003d csv)\t\n\n\t\n\telif self.getSibling(\"Statistics\").props.currentTabIndex \u003d\u003d 1:\n\t\tresults \u003d self.parent.getChild(\"Statistics\").getChild(\"Scanner_Details\").getChild(\"Scanner Details\").props.filter.results.data\n\t\tif(len(results) \u003e 0):\n\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Scanner\",\"Total (#)\",\"Good Read (#)\",\"No Read (#)\",\"Multi Read (#)\",\"No Code (#)\"]\n\t\t\t\tfor result in results:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027ScannerName\u0027],result[\u0027Total_count\u0027],result[\u0027GoodRead_count\u0027],result[\u0027NoRead_count\u0027],result[\u0027MultiLabelRead_count\u0027],result[\u0027NoCode_count\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Scanner\",\"Total (%)\",\"Good Read (%)\",\"No Read (%)\",\"Multi Read (%)\",\"No Code (%)\"]\n\t\t\t\tfor result in results:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027ScannerName\u0027],result[\u0027Total_perc\u0027],result[\u0027GoodRead_perc\u0027],result[\u0027NoRead_perc\u0027],result[\u0027MultiLabelRead_perc\u0027],result[\u0027NoCode_perc\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Scanner\",\"Total (pph)\",\"Good Read (pph)\",\"No Read (pph)\",\"Multi Read (pph)\",\"No Code (pph)\"]\n\t\t\t\tfor result in results:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027ScannerName\u0027],result[\u0027Total_rate\u0027],result[\u0027GoodRead_rate\u0027],result[\u0027NoRead_rate\u0027],result[\u0027MultiLabelRead_rate\u0027],result[\u0027NoCode_rate\u0027]])\n\t\n\t\telse:\n\t\t\ttest_table \u003d system.dataset.toPyDataSet(self.parent.getChild(\"Statistics\").getChild(\"Scanner_Details\").getChild(\"Scanner Details\").props.data)\n\t\t\n\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Scanner\",\"Total (#)\",\"Good Read (#)\",\"No Read (#)\",\"Multi Read (#)\",\"No Code (#)\"]\n\t\t\t\tfor result in test_table:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027ScannerName\u0027],result[\u0027Total_count\u0027],result[\u0027GoodRead_count\u0027],result[\u0027NoRead_count\u0027],result[\u0027MultiLabelRead_count\u0027],result[\u0027NoCode_count\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Scanner\",\"Total (%)\",\"Good Read (%)\",\"No Read (%)\",\"Multi Read (%)\",\"No Code (%)\"]\n\t\t\t\tfor result in test_table:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027ScannerName\u0027],result[\u0027Total_perc\u0027],result[\u0027GoodRead_perc\u0027],result[\u0027NoRead_perc\u0027],result[\u0027MultiLabelRead_perc\u0027],result[\u0027NoCode_perc\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Scanner\",\"Total (pph)\",\"Good Read (pph)\",\"No Read (pph)\",\"Multi Read (pph)\",\"No Code (pph)\"]\n\t\t\t\tfor result in test_table:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027ScannerName\u0027],result[\u0027Total_rate\u0027],result[\u0027GoodRead_rate\u0027],result[\u0027NoRead_rate\u0027],result[\u0027MultiLabelRead_rate\u0027],result[\u0027NoCode_rate\u0027]])\n\t\t\t\n\t\ttable \u003d system.dataset.toDataSet(headers, data)\t\n\t\tcsv \u003d system.dataset.toCSV(table,1,0,1)\n\t\tsystem.perspective.download(filename \u003d str_date+\u0027 Scanner Details.csv\u0027, data \u003d csv)\n\t\n\t\n\telif self.getSibling(\"Statistics\").props.currentTabIndex \u003d\u003d 2:\n\t\tresults \u003d self.parent.getChild(\"Statistics\").getChild(\"Sorter Summary\").getChild(\"Sorter Summary\").props.filter.results.data\n\t\tif(len(results) \u003e 0):\n\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Inducted (#)\",\"Sorted (#)\",\"Awcs Recirc (#)\",\"Operational Recirc (#)\",\"Machine Recirc (#)\"]\n\t\t\t\tfor result in results:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027Induct_count\u0027],result[\u0027Sorted_count\u0027],result[\u0027AWCSRecirc_count\u0027],result[\u0027OperRecirc_count\u0027],result[\u0027MachineRecirc_count\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Inducted (%)\",\"Sorted (%)\",\"Awcs Recirc (%)\",\"Operational Recirc (%)\",\"Machine Recirc (%)\"]\n\t\t\t\tfor result in results:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027Induct_perc\u0027],result[\u0027Sorted_perc\u0027],result[\u0027AWCSRecirc_perc\u0027],result[\u0027OperRecirc_perc\u0027],result[\u0027MachineRecirc_perc\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Inducted (pph)\",\"Sorted (pph)\",\"Awcs Recirc (pph)\",\"Operational Recirc (pph)\",\"Machine Recirc (pph)\"]\n\t\t\t\tfor result in results:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027Induct_rate\u0027],result[\u0027Sorted_rate\u0027],result[\u0027AWCSRecirc_rate\u0027],result[\u0027OperRecirc_rate\u0027],result[\u0027MachineRecirc_rate\u0027]])\n\t\n\t\telse:\n\t\t\ttest_table \u003d system.dataset.toPyDataSet(self.parent.getChild(\"Statistics\").getChild(\"Sorter Summary\").getChild(\"Sorter Summary\").props.data)\n\t\t\n\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Inducted (#)\",\"Sorted (#)\",\"Awcs Recirc (#)\",\"Operational Recirc (#)\",\"Machine Recirc (#)\"]\n\t\t\t\tfor result in test_table:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027Induct_count\u0027],result[\u0027Sorted_count\u0027],result[\u0027AWCSRecirc_count\u0027],result[\u0027OperRecirc_count\u0027],result[\u0027MachineRecirc_count\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Inducted (%)\",\"Sorted (%)\",\"Awcs Recirc (%)\",\"Operational Recirc (%)\",\"Machine Recirc (%)\"]\n\t\t\t\tfor result in test_table:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027Induct_perc\u0027],result[\u0027Sorted_perc\u0027],result[\u0027AWCSRecirc_perc\u0027],result[\u0027OperRecirc_perc\u0027],result[\u0027MachineRecirc_perc\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Inducted (pph)\",\"Sorted (pph)\",\"Awcs Recirc (pph)\",\"Operational Recirc (pph)\",\"Machine Recirc (pph)\"]\n\t\t\t\tfor result in test_table:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027Induct_rate\u0027],result[\u0027Sorted_rate\u0027],result[\u0027AWCSRecirc_rate\u0027],result[\u0027OperRecirc_rate\u0027],result[\u0027MachineRecirc_rate\u0027]])\n\t\t\t\n\t\ttable \u003d system.dataset.toDataSet(headers, data)\t\n\t\tcsv \u003d system.dataset.toCSV(table,1,0,1)\n\t\tsystem.perspective.download(filename \u003d str_date+\u0027 Sorter Summary.csv\u0027, data \u003d csv)\n\n\t\n\telif self.getSibling(\"Statistics\").props.currentTabIndex \u003d\u003d 3:\n\t\tresults \u003d self.parent.getChild(\"Statistics\").getChild(\"Sorter Details\").getChild(\"Sorter Details\").props.filter.results.data\n\t\tif(len(results) \u003e 0):\n\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Inducted (#)\",\"Sorted (#)\",\"Assigned (#)\",\"Dest Inv (#)\",\"Dest None (#)\",\"Dest Dis (#)\",\"Dest Full (#)\",\"Unexpected (#)\",\"Dest Fault (#)\",\"Div Fail (#)\",\"Gap Err (#)\",\"Lost (#)\",\"Track Err (#)\",\"Unknown (#)\",\"Unsafe (#)\"]\n\t\t\t\tfor result in results:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027inducted_count\u0027],result[\u0027sorted_count\u0027],result[\u0027assigned_count\u0027],result[\u0027destinv_count\u0027],result[\u0027destnone_count\u0027],result[\u0027destdis_count\u0027],result[\u0027destfull_count\u0027],result[\u0027unexpected_count\u0027],result[\u0027destfault_count\u0027],result[\u0027divfail_count\u0027],result[\u0027gaperr_count\u0027],result[\u0027lost_count\u0027],result[\u0027trackerr_count\u0027],result[\u0027unknownn_count\u0027],result[\u0027unsafe_count\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Inducted (%)\",\"Sorted (%)\",\"Assigned (%)\",\"Dest Inv (%)\",\"Dest None (%)\",\"Dest Dis (%)\",\"Dest Full (%)\",\"Unexpected (%)\",\"Dest Fault (%)\",\"Div Fail (%)\",\"Gap Err (%)\",\"Lost (%)\",\"Track Err (%)\",\"Unknown (%)\",\"Unsafe (%)\"]\n\t\t\t\tfor result in results:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027inducted_perc\u0027],result[\u0027sorted_perc\u0027],result[\u0027assigned_perc\u0027],result[\u0027destinv_perc\u0027],result[\u0027destnone_perc\u0027],result[\u0027destdis_perc\u0027],result[\u0027destfull_perc\u0027],result[\u0027unexpected_perc\u0027],result[\u0027destfault_perc\u0027],result[\u0027divfail_perc\u0027],result[\u0027gaperr_perc\u0027],result[\u0027lost_perc\u0027],result[\u0027trackerr_perc\u0027],result[\u0027unknown_perc\u0027],result[\u0027unsafe_perc\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Inducted (pph)\",\"Sorted (pph)\",\"Assigned (pph)\",\"Dest Inv (pph)\",\"Dest None (pph)\",\"Dest Dis (pph)\",\"Dest Full (pph)\",\"Unexpected (pph)\",\"Dest Fault (pph)\",\"Div Fail (pph)\",\"Gap Err (pph)\",\"Lost (pph)\",\"Track Err (pph)\",\"Unknown (pph)\",\"Unsafe (pph)\"]\n\t\t\t\tfor result in results:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027inducted_rate\u0027],result[\u0027sorted_rate\u0027],result[\u0027assigned_rate\u0027],result[\u0027destinv_rate\u0027],result[\u0027destnone_rate\u0027],result[\u0027destdis_rate\u0027],result[\u0027destfull_rate\u0027],result[\u0027unexpected_rate\u0027],result[\u0027destfault_rate\u0027],result[\u0027divfail_rate\u0027],result[\u0027gaperr_rate\u0027],result[\u0027lost_rate\u0027],result[\u0027trackerr_rate\u0027],result[\u0027unknown_rate\u0027],result[\u0027unsafe_rate\u0027]])\n\t\t\n\t\telse:\n\t\t\ttest_table \u003d system.dataset.toPyDataSet(self.parent.getChild(\"Statistics\").getChild(\"Sorter Details\").getChild(\"Sorter Details\").props.data)\n\t\t\n\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Inducted (#)\",\"Sorted (#)\",\"Assigned (#)\",\"Dest Inv (#)\",\"Dest None (#)\",\"Dest Dis (#)\",\"Dest Full (#)\",\"Unexpected (#)\",\"Dest Fault (#)\",\"Div Fail (#)\",\"Gap Err (#)\",\"Lost (#)\",\"Track Err (#)\",\"Unknown (#)\",\"Unsafe (#)\"]\n\t\t\t\tfor result in test_table:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027inducted_count\u0027],result[\u0027sorted_count\u0027],result[\u0027sorted_count\u0027],result[\u0027destinv_count\u0027],result[\u0027destnone_count\u0027],result[\u0027destdis_count\u0027],result[\u0027destfull_count\u0027],result[\u0027unexpected_count\u0027],result[\u0027destfault_count\u0027],result[\u0027divfail_count\u0027],result[\u0027gaperr_count\u0027],result[\u0027lost_count\u0027],result[\u0027trackerr_count\u0027],result[\u0027unknownn_count\u0027],result[\u0027unsafe_count\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Inducted (%)\",\"Sorted (%)\",\"Assigned (%)\",\"Dest Inv (%)\",\"Dest None (%)\",\"Dest Dis (%)\",\"Dest Full (%)\",\"Unexpected (%)\",\"Dest Fault (%)\",\"Div Fail (%)\",\"Gap Err (%)\",\"Lost (%)\",\"Track Err (%)\",\"Unknown (%)\",\"Unsafe (%)\"]\n\t\t\t\tfor result in test_table:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027inducted_perc\u0027],result[\u0027sorted_perc\u0027],result[\u0027assigned_perc\u0027],result[\u0027destinv_perc\u0027],result[\u0027destnone_perc\u0027],result[\u0027destdis_perc\u0027],result[\u0027destfull_perc\u0027],result[\u0027unexpected_perc\u0027],result[\u0027destfault_perc\u0027],result[\u0027divfail_perc\u0027],result[\u0027gaperr_perc\u0027],result[\u0027lost_perc\u0027],result[\u0027trackerr_perc\u0027],result[\u0027unknown_perc\u0027],result[\u0027unsafe_perc\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Inducted (pph)\",\"Sorted (pph)\",\"Assigned (pph)\",\"Dest Inv (pph)\",\"Dest None (pph)\",\"Dest Dis (pph)\",\"Dest Full (pph)\",\"Unexpected (pph)\",\"Dest Fault (pph)\",\"Div Fail (pph)\",\"Gap Err (pph)\",\"Lost (pph)\",\"Track Err (pph)\",\"Unknown (pph)\",\"Unsafe (pph)\"]\n\t\t\t\tfor result in test_table:\n\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027inducted_rate\u0027],result[\u0027sorted_rate\u0027],result[\u0027assigned_rate\u0027],result[\u0027destinv_rate\u0027],result[\u0027destnone_rate\u0027],result[\u0027destdis_rate\u0027],result[\u0027destfull_rate\u0027],result[\u0027unexpected_rate\u0027],result[\u0027destfault_rate\u0027],result[\u0027divfail_rate\u0027],result[\u0027gaperr_rate\u0027],result[\u0027lost_rate\u0027],result[\u0027trackerr_rate\u0027],result[\u0027unknown_rate\u0027],result[\u0027unsafe_rate\u0027]])\n\t\t\t\n\t\ttable \u003d system.dataset.toDataSet(headers, data)\t\n\t\tcsv \u003d system.dataset.toCSV(table,1,0,1)\n\t\tsystem.perspective.download(filename \u003d str_date+\u0027 Sorter Details.csv\u0027, data \u003d csv)\n\t\t\n\t\n\telif self.getSibling(\"Statistics\").props.currentTabIndex \u003d\u003d 4:\n\t\t\tresults \u003d self.parent.getChild(\"Statistics\").getChild(\"Lane Details\").getChild(\"Lane Details\").props.filter.results.data\n\t\t\tif(len(results) \u003e 0):\n\t\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Lane\",\"Total (#)\",\"Diverted (#)\",\"Dest Full (#)\",\"Dest Jam (#)\",\"Dest Disabled (#)\",\"Dest Fault (#)\",\"Divert Fail (#)\",\"Lost (#)\",\"Unsafe (#)\",\"Dim Error (#)\",\"Gap Error (#)\",\"Unknown (#)\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027Lane\u0027],result[\u0027Total_count\u0027],result[\u0027Diverted_count\u0027],result[\u0027Destfull_count\u0027],result[\u0027DestJam_count\u0027],result[\u0027DestDis_count\u0027],result[\u0027DestFault_count\u0027],result[\u0027DivertFail_count\u0027],result[\u0027Lost_count\u0027],result[\u0027Unsafe_count\u0027],result[\u0027Dim_count\u0027],result[\u0027GapErr_count\u0027],result[\u0027Unknown_count\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Lane\",\"Total (%)\",\"Diverted (%)\",\"Dest Full (%)\",\"Dest Jam (%)\",\"Dest Disabled (%)\",\"Dest Fault (%)\",\"Divert Fail (%)\",\"Lost (%)\",\"Unsafe (%)\",\"Dim Error (%)\",\"Gap Error (%)\",\"Unknown (%)\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027Lane\u0027],result[\u0027total_perc\u0027],result[\u0027Diverted_perc\u0027],result[\u0027destfull_perc\u0027],result[\u0027destjam_perc\u0027],result[\u0027destdisabled_perc\u0027],result[\u0027destfault_perc\u0027],result[\u0027DivertFail_perc\u0027],result[\u0027lost_perc\u0027],result[\u0027unsafe_perc\u0027],result[\u0027dim_perc\u0027],result[\u0027gaperr_perc\u0027],result[\u0027unknown_perc\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Lane\",\"Total (pph)\",\"Diverted (pph)\",\"Dest Full (pph)\",\"Dest Jam (pph)\",\"Dest Disabled (pph)\",\"Dest Fault (pph)\",\"Divert Fail (pph)\",\"Lost (pph)\",\"Unsafe (pph)\",\"Dim Error (pph)\",\"Gap Error (pph)\",\"Unknown (pph)\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027Lane\u0027],result[\u0027total_rate\u0027],result[\u0027Diverted_rate\u0027],result[\u0027destfull_rate\u0027],result[\u0027destjam_rate\u0027],result[\u0027destdisabled_rate\u0027],result[\u0027destfault_rate\u0027],result[\u0027DivertFail_rate\u0027],result[\u0027lost_rate\u0027],result[\u0027unsafe_rate\u0027],result[\u0027dim_rate\u0027],result[\u0027gaperr_rate\u0027],result[\u0027unknown_rate\u0027]])\n\t\t\t\n\t\t\telse:\n\t\t\t\ttest_table \u003d system.dataset.toPyDataSet(self.parent.getChild(\"Statistics\").getChild(\"Lane Details\").getChild(\"Lane Details\").props.data)\n\t\t\t\n\t\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Lane\",\"Total (#)\",\"Diverted (#)\",\"Dest Full (#)\",\"Dest Jam (#)\",\"Dest Disabled (#)\",\"Dest Fault (#)\",\"Divert Fail (#)\",\"Lost (#)\",\"Unsafe (#)\",\"Dim Error (#)\",\"Gap Error (#)\",\"Unknown (#)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027Lane\u0027],result[\u0027Total_count\u0027],result[\u0027Diverted_count\u0027],result[\u0027Destfull_count\u0027],result[\u0027DestJam_count\u0027],result[\u0027DestDis_count\u0027],result[\u0027DestFault_count\u0027],result[\u0027DivertFail_count\u0027],result[\u0027Lost_count\u0027],result[\u0027Unsafe_count\u0027],result[\u0027Dim_count\u0027],result[\u0027GapErr_count\u0027],result[\u0027Unknown_count\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Lane\",\"Total (%)\",\"Diverted (%)\",\"Dest Full (%)\",\"Dest Jam (%)\",\"Dest Disabled (%)\",\"Dest Fault (%)\",\"Divert Fail (%)\",\"Lost (%)\",\"Unsafe (%)\",\"Dim Error (%)\",\"Gap Error (%)\",\"Unknown (%)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027Lane\u0027],result[\u0027total_perc\u0027],result[\u0027Diverted_perc\u0027],result[\u0027destfull_perc\u0027],result[\u0027destjam_perc\u0027],result[\u0027destdisabled_perc\u0027],result[\u0027destfault_perc\u0027],result[\u0027DivertFail_perc\u0027],result[\u0027lost_perc\u0027],result[\u0027unsafe_perc\u0027],result[\u0027dim_perc\u0027],result[\u0027gaperr_perc\u0027],result[\u0027unknown_perc\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"End Timestamp\", \"Sorter\",\"Lane\",\"Total (pph)\",\"Diverted (pph)\",\"Dest Full (pph)\",\"Dest Jam (pph)\",\"Dest Disabled (pph)\",\"Dest Fault (pph)\",\"Divert Fail (pph)\",\"Lost (pph)\",\"Unsafe (pph)\",\"Dim Error (pph)\",\"Gap Error (pph)\",\"Unknown (pph)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027SorterName\u0027],result[\u0027Lane\u0027],result[\u0027total_rate\u0027],result[\u0027Diverted_rate\u0027],result[\u0027destfull_rate\u0027],result[\u0027destjam_rate\u0027],result[\u0027destdisabled_rate\u0027],result[\u0027destfault_rate\u0027],result[\u0027DivertFail_rate\u0027],result[\u0027lost_rate\u0027],result[\u0027unsafe_rate\u0027],result[\u0027dim_rate\u0027],result[\u0027gaperr_rate\u0027],result[\u0027unknown_rate\u0027]])\n\t\t\t\t\n\t\t\ttable \u003d system.dataset.toDataSet(headers, data)\t\n\t\t\tcsv \u003d system.dataset.toCSV(table,1,0,1)\n\t\t\tsystem.perspective.download(filename \u003d str_date+\u0027 Lane Details.csv\u0027, data \u003d csv)\n\n\t\n\telif self.getSibling(\"Statistics\").props.currentTabIndex \u003d\u003d 5:\n\t\t\tresults \u003d self.parent.getChild(\"Statistics\").getChild(\"Hourly_Induct\").getChild(\"Hourly_Induct\").props.filter.results.data\n\t\t\tif(len(results) \u003e 0):\n\t\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\", \"Total (#)\",\"Single Carrier (#)\",\"Double Carrier (#)\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Total (#)\u0027],result[\u0027Single Carrier (#)\u0027],result[\u0027Double Carrier (#)\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (%)\",\"Single Carrier (%)\",\"Double Carrier (%)\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Total (%\u0027],result[\u0027Single Carrier (%)\u0027],result[\u0027Double Carrier (%)\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\", \"Total (pph)\",\"Single Carrier (pph)\",\"Double Carrier (pph)\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Total (pph)\u0027],result[\u0027Single Carrier (pph)\u0027],result[\u0027Double Carrier (pph)\u0027]])\n\t\t\t\n\t\t\telse:\n\t\t\t\ttest_table \u003d system.dataset.toPyDataSet(self.parent.getChild(\"Statistics\").getChild(\"Hourly_Induct\").getChild(\"Hourly_Induct\").props.data)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\", \"Total (#)\",\"Single Carrier (#)\",\"Double Carrier (#)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Total (#)\u0027],result[\u0027Single Carrier (#)\u0027],result[\u0027Double Carrier (#)\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (%)\",\"Single Carrier (%)\",\"Double Carrier (%)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Total (%)\u0027],result[\u0027Single Carrier (%)\u0027],result[\u0027Double Carrier (%)\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\", \"Total (pph)\",\"Single Carrier (pph)\",\"Double Carrier (pph)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Total (pph)\u0027],result[\u0027Single Carrier (pph)\u0027],result[\u0027Double Carrier (pph)\u0027]])\n\t\t\t\n\t\t\ttable \u003d system.dataset.toDataSet(headers, data)\t\n\t\t\tcsv \u003d system.dataset.toCSV(table,1,0,1)\n\t\t\tsystem.perspective.download(filename \u003d str_date+\u0027 Hourly Induct.csv\u0027, data \u003d csv)\n\t\n\t\n\telif self.getSibling(\"Statistics\").props.currentTabIndex \u003d\u003d 6:\n\t\t\tresults \u003d self.parent.getChild(\"Statistics\").getChild(\"Hourly_Scanner\").getChild(\"Hourly_Scanner\").props.filter.results.data\n\t\t\tif(len(results) \u003e 0):\n\t\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\", \"Total (#)\",\"Good Read (#)\",\"No Read (#)\",\"Multi Read (#)\",\"No code (#)\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Total (#)\u0027],result[\u0027Good Read (#)\u0027],result[\u0027No Read (#)\u0027],result[\u0027Multi Read (#)\u0027],result[\u0027No code (#)\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\", \"Total (%)\",\"Good Read (%)\",\"No Read (%)\",\"Multi Read (%)\",\"No Code (%)\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Total (%)\u0027],result[\u0027Good Read (%)\u0027],result[\u0027No Read (%)\u0027],result[\u0027Multi Read (%)\u0027],result[\u0027No Code (%)\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (pph)\",\"Good Read (pph)\",\"No Read (pph)\",\"Multi Read (pph)\",\"No Code (pph)\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Total (pph)\u0027],result[\u0027Good Read (pph)\u0027],result[\u0027No Read (pph)\u0027],result[\u0027Multi Read (pph)\u0027],result[\u0027No Code (pph)\u0027]])\n\t\t\t\n\t\t\telse:\n\t\t\t\ttest_table \u003d system.dataset.toPyDataSet(self.parent.getChild(\"Statistics\").getChild(\"Hourly_Scanner\").getChild(\"Hourly_Scanner\").props.data)\n\t\t\t\n\t\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\", \"Total (#)\",\"Good Read (#)\",\"No Read (#)\",\"Multi Read (#)\",\"No code (#)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Total (#)\u0027],result[\u0027Good Read (#)\u0027],result[\u0027No Read (#)\u0027],result[\u0027Multi Read (#)\u0027],result[\u0027No code (#)\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\", \"Total (%)\",\"Good Read (%)\",\"No Read (%)\",\"Multi Read (%)\",\"No Code (%)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Total (%)\u0027],result[\u0027Good Read (%)\u0027],result[\u0027No Read (%)\u0027],result[\u0027Multi Read (%)\u0027],result[\u0027No Code (%)\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (pph)\",\"Good Read (pph)\",\"No Read (pph)\",\"Multi Read (pph)\",\"No Code (pph)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Total (pph)\u0027],result[\u0027Good Read (pph)\u0027],result[\u0027No Read (pph)\u0027],result[\u0027Multi Read (pph)\u0027],result[\u0027No Code (pph)\u0027]])\n\t\t\t\t\n\t\t\ttable \u003d system.dataset.toDataSet(headers, data)\t\n\t\t\tcsv \u003d system.dataset.toCSV(table,1,0,1)\n\t\t\tsystem.perspective.download(filename \u003d str_date+\u0027 Hourly Scanner.csv\u0027, data \u003d csv)\n\t\t\t\n\t\t\t\n\telif self.getSibling(\"Statistics\").props.currentTabIndex \u003d\u003d 7:\n\t\t\tresults \u003d self.parent.getChild(\"Statistics\").getChild(\"Hourly_Sorter_Summary\").getChild(\"Hourly_Sorter_Summary\").props.filter.results.data\n\t\t\tif(len(results) \u003e 0):\n\t\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\",\"Inducted (#)\",\"Sorted (#)\",\"Awcs Recirc (#)\",\"Operational Recirc (#)\",\"Machine Recirc (#)\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Inducted (#)\u0027],result[\u0027Sorted (#)\u0027],result[\u0027Awcs Recirc (#)\u0027],result[\u0027Operational Recirc (#)\u0027],result[\u0027Machine Recirc (#)\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\",\"Inducted (%)\",\"Sorted (%)\",\"Awcs Recirc (%)\",\"Operational Recirc (%)\",\"Machine Recirc (%)\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Inducted (%)\u0027],result[\u0027Sorted (%)\u0027],result[\u0027Awcs Recirc (%)\u0027],result[\u0027Operational Recirc (%)\u0027],result[\u0027Machine Recirc (%)\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\",\"Inducted (pph)\",\"Sorted (pph)\",\"Awcs Recirc (pph)\",\"Operational Recirc (pph)\",\"Machine Recirc (pph)\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Inducted (pph)\u0027],result[\u0027Sorted (pph)\u0027],result[\u0027Awcs Recirc (pph)\u0027],result[\u0027Operational Recirc (pph)\u0027],result[\u0027Machine Recirc (pph)\u0027]])\n\t\t\n\t\t\telse:\n\t\t\t\ttest_table \u003d system.dataset.toPyDataSet(self.parent.getChild(\"Statistics\").getChild(\"Hourly_Sorter_Summary\").getChild(\"Hourly_Sorter_Summary\").props.data)\n\t\t\t\n\t\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\",\"Inducted (#)\",\"Sorted (#)\",\"Awcs Recirc (#)\",\"Operational Recirc (#)\",\"Machine Recirc (#)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Inducted (#)\u0027],result[\u0027Sorted (#)\u0027],result[\u0027Awcs Recirc (#)\u0027],result[\u0027Operational Recirc (#)\u0027],result[\u0027Machine Recirc (#)\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\",\"Inducted (%)\",\"Sorted (%)\",\"Awcs Recirc (%)\",\"Operational Recirc (%)\",\"Machine Recirc (%)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Inducted (%)\u0027],result[\u0027Sorted (%)\u0027],result[\u0027Awcs Recirc (%)\u0027],result[\u0027Operational Recirc (%)\u0027],result[\u0027Machine Recirc (%)\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\",\"Inducted (pph)\",\"Sorted (pph)\",\"Awcs Recirc (pph)\",\"Operational Recirc (pph)\",\"Machine Recirc (pph)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Inducted (pph)\u0027],result[\u0027Sorted (pph)\u0027],result[\u0027Awcs Recirc (pph)\u0027],result[\u0027Operational Recirc (pph)\u0027],result[\u0027Machine Recirc (pph)\u0027]])\n\t\t\t\t\n\t\t\ttable \u003d system.dataset.toDataSet(headers, data)\t\n\t\t\tcsv \u003d system.dataset.toCSV(table,1,0,1)\n\t\t\tsystem.perspective.download(filename \u003d str_date+\u0027 Hourly Sorter Summary.csv\u0027, data \u003d csv)\n\t\n\t\t\n\telif self.getSibling(\"Statistics\").props.currentTabIndex \u003d\u003d 8:\n\t\tresults \u003d self.parent.getChild(\"Statistics\").getChild(\"Hourly_Sorter_Details\").getChild(\"Hourly_Sorter_Details\").props.filter.results.data\n\t\tif(len(results) \u003e 0):\n\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\",\"Inducted (#)\",\"Sorted (#)\",\"Dest Inv (#)\",\"Dest None (#)\",\"Dest Dis (#)\",\"Dest Full (#)\",\"Unexpected (#)\",\"Dest Fault (#)\",\"Div Fail (#)\",\"Gap Err (#)\",\"Lost (#)\",\"Track Err (#)\",\"Unknown (#)\",\"Unsafe (#)\"]\n\t\t\t\tfor result in results:\n\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Inducted (#)\u0027],result[\u0027Sorted (#)\u0027],result[\u0027Dest Inv (#)\u0027],result[\u0027Dest None (#)\u0027],result[\u0027Dest Dis (#)\u0027],result[\u0027Dest Full (#)\u0027],result[\u0027Unexpected (#)\u0027],result[\u0027Dest Fault (#)\u0027],result[\u0027Div Fail (#)\u0027],result[\u0027Gap Err (#)\u0027],result[\u0027Lost (#)\u0027],result[\u0027Track Err (#)\u0027],result[\u0027Unknown (#)\u0027],result[\u0027Unsafe (#)\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\",\"Inducted (%)\",\"Sorted (%)\",\"Dest Inv (%)\",\"Dest None (%)\",\"Dest Dis (%)\",\"Dest Full (%)\",\"Unexpected (%)\",\"Dest Fault (%)\",\"Div Fail (%)\",\"Gap Err (%)\",\"Lost (%)\",\"Track Err (%)\",\"Unknown (%)\",\"Unsafe (%)\"]\n\t\t\t\tfor result in results:\n\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Inducted (%)\u0027],result[\u0027Sorted (%)\u0027],result[\u0027Dest Inv (%)\u0027],result[\u0027Dest None (%)\u0027],result[\u0027Dest Dis (%)\u0027],result[\u0027Dest Full (%)\u0027],result[\u0027Unexpected (%)\u0027],result[\u0027Dest Fault (%)\u0027],result[\u0027Div Fail (%)\u0027],result[\u0027Gap Err (%)\u0027],result[\u0027Lost (%)\u0027],result[\u0027Track Err (%)\u0027],result[\u0027Unknown (%)\u0027],result[\u0027Unsafe (%)\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\",\"Inducted (pph)\",\"Sorted (pph)\",\"Dest Inv (pph)\",\"Dest None (pph)\",\"Dest Dis (pph)\",\"Dest Full (pph)\",\"Unexpected (pph)\",\"Dest Fault (pph)\",\"Div Fail (pph)\",\"Gap Err (pph)\",\"Lost (pph)\",\"Track Err (pph)\",\"Unknown (pph)\",\"Unsafe (pph)\"]\n\t\t\t\tfor result in results:\n\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Inducted (pph)\u0027],result[\u0027Sorted (pph)\u0027],result[\u0027Dest Inv (pph)\u0027],result[\u0027Dest None (pph)\u0027],result[\u0027Dest Dis (pph)\u0027],result[\u0027Dest Full (pph)\u0027],result[\u0027Unexpected (pph)\u0027],result[\u0027Dest Fault (pph)\u0027],result[\u0027Div Fail (pph)\u0027],result[\u0027Gap Err (pph)\u0027],result[\u0027Lost (pph)\u0027],result[\u0027Track Err (pph)\u0027],result[\u0027Unknown (pph)\u0027],result[\u0027Unsafe (pph)\u0027]])\n\t\t\n\t\telse:\n\t\t\ttest_table \u003d system.dataset.toPyDataSet(self.parent.getChild(\"Statistics\").getChild(\"Hourly_Sorter_Details\").getChild(\"Hourly_Sorter_Details\").props.data)\n\t\t\n\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\",\"Inducted (#)\",\"Sorted (#)\",\"Dest Inv (#)\",\"Dest None (#)\",\"Dest Dis (#)\",\"Dest Full (#)\",\"Unexpected (#)\",\"Dest Fault (#)\",\"Div Fail (#)\",\"Gap Err (#)\",\"Lost (#)\",\"Track Err (#)\",\"Unknown (#)\",\"Unsafe (#)\"]\n\t\t\t\tfor result in test_table:\n\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Inducted (#)\u0027],result[\u0027Sorted (#)\u0027],result[\u0027Dest Inv (#)\u0027],result[\u0027Dest None (#)\u0027],result[\u0027Dest Dis (#)\u0027],result[\u0027Dest Full (#)\u0027],result[\u0027Unexpected (#)\u0027],result[\u0027Dest Fault (#)\u0027],result[\u0027Div Fail (#)\u0027],result[\u0027Gap Err (#)\u0027],result[\u0027Lost (#)\u0027],result[\u0027Track Err (#)\u0027],result[\u0027Unknown (#)\u0027],result[\u0027Unsafe (#)\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\",\"Inducted (%)\",\"Sorted (%)\",\"Dest Inv (%)\",\"Dest None (%)\",\"Dest Dis (%)\",\"Dest Full (%)\",\"Unexpected (%)\",\"Dest Fault (%)\",\"Div Fail (%)\",\"Gap Err (%)\",\"Lost (%)\",\"Track Err (%)\",\"Unknown (%)\",\"Unsafe (%)\"]\n\t\t\t\tfor result in test_table:\n\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Inducted (%)\u0027],result[\u0027Sorted (%)\u0027],result[\u0027Dest Inv (%)\u0027],result[\u0027Dest None (%)\u0027],result[\u0027Dest Dis (%)\u0027],result[\u0027Dest Full (%)\u0027],result[\u0027Unexpected (%)\u0027],result[\u0027Dest Fault (%)\u0027],result[\u0027Div Fail (%)\u0027],result[\u0027Gap Err (%)\u0027],result[\u0027Lost (%)\u0027],result[\u0027Track Err (%)\u0027],result[\u0027Unknown (%)\u0027],result[\u0027Unsafe (%)\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\",\"Inducted (pph)\",\"Sorted (pph)\",\"Dest Inv (pph)\",\"Dest None (pph)\",\"Dest Dis (pph)\",\"Dest Full (pph)\",\"Unexpected (pph)\",\"Dest Fault (pph)\",\"Div Fail (pph)\",\"Gap Err (pph)\",\"Lost (pph)\",\"Track Err (pph)\",\"Unknown (pph)\",\"Unsafe (pph)\"]\n\t\t\t\tfor result in test_table:\n\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Inducted (pph)\u0027],result[\u0027Sorted (pph)\u0027],result[\u0027Dest Inv (pph)\u0027],result[\u0027Dest None (pph)\u0027],result[\u0027Dest Dis (pph)\u0027],result[\u0027Dest Full (pph)\u0027],result[\u0027Unexpected (pph)\u0027],result[\u0027Dest Fault (pph)\u0027],result[\u0027Div Fail (pph)\u0027],result[\u0027Gap Err (pph)\u0027],result[\u0027Lost (pph)\u0027],result[\u0027Track Err (pph)\u0027],result[\u0027Unknown (pph)\u0027],result[\u0027Unsafe (pph)\u0027]])\n\t\t\t\n\t\ttable \u003d system.dataset.toDataSet(headers, data)\t\n\t\tcsv \u003d system.dataset.toCSV(table,1,0,1)\n\t\tsystem.perspective.download(filename \u003d str_date+\u0027 Hourly Sorter Details.csv\u0027, data \u003d csv)\n\t\t\n\t\n\telif self.getSibling(\"Statistics\").props.currentTabIndex \u003d\u003d 9:\n\t\tresults \u003d self.parent.getChild(\"Statistics\").getChild(\"Hourly_Lane\").getChild(\"Hourly_Lane\").props.filter.results.data\n\t\tif(len(results) \u003e 0):\n\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\",\"Total (#)\",\"Diverted (#)\",\"Dest Full (#)\",\"Dest Jam (#)\",\"Dest Disabled (#)\",\"Dest Fault (#)\",\"Divert Fail (#)\",\"Lost (#)\",\"Unsafe (#)\",\"Dim Error (#)\",\"Gap Error (#)\",\"Unknown (#)\"]\n\t\t\t\tfor result in results:\n\t\t\t\t\tdata.append([result[\u0027endt\u0027],result[\u0027rownumber\u0027],result[\u0027Total_count\u0027],result[\u0027Diverted_count\u0027],result[\u0027Destfull_count\u0027],result[\u0027DestJam_count\u0027],result[\u0027DestDis_count\u0027],result[\u0027DestFault_count\u0027],result[\u0027DivertFail_count\u0027],result[\u0027Lost_count\u0027],result[\u0027Unsafe_count\u0027],result[\u0027Dim_count\u0027],result[\u0027GapErr_count\u0027],result[\u0027Unknown_count\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\",\"Total (%)\",\"Diverted (%)\",\"Dest Full (%)\",\"Dest Jam (%)\",\"Dest Disabled (%)\",\"Dest Fault (%)\",\"Divert Fail (%)\",\"Lost (%)\",\"Unsafe (%)\",\"Dim Error (%)\",\"Gap Error (%)\",\"Unknown (%)\"]\n\t\t\t\tfor result in results:\n\t\t\t\t\tdata.append([result[\u0027endt\u0027],result[\u0027rownumber\u0027],result[\u0027total_perc\u0027],result[\u0027Diverted_perc\u0027],result[\u0027destfull_perc\u0027],result[\u0027destjam_perc\u0027],result[\u0027destdisabled_perc\u0027],result[\u0027destfault_perc\u0027],result[\u0027DivertFail_perc\u0027],result[\u0027lost_perc\u0027],result[\u0027unsafe_perc\u0027],result[\u0027dim_perc\u0027],result[\u0027gaperr_perc\u0027],result[\u0027unknown_perc\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\",\"Total (pph)\",\"Diverted (pph)\",\"Dest Full (pph)\",\"Dest Jam (pph)\",\"Dest Disabled (pph)\",\"Dest Fault (pph)\",\"Divert Fail (pph)\",\"Lost (pph)\",\"Unsafe (pph)\",\"Dim Error (pph)\",\"Gap Error (pph)\",\"Unknown (pph)\"]\n\t\t\t\tfor result in results:\n\t\t\t\t\tdata.append([result[\u0027endt\u0027],result[\u0027rownumber\u0027],result[\u0027total_rate\u0027],result[\u0027Diverted_rate\u0027],result[\u0027destfull_rate\u0027],result[\u0027destjam_rate\u0027],result[\u0027destdisabled_rate\u0027],result[\u0027destfault_rate\u0027],result[\u0027DivertFail_rate\u0027],result[\u0027lost_rate\u0027],result[\u0027unsafe_rate\u0027],result[\u0027dim_rate\u0027],result[\u0027gaperr_rate\u0027],result[\u0027unknown_rate\u0027]])\n\t\t\t\n\t\telse:\n\t\t\ttest_table \u003d system.dataset.toPyDataSet(self.parent.getChild(\"Statistics\").getChild(\"Hourly_Lane\").getChild(\"Hourly_Lane\").props.data)\n\t\t\t\n\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Total (#)\",\"Diverted (#)\",\"Dest Full (#)\",\"Dest Jam (#)\",\"Dest Disabled (#)\",\"Dest Fault (#)\",\"Divert Fail (#)\",\"Lost (#)\",\"Unsafe (#)\",\"Dim Err (#)\",\"Gap Error (#)\",\"Unknown (#)\"]\n\t\t\t\tfor result in test_table:\n\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Total (#)\u0027],result[\u0027Diverted (#)\u0027],result[\u0027Dest Full (#)\u0027],result[\u0027Dest Jam (#)\u0027],result[\u0027Dest Disabled (#)\u0027],result[\u0027Dest Fault (#)\u0027],result[\u0027Divert Fail (#)\u0027],result[\u0027Lost (#)\u0027],result[\u0027Unsafe (#)\u0027],result[\u0027Dim Err (#)\u0027],result[\u0027Gap Err (#)\u0027],result[\u0027Unknown (#)\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\",\"Total (%)\",\"Diverted (%)\",\"Dest Full (%)\",\"Dest Jam (%)\",\"Dest Disabled (%)\",\"Dest Fault (%)\",\"Divert Fail (%)\",\"Lost (%)\",\"Unsafe (%)\",\"Dim Err (%)\",\"Gap Error (%)\",\"Unknown (%)\"]\n\t\t\t\tfor result in test_table:\n\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Total (%)\u0027],result[\u0027Diverted (%)\u0027],result[\u0027Dest Full (%)\u0027],result[\u0027Dest Jam (%)\u0027],result[\u0027Dest Disabled (%)\u0027],result[\u0027Dest Fault (%)\u0027],result[\u0027Divert Fail (%)\u0027],result[\u0027Lost (%)\u0027],result[\u0027Unsafe (%)\u0027],result[\u0027Dim Err (%)\u0027],result[\u0027Gap Err (%)\u0027],result[\u0027Unknown (%)\u0027]])\n\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\theaders \u003d [\"Start Timestamp\", \"Hour\",\"Total (pph)\",\"Diverted (pph)\",\"Dest Full (pph)\",\"Dest Jam (pph)\",\"Dest Disabled (pph)\",\"Dest Fault (pph)\",\"Divert Fail (pph)\",\"Lost (pph)\",\"Unsafe (pph)\",\"Dim Err (pph)\",\"Gap Error (pph)\",\"Unknown (pph)\"]\n\t\t\t\tfor result in test_table:\n\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Total (pph)\u0027],result[\u0027Diverted (pph)\u0027],result[\u0027Dest Full (pph)\u0027],result[\u0027Dest Jam (pph)\u0027],result[\u0027Dest Disabled (pph)\u0027],result[\u0027Dest Fault (pph)\u0027],result[\u0027Divert Fail (pph)\u0027],result[\u0027Lost (pph)\u0027],result[\u0027Unsafe (pph)\u0027],result[\u0027Dim Err (pph)\u0027],result[\u0027Gap Err (pph)\u0027],result[\u0027Unknown (pph)\u0027]])\n\t\t\t\t\n\t\ttable \u003d system.dataset.toDataSet(headers, data)\t\n\t\tcsv \u003d system.dataset.toCSV(table,1,0,1)\n\t\tsystem.perspective.download(filename \u003d str_date+\u0027 Hourly Lane.csv\u0027, data \u003d csv)\n\t\t\t\n\t\t\t\n\telif self.getSibling(\"Statistics\").props.currentTabIndex \u003d\u003d 12:\n\t\t\tresults \u003d self.parent.getChild(\"Statistics\").getChild(\"Dumper cycles\").getChild(\"Dumper cycles\").props.filter.results.data\n\t\t\tif(len(results) \u003e 0):\n\t\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Cycles of ULGL1\",\"Cycles of ULGL2\",\"Cycles of ULGL3\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Cycles of ULGL1\u0027],result[\u0027Cycles of ULGL2\u0027],result[\u0027Cycles of ULGL3\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Cycles of ULGL1 (%)\",\"Cycles of ULGL2 (%)\",\"Cycles of ULGL3 (%)\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Cycles of ULGL1 (%)\u0027],result[\u0027Cycles of ULGL2 (%)\u0027],result[\u0027Cycles of ULGL3 (%)\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Cycles of ULGL1 (cph)\",\"Cycles of ULGL2 (cph)\",\"Cycles of ULGL3 (cph)\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Cycles of ULGL1 (cph)\u0027],result[\u0027Cycles of ULGL2 (cph)\u0027],result[\u0027Cycles of ULGL3 (cph)\u0027]])\n\t\t\t\t\t\n\t\t\telse:\n\t\t\t\ttest_table \u003d system.dataset.toPyDataSet(self.parent.getChild(\"Statistics\").getChild(\"Dumper cycles\").getChild(\"Dumper cycles\").props.data)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Cycles of ULGL1\",\"Cycles of ULGL2\",\"Cycles of ULGL3\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Cycles of ULGL1\u0027],result[\u0027Cycles of ULGL2\u0027],result[\u0027Cycles of ULGL3\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Cycles of ULGL1 (%)\",\"Cycles of ULGL2 (%)\",\"Cycles of ULGL3 (%)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Cycles of ULGL1 (%)\u0027],result[\u0027Cycles of ULGL2 (%)\u0027],result[\u0027Cycles of ULGL3 (%)\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Cycles of ULGL1 (cph)\",\"Cycles of ULGL2 (cph)\",\"Cycles of ULGL3 (cph)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Cycles of ULGL1 (cph)\u0027],result[\u0027Cycles of ULGL2 (cph)\u0027],result[\u0027Cycles of ULGL3 (cph)\u0027]])\t\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\ttable \u003d system.dataset.toDataSet(headers, data)\t\n\t\t\tcsv \u003d system.dataset.toCSV(table,1,0,1)\n\t\t\tsystem.perspective.download(filename \u003d str_date+\u0027 Dumper cycles.csv\u0027, data \u003d csv)\n\t\t\t\t\t\n\t\t\t\t\t\n\telif self.getSibling(\"Statistics\").props.currentTabIndex \u003d\u003d 10:\n\n\t\t\tresults \u003d self.parent.getChild(\"Statistics\").getChild(\"Total Full1\").getChild(\"Total Full1\").props.filter.results.data\n\t\t\tif(len(results) \u003e 0):\n\t\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Cycles of ULGL1\",\"Cycles of ULGL2\",\"Cycles of ULGL3\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Cycles of ULGL1\u0027],result[\u0027Cycles of ULGL2\u0027],result[\u0027Cycles of ULGL3\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Cycles of ULGL1 (%)\",\"Cycles of ULGL2 (%)\",\"Cycles of ULGL3 (%)\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Cycles of ULGL1 (%)\u0027],result[\u0027Cycles of ULGL2 (%)\u0027],result[\u0027Cycles of ULGL3 (%)\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\t\theaders \u003d [\"Start Timestamp\",\"Hour\",\"Cycles of ULGL1 (cph)\",\"Cycles of ULGL2 (cph)\",\"Cycles of ULGL3 (cph)\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Start Timestamp\u0027],result[\u0027Hour\u0027],result[\u0027Cycles of ULGL1 (cph)\u0027],result[\u0027Cycles of ULGL2 (cph)\u0027],result[\u0027Cycles of ULGL3 (cph)\u0027]])\n\t\t\t\n\t\t\telse:\n\t\t\t\ttest_table \u003d system.dataset.toPyDataSet(self.parent.getChild(\"Statistics\").getChild(\"Total Full1\").getChild(\"Total Full1\").props.data)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\t\theaders \u003d [\"Lane\",\"Total (#)\",\"DestFull (#)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Lane\u0027],result[\u0027Total (#)\u0027],result[\u0027DestFull (#)\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\t\theaders \u003d [\"Lane\",\"Total (%)\",\"DestFull (%)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Lane\u0027],result[\u0027Total (%)\u0027],result[\u0027DestFull (%)\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Rate\":\n\t\t\t\t\theaders \u003d [\"Lane\",\"Total (pph)\",\"DestFull (pph)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Lane\u0027],result[\u0027Total (pph)\u0027],result[\u0027DestFull (pph)\u0027]])\t\t\t\t\t\t\t\n\t\t\t\n\t\t\ttable \u003d system.dataset.toDataSet(headers, data)\t\n\t\t\tcsv \u003d system.dataset.toCSV(table,1,0,1)\n\t\t\tsystem.perspective.download(filename \u003d str_date+\u0027 Lane Total Full.csv\u0027, data \u003d csv)\n\t\t\t\n\telif self.getSibling(\"Statistics\").props.currentTabIndex \u003d\u003d 11:\n\t\t\n\t\t\tresults \u003d self.parent.getChild(\"Statistics\").getChild(\"Jam Area\").getChild(\"Jam Area\").props.filter.results.data\n\t\t\tif(len(results) \u003e 0):\n\t\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\t\theaders \u003d [\"Start Stamp\",\"End Stamp\",\"Total Jam (#)\",\"Dumpers Jam (#)\", \"Inbound Jam (#)\",\"Runout Jam (#)\",\"Sorter Recirc Jam (#)\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027Total_Jam\u0027],result[\u0027Dumpers_jam\u0027],result[\u0027Inbound_jam\u0027],result[\u0027Runout_jam\u0027],result[\u0027Sorter_Recirc_jam\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\t\theaders \u003d [\"Start Stamp\",\"End Stamp\",\"Total Jam (%)\",\"Dumpers Jam (%)\", \"Inbound Jam (%)\",\"Runout Jam (%)\",\"Sorter Recirc Jam (%)\"]\n\t\t\t\t\tfor result in results:\n\t\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027Total_perc\u0027],result[\u0027Dumpers_perc\u0027],result[\u0027Inbound_perc\u0027],result[\u0027Runout_perc\u0027],result[\u0027Sorter_Recirc_perc\u0027]])\n\n\t\t\t\n\t\t\telse:\n\t\t\t\ttest_table \u003d system.dataset.toPyDataSet(self.parent.getChild(\"Statistics\").getChild(\"Jam Area\").getChild(\"Jam Area\").props.data)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\tif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Count\":\n\t\t\t\t\theaders \u003d [\"Start Stamp\",\"End Stamp\",\"Total Jam (#)\",\"Dumpers Jam (#)\", \"Inbound Jam (#)\",\"Runout Jam (#)\",\"Sorter Recirc Jam (#)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027Total_Jam\u0027],result[\u0027Dumpers_jam\u0027],result[\u0027Inbound_jam\u0027],result[\u0027Runout_jam\u0027],result[\u0027Sorter_Recirc_jam\u0027]])\n\t\t\t\telif self.parent.getChild(\"Aggregation_Mode\").getChild(\"Dropdown_Aggregation_mode\").props.value \u003d\u003d \"Percentage\":\n\t\t\t\t\theaders \u003d [\"Start Stamp\",\"End Stamp\",\"Total Jam (%)\",\"Dumpers Jam (%)\", \"Inbound Jam (%)\",\"Runout Jam (%)\",\"Sorter Recirc Jam (%)\"]\n\t\t\t\t\tfor result in test_table:\n\t\t\t\t\t\tdata.append([result[\u0027Startstamp\u0027],result[\u0027Endtstamp\u0027],result[\u0027Total_perc\u0027],result[\u0027Dumpers_perc\u0027],result[\u0027Inbound_perc\u0027],result[\u0027Runout_perc\u0027],result[\u0027Sorter_Recirc_perc\u0027]])\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\n\t\t\ttable \u003d system.dataset.toDataSet(headers, data)\t\n\t\t\tcsv \u003d system.dataset.toCSV(table,1,0,1)\n\t\t\tsystem.perspective.download(filename \u003d str_date+\u0027 Jam Areas.csv\u0027, data \u003d csv)\t\t\t\t\t\t\n\t\t\t\t\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "ExportToCSV", + "tooltip": { + "enabled": true, + "location": "bottom", + "style": { + "backgroundColor": "#2B2B2BBF", + "color": "#FFFFFF", + "fontSize": 14, + "textAlign": "left", + "white-space": "pre" + }, + "sustain": 2000 + } + }, + "position": { + "height": 0.03, + "width": 0.0625, + "x": 0.9351, + "y": -0.0132 + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "\"About: Export to CSV\"+ \r\n\"\\n\"+\r\n\"\\n\"+\"Which tab is open that\"+ \r\n\"\\n\"+\"table will be exported to CSV\"+ \r\n\"\\n\"+\"file after clicking on the button.\"" + }, + "type": "expr" + } + } + }, + "props": { + "mode": "percent", + "style": { + "classes": "Button_Action", + "fontFamily": "Arial", + "marginBottom": "2px", + "marginTop": "16px" + }, + "text": "Export to CSV" + }, + "type": "ia.input.button" + }, + { + "children": [ + { + "meta": { + "name": "LPeriod" + }, + "position": { + "basis": "60px" + }, + "props": { + "style": { + "color": "#FFFFFF" + }, + "text": "Period:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Period" + }, + "position": { + "basis": "160px" + }, + "props": { + "options": [ + { + "label": "Past 30 Min", + "value": "Past 30 Min" + }, + { + "label": "Past Hour", + "value": "Past Hour" + }, + { + "label": "Past 2 Hour", + "value": "Past 2 Hour" + }, + { + "label": "Past 4 Hour", + "value": "Past 4 Hour" + }, + { + "label": "Past 8 Hour", + "value": "Past 8 Hour" + }, + { + "label": "Current Day", + "value": "Current Day" + }, + { + "label": "Morning", + "value": "Morning" + }, + { + "label": "Daylight", + "value": "Daylight" + }, + { + "label": "Twilight", + "value": "Twilight" + }, + { + "label": "Night", + "value": "Night" + }, + { + "label": "Wrap Down", + "value": "Wrap Down" + }, + { + "label": "Current Sort", + "value": "Current Sort" + }, + { + "label": "Custom", + "value": "Custom" + } + ], + "value": "Past Hour" + }, + "type": "ia.input.dropdown" + }, + { + "meta": { + "name": "Spare_0" + }, + "position": { + "basis": "18.1px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Start Date" + }, + "position": { + "basis": "85px" + }, + "props": { + "style": { + "color": "#FFFFFF" + }, + "text": "Start Date:" + }, + "type": "ia.display.label" + }, + { + "custom": { + "Selected": { + "$": [ + "ts", + 192, + 1689168205405 + ], + "$ts": 1688473380000 + } + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t\n\tself.custom.Selected \u003d self.props.value" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "StartTime" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "{../Period.props.value} \u003d \"Custom\"" + }, + "type": "expr" + } + }, + "props.maxDate": { + "binding": { + "config": { + "expression": "now()" + }, + "type": "expr" + } + }, + "props.startDate": { + "binding": { + "config": { + "path": "../Period.props.value" + }, + "transforms": [ + { + "fallback": "todate(now())", + "inputType": "expression", + "mappings": [ + { + "input": "\"Past 30 Min\"", + "output": "todate(dateFormat(dateArithmetic(now(),-30, \"Minute\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "\"Past Hour\"", + "output": "todate(dateFormat(dateArithmetic(now(),-1, \"Hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "\"Past 2 Hour\"", + "output": "todate(dateFormat(dateArithmetic(now(),-2, \"Hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "\"Past 4 Hour\"", + "output": "todate(dateFormat(dateArithmetic(now(),-4, \"Hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "\"Past 8 Hour\"", + "output": "todate(dateFormat(dateArithmetic(now(),-8, \"Hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "\"Current Day\"", + "output": "todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 00:00:00\"))" + }, + { + "input": "\"Morning\"", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"2:30:00\",\r dateFormat(dateArithmetic(now(0),-1, \"Day\"), \"yyyy-MM-dd 2:30:00\"),todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 2:30:00\")))" + }, + { + "input": "\"Daylight\"", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"7:30:00\", todate(dateFormat(dateArithmetic(now(0),-1, \"Day\"), \"yyyy-MM-dd 7:30:00\")),todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 7:30:00\")))" + }, + { + "input": "\"Twilight\"", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Hours\"), \"HH:mm:ss\")\u003c\"13:00:00\", todate(dateFormat(dateArithmetic(now(0),-1, \"Day\"), \"yyyy-MM-dd 13:00:00\")),todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 13:00:00\")))" + }, + { + "input": "\"Night\"", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"18:30:00\", todate(dateFormat(dateArithmetic(now(0),-1, \"Day\"), \"yyyy-MM-dd 18:30:00\")),todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 18:30:00\")))" + }, + { + "input": "\"Wrap Down\"", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"23:30:00\", todate(dateFormat(dateArithmetic(now(0),-1, \"Day\"), \"yyyy-MM-dd 23:30:00\")),todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 23:30:00\")))" + }, + { + "input": "\"Current Sort\"", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"7:30:00\", todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 2:30:00\")), \r if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"13:00:00\",todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 7:30:00\")),\r if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"18:30:00\",todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 13:00:00\")),\r if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"23:30:00\",todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 18:30:00\")),\r if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"2:30:00\", todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 23:30:00\")),\r todate(dateFormat(dateArithmetic(now(),0, \"Day\"), \"yyyy-MM-dd HH:mm:ss\")))))))" + }, + { + "input": "\"Custom\"", + "output": "{this.props.value}" + } + ], + "outputType": "expression", + "type": "map" + } + ], + "type": "property" + }, + "onChange": { + "enabled": null, + "script": "\t\n\tif self.getSibling(\"Period\").props.value !\u003d \"Custom\":\n\t\tself.props.value \u003d self.props.startDate" + } + }, + "props.value": { + "onChange": { + "enabled": null, + "script": "\t\n\tif system.date.secondsBetween(self.props.value,self.getSibling(\"EndTime\").props.value) \u003e 604800 or system.date.secondsBetween(self.props.value,self.getSibling(\"EndTime\").props.value) \u003c 0:\n\t if system.date.secondsBetween(system.date.addSeconds(self.props.value,604800),system.date.now()) \u003c 0: \n\t self.getSibling(\"EndTime\").props.value \u003d system.date.now()\n\t else:\n\t self.getSibling(\"EndTime\").props.value \u003d system.date.addSeconds(self.props.value,604800)" + } + } + }, + "props": { + "dismissOnSelect": false, + "formattedValue": "Apr 25, 2025 2:58 PM", + "formattedValues": { + "date": "Mar 26, 2021", + "datetime": "Mar 26, 2021 12:00 AM", + "time": "12:00 AM" + }, + "value": { + "$": [ + "ts", + 192, + 1745582282491 + ], + "$ts": 1745578682000 + } + }, + "type": "ia.input.date-time-input" + }, + { + "meta": { + "name": "Spare" + }, + "position": { + "basis": "18.1px" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "End Date" + }, + "position": { + "basis": "81px" + }, + "props": { + "style": { + "color": "#FFFFFF" + }, + "text": "End Date:" + }, + "type": "ia.display.label" + }, + { + "custom": { + "Selected": "value" + }, + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t\n\tself.custom.Selected \u003d self.props.value" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "EndTime" + }, + "position": { + "basis": "190px" + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "{../Period.props.value} \u003d \"Custom\"" + }, + "type": "expr" + } + }, + "props.endDate": { + "binding": { + "config": { + "path": "../Period.props.value" + }, + "transforms": [ + { + "fallback": "{this.props.value}", + "inputType": "scalar", + "mappings": [ + { + "input": "Past 30 Min", + "output": "todate(dateFormat(dateArithmetic(now(),0, \"Hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "Past Hour", + "output": "todate(dateFormat(dateArithmetic(now(),0, \"hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "Past 2 Hour", + "output": "todate(dateFormat(dateArithmetic(now(),0, \"hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "Past 4 Hour", + "output": "todate(dateFormat(dateArithmetic(now(),0, \"hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "Past 8 Hour", + "output": "todate(dateFormat(dateArithmetic(now(),0, \"hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "Current Day", + "output": "todate(dateFormat(dateArithmetic(now(),0, \"hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + }, + { + "input": "Morning", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"2:30:00\",\r todate(dateFormat(dateArithmetic(now(0),-1, \"Day\"), \"yyyy-MM-dd 7:30:00\")),\r if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"7:30:00\",\r todate(dateFormat(dateArithmetic(now(),0, \"Day\"), \"yyyy-MM-dd HH:mm:ss\")), todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 7:30:00\"))))" + }, + { + "input": "Daylight", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"7:30:00\",\r todate(dateFormat(dateArithmetic(now(0),-1, \"Day\"), \"yyyy-MM-dd 13:00:00\")),\r if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"13:00:00\",\r todate(dateFormat(dateArithmetic(now(),0, \"Day\"), \"yyyy-MM-dd HH:mm:ss\")), todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 13:00:00\"))))" + }, + { + "input": "Twilight", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"13:00:00\",\r todate(dateFormat(dateArithmetic(now(0),-1, \"Day\"), \"yyyy-MM-dd 18:30:00\")),\r if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"18:30:00\",\r todate(dateFormat(dateArithmetic(now(),0, \"Day\"), \"yyyy-MM-dd HH:mm:ss\")), todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 18:30:00\"))))" + }, + { + "input": "Night", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"18:30:00\",\r todate(dateFormat(dateArithmetic(now(0),-1, \"Day\"), \"yyyy-MM-dd 23:30:00\")),\r if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"23:30:00\",\r todate(dateFormat(dateArithmetic(now(),0, \"Day\"), \"yyyy-MM-dd HH:mm:ss\")), todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 23:30:00\"))))" + }, + { + "input": "Wrap Down", + "output": "if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"23:30:00\",\r todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 2:30:00\")),\r if (dateFormat(dateArithmetic(now(),0, \"Day\"), \"HH:mm:ss\")\u003c\"2:30:00\",\r todate(dateFormat(dateArithmetic(now(),0, \"Day\"), \"yyyy-MM-dd HH:mm:ss\")), todate(dateFormat(dateArithmetic(now(0),0, \"Day\"), \"yyyy-MM-dd 2:30:00\"))))" + }, + { + "input": "Current Sort", + "output": "todate(dateFormat(dateArithmetic(now(),0, \"hour\"), \"yyyy-MM-dd HH:mm:ss\"))" + } + ], + "outputType": "expression", + "type": "map" + } + ], + "type": "property" + }, + "onChange": { + "enabled": null, + "script": "\t\n\tif self.getSibling(\"Period\").props.value !\u003d \"Custom\":\n\t\tself.props.value \u003d self.props.endDate" + } + }, + "props.maxDate": { + "binding": { + "config": { + "expression": "if(dateDiff({../StartTime.props.value},now(),\"day\") \u003c 7, now(),dateArithmetic({../StartTime.props.value}, 7, \"days\"))" + }, + "type": "expr" + } + }, + "props.minDate": { + "binding": { + "config": { + "expression": "{../StartTime.props.value}" + }, + "type": "expr" + } + } + }, + "props": { + "dismissOnSelect": false, + "formattedValue": "Apr 25, 2025 3:58 PM", + "formattedValues": { + "date": "Mar 29, 2021", + "datetime": "Mar 29, 2021 1:37 PM", + "time": "1:37 PM" + }, + "value": { + "$": [ + "ts", + 192, + 1745582282501 + ], + "$ts": 1745582282000 + } + }, + "type": "ia.input.date-time-input" + } + ], + "meta": { + "name": "Period_not_Global_0" + }, + "position": { + "height": 0.0269, + "width": 0.413, + "x": 0.0025, + "y": 0.0059 + }, + "propConfig": { + "custom.EndDate": { + "binding": { + "config": { + "path": "./EndTime.props.value" + }, + "type": "property" + } + }, + "custom.StartDate": { + "binding": { + "config": { + "path": "./StartTime.props.value" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "fontFamily": "Arial" + } + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "Info", + "tooltip": { + "enabled": true, + "location": "bottom-right", + "style": { + "backgroundColor": "#2B2B2BBF", + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": 14, + "textAlign": "left", + "white-space": "pre" + } + } + }, + "position": { + "height": 0.043, + "width": 0.0208, + "x": 0.9745, + "y": 0.0847 + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "if ({view.params.Table} \u003d \"Statistics\" \u0026\u0026 {view.params.Tab_ID} \u003d 0,\r\n\t\"About: Induct Details\"+ \r\n\t\"\\n\"+\r\n\t\"\\n\"+\"Start Timestamp - time of the first value determined by the selected period.\"+\r\n\t\"\\n\"+\"End Timestamp - time of the last value determined by the selected period.\"+\r\n\t\"\\n\"+\"Sorter Number - sorter name.\"+\r\n\t\"\\n\"+\"Induct Number - induct name.\"+\r\n\t\"\\n\"+\"Total Count - the total number of parcels.\"+\r\n\t\"\\n\"+\"Single Carrier Count - the number of single parcels.\"+\r\n\t\"\\n\"+\"Double Carrier Count - the number of paired parcels.\",\r\nif ({view.params.Table} \u003d \"Statistics\" \u0026\u0026 {view.params.Tab_ID} \u003d 1,\r\n\t\"About: Scanner Details\"+ \r\n\t\"\\n\"+\r\n\t\"\\n\"+\"Start Timestamp - time of the first value determined by the selected period.\"+\r\n\t\"\\n\"+\"End Timestamp - time of the last value determined by the selected period.\"+\r\n\t\"\\n\"+\"Sorter Number - sorter name.\"+\r\n\t\"\\n\"+\"Scanner Number - scanner name.\"+\r\n\t\"\\n\"+\"Total Count - total number of scanned parcels.\"+\r\n\t\"\\n\"+\"Good Read Count - number of good reads.\"+\r\n\t\"\\n\"+\"No Read Count - number of noreads.\"+\r\n\t\"\\n\"+\"Multi Read Count - number of multireads.\"+\r\n\t\"\\n\"+\"No Code Count - number of no codes.\",\r\nif ({view.params.Table} \u003d \"Statistics\" \u0026\u0026 {view.params.Tab_ID} \u003d 2,\r\n\t\"About: Sorter Summary\"+ \r\n\t\"\\n\"+\r\n\t\"\\n\"+\"Start Timestamp - time of the first value determined by the selected period.\"+\r\n\t\"\\n\"+\"End Timestamp - time of the last value determined by the selected period.\"+\r\n\t\"\\n\"+\"Sorter Number - sorter name.\"+\r\n\t\"\\n\"+\"Inducted - the total number of received parcels.\"+\r\n\t\"\\n\"+\"Sorted - the number of parcels sorted.\"+\r\n\t\"\\n\"+\"AWCS Recirc - the number of parcels sent for recirc.\"+\r\n\t\"\\n\"+\"Operational Recirc - \"+\r\n\t\"\\n\"+\"Machine Recirc - \",\r\nif ({view.params.Table} \u003d \"Statistics\" \u0026\u0026 {view.params.Tab_ID} \u003d 3,\r\n\t\"About: Sorter Details\"+ \r\n\t\"\\n\"+\r\n\t\"\\n\"+\"Start Timestamp - time of the first value determined by the selected period.\"+\r\n\t\"\\n\"+\"End Timestamp - time of the last value determined by the selected period.\"+\r\n\t\"\\n\"+\"Sorter Number - sorter name.\"+\r\n\t\"\\n\"+\"Inducted Count - the total number of received parcels.\"+\r\n\t\"\\n\"+\"Sorted Count - the number of parcels sorted.\"+\r\n\t\"\\n\"+\"Assigned Count - not applicable.\"+\r\n\t\"\\n\"+\"Destination Inv Count - the total number of the requested destination \\n\\t\\tassigned by AWCS is not valid for the current scan point or sorter.\"+\r\n\t\"\\n\"+\"Dest None Count - not applicable.\"+\r\n\t\"\\n\"+\"Dest Dis Count - not applicable.\"+\r\n\t\"\\n\"+\"Destination Full Count - the total number of the requested destination for \\n\\t\\tthe container was full. \"+\r\n\t\"\\n\"+\"Unexpected Count - the total number of an unexpected container was \\n\\t\\tidentified during sortation.\"+\r\n\t\"\\n\"+\"Destination Fault Count - the total number of the requested destination \\n\\t\\tfor the container was non-operational due to a fault\"+\r\n\t\"\\n\"+\"Divert Fail Count - the total number of the sorter attempted to divert \\n\\t\\tthe container to the requested destination\tbut failed. \"+\r\n\t\"\\n\"+\"Gap Error Count - the total number of containers were inducted into the \\n\\t\\tsorter with less than the minimum gap between containers the \\n\\t\\tsorter supports.\"+\r\n\t\"\\n\"+\"Lost Count - the total number of the container was lost on the sorter after \\n\\t\\tit was scanned at a scan point.\"+\r\n\t\"\\n\"+\"Track Error - the total number of the container was lost on the sorter after \\n\\t\\tit was scanned at a scan point.\"+\r\n\t\"\\n\"+\"Unknown Count - the total number of\"+\r\n\t\"\\n\"+\"Unsafe Count - the total number of the sorter did not attempt to divert \\n\\t\\tthe container to the requested destination because the container \\n\\t\\twas unable to be diverted accurately or safely\",\r\nif ({view.params.Table} \u003d \"Statistics\" \u0026\u0026 {view.params.Tab_ID} \u003d 4,\r\n\t\"About: Lane Details\"+ \r\n\t\"\\n\"+\r\n\t\"\\n\"+\"Start Timestamp - time of the first value determined by the selected period.\"+\r\n\t\"\\n\"+\"End Timestamp - time of the last value determined by the selected period.\"+\r\n\t\"\\n\"+\"Sorter Number - sorter name.\"+\r\n\t\"\\n\"+\"Lane/Chute Number - lane/chute name.\"+\r\n\t\"\\n\"+\"Total Count - total number of diverted parcels on this chute.\"+\r\n\t\"\\n\"+\"Diverted Count - the number of successfully diverted parcels to this chute.\"+\r\n\t\"\\n\"+\"Destination Full Count - the number of full states.\"+\r\n\t\"\\n\"+\"Destination Jam Count - the number of jam states.\"+\r\n\t\"\\n\"+\"Destination Disabled Count - the number of Disabled states.\"+\r\n\t\"\\n\"+\"Destination Fault Count - not applicable.\"+\r\n\t\"\\n\"+\"Divert Fail Count - the number of unsuccessfully diverted parcels to this chute.\"+\r\n\t\"\\n\"+\"Lost Count - not applicable.\"+\r\n\t\"\\n\"+\"Unsafe Count - not applicable.\"+\r\n\t\"\\n\"+\"Dim Error - not applicable.\"+\r\n\t\"\\n\"+\"Gap Error Count - not applicable.\"+\r\n\t\"\\n\"+\"Unknown Count - not applicable.\",\r\nif ({view.params.Table} \u003d \"Statistics\" \u0026\u0026 {view.params.Tab_ID} \u003d 5,\r\n\t\"About: Hourly Induct\"+ \r\n\t\"\\n\"+\r\n\t\"\\n\"+\"Start Timestamp - time value for counting on hourly values.\"+\r\n\t\"\\n\"+\"Hour – Hour of the day (H1-H24) - time in the selected period \\n\\t\\tdivided by whole hours. The choice of the time period \\n\\t\\tthat will be viewed for the Hourly tables should be \\n\\t\\tin whole hours (example: 7:00).\"+\r\n\t\"\\n\"+\"Total (#) - the total number of parcels.\"+\r\n\t\"\\n\"+\"Single Carrier (#) - the number of single parcels.\"+\r\n\t\"\\n\"+\"Double Carrier (#) - the number of paired parcels.\",\r\nif ({view.params.Table} \u003d \"Statistics\" \u0026\u0026 {view.params.Tab_ID} \u003d 6,\r\n\t\"About: Hourly Scanner\"+ \r\n\t\"\\n\"+\r\n\t\"\\n\"+\"Start Timestamp - time value for counting on hourly values.\"+\r\n\t\"\\n\"+\"Hour – Hour of the day (H1-H24) - time in the selected period \\n\\t\\tdivided by whole hours. The choice of the time period \\n\\t\\tthat will be viewed for the Hourly tables should be \\n\\t\\tin whole hours (example: 7:00).\"+\r\n\t\"\\n\"+\"Total (#) - total number of scanned parcels.\"+\r\n\t\"\\n\"+\"Good read (#) - number of good reads.\"+\r\n\t\"\\n\"+\"No Read (#) - number of noreads.\"+\r\n\t\"\\n\"+\"Multi Read (#) - number of multireads.\"+\r\n\t\"\\n\"+\"No Code (#) - number of no codes.\",\r\nif ({view.params.Table} \u003d \"Statistics\" \u0026\u0026 {view.params.Tab_ID} \u003d 7,\r\n\t\"About: Hourly Sorter Summary\"+ \r\n\t\"\\n\"+\r\n\t\"\\n\"+\"Start Timestamp - time value for counting on hourly values.\"+\r\n\t\"\\n\"+\"Hour – Hour of the day (H1-H24) - time in the selected period \\n\\t\\tdivided by whole hours. The choice of the time period \\n\\t\\tthat will be viewed for the Hourly tables should be \\n\\t\\tin whole hours (example: 7:00).\"+\r\n\t\"\\n\"+\"Total Inducted(#) - the total number of received parcels.\"+\r\n\t\"\\n\"+\"Total Sorted(#) - the number of parcels sorted.\"+\r\n\t\"\\n\"+\"AWCS Recirculate (#) - the number of parcels sent for recirc.\"+\r\n\t\"\\n\"+\"Operational Recirculate(#) - \"+\r\n\t\"\\n\"+\"Machine Recirculate(#) - \",\r\nif ({view.params.Table} \u003d \"Statistics\" \u0026\u0026 {view.params.Tab_ID} \u003d 8,\r\n\t\"About: Hourly Sorter Details\"+ \r\n\t\"\\n\"+\r\n\t\"\\n\"+\"Start Timestamp - time value for counting on hourly values.\"+\r\n\t\"\\n\"+\"Hour – Hour of the day (H1-H24) - time in the selected period \\n\\t\\tdivided by whole hours. The choice of the time period \\n\\t\\tthat will be viewed for the Hourly tables should be \\n\\t\\tin whole hours (example: 7:00).\"+\r\n\t\"\\n\"+\"Inducted (#) - the total number of received parcels.\"+\r\n\t\"\\n\"+\"Sorted (#) - the number of parcels sorted.\"+\r\n\t\"\\n\"+\"Assigned (#) - not applicable.\"+\r\n\t\"\\n\"+\"Destination Inv (#) - the total number of the requested destination \\n\\t\\tassigned by AWCS is not valid for the current scan point or sorter.\"+\r\n\t\"\\n\"+\"Dest None (#) - not applicable.\"+\r\n\t\"\\n\"+\"Dest Dis Count - not applicable.\"+\r\n\t\"\\n\"+\"Destination Full (#) - the total number of the requested destination for \\n\\t\\tthe container was full.\"+\r\n\t\"\\n\"+\"Unexpected (#) - the total number of an unexpected container was \\n\\t\\tidentified during sortation.\"+\r\n\t\"\\n\"+\"Destination Fault (#) - the total number of the requested destination \\n\\t\\tfor the container was non-operational due to a fault.\"+\r\n\t\"\\n\"+\"Divert Fail (#) - - the total number of the sorter attempted to divert \\n\\t\\tthe container to the requested destination but failed.\"+\r\n\t\"\\n\"+\"Gap Error (#) - the total number of containers were inducted into the \\n\\t\\tsorter with less than the minimum gap between containers the \\n\\t\\tsorter supports.\"+\r\n\t\"\\n\"+\"Lost (#) - the total number of the container was lost on the sorter after \\n\\t\\tit was scanned at a scan point.\"+\r\n\t\"\\n\"+\"Track Error (#) - the total number of the container was lost on the sorter after \\n\\t\\tit was scanned at a scan point.\"+\r\n\t\"\\n\"+\"Unknown Count (#) - \"+\r\n\t\"\\n\"+\"Unsafe Count (#) - the total number of the sorter did not attempt to divert \\n\\t\\tthe container to the requested destination because the container \\n\\t\\twas unable to be diverted accurately or safely\",\r\nif ({view.params.Table} \u003d \"Statistics\" \u0026\u0026 {view.params.Tab_ID} \u003d 9,\r\n\t\"About: Hourly Lane Details\"+ \r\n\t\"\\n\"+\r\n\t\"\\n\"+\"Start Timestamp - time value for counting on hourly values.\"+\r\n\t\"\\n\"+\"Hour – Hour of the day (H1-H24) - time in the selected period \\n\\t\\tdivided by whole hours. The choice of the time period \\n\\t\\tthat will be viewed for the Hourly tables should be \\n\\t\\tin whole hours (example: 7:00).\"+\r\n\t\"\\n\"+\"Total (#) - total number of diverted parcels on this chute.\"+\r\n\t\"\\n\"+\"Diverted (#) - the number of successfully diverted parcels to this chute.\"+\r\n\t\"\\n\"+\"Destination Full (#) - the number of full states.\"+\r\n\t\"\\n\"+\"Destination Jam (#) - the number of jam states.\"+\r\n\t\"\\n\"+\"Destination Disabled (#) - the number of Disabled states.\"+\r\n\t\"\\n\"+\"Destination Fault Count - not applicable.\"+\r\n\t\"\\n\"+\"Divert Fail (#) - the number of unsuccessfully diverted parcels to this chute.\"+\r\n\t\"\\n\"+\"Lost (#) - not applicable.\"+\r\n\t\"\\n\"+\"Unsafe (#) - not applicable.\"+\r\n\t\"\\n\"+\"Dim (#) - not applicable.\"+\r\n\t\"\\n\"+\"Gap Error (#) - not applicable.\"+\r\n\t\"\\n\"+\"Unknown (#) - not applicable.\",\r\nif ({view.params.Table} \u003d \"Statistics\" \u0026\u0026 {view.params.Tab_ID} \u003d 10,\r\n\t\"About: Lane Total Full\"+\t\r\n\t\"\\n\"+\r\n\t\"\\n\"+\"Lane Number - lane name.\"+\r\n\t\"\\n\"+\"Total Count - total number of diverted parcels on this chute.\"+\r\n\t\"\\n\"+\"Destination Full Count - the number of full states.\",\r\nif ({view.params.Table} \u003d \"Statistics\" \u0026\u0026 {view.params.Tab_ID} \u003d 11,\r\n\t\"About: Jam by Area\"+\t\r\n\t\"\\n\"+\r\n\t\"\\n\"+\"Jam counts by areas\",\r\n\t\r\nif ({view.params.Table} \u003d \"Statistics\" \u0026\u0026 {view.params.Tab_ID} \u003d 12,\r\n\t\"About: Dumper cycles\"+\t\r\n\t\"\\n\"+\r\n\t\"\\n\"+\"Cycles counts by dumpers\",\t\t\r\n\r\n\"not response\")))))))))))))" + }, + "type": "expr" + } + } + }, + "props": { + "fit": { + "mode": "fill" + }, + "source": "/system/images/MyIcon/question64x64.png", + "style": { + "cursor": "pointer" + } + }, + "type": "ia.display.image" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "height": 0.0344, + "width": 0.2536, + "x": 0.5195, + "y": 0.0041 + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "designerUseLimit": false, + "parameters": { + "endtime": "{../Period_not_Global_0.custom.EndDate}", + "starttime": "{../Period_not_Global_0.custom.StartDate}" + }, + "polling": { + "enabled": true, + "rate": "300" + }, + "queryPath": "Statistics/Max PPH 5 Min" + }, + "transforms": [ + { + "code": "\t\n\tmax_pph \u003d system.dataset.toPyDataSet(value)\n\treturn \"Highest Sorted PPH at 5 min Interval: \" + str(int(max_pph[0][0])) + \" pph\"\n\t\n\t", + "type": "script" + } + ], + "type": "query" + } + } + }, + "props": { + "style": { + "color": "#FFFFFF", + "fontFamily": "Arial", + "fontSize": 20 + } + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "meta": { + "name": "Label_Lane" + }, + "position": { + "basis": "70px" + }, + "props": { + "style": { + "color": "#000000" + }, + "text": "Dumper:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Dumper" + }, + "position": { + "basis": "171px" + }, + "props": { + "options": [ + { + "label": "ULGL1-1", + "value": "ULGL1-1" + }, + { + "label": "ULGL2-1", + "value": "ULGL2-1" + }, + { + "label": "ULGL3-1", + "value": "ULGL3-1" + } + ], + "value": "S0101" + }, + "type": "ia.input.dropdown" + } + ], + "meta": { + "name": "Dumper Drop Down_0", + "visible": false + }, + "position": { + "height": 0.0269, + "width": 0.1219, + "x": 0.8469, + "y": 0.0922 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "if ({../Statistics.props.currentTabIndex} \u003d 12 ,\r\ntrue,\r\nfalse)" + }, + "enabled": false, + "type": "expr" + } + } + }, + "props": { + "style": { + "fontFamily": "Arial" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "position": { + "x": -0.0073, + "y": -0.0011 + }, + "props": { + "mode": "percent", + "style": { + "backgroundColor": "#1A4A5E" + } + }, + "type": "ia.container.coord" + } +} \ No newline at end of file diff --git a/.resources/cf4987352a124269b11edd4ebdd865636602a406515a0675ab107077200027de b/.resources/cf4987352a124269b11edd4ebdd865636602a406515a0675ab107077200027de new file mode 100644 index 0000000..1feb135 --- /dev/null +++ b/.resources/cf4987352a124269b11edd4ebdd865636602a406515a0675ab107077200027de @@ -0,0 +1,604 @@ +{ + "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": "Photocell (Lift)" + }, + "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": 202, + "output": "State-Styles/State201" + }, + { + "input": 201, + "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.0761814", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.264583" + }, + "type": "circle" + }, + { + "cx": "6.6145835", + "cy": "6.6145835", + "fill": { + "opacity": "1", + "paint": "#000000" + }, + "id": "path2", + "name": "path2", + "rx": "0.5251264", + "ry": "0.52512622", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.272664" + }, + "type": "ellipse" + } + ], + "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/.resources/d2dae318191273603a3599a88bb9b2be7023eb5dc810493408a4e84de3449533 b/.resources/d2dae318191273603a3599a88bb9b2be7023eb5dc810493408a4e84de3449533 new file mode 100644 index 0000000..049ccde --- /dev/null +++ b/.resources/d2dae318191273603a3599a88bb9b2be7023eb5dc810493408a4e84de3449533 @@ -0,0 +1,2092 @@ +{ + "custom": { + "api_region_name": "eu", + "default_file_config": { + "ETag": "?", + "LastModified": "?", + "Size": 0, + "StorageClass": "?" + }, + "dummy": [], + "file_not_found": true, + "file_options": [], + "loading": false, + "selected_file": "", + "selected_file_config": { + "ETag": "?", + "Filename": ".svg", + "Key": ".svg", + "LastModified": "?", + "Size": 0, + "StorageClass": "?" + }, + "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" + } + }, + "events": { + "system": { + "onStartup": { + "config": { + "script": "\tself.custom.selected_file \u003d self.params.selected_file" + }, + "scope": "G", + "type": "script" + } + } + }, + "params": { + "bucket": "", + "enables": { + "delete": true, + "download": true, + "file": true, + "object_key": false, + "upload": true + }, + "files": [], + "prefix": "", + "selected_file": "", + "suffix": ".svg", + "upload_file_types": [ + "svg" + ], + "whid": "" + }, + "propConfig": { + "custom.api_region_name": { + "binding": { + "config": { + "path": "session.custom.aws.prefix" + }, + "type": "property" + }, + "persistent": true + }, + "custom.default_file_config": { + "persistent": true + }, + "custom.default_file_config.Filename": { + "binding": { + "config": { + "expression": "{view.params.selected_file}+{view.params.suffix}" + }, + "type": "expr" + } + }, + "custom.default_file_config.Key": { + "binding": { + "config": { + "expression": "{view.params.prefix}+{view.params.selected_file}+{view.params.suffix}" + }, + "type": "expr" + } + }, + "custom.dummy": { + "persistent": true + }, + "custom.file_not_found": { + "binding": { + "config": { + "expression": "{view.custom.selected_file_config.Size}\u003d0" + }, + "type": "expr" + }, + "persistent": true + }, + "custom.file_options": { + "binding": { + "config": { + "path": "view.params.files" + }, + "transforms": [ + { + "code": "\tprefix \u003d self.params.prefix\n\tsuffix \u003d self.params.suffix\n\treturn [{\u0027value\u0027: x.Filename, \n\t\t\u0027label\u0027: x.Filename} \n\t\tfor x in value]", + "type": "script" + } + ], + "type": "property" + }, + "persistent": true + }, + "custom.loading": { + "persistent": true + }, + "custom.selected_file": { + "persistent": true + }, + "custom.selected_file_config": { + "binding": { + "config": { + "expression": "{view.custom.selected_file}+toStr({view.custom.file_options})" + }, + "transforms": [ + { + "code": "\tdef_file_config \u003d self.custom.default_file_config\n\treturn next((x for x in self.params.files if x.Filename \u003d\u003d self.custom.selected_file), def_file_config)", + "type": "script" + } + ], + "type": "expr" + }, + "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.bucket": { + "paramDirection": "input", + "persistent": true + }, + "params.enables": { + "paramDirection": "input", + "persistent": true + }, + "params.files": { + "paramDirection": "input", + "persistent": true + }, + "params.prefix": { + "paramDirection": "input", + "persistent": true + }, + "params.selected_file": { + "onChange": { + "enabled": null, + "script": "\tif not missedEvents:\n\t\tselection \u003d self.getChild(\"root\").getChild(\"FlexContainer\").getChild(\"Table\").props.selection\n\t\tif currentValue.value:\n\t\t\tif not currentValue.value.endswith(self.params.suffix):\n\t\t\t\tself.custom.selected_file \u003d currentValue.value + self.params.suffix\n\t\t\telse:\n\t\t\t\tself.custom.selected_file \u003d currentValue.value\n\t\t\t# now select the correct row in table that matches selection\n\t\t\tfilename \u003d self.custom.selected_file\n\t\t\tselected_row, selected_data \u003d None, []\n\t\t\tfor index, row in enumerate(self.params.files):\n\t\t\t\tif row.Filename \u003d\u003d filename:\n\t\t\t\t\tselected_row \u003d index\n\t\t\t\t\tselected_data.append(row)\n\t\t\t\t\tbreak\n\t\t\tselection.data \u003d selected_data\n\t\t\tselection.selectedRow \u003d selected_row\n\t\telse:\n\t\t\t# file is none, clear out file selection\n\t\t\t# I know, why are we setting to -1, then None? it\u0027s an ignition persp table bug\n\t\t\t# as of 8.1.20. It works...\n\t\t\tselection.selectedRow \u003d -1\n\t\t\tselection.selectedColumn \u003d -1\n\t\t\tselection.selectedRow \u003d None\n\t\t\tselection.selectedColumn \u003d None\n\t" + }, + "paramDirection": "input", + "persistent": true + }, + "params.suffix": { + "paramDirection": "input", + "persistent": true + }, + "params.upload_file_types": { + "paramDirection": "input", + "persistent": true + }, + "params.whid": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 600, + "width": 550 + } + }, + "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": "Select File:" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t# when user selects new file, send message to update selected image on parent view\n\tif self.props.value:\n\t\tsuffix \u003d self.view.params.suffix\n\t\tselected_image \u003d self.props.value.replace(suffix, \u0027\u0027)\n\t\tpayload \u003d {\u0027image\u0027: selected_image}\n\t\tsystem.perspective.sendMessage(\u0027update_selected_image\u0027, payload, scope\u003d\u0027session\u0027)\n\t\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Dropdown", + "tooltip": { + "location": "bottom", + "style": { + "whiteSpace": "pre" + }, + "text": "Click here to select a different \nstage folder to manage" + } + }, + "position": { + "basis": "175px", + "grow": 1, + "shrink": 0 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "{view.params.enables.file}\u0026\u0026try(len({view.params.files})\u003e0,false)" + }, + "type": "expr" + } + }, + "props.options": { + "binding": { + "config": { + "path": "view.custom.file_options" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.custom.selected_file" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "margin": "2px", + "marginRight": "5px" + } + }, + "type": "ia.input.dropdown" + }, + { + "events": { + "component": { + "onFileReceived": { + "config": { + "script": "\tself.upload_file(event\u003devent)\n" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "FileUpload", + "tooltip": { + "enabled": true + } + }, + "position": { + "basis": "26px", + "shrink": 0 + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "stringFormat(\u0027Upload new version of %s\u0027,{view.custom.selected_file})" + }, + "type": "expr" + } + }, + "meta.visible": { + "binding": { + "config": { + "expression": "{view.params.enables.upload}\u0026\u0026!{view.custom.file_not_found}" + }, + "type": "expr" + } + }, + "props.supportedFileTypes": { + "binding": { + "config": { + "path": "view.params.upload_file_types" + }, + "type": "property" + } + } + }, + "props": { + "fileSizeLimit": 20, + "fileUploadIcon": { + "style": { + "borderStyle": "none", + "classes": "Input/Button/Secondary_minimal", + "margin": "-5px" + } + }, + "maxUploads": 1 + }, + "scripts": { + "customMethods": [ + { + "name": "update_bindings", + "params": [], + "script": "\t\"\"\"\n\t\tAfter data saved to S3, refresh session and view bindings\n\t\"\"\"\n\t\n\tself.view.custom.loading \u003d False\n\t# reset file upload component to default state\n\tself.clearUploads()\n\t# send message to update files param on parent view\n\tbucket \u003d self.view.params.bucket\n\tsystem.perspective.sendMessage(\u0027update_file_binding\u0027, {\u0027bucket\u0027: bucket}, scope\u003d\u0027session\u0027)\n\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\"File Uploaded\", \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" + }, + { + "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\"File NOT Uploaded\", \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" + }, + { + "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\"File Upload 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": "upload_file", + "params": [ + "event\u003dNone" + ], + "script": "\tfrom AWS.s3 import S3Manager\n\tfrom pprint import pformat\n\tsystem.perspective.print(\u0027FileUpload component upload_file custom method reached...\u0027)\n\tself.view.custom.loading \u003d True\n\ttry:\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\tbucket \u003d self.view.params.bucket\n\t\tobj_key \u003d self.view.custom.selected_file_config.Key\n\t\tregion \u003d self.view.custom.stage_config.s3_region\n\t\texisting_filename \u003d self.view.custom.selected_file_config.Filename\n\t\tfilename \u003d event.file.name\n\t\t# verify that uploaded file name matches existing file name. Throw error if not.\n\t\tif filename !\u003d existing_filename:\n\t\t\tmsg \u003d \u0027File uploaded does not have the same name as target object key. Please check spelling and that you selected the correct file to upload. Target filename: %s. Received: %s\u0027 % (\n\t\t\t\t\texisting_filename, filename)\n\t\t\tself.show_error_dialog(msg)\n\t\t\tself.view.custom.loading \u003d False\n\t\t\tself.clearUploads()\n\t\t\treturn\n\t\tsystem.perspective.print(\u0027obj_key to upload: %s\u0027 % obj_key)\n\t\tobj_data \u003d event.file.getString()\n\t\tsystem.perspective.print(\u0027obj_data length: %s\u0027 % len(obj_data))\n\n\t\ts3m \u003d S3Manager(api_stage, api_region_name, username)\n\t\ttry:\n\t\t\tresp \u003d s3m.upload(\n\t\t\t\tobj_data\u003dobj_data,\n\t\t\t\tobj_key\u003dobj_key,\n\t\t\t\tbucket\u003dbucket,\n\t\t\t\tregion\u003dregion\n\t\t\t)\n\t\t\tresp_code \u003d resp.get(\u0027code\u0027, None)\n\t\t\tif (resp_code and resp_code !\u003d 200) or (not resp_code and \u0027message\u0027 in resp):\n\t\t\t\t# this means the API encountered an error, annunciate the error here\n\t\t\t\tmsg \u003d \u0027API encountered error uploading %s to %s bucket. \\nResponse: %s\u0027 % (obj_key, bucket, pformat(resp))\n\t\t\t\tsystem.perspective.print(msg)\n\t\t\t\tself.view.custom.loading \u003d False\n\t\t\t\tself.show_error_dialog(msg)\n\t\t\t\tself.clearUploads()\n\t\t\t\treturn\n\t\t\tmsg \u003d \u0027Successfully uploaded %s object in %s bucket!\\nResponse: %s\u0027 % (obj_key, bucket, pformat(resp))\n\t\t\tsystem.perspective.print(msg)\n\t\t\tself.show_success_dialog(msg)\n\t\t\tself.update_bindings()\n\t\texcept:\n\t\t\timport traceback\n\t\t\tmsg \u003d \u0027Error uploading %s object in %s bucket: %s\u0027 % (obj_key, bucket, traceback.format_exc())\n\t\t\tsystem.perspective.print(msg)\n\t\t\tself.view.custom.loading \u003d False\n\t\t\tself.show_error_dialog(msg)\n\t\t\tself.clearUploads()\n\texcept:\n\t\timport traceback\n\t\tmsg \u003d \u0027General Error uploading %s object in %s bucket: %s\u0027 % (obj_key, bucket, 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\tself.clearUploads()\n\t\t" + } + ], + "extensionFunctions": null, + "messageHandlers": [] + }, + "type": "ia.input.fileupload" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tfrom AWS.s3 import S3Manager\n\tfrom pprint import pformat\n\timport json\n\t\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\tbucket \u003d self.view.params.bucket\n\tobj_key \u003d self.view.custom.selected_file_config.Key\n\tregion \u003d self.view.custom.stage_config.s3_region\n\tfilename \u003d self.view.custom.selected_file_config.Filename\n\t\n\ts3m \u003d S3Manager(api_stage, api_region_name, username)\n\tdata \u003d None\n\ttry:\n\t\tresp \u003d s3m.download(bucket\u003dbucket, obj_key\u003dobj_key, region\u003dregion)\n\t\ttry:\n\t\t\tresp_code \u003d resp.get(\u0027code\u0027, None)\n\t\texcept AttributeError:\n\t\t\tresp_code \u003d None\n\t\tif (resp_code and resp_code !\u003d 200) or (not resp_code and \u0027message\u0027 in resp):\n\t\t\t# this means the API encountered an error, annunciate the error here\n\t\t\tmsg \u003d \u0027API encountered error downloading %s on %s bucket. \\nResponse: %s\u0027 % (obj_key, bucket, pformat(sanitize_tree(resp)))\n\t\t\tsystem.perspective.print(msg)\n\t\t\tself.show_error_dialog(msg)\n\t\t\treturn\n\t\tif isinstance(resp, dict) or isinstance(resp, list):\n\t\t\tdata \u003d json.dumps(resp, indent\u003d2)\n\t\telse:\n\t\t\tdata \u003d resp\n\texcept:\n\t\timport traceback\n\t\tmsg \u003d \u0027error downloading %s obj: %s\u0027 % (obj_key, traceback.format_exc())\n\t\tsystem.perspective.print(msg)\n\t\tself.show_error_dialog(msg)\n\tif data:\n\t\tsystem.perspective.download(filename, data)\n\telse:\n\t\tsystem.perspective.print(\u0027no data for %s obj!\u0027 % obj_key)\n\t\tself.show_error_dialog(msg)\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Download Button", + "tooltip": { + "enabled": true + } + }, + "position": { + "basis": "26px", + "shrink": 0 + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "stringFormat(\u0027Download copy of %s\u0027,{view.custom.selected_file})" + }, + "type": "expr" + } + }, + "props.enabled": { + "binding": { + "config": { + "expression": "{view.params.enables.download}\u0026\u0026!{view.custom.file_not_found}" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/cloud_download" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal", + "margin": "2px" + }, + "text": "" + }, + "scripts": { + "customMethods": [ + { + "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\"File Download 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\t" + } + ], + "extensionFunctions": null, + "messageHandlers": [] + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tself.show_confirm_dialog()" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Delete Button", + "tooltip": { + "enabled": true + } + }, + "position": { + "basis": "26px", + "shrink": 0 + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "stringFormat(\u0027Delete record of %s file from %s bucket\u0027,\r\n\t{view.custom.selected_file},{view.params.bucket})" + }, + "type": "expr" + } + }, + "props.enabled": { + "binding": { + "config": { + "expression": "{view.params.enables.delete}\u0026\u0026!{view.custom.file_not_found}" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/delete_forever" + } + }, + "primary": false, + "style": { + "classes": "Input/Button/Secondary_minimal", + "margin": "2px" + }, + "text": "" + }, + "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\"File Deleted\", \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\"File NOT Deleted\", \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\"File Delete 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 delete %s file from %s S3 bucket? THIS OPERATION CANNOT BE UNDONE!\u0027) % (\n\t\tself.view.custom.selected_file, self.view.params.bucket)\n\tpayload \u003d {\u0027bucket\u0027: self.view.params.bucket}\t\t\n\tAlerts.showAlert(\n\t\t\"info\", \n\t\t\"Delete from S3?\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"Continue\", \n\t\t\"Cancel\", \n\t\t\"delete_forever\", \n\t\t\"\", \n\t\t\"left\", \n\t\t\"confirm_delete_file\", \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 deleted from S3, refresh session and view bindings\n\t\"\"\"\n\tself.view.custom.loading \u003d False\n\t# send message to update files param on parent view\n\tbucket \u003d self.view.params.bucket\n\tsystem.perspective.sendMessage(\u0027update_file_binding\u0027, {\u0027bucket\u0027: bucket}, scope\u003d\u0027session\u0027)\n\t" + }, + { + "name": "delete_file", + "params": [], + "script": "\t\"\"\"\n\t\tCall AWS.s3.S3Manager.delete() 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\tself.view.custom.loading \u003d True\n\n\ts3m \u003d S3Manager(\u0027prod\u0027, api_region_name, username)\n\n\tbucket \u003d self.view.params.bucket\n\tobj_key \u003d self.view.custom.selected_file_config.Key\n\toperation \u003d \u0027delete\u0027\n\tparams \u003d {\u0027obj_key\u0027: obj_key, \u0027bucket\u0027: bucket}\n\ttry:\n\t\tresp \u003d getattr(s3m, operation)(**params)\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# this means the API encountered an error, annunciate the error here\n\t\t\tmsg \u003d \u0027API encountered error deleting %s on %s bucket. \\nResponse: %s\u0027 % (obj_key, bucket, pformat(sanitize_tree(resp)))\n\t\t\tsystem.perspective.print(msg)\n\t\t\tself.view.custom.loading \u003d False\n\t\t\tself.show_error_dialog(msg)\n\t\t\treturn\n\t\tmsg \u003d pformat(sanitize_tree(resp))\n\t\tsystem.perspective.print(msg)\n\t\tself.show_success_dialog(msg)\n\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_delete_file", + "pageScope": false, + "script": "\tsystem.perspective.closePopup(\u0027alertDialog\u0027)\n\tif payload is not None:\n\t\tbucket_requested \u003d payload.get(\u0027bucket\u0027, None)\n\t\tif bucket_requested and bucket_requested \u003d\u003d self.view.params.bucket:\n\t\t\t# call the delete custom method\n\t\t\tself.delete_file()", + "sessionScope": true, + "viewScope": true + } + ] + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer File Selection" + }, + "position": { + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Cards/Row" + } + }, + "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": "Object Key (uri):" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "label_LeftAlign" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.params.text": { + "binding": { + "config": { + "path": "view.custom.selected_file_config.Key" + }, + "type": "property" + } + } + }, + "props": { + "path": "Objects/Templates/Labels/label_LeftAlign", + "style": { + "classes": "Framework/Card/Value" + } + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "FlexContainer Object Key" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "!{view.custom.file_not_found}" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "classes": "Framework/Cards/Row" + } + }, + "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": "Last Modified:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "label_LeftAlign" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.params.text": { + "binding": { + "config": { + "path": "view.custom.selected_file_config.LastModified" + }, + "type": "property" + } + } + }, + "props": { + "path": "Objects/Templates/Labels/label_LeftAlign", + "style": { + "classes": "Framework/Card/Value" + } + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "FlexContainer Last Modified" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "!{view.custom.file_not_found}" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "classes": "Framework/Cards/Row" + } + }, + "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": "File Size (KB):" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "label_LeftAlign" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.params.text": { + "binding": { + "config": { + "expression": "round({view.custom.selected_file_config.Size}/1024.0,2)" + }, + "type": "expr" + } + } + }, + "props": { + "path": "Objects/Templates/Labels/label_LeftAlign", + "style": { + "classes": "Framework/Card/Value" + } + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "FlexContainer File Size" + }, + "position": { + "basis": "50%", + "grow": 1 + }, + "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": "Storage Class:" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "label_LeftAlign" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.params.text": { + "binding": { + "config": { + "path": "view.custom.selected_file_config.StorageClass" + }, + "type": "property" + } + } + }, + "props": { + "path": "Objects/Templates/Labels/label_LeftAlign", + "style": { + "classes": "Framework/Card/Value" + } + }, + "type": "ia.display.view" + } + ], + "meta": { + "name": "FlexContainer Storage Class" + }, + "position": { + "basis": "50%", + "grow": 1 + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer File Detail" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "!{view.custom.file_not_found}" + }, + "type": "expr" + } + } + }, + "props": { + "style": { + "classes": "Framework/Cards/Row" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t# build out the stage, site, flow-view, and copy_option from the object-key in row\n\tobj_key \u003d self.view.custom.selected_file_config.Key\n\tfilename \u003d self.view.custom.selected_file_config.Filename\n\tsuffix \u003d self.view.params.suffix\n\tpath \u003d obj_key.split(\u0027/\u0027)\n\tsite \u003d path[1]\n\tview \u003d filename.replace(suffix,\u0027\u0027)\n\tbucket \u003d self.view.params.bucket\n\t# build out query_params from row values\n\t# view, site, and bucket 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_bucket\": bucket,\n\t\t\"destination_site\": site,\n\t\t\"destination_view\": view,\n\t\t\"end_time\": null,\n\t\t\"error_occurred\": null,\n\t\t\"operation\": null,\n\t\t\"source_bucket\": null,\n\t\t\"source_site\": null,\n\t\t\"source_view\": 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)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Audit Logs Button", + "tooltip": { + "enabled": true, + "location": "bottom", + "text": "View Audit Logs for this file" + } + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!{view.custom.file_not_found}" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/table_view" + } + }, + "primary": false, + "style": { + "margin": "2px", + "paddingLeft": "4px", + "paddingRight": "4px" + }, + "text": "Audit Logs" + }, + "type": "ia.input.button" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t# build out the stage, site, flow-view, and copy_option from the object-key in row\n\tobj_key \u003d self.view.custom.selected_file_config.Key\n\tfilename \u003d self.view.custom.selected_file_config.Filename\n\tsuffix \u003d self.view.params.suffix\n\tpath \u003d obj_key.split(\u0027/\u0027)\n\tsite \u003d path[1]\n\tview \u003d filename.replace(suffix,\u0027\u0027)\n\tbucket \u003d self.view.params.bucket\n\t# build out query_params from row values\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" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Version History Button", + "tooltip": { + "text": "View Version History for this file" + } + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "props.enabled": { + "binding": { + "config": { + "expression": "!{view.custom.file_not_found}" + }, + "type": "expr" + } + } + }, + "props": { + "image": { + "icon": { + "path": "material/history" + } + }, + "primary": false, + "style": { + "margin": "2px", + "paddingLeft": "4px", + "paddingRight": "4px" + }, + "text": "Version History" + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "75px", + "shrink": 0 + }, + "props": { + "style": { + "classes": "Framework/Card/Label Text/RightAlign_with_Padding", + "paddingLeft": "5px" + }, + "text": "Upload New File:" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onFileReceived": { + "config": { + "script": "\tself.upload_file(event\u003devent)\n" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "FileUpload", + "tooltip": { + "enabled": true + } + }, + "position": { + "basis": "25%", + "shrink": 0 + }, + "propConfig": { + "meta.tooltip.text": { + "binding": { + "config": { + "expression": "stringFormat(\u0027Upload new file to %s S3 bucket\u0027,{view.params.bucket})" + }, + "type": "expr" + } + }, + "position.display": { + "binding": { + "config": { + "path": "view.params.enables.upload" + }, + "type": "property" + } + }, + "props.supportedFileTypes": { + "binding": { + "config": { + "path": "view.params.upload_file_types" + }, + "type": "property" + } + } + }, + "props": { + "fileSizeLimit": 100, + "fileUploadIcon": { + "style": { + "classes": "" + } + }, + "maxUploads": 1, + "style": { + "backgroundColor": "var(--neutral-30)", + "borderStyle": "none", + "classes": "FadeInFast, background, background-none", + "cursor": "pointer", + "margin": "2px", + "max-height": "40px", + "overflow": "visible" + } + }, + "scripts": { + "customMethods": [ + { + "name": "update_bindings", + "params": [], + "script": "\t\"\"\"\n\t\tAfter data saved to S3, refresh session and view bindings\n\t\"\"\"\n\t\n\tself.view.custom.loading \u003d False\n\t# reset file upload component to default state\n\tself.clearUploads()\n\t# send message to update files param on parent view\n\tbucket \u003d self.view.params.bucket\n\tsystem.perspective.sendMessage(\u0027update_file_binding\u0027, {\u0027bucket\u0027: bucket}, scope\u003d\u0027session\u0027)\n\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\"File Uploaded\", \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" + }, + { + "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\"File NOT Uploaded\", \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" + }, + { + "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\"File Upload 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": "upload_file", + "params": [ + "event\u003dNone" + ], + "script": "\tfrom AWS.s3 import S3Manager\n\tfrom pprint import pformat\n\t\n\tself.view.custom.loading \u003d True\n\ttry:\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\tbucket \u003d self.view.params.bucket\n\t\tdefault_obj_key \u003d self.view.custom.default_file_config.Key\n\t\tdefault_filename \u003d self.view.custom.default_file_config.Filename\n\t\tregion \u003d self.view.custom.stage_config.s3_region\n\t\tfilename \u003d event.file.name\n\t\t# check if file already exists in S3 site folder, throw error if so\n\t\tif any(x.Filename \u003d\u003d filename for x in self.view.params.files):\n\t\t\tmsg \u003d \u0027%s file already exists in the site folder. Please use the upload button next to the file select dropdown or select a new file to upload\u0027 % filename\n\t\t\tself.show_error_dialog(msg)\n\t\t\tself.view.custom.loading \u003d False\n\t\t\tself.clearUploads()\n\t\t\treturn\n\t\tobj_key \u003d default_obj_key.replace(default_filename, filename)\n\t\tobj_data \u003d event.file.getString()\n\t\t\n\t\ts3m \u003d S3Manager(api_stage, api_region_name, username)\n\t\ttry:\n\t\t\tresp \u003d s3m.upload(\n\t\t\t\tobj_data\u003dobj_data,\n\t\t\t\tobj_key\u003dobj_key,\n\t\t\t\tbucket\u003dbucket,\n\t\t\t\tregion\u003dregion\n\t\t\t)\n\t\t\tresp_code \u003d resp.get(\u0027code\u0027, None)\n\t\t\tif (resp_code and resp_code !\u003d 200) or (not resp_code and \u0027message\u0027 in resp):\n\t\t\t\t# this means the API encountered an error, annunciate the error here\n\t\t\t\tmsg \u003d \u0027API encountered error uploading %s to %s bucket. \\nResponse: %s\u0027 % (obj_key, bucket, pformat(resp))\n\t\t\t\tsystem.perspective.print(msg)\n\t\t\t\tself.view.custom.loading \u003d False\n\t\t\t\tself.show_error_dialog(msg)\n\t\t\t\tself.clearUploads()\n\t\t\t\treturn\n\t\t\tmsg \u003d \u0027Successfully uploaded %s object in %s bucket!\\nResponse: %s\u0027 % (obj_key, bucket, pformat(resp))\n\t\t\tsystem.perspective.print(msg)\n\t\t\tself.show_success_dialog(msg)\n\t\t\tself.update_bindings()\n\t\texcept:\n\t\t\timport traceback\n\t\t\tmsg \u003d \u0027Error uploading %s object in %s bucket: %s\u0027 % (obj_key, bucket, traceback.format_exc())\n\t\t\tsystem.perspective.print(msg)\n\t\t\tself.view.custom.loading \u003d False\n\t\t\tself.show_error_dialog(msg)\n\t\t\tself.clearUploads()\n\texcept:\n\t\timport traceback\n\t\tmsg \u003d \u0027General Error uploading %s object in %s bucket: %s\u0027 % (obj_key, bucket, 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\tself.clearUploads()\n\t\t" + } + ], + "extensionFunctions": null, + "messageHandlers": [] + }, + "type": "ia.input.fileupload" + } + ], + "meta": { + "name": "FlexContainer Log Buttons" + }, + "position": { + "shrink": 0 + }, + "props": { + "justify": "center" + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "meta": { + "name": "Title" + }, + "position": { + "basis": "100%" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "expression": "stringFormat(\u0027%s Object%s\u0027, len({view.params.files}), \r\n\tif(len({view.params.files})\u003d1,\u0027\u0027,\u0027s\u0027))" + }, + "type": "expr" + } + } + }, + "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": "\tself.view.custom.selected_file \u003d \u0027\u0027\n\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/FlexContainer/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" + }, + { + "events": { + "component": { + "onSelectionChange": { + "config": { + "script": "\t# validate the selection data is not null\n\tif self.props.selection.data:\n\t\tfilename \u003d self.props.selection.data[0].Filename\n\t\tself.view.custom.selected_file \u003d filename\n\t\t# send message to update selected file on parent container\n\t\tsuffix \u003d self.view.params.suffix\n\t\tpayload \u003d {\u0027image\u0027: filename.replace(suffix, \u0027\u0027)}\n\t\tsystem.perspective.sendMessage(\u0027update_selected_image\u0027, payload, scope\u003d\u0027session\u0027)\n\t" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Table" + }, + "position": { + "basis": "370px", + "shrink": 0 + }, + "propConfig": { + "props.data": { + "binding": { + "config": { + "path": "view.params.files" + }, + "type": "property" + } + }, + "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": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Filename", + "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": "Filename" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Size", + "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": "Size (bytes)" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "LastModified", + "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": "Last Updated" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Key", + "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": "Key" + }, + "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": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "ETag", + "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": "ETag" + }, + "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": false, + "width": "" + }, + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "StorageClass", + "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": "Storage Class" + }, + "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": false, + "width": "" + } + ], + "filter": {}, + "style": { + "margin": "10px" + } + }, + "type": "ia.display.table" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "100%", + "grow": 1 + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "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": true, + "viewScope": false + }, + { + "messageType": "column-visibility", + "pageScope": true, + "script": "\t# implement your handler here\n\ttable_columns \u003d self.getChild(\"FlexContainer\").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]", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/d37d5e6af4dd2f99913eb137a881f97ef158c19691e2ddb796445dbf7c0a8907 b/.resources/d37d5e6af4dd2f99913eb137a881f97ef158c19691e2ddb796445dbf7c0a8907 new file mode 100644 index 0000000..7db571c --- /dev/null +++ b/.resources/d37d5e6af4dd2f99913eb137a881f97ef158c19691e2ddb796445dbf7c0a8907 @@ -0,0 +1,242 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 155, + "width": 1910 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "233px" + }, + "props": { + "text": "Console Log", + "textStyle": { + "fontWeight": "bold", + "padding": "5px", + "textDecoration": "underline" + } + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\tpayload \u003d {}\n\tsystem.perspective.sendMessage(\"clearFeedback\" , payload , \"page\")" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Button" + }, + "position": { + "basis": "40px" + }, + "props": { + "image": { + "icon": { + "path": "material/delete_forever" + } + }, + "primary": false, + "style": { + "borderStyle": "solid" + }, + "text": "" + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "40px" + }, + "props": { + "justify": "space-between", + "style": { + "paddingBottom": "5px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Table" + }, + "position": { + "basis": "400px", + "grow": 1 + }, + "props": { + "columns": [ + { + "align": "center", + "boolean": "checkbox", + "dateFormat": "MM/DD/YYYY", + "editable": false, + "field": "Value", + "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", + "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": "Main-Views/Commissioning Tool/Message", + "visible": true, + "width": "100px" + } + ], + "data": [ + { + "Value": { + "Msg": "", + "Timestamp": "" + } + } + ], + "enableHeader": false, + "pager": { + "bottom": false + }, + "rows": { + "subviewExpansionMode": "single" + }, + "selection": { + "enableRowSelection": false + } + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "clearFeedback", + "pageScope": true, + "script": "\t# implement your handler here\n\t\n\tself.props.data \u003d []", + "sessionScope": false, + "viewScope": false + }, + { + "messageType": "addFeedback", + "pageScope": true, + "script": "\t# implement your handler here\n\t\n\trecord \u003d {\n\t \"Value\": {\n\t \"Timestamp\": str(system.date.now()),\n\t \"Msg\": payload[\"Msg\"]\n\t }\n\t}\n\tself.props.data.insert(0, record)", + "sessionScope": false, + "viewScope": false + } + ] + }, + "type": "ia.display.table" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "80px", + "grow": 1, + "shrink": 0 + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "style": { + "padding": "5px" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/d55e91df2df4723d752b8c4f9dbe6e6719fa42104f9af2b09510aa687271bdcb b/.resources/d55e91df2df4723d752b8c4f9dbe6e6719fa42104f9af2b09510aa687271bdcb new file mode 100644 index 0000000..7c241de --- /dev/null +++ b/.resources/d55e91df2df4723d752b8c4f9dbe6e6719fa42104f9af2b09510aa687271bdcb @@ -0,0 +1,608 @@ +{ + "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": 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.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": "AUS" + }, + "position": { + "height": 1, + "width": 1 + }, + "propConfig": { + "props.elements[1].elements[0].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": "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": 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" + } + ], + "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/.resources/d5b60f140f35d0d0d1fc62f0bd39f0f8307e19dd83b3eb33273fba9bae71bcc2 b/.resources/d5b60f140f35d0d0d1fc62f0bd39f0f8307e19dd83b3eb33273fba9bae71bcc2 new file mode 100644 index 0000000..3ee54c4 --- /dev/null +++ b/.resources/d5b60f140f35d0d0d1fc62f0bd39f0f8307e19dd83b3eb33273fba9bae71bcc2 @@ -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/.resources/d67eb06636d3eb035cbb1b5d0acc56c56ec013fcb9599bee77a4ede5d0a736c0 b/.resources/d67eb06636d3eb035cbb1b5d0acc56c56ec013fcb9599bee77a4ede5d0a736c0 new file mode 100644 index 0000000..68b36c5 --- /dev/null +++ b/.resources/d67eb06636d3eb035cbb1b5d0acc56c56ec013fcb9599bee77a4ede5d0a736c0 @@ -0,0 +1,932 @@ +{ + "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": false, + "searchId": "value", + "show_error": false, + "show_running": true, + "state": 5, + "state_string": "Unknown", + "visible_status": false + }, + "params": { + "directionDown": 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} || {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" + } + }, + "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.directionDown": { + "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": 29, + "width": 20 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "ErrorStatus", + "tooltip": { + "style": { + "fontSize": 16 + } + } + }, + "position": { + "grow": 1 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "{view.custom.display_icon} \u0026\u0026 {view.custom.error} \u0026! {view.params.directionDown}" + }, + "type": "expr" + } + }, + "position.display": { + "binding": { + "config": { + "expression": "{view.custom.display_icon} \u0026\u0026 {view.custom.error} \u0026! {view.params.directionDown} \u0026\u0026 {view.custom.show_error}" + }, + "type": "expr" + } + }, + "props.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" + } + ], + "type": "property" + } + }, + "props.elements[1].fill.paint": { + "binding": { + "config": { + "path": "view.custom.running_status" + }, + "transforms": [ + { + "expression": "case(\t{value}, \r\n\t\t1, {session.custom.colours.state0},\r\n\t\t2, {session.custom.colours.state0},\r\n\t\t3, {session.custom.colours.state5},\r\n\t\t\u0027#000000\u0027\r\n\t)", + "type": "expression" + }, + { + "expression": "if({session.custom.alarm_filter.show_running},{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[1].stroke.width": { + "binding": { + "config": { + "expression": "if({session.custom.alarm_filter.show_running},2,0)" + }, + "type": "expr" + } + }, + "props.elements[2].fill": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired}, \r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#FFFFFF\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#000000\u0027,\r\n\t\t\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\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[2].text": { + "binding": { + "config": { + "path": "view.custom.priority" + }, + "type": "property" + } + } + }, + "props": { + "elements": [ + { + "d": "M 31,26 C 41,36 51,46 61,56 51,66 41,76 31,86 21,76 11,66 1,56 11,46 21,36 31,26 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 2 + }, + "type": "path" + }, + { + "d": "M 61,50 C 61,43.346667 61,36.693333 61,30.04 51,20.026667 41,10.013333 31,0 21,10.013333 11,20.026667 1,30.04 1,36.693333 1,43.346667 1,50 11,40.013333 21,30.026667 31,20.04 41,30.026667 51,40.013333 61,50 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000" + }, + "type": "path" + }, + { + "style": { + "classes": "", + "fontSize": 42, + "fontWeight": "bolder" + }, + "type": "text", + "x": 20, + "y": 70 + } + ], + "style": { + "overflow": "hidden" + }, + "viewBox": "-0.5 -0.5 64 89" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "ErrorStatus_Down" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "meta.visible": { + "binding": { + "config": { + "expression": "{view.custom.display_icon} \u0026\u0026 {view.custom.error} \u0026\u0026 {view.params.directionDown}" + }, + "type": "expr" + } + }, + "position.display": { + "binding": { + "config": { + "expression": "{view.custom.display_icon} \u0026\u0026 {view.custom.error} \u0026\u0026 {view.params.directionDown} \u0026\u0026 {view.custom.show_error}" + }, + "type": "expr" + } + }, + "props.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" + } + ], + "type": "property" + } + }, + "props.elements[1].fill.paint": { + "binding": { + "config": { + "path": "view.custom.running_status" + }, + "transforms": [ + { + "expression": "case(\t{value}, \r\n\t\t1, {session.custom.colours.state0},\r\n\t\t2, {session.custom.colours.state0},\r\n\t\t3, {session.custom.colours.state5},\r\n\t\t\u0027#000000\u0027\r\n\t)", + "type": "expression" + }, + { + "expression": "if({session.custom.alarm_filter.show_running},{value},{value}+\u002700\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[1].stroke.width": { + "binding": { + "config": { + "expression": "if({session.custom.alarm_filter.show_running},2,0)" + }, + "type": "expr" + } + }, + "props.elements[2].fill": { + "binding": { + "config": { + "path": "view.custom.state" + }, + "transforms": [ + { + "expression": "if({session.custom.colours.colour_impaired}, \r\n\tcase(\t{value},\r\n\t\t\t1,\u0027#FFFFFF\u0027,\r\n\t\t\t2,\u0027#FFFFFF\u0027,\r\n\t\t\t3,\u0027#000000\u0027,\r\n\t\t\t4,\u0027#000000\u0027,\r\n\t\t\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\t\u0027#000000\u0027)\r\n\t)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[2].text": { + "binding": { + "config": { + "path": "view.custom.priority" + }, + "type": "property" + } + } + }, + "props": { + "elements": [ + { + "d": "M 32,2 C 42,12 52,22 62,32 52,42 42,52 32,62 22,52 12,42 2,32 12,22 22,12 32,2 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000", + "width": 2 + }, + "type": "path" + }, + { + "d": "M 2,38 C 2,44.653333 2,51.306667 2,57.96 12,67.973333 22,77.986667 32,88 42,77.986667 52,67.973333 62,57.96 62,51.306667 62,44.653333 62,38 52,47.986667 42,57.973333 32,67.96 22,57.973333 12,47.986667 2,38 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#000000" + }, + "type": "path" + }, + { + "style": { + "classes": "", + "fontSize": 42, + "fontWeight": "bolder", + "textOrientation": "upright", + "writingMode": "horizontal-tb" + }, + "type": "text", + "x": 20, + "y": 44.5 + } + ], + "style": { + "overflow": "hidden" + }, + "viewBox": "-0.5 -0.5 65 89" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "RunningStatus" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "if((({view.custom.display_icon} \u0026\u0026 !{view.custom.error}) || ({view.custom.show_running} \u0026! {view.custom.show_error})) \u0026! {view.params.directionDown},True,False)" + }, + "type": "expr" + } + }, + "position.rotate.angle": { + "binding": { + "config": { + "path": "view.params.directionLeft" + }, + "transforms": [ + { + "expression": "if({value}, \u0027180deg\u0027, \u00270deg\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[0].fill.paint": { + "binding": { + "config": { + "path": "view.custom.running_status" + }, + "transforms": [ + { + "expression": "case(\t{value}, \r\n\t\t1, {session.custom.colours.state0},\r\n\t\t2, {session.custom.colours.state0},\r\n\t\t3, {session.custom.colours.state5},\r\n\t\t\u0027#000000\u0027\r\n\t)\r\n\t\t\r\n", + "type": "expression" + } + ], + "type": "property" + } + } + }, + "props": { + "elements": [ + { + "d": "M 0,70 C 0,56.666667 0,43.333333 0,30 10,20 20,10 30,0 40,10 50,20 60,30 60,43.333333 60,56.666667 60,70 50,60 40,50 30,40 20,50 10,60 0,70 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#4c4c4c", + "width": "2" + }, + "type": "path" + } + ], + "style": { + "overflow": "hidden" + }, + "viewBox": "-0.5 -0.5 61 71" + }, + "type": "ia.shapes.svg" + }, + { + "meta": { + "name": "RunningStatus_Down" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "expression": "if((({view.custom.display_icon} \u0026\u0026 !{view.custom.error}) || ({view.custom.show_running} \u0026! {view.custom.show_error})) \u0026\u0026 {view.params.directionDown},True,False)" + }, + "type": "expr" + } + }, + "position.rotate.angle": { + "binding": { + "config": { + "path": "view.params.directionLeft" + }, + "transforms": [ + { + "expression": "if({value}, \u0027180deg\u0027, \u00270deg\u0027)", + "type": "expression" + } + ], + "type": "property" + } + }, + "props.elements[0].fill.paint": { + "binding": { + "config": { + "path": "view.custom.running_status" + }, + "transforms": [ + { + "expression": "case(\t{value}, \r\n\t\t1, {session.custom.colours.state0},\r\n\t\t2, {session.custom.colours.state0},\r\n\t\t3, {session.custom.colours.state5},\r\n\t\t\u0027#000000\u0027\r\n\t)\r\n\t\t\r\n", + "type": "expression" + } + ], + "type": "property" + } + } + }, + "props": { + "elements": [ + { + "d": "m 60,0 c 0,13.333333 0,26.666667 0,40 C 50,50 40,60 30,70 20,60 10,50 0,40 0,26.666667 0,13.333333 0,0 10,10 20,20 30,30 40,20 50,10 60,0 Z", + "fill": {}, + "name": "path", + "stroke": { + "paint": "#4c4c4c", + "width": "2" + }, + "type": "path" + } + ], + "style": { + "overflow": "hidden" + }, + "viewBox": "-0.5 -0.5 61 71" + }, + "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.borderStyle": { + "binding": { + "config": { + "path": "view.custom.disconnected" + }, + "transforms": [ + { + "fallback": "", + "inputType": "scalar", + "mappings": [ + { + "input": true, + "output": "solid" + }, + { + "input": false, + "output": "none" + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "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": { + "direction": "column", + "justify": "center", + "style": { + "borderColor": "#FF0000", + "borderWidth": "2px", + "cursor": "pointer" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/d7e3fba185cda2cee2757dfd4954ed57caa2d28029fa9f1fd2773883b6c220b4 b/.resources/d7e3fba185cda2cee2757dfd4954ed57caa2d28029fa9f1fd2773883b6c220b4 new file mode 100644 index 0000000..acbbb6b --- /dev/null +++ b/.resources/d7e3fba185cda2cee2757dfd4954ed57caa2d28029fa9f1fd2773883b6c220b4 @@ -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/.resources/d8c69bd5cd8e681b3be6c77e4861d9c9f6bae677fc95ee989c745446fe21e81c b/.resources/d8c69bd5cd8e681b3be6c77e4861d9c9f6bae677fc95ee989c745446fe21e81c new file mode 100644 index 0000000..204e23f --- /dev/null +++ b/.resources/d8c69bd5cd8e681b3be6c77e4861d9c9f6bae677fc95ee989c745446fe21e81c @@ -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/.resources/d8e53bc702c7f3592644d976e38f473727a14b9a3c3f988622e66fcbf512e0f0 b/.resources/d8e53bc702c7f3592644d976e38f473727a14b9a3c3f988622e66fcbf512e0f0 new file mode 100644 index 0000000..a13432a --- /dev/null +++ b/.resources/d8e53bc702c7f3592644d976e38f473727a14b9a3c3f988622e66fcbf512e0f0 @@ -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/.resources/d93480cbfa2afd230facfad16e72e68a578b08a30a478d02043f65889d0e95b7 b/.resources/d93480cbfa2afd230facfad16e72e68a578b08a30a478d02043f65889d0e95b7 new file mode 100644 index 0000000..d31f088 --- /dev/null +++ b/.resources/d93480cbfa2afd230facfad16e72e68a578b08a30a478d02043f65889d0e95b7 @@ -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/.resources/da88dc7575ce5efb167e87b4a6b301df01bd132a858e4528aec01314fa64f23c b/.resources/da88dc7575ce5efb167e87b4a6b301df01bd132a858e4528aec01314fa64f23c new file mode 100644 index 0000000..c87b827 --- /dev/null +++ b/.resources/da88dc7575ce5efb167e87b4a6b301df01bd132a858e4528aec01314fa64f23c @@ -0,0 +1,175 @@ +{ + "custom": { + "activityLogger": { + "start_time": { + "$": [ + "ts", + 192, + 1709760479262 + ], + "$ts": 1709760479262 + } + }, + "show_alarms": false + }, + "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": { + "detailedView": "", + "plcTagPath": "" + }, + "propConfig": { + "custom.activityLogger": { + "persistent": true + }, + "custom.activityLogger.alt_pageid": { + "binding": { + "config": { + "expression": "\"detailed_views/\"+ {view.params.detailedView}" + }, + "type": "expr" + } + }, + "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.show_alarms": { + "persistent": true + }, + "params.detailedView": { + "paramDirection": "input", + "persistent": true + }, + "params.plcTagPath": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 1080, + "width": 1920 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "EmbeddedView" + }, + "position": { + "basis": "320px", + "grow": 1 + }, + "propConfig": { + "props.params.PLCTagPath": { + "binding": { + "config": { + "path": "view.params.plcTagPath" + }, + "type": "property" + } + } + }, + "props": { + "path": "Alarm-Views/Docked-Alarm" + }, + "type": "ia.display.view" + } + ], + "custom": { + "key": "value" + }, + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "130px", + "display": false + }, + "scripts": { + "customMethods": [], + "extensionFunctions": null, + "messageHandlers": [ + { + "messageType": "show-south-dock", + "pageScope": true, + "script": "\tshow \u003d payload[\"show_alarms\"]\n\tsystem.perspective.print(show)\n\tself.position.display \u003d show", + "sessionScope": true, + "viewScope": false + } + ] + }, + "type": "ia.container.flex" + }, + { + "meta": { + "name": "EmbeddedView" + }, + "position": { + "basis": "320px", + "grow": 1 + }, + "propConfig": { + "props.path": { + "binding": { + "config": { + "expression": "\"Detailed-Views/\"+ {view.params.detailedView}" + }, + "type": "expr" + } + } + }, + "type": "ia.display.view" + } + ], + "events": { + "dom": { + "onClick": { + "config": { + "id": "Docked-East", + "type": "close" + }, + "scope": "C", + "type": "dock" + } + } + }, + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/da8f4e9dfbe74aca9aec175060946d737d800763ec4042e5420036da853e6e83 b/.resources/da8f4e9dfbe74aca9aec175060946d737d800763ec4042e5420036da853e6e83 new file mode 100644 index 0000000..49ef45f --- /dev/null +++ b/.resources/da8f4e9dfbe74aca9aec175060946d737d800763ec4042e5420036da853e6e83 @@ -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/.resources/db3da19cb91486723ef56f625aaf6c810d8855f4b72ad7109ef749e83826e5ed b/.resources/db3da19cb91486723ef56f625aaf6c810d8855f4b72ad7109ef749e83826e5ed new file mode 100644 index 0000000..9851204 --- /dev/null +++ b/.resources/db3da19cb91486723ef56f625aaf6c810d8855f4b72ad7109ef749e83826e5ed @@ -0,0 +1,592 @@ +{ + "custom": {}, + "params": { + "tagProps": [ + "", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value", + "value" + ] + }, + "propConfig": { + "params.tagProps": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 212, + "width": 336 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "60px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "path": "view.params.tagProps[0]" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "backgroundColor": "#555555", + "borderBottomLeftRadius": 5, + "borderBottomRightRadius": 5, + "borderTopLeftRadius": 5, + "borderTopRightRadius": 5, + "marginLeft": 0, + "marginRight": 0, + "marginTop": 0 + }, + "textStyle": { + "textAlign": "start", + "textIndent": 10 + } + }, + "type": "ia.display.label" + }, + { + "children": [ + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "50px" + }, + "props": { + "style": { + "marginLeft": 10 + }, + "text": "AREA", + "textStyle": { + "fontFamily": "Roboto", + "fontSize": 12 + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "195px" + }, + "propConfig": { + "props.text": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "indirect", + "references": { + "0": "{view.params.tagProps[0]}" + }, + "tagPath": "{0}/Config/cfg" + }, + "transforms": [ + { + "code": " decode \u003d system.util.jsonDecode(value)\n area \u003d decode.get(\"Area\")\n sub_area \u003d decode.get(\"SubArea\")\n area_label \u003d str(area) + \"/\" + str(sub_area)\n return area_label\n\t", + "type": "script" + } + ], + "type": "tag" + } + } + }, + "props": { + "style": { + "marginLeft": 50 + }, + "textStyle": { + "fontSize": 12 + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "80px" + }, + "props": { + "style": { + "borderBottomColor": "#555555", + "borderBottomStyle": "solid", + "borderBottomWidth": 0.5, + "borderLeftColor": "#555555", + "borderLeftStyle": "none", + "borderLeftWidth": 0.5, + "borderRightColor": "#555555", + "borderRightStyle": "none", + "borderRightWidth": 0.5, + "borderTopColor": "#555555", + "borderTopStyle": "solid", + "borderTopWidth": 0.5 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label_0" + }, + "position": { + "basis": "50px" + }, + "props": { + "style": { + "marginLeft": 10 + }, + "text": "STATUS", + "textStyle": { + "fontFamily": "Roboto", + "fontSize": 12 + } + }, + "type": "ia.display.label" + }, + { + "events": { + "dom": { + "onClick": { + "config": { + "script": "\tself.session.custom.covert \u003d False\n\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": "Label" + }, + "position": { + "basis": "236px" + }, + "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" + } + ], + "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" + }, + { + "input": 2, + "output": "STOPPED" + }, + { + "input": 1, + "output": "FAULTED" + }, + { + "input": 6, + "output": null + } + ], + "outputType": "scalar", + "type": "map" + } + ], + "type": "property" + } + } + }, + "props": { + "style": { + "borderBottomLeftRadius": 5, + "borderBottomRightRadius": 5, + "borderColor": "#555555", + "borderStyle": "solid", + "borderTopLeftRadius": 5, + "borderTopRightRadius": 5, + "borderWidth": 2, + "marginBottom": 10, + "marginLeft": 50, + "marginRight": 10, + "marginTop": 10 + }, + "textStyle": { + "fontSize": 12, + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "basis": "80px" + }, + "props": { + "style": { + "borderBottomColor": "#555555", + "borderBottomStyle": "solid", + "borderBottomWidth": 0.5 + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\ttags_to_read \u003d system.tag.readBlocking([\"Configuration/FC\"])\n\twhid \u003d tags_to_read[0].value\n\tcommandTarget\u003dself.view.params.tagProps[0]\n\tCommands.button_commands.send_request(whid, id, action)\n\tactionCode \u003d 1 #Start\n\tfunctionParameters\u003d{}\n\tfunctionParameters[\"commandTarget\"] \u003d commandTarget\n\tfunctionParameters[\"commandCode\"] \u003d actionCode\n\tfunctionParameters[\"commandParams\"] \u003d \"\"\n\tCommands.button_commands.send_request(whid,actionCode,functionParameters)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Start" + }, + "position": { + "basis": "80px" + }, + "props": { + "image": { + "height": 32, + "icon": { + "path": "material/not_started" + }, + "position": "top", + "width": 32 + }, + "style": { + "classes": "Background-Styles/Controller", + "marginBottom": 15, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 15 + }, + "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\tcommandTarget\u003dself.view.params.tagProps[0]\n\tCommands.button_commands.send_request(whid, id, action)\n\tactionCode \u003d 2 #Stop\n\tfunctionParameters\u003d{}\n\tfunctionParameters[\"commandTarget\"] \u003d commandTarget\n\tfunctionParameters[\"commandCode\"] \u003d actionCode\n\tfunctionParameters[\"commandParams\"] \u003d \"\"\n\tCommands.button_commands.send_request(whid,actionCode,functionParameters)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Stop" + }, + "position": { + "basis": "80px" + }, + "props": { + "image": { + "height": 32, + "icon": { + "path": "material/stop_circle" + }, + "position": "top", + "width": 32 + }, + "style": { + "classes": "Background-Styles/Controller", + "marginBottom": 15, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 15 + }, + "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\tcommandTarget\u003dself.view.params.tagProps[0]\n\tCommands.button_commands.send_request(whid, id, action)\n\tactionCode \u003d 3 #Reset\n\tfunctionParameters\u003d{}\n\tfunctionParameters[\"commandTarget\"] \u003d commandTarget\n\tfunctionParameters[\"commandCode\"] \u003d actionCode\n\tfunctionParameters[\"commandParams\"] \u003d \"\"\n\tCommands.button_commands.send_request(whid,actionCode,functionParameters)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "Reset" + }, + "position": { + "basis": "80px" + }, + "props": { + "image": { + "height": 32, + "icon": { + "path": "material/refresh" + }, + "position": "top", + "width": 32 + }, + "style": { + "classes": "Background-Styles/Controller", + "marginBottom": 15, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 15 + }, + "text": "", + "textStyle": { + "fontSize": 12, + "fontWeight": "bold", + "textAlign": "center" + } + }, + "type": "ia.input.button" + }, + { + "meta": { + "name": "JAM_Reset" + }, + "position": { + "basis": "80px" + }, + "props": { + "enabled": false, + "image": { + "height": 32, + "icon": { + "path": "material/sync_problem" + }, + "position": "top", + "width": 32 + }, + "style": { + "classes": "Background-Styles/Controller", + "marginBottom": 15, + "marginLeft": 5, + "marginRight": 5, + "marginTop": 15 + }, + "text": "", + "textStyle": { + "fontSize": 12, + "fontWeight": "bold", + "textAlign": "center" + } + }, + "type": "ia.input.button" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "333px" + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "FlexContainer_3" + }, + "position": { + "basis": "160px" + }, + "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", + "style": { + "animationFillMode": "both", + "borderBottomLeftRadius": 10, + "borderBottomRightRadius": 10, + "borderColor": "#555555", + "borderStyle": "solid", + "borderTopLeftRadius": 10, + "borderTopRightRadius": 10, + "borderWidth": 1, + "classes": "Background-Styles/Controller" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/dea7932db96c559d51ad7c009bececc021201860c0d8e5ebb61fba41f03404b9 b/.resources/dea7932db96c559d51ad7c009bececc021201860c0d8e5ebb61fba41f03404b9 new file mode 100644 index 0000000..4e10d2d --- /dev/null +++ b/.resources/dea7932db96c559d51ad7c009bececc021201860c0d8e5ebb61fba41f03404b9 @@ -0,0 +1,46 @@ +{ + "custom": {}, + "params": { + "Information": "" + }, + "propConfig": { + "params.Information": { + "paramDirection": "inout", + "persistent": true + } + }, + "props": {}, + "root": { + "children": [ + { + "meta": { + "name": "Markdown" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "propConfig": { + "props.source": { + "binding": { + "config": { + "bidirectional": true, + "path": "view.params.Information" + }, + "type": "property" + } + } + }, + "type": "ia.display.markdown" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column", + "justify": "space-evenly" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/e3431e02044c57f72c19d6c35605e54a6dcfd86715ad2aee42aaa98d3f82eb49 b/.resources/e3431e02044c57f72c19d6c35605e54a6dcfd86715ad2aee42aaa98d3f82eb49 new file mode 100644 index 0000000..242366a --- /dev/null +++ b/.resources/e3431e02044c57f72c19d6c35605e54a6dcfd86715ad2aee42aaa98d3f82eb49 @@ -0,0 +1,198 @@ +{ + "custom": {}, + "params": {}, + "props": { + "defaultSize": { + "height": 301, + "width": 493 + } + }, + "root": { + "children": [ + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "50px", + "grow": 1 + }, + "props": { + "text": "alarms.csv" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onFileReceived": { + "config": { + "script": "\tpayload\u003d{\"fileContent\":event.file.getString(),\"fileName\":event.file.name}\n\tsystem.perspective.sendMessage(\"alarmsTab_importFile\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "FileUpload" + }, + "position": { + "basis": "200px" + }, + "props": { + "style": { + "classes": "", + "margin": "10px" + }, + "supportedFileTypes": [ + "csv" + ] + }, + "type": "ia.input.fileupload" + } + ], + "meta": { + "name": "FlexContainer" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "props": { + "style": { + "margin": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "50px", + "grow": 1 + }, + "props": { + "text": "sources.csv" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onFileReceived": { + "config": { + "script": "\tpayload\u003d{\"fileContent\":event.file.getString(),\"fileName\":event.file.name}\n\tsystem.perspective.sendMessage(\"sourcesTab_importFile\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "FileUpload" + }, + "position": { + "basis": "200px" + }, + "props": { + "style": { + "classes": "", + "margin": "10px" + }, + "supportedFileTypes": [ + "csv" + ] + }, + "type": "ia.input.fileupload" + } + ], + "meta": { + "name": "FlexContainer_0" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "props": { + "style": { + "margin": "10px" + } + }, + "type": "ia.container.flex" + }, + { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "50px", + "grow": 1 + }, + "props": { + "text": "Pick up where you left off ?" + }, + "type": "ia.display.label" + }, + { + "events": { + "component": { + "onFileReceived": { + "config": { + "script": "\tpayload\u003d{\"fileContent\":event.file.getString(),\"fileName\":event.file.name}\n\tsystem.perspective.sendMessage(\"uploadBackup\",payload)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "FileUpload" + }, + "position": { + "basis": "200px" + }, + "props": { + "style": { + "classes": "", + "margin": "10px" + }, + "supportedFileTypes": [ + "csv" + ] + }, + "type": "ia.input.fileupload" + } + ], + "meta": { + "name": "FlexContainer_1" + }, + "position": { + "basis": "200px", + "grow": 1 + }, + "props": { + "style": { + "margin": "10px" + } + }, + "type": "ia.container.flex" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/e4bf8842b5470c56b2aed8a1e7d2263468243816556b6cfe6646a62331b5d03f b/.resources/e4bf8842b5470c56b2aed8a1e7d2263468243816556b6cfe6646a62331b5d03f new file mode 100644 index 0000000..998ac83 --- /dev/null +++ b/.resources/e4bf8842b5470c56b2aed8a1e7d2263468243816556b6cfe6646a62331b5d03f @@ -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/.resources/e9916de03659b699d08cb9f2effd2d4b0e070da43f2bd770412a83809e7adaae b/.resources/e9916de03659b699d08cb9f2effd2d4b0e070da43f2bd770412a83809e7adaae new file mode 100644 index 0000000..8f2274d --- /dev/null +++ b/.resources/e9916de03659b699d08cb9f2effd2d4b0e070da43f2bd770412a83809e7adaae @@ -0,0 +1,99 @@ +import datetime +import hashlib +import hmac + +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/.resources/ea24da0df5f485c7a346683a801158bdb9addb99abef44072bbc76b3f7084f27 b/.resources/ea24da0df5f485c7a346683a801158bdb9addb99abef44072bbc76b3f7084f27 new file mode 100644 index 0000000..27c484e --- /dev/null +++ b/.resources/ea24da0df5f485c7a346683a801158bdb9addb99abef44072bbc76b3f7084f27 @@ -0,0 +1,225 @@ +{ + "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": "na", + "region": "us-east-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": "SAT9", + "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}", + "local": true, + "local_mode": true, + "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": "127.0.0.1", + "appBar": { + "togglePosition": "hidden" + }, + "device": {}, + "geolocation": {}, + "locale": "en-US", + "timeZoneId": "America/Los_Angeles" + } +} \ No newline at end of file diff --git a/.resources/eb758cdb36fd46a553dab5357a3e21442f739358a5c11a1f2dd0a361019522db b/.resources/eb758cdb36fd46a553dab5357a3e21442f739358a5c11a1f2dd0a361019522db new file mode 100644 index 0000000..c513773 --- /dev/null +++ b/.resources/eb758cdb36fd46a553dab5357a3e21442f739358a5c11a1f2dd0a361019522db @@ -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/.resources/eb9370d16e98d1db6b91815628438c565acf06c55768fc5efae3ea76bab5d5f6 b/.resources/eb9370d16e98d1db6b91815628438c565acf06c55768fc5efae3ea76bab5d5f6 new file mode 100644 index 0000000..3f28796 --- /dev/null +++ b/.resources/eb9370d16e98d1db6b91815628438c565acf06c55768fc5efae3ea76bab5d5f6 @@ -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/.resources/ec3ed5eeb9e098fcd8b05982706157752717edf84d93bb989228d9bc70290df1 b/.resources/ec3ed5eeb9e098fcd8b05982706157752717edf84d93bb989228d9bc70290df1 new file mode 100644 index 0000000..37073f4 --- /dev/null +++ b/.resources/ec3ed5eeb9e098fcd8b05982706157752717edf84d93bb989228d9bc70290df1 @@ -0,0 +1,110 @@ +{ + "custom": {}, + "params": { + "Display": true, + "Label": "value", + "Value": "RESULT_INSUFFICIENT_GAP_AT_INFEED" + }, + "propConfig": { + "params.Display": { + "paramDirection": "input", + "persistent": true + }, + "params.Label": { + "paramDirection": "input", + "persistent": true + }, + "params.Value": { + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 50, + "width": 140 + } + }, + "root": { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "shrink": 0 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "view.params.Display" + }, + "type": "property" + } + }, + "props.text": { + "binding": { + "config": { + "path": "view.params.Label" + }, + "type": "property" + } + } + }, + "props": { + "style": { + "border-bottom": "0.75px solid black" + }, + "textStyle": { + "fontSize": 12, + "fontWeight": "bolder", + "textAlign": "center" + } + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "value" + }, + "position": { + "grow": 1 + }, + "propConfig": { + "position.display": { + "binding": { + "config": { + "path": "view.params.Display" + }, + "type": "property" + } + }, + "props.text": { + "binding": { + "config": { + "path": "view.params.Value" + }, + "type": "property" + } + } + }, + "props": { + "textStyle": { + "fontSize": 12, + "overflowWrap": "break-word", + "textAlign": "center" + } + }, + "type": "ia.display.label" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/ecf83ef8e6b9b40a2bfffaceecf2a576cba1a878a71d9f8a3a6f2a76352ab8b5 b/.resources/ecf83ef8e6b9b40a2bfffaceecf2a576cba1a878a71d9f8a3a6f2a76352ab8b5 new file mode 100644 index 0000000..316cac6 --- /dev/null +++ b/.resources/ecf83ef8e6b9b40a2bfffaceecf2a576cba1a878a71d9f8a3a6f2a76352ab8b5 @@ -0,0 +1,55 @@ +{ + "custom": {}, + "params": {}, + "props": {}, + "root": { + "children": [ + { + "meta": { + "name": "Label" + }, + "position": { + "basis": "32px" + }, + "props": { + "style": { + "fontFamily": "Arial", + "fontSize": 22, + "fontWeight": "bold", + "textAlign": "center" + }, + "text": "MONITRON" + }, + "type": "ia.display.label" + }, + { + "meta": { + "name": "Table" + }, + "position": { + "basis": "400px" + }, + "propConfig": { + "props.data": { + "binding": { + "config": { + "fallbackDelay": 2.5, + "mode": "direct", + "tagPath": "[IEC_SCADA_TAG_PROVIDER]Monitron/monitron_data" + }, + "type": "tag" + } + } + }, + "type": "ia.display.table" + } + ], + "meta": { + "name": "root" + }, + "props": { + "direction": "column" + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/f25db8a7e193566e4aba05478e73566b8dcebefae92a941201af13193b8b3e3d b/.resources/f25db8a7e193566e4aba05478e73566b8dcebefae92a941201af13193b8b3e3d new file mode 100644 index 0000000..7fa2854 --- /dev/null +++ b/.resources/f25db8a7e193566e4aba05478e73566b8dcebefae92a941201af13193b8b3e3d @@ -0,0 +1,144 @@ +{ + "custom": { + "numeric_val": 0 + }, + "params": { + "align": "left", + "enabled": true, + "number_format": "0,0.##", + "target_message_handler": null, + "use_right_margin": true, + "val": "" + }, + "propConfig": { + "custom.numeric_val": { + "binding": { + "config": { + "expression": "toFloat({view.params.val}, 0)" + }, + "overlayOptOut": true, + "type": "expr" + }, + "persistent": true + }, + "params.align": { + "paramDirection": "input", + "persistent": true + }, + "params.enabled": { + "paramDirection": "input", + "persistent": true + }, + "params.number_format": { + "paramDirection": "input", + "persistent": true + }, + "params.target_message_handler": { + "paramDirection": "input", + "persistent": true + }, + "params.use_right_margin": { + "paramDirection": "input", + "persistent": true + }, + "params.val": { + "onChange": { + "enabled": false, + "script": "\tval \u003d currentValue.value\n\tif val:\n\t\tif self.params.target_message_handler:\n\t\t\tsystem.perspective.sendMessage(\n\t\t\t\tself.params.target_message_handler,\n\t\t\t\t{\u0027value\u0027: val},\n\t\t\t\tscope\u003d\u0027session\u0027\n\t\t\t)\n" + }, + "paramDirection": "input", + "persistent": true + } + }, + "props": { + "defaultSize": { + "height": 32, + "width": 200 + } + }, + "root": { + "children": [ + { + "events": { + "component": { + "onActionPerformed": { + "config": { + "script": "\t# transform user entry into a string and send to view param\n\tval \u003d self.props.value\n\tself.view.params.val \u003d val\n\tif val:\n\t\tif self.view.params.target_message_handler:\n\t\t\tsystem.perspective.sendMessage(\n\t\t\t\tself.view.params.target_message_handler,\n\t\t\t\t{\u0027value\u0027: val},\n\t\t\t\tscope\u003d\u0027session\u0027\n\t\t\t)" + }, + "scope": "G", + "type": "script" + } + } + }, + "meta": { + "name": "NumericEntryField" + }, + "position": { + "basis": "172px", + "grow": 1 + }, + "propConfig": { + "props.align": { + "binding": { + "config": { + "path": "view.params.align" + }, + "overlayOptOut": true, + "type": "property" + } + }, + "props.containerStyle.marginRight": { + "binding": { + "config": { + "expression": "if({view.params.use_right_margin},\u002726px\u0027,\u00272px\u0027)" + }, + "overlayOptOut": true, + "type": "expr" + } + }, + "props.enabled": { + "binding": { + "config": { + "path": "view.params.enabled" + }, + "type": "property" + } + }, + "props.format": { + "binding": { + "config": { + "path": "view.params.number_format" + }, + "type": "property" + } + }, + "props.value": { + "binding": { + "config": { + "path": "view.custom.numeric_val" + }, + "overlayOptOut": true, + "type": "property" + } + } + }, + "props": { + "containerStyle": { + "margin": "2px" + } + }, + "type": "ia.input.numeric-entry-field" + } + ], + "meta": { + "name": "root" + }, + "props": { + "justify": "center", + "style": { + "overflow": "hidden" + } + }, + "type": "ia.container.flex" + } +} \ No newline at end of file diff --git a/.resources/f4539402aa21da5382cea4b3eeb0e2d1fb98156e006f8c8a04fad2f41e616456 b/.resources/f4539402aa21da5382cea4b3eeb0e2d1fb98156e006f8c8a04fad2f41e616456 new file mode 100644 index 0000000000000000000000000000000000000000..c9d58987ce8e0a755af4150062e199b8dac009ce GIT binary patch literal 65692 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

v75T#)rw^j#1pI( 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 ObL+<4>*Q0: + 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/.resources/fa6a79c476ed4b2e3b249c2170c18b017f4837f61a31444a04ec3f31583c2cdf b/.resources/fa6a79c476ed4b2e3b249c2170c18b017f4837f61a31444a04ec3f31583c2cdf new file mode 100644 index 0000000..3f2a8d7 --- /dev/null +++ b/.resources/fa6a79c476ed4b2e3b249c2170c18b017f4837f61a31444a04ec3f31583c2cdf @@ -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/.resources/fb720f4eb1ccebcc59488638c07c71982c00f5fa23502f2de61260a79440f679 b/.resources/fb720f4eb1ccebcc59488638c07c71982c00f5fa23502f2de61260a79440f679 new file mode 100644 index 0000000000000000000000000000000000000000..88c6507430e13bea87541cf0e0adf608fa343add GIT binary patch literal 27719 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 BYC-@2 literal 0 HcmV?d00001 diff --git a/.resources/fbe73f50381bfde30f039153eb31501aa66be46696c98e8cdbf25895865b9531 b/.resources/fbe73f50381bfde30f039153eb31501aa66be46696c98e8cdbf25895865b9531 new file mode 100644 index 0000000..8ce7640 --- /dev/null +++ b/.resources/fbe73f50381bfde30f039153eb31501aa66be46696c98e8cdbf25895865b9531 @@ -0,0 +1,603 @@ +{ + "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": "Photocell 2 (Lift)" + }, + "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": [ + { + "d": "m 12.584327,-6.5 a 6.0843272,6.0843277 0 0 1 -3.0421635,5.2691824 6.0843272,6.0843277 0 0 1 -6.0843273,-1e-7 A 6.0843272,6.0843277 0 0 1 0.41567278,-6.5", + "fill": {}, + "id": "path1", + "name": "path1", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.264583" + }, + "transform": "scale(1,-1)", + "type": "path" + }, + { + "cx": "6.5", + "cy": "6.5", + "fill": { + "opacity": "1", + "paint": "#000000" + }, + "id": "path2", + "name": "path2", + "rx": "0.54629576", + "ry": "0.54629594", + "stroke": { + "dasharray": "none", + "paint": "#000000", + "width": "0.230325" + }, + "type": "ellipse" + } + ], + "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/.resources/fc5d895182b05bf59f20009681354b7137434aa5b7612cc7c6b289ceddb709da b/.resources/fc5d895182b05bf59f20009681354b7137434aa5b7612cc7c6b289ceddb709da new file mode 100644 index 0000000..d00b2ad --- /dev/null +++ b/.resources/fc5d895182b05bf59f20009681354b7137434aa5b7612cc7c6b289ceddb709da @@ -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/SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM02 Fluid Inbound/resource.json b/SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM02 Fluid Inbound/resource.json new file mode 100644 index 0000000..168c1d4 --- /dev/null +++ b/SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM02 Fluid Inbound/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-05-01T06:51:15Z" + }, + "lastModificationSignature": "70a208166167ec697c8fc902b724405847d6a698d29fd0765cef922514bbc497" + } +} \ No newline at end of file diff --git a/SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM02 Fluid Inbound/thumbnail.png b/SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM02 Fluid Inbound/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..88c6507430e13bea87541cf0e0adf608fa343add GIT binary patch literal 27719 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 BYC-@2 literal 0 HcmV?d00001 diff --git a/SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM03 Fluid Inbound/resource.json b/SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM03 Fluid Inbound/resource.json new file mode 100644 index 0000000..12e1c42 --- /dev/null +++ b/SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM03 Fluid Inbound/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-05-01T06:51:13Z" + }, + "lastModificationSignature": "824c5006e9f727c45b9efd27cb59730888eaf6dcd8f45b8add445452fd2e5ccd" + } +} \ No newline at end of file diff --git a/SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM03 Fluid Inbound/thumbnail.png b/SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM03 Fluid Inbound/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..20459a2ffc0d48833b25aace77316c2fec5f1485 GIT binary patch literal 68531 zcmeFYbx<7L*De}7SP1SAEO?Lv2=4Cg4nYS91RE@Pa0vDS!QFKRhX6q*KyY_wa2Q<9 zkoWhU`p&6)Pu2PJR^6^ZRhsVJz1LcM?Popf=?FCyS!@h4j2ACnV9U!%X}oxW1b*=X z5$`1`{LJ+W&B+%pzP^x`64&xFIaosZLNK#{dJ?m$v&h`55QQ?c-Ww@7M%xP_2w&G( zMPg}40?S1?ys-@mSw#*)_VmO?S9v+gcf6EoT|Z~dSFEZF|XrO(KBCFl= z6PC@fP)L)DDAvw#SeduOPQw;42sRBFU3}HG6)&q-f5ir->@3^1PJ3_de(Y)_YdyMx z*_%-AS?jg%na8>P5n$chN_7RW*4I^^nPY{tM7E5W=uc};x?c{}RpnLH>!!F9x@Wf6 zRg{-N50b5orHyT>*`O@@0zUswxAYaYaFbvP{Tg$)ayi>Z;-U7o!TEfv^Q}w@>K^-U z6JWiv(-b=-V1Ln=?3caKQThM=r2m`2=VrBZ!xHEFh^d9T?fKL2XD08N0dsZ$%g;LH z4XdmMC{Cie+pw+mNr2^?w!z$sLkX?91(g)|8whCXlz){r$nVsgyW+2c&ysZqQdjkZ z1JdH!!3G_=`9Ggj1=HD^ zn7*?Tbel^&R=@O%y-TSp2UGg()E&DSg~M$)l4@)YyA{ZsI~qykRKw`TgL{eV{^cS)K$P- z4Xv>`B#-Hg&d+jXvKxCFmdPOVKjDA16oy{|zk(+P6bQes5BU5DYkh}lYwW8d(HFRX z4|OAJuai}TZ~q?aEU1RGe~-us632+YCz(_%YZz#6(H2`haXgQg8E$7<1D^boIs+8z zmRq9hH&+s1kMIkTgV}M_u@ax+Mg49Gs!coJ-s<|m_6a2%w+kHYveL6W_XvA6ZJ;zo^W(f^K!OT<3mDo?*T@icC zf=-qOlfM5{LhVW=3?wM@)b3E^T97!O5|b|*7ldCNaQ9_vi135MG?sCzM=!`>=Hz5e@_Yd0hL1)vex}M469)(9 zmni`?6`#=RX9c%y_6FFgv%|vn`A-{Z5zU_Oq;Sg*kiqSl5GBu%yr{|A6UQ)__3^XB zL-ErVB(VLs4Q`0?WF+CKTsNwXN=q&7lF;eOskZxY5ndHs+&;ClTUds5H686_ z-OH%Z+u%U9RM~$z3{zq_lamjX8KyjNaf!(H92x*CjyBB_qAB2IV5XhxV_OV_ZFJCg zdAri_VD!tYl)LW^6LSL257*UJ?XaPzp9P{~ENpC8hw~s!$>TyaT`HnNQFMNdn#|JB zsl=j_mM8f9$K4=iic(U}J@DU~7Pp+6+`53@v$F*kIGHo;dGaC0;f-YzyEzHIi;U>Ee? zTFyAkUhDzK_|MkZkyiz^q#Q4r!g11FVdybkc&BAmOuh{*=7O-fpIKR5w3Foh>6$bNSXfyNJmf54tmJ zQpK(!AFXD?(b_OI?hqm0p1SJO(HVapcnjJnBcqF>tfmO#IM-SPr)>XzLA?`+0c zDaaXbaAk|QEcru&}`U8*Y1DIwrxis?o{J9w>&SpIEa;{}fJ!vsg7` zw+tqsn3^kDa)2r>zggQu%Y9Pwj7BEq;_2B%Y5>`w=J|=9>L!TfmYK#4{p6?@*V7{P~_53f?tL1~xNiLJnPA%aS+|jCh zMG&oACJn2`Th*B9{1mag?-#Z*S8b|}KO%xi6KU4aNaN|V5PH*9`yh

YQmmJT=(n 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 literal 0 HcmV?d00001 diff --git a/SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM05 Sorter Destination, chutes and Bypass/resource.json b/SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM05 Sorter Destination, chutes and Bypass/resource.json new file mode 100644 index 0000000..d93745e --- /dev/null +++ b/SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM05 Sorter Destination, chutes and Bypass/resource.json @@ -0,0 +1,17 @@ +{ + "scope": "G", + "version": 1, + "restricted": false, + "overridable": true, + "files": [ + "view.json", + "thumbnail.png" + ], + "attributes": { + "lastModification": { + "actor": "admin", + "timestamp": "2025-05-01T06:57:45Z" + }, + "lastModificationSignature": "ad010a846aaf5c023f275576d0c922c6c28ca48d09300f09539842c58eb1abc5" + } +} \ No newline at end of file diff --git a/SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM05 Sorter Destination, chutes and Bypass/thumbnail.png b/SAT9_SCADA/com.inductiveautomation.perspective/views/Detailed-Views/MCM05 Sorter Destination, chutes and Bypass/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..c9d58987ce8e0a755af4150062e199b8dac009ce GIT binary patch literal 65692 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

v75T#)rw^j#1pI( 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 ObL+<4>*Q