diff --git a/coverage/clover.xml b/coverage/clover.xml new file mode 100644 index 0000000..75b4ca9 --- /dev/null +++ b/coverage/clover.xml @@ -0,0 +1,1211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json new file mode 100644 index 0000000..5780739 --- /dev/null +++ b/coverage/coverage-final.json @@ -0,0 +1,54 @@ +{"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\App.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\App.tsx","statementMap":{"0":{"start":{"line":13,"column":34},"end":{"line":13,"column":49}},"1":{"start":{"line":15,"column":2},"end":{"line":34,"column":4}},"2":{"start":{"line":19,"column":31},"end":{"line":19,"column":53}}},"fnMap":{"0":{"name":"App","decl":{"start":{"line":12,"column":9},"end":{"line":12,"column":12}},"loc":{"start":{"line":12,"column":12},"end":{"line":35,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":19,"column":25},"end":{"line":19,"column":28}},"loc":{"start":{"line":19,"column":31},"end":{"line":19,"column":53}}}},"branchMap":{"0":{"loc":{"start":{"line":31,"column":9},"end":{"line":31,"column":32}},"type":"binary-expr","locations":[{"start":{"line":31,"column":9},"end":{"line":31,"column":17}},{"start":{"line":31,"column":21},"end":{"line":31,"column":32}}]}},"s":{"0":0,"1":0,"2":0},"f":{"0":0,"1":0},"b":{"0":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\main.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\main.tsx","statementMap":{"0":{"start":{"line":7,"column":0},"end":{"line":13,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":0},"f":{},"b":{}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\components\\MultilineTextField.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\components\\MultilineTextField.tsx","statementMap":{"0":{"start":{"line":23,"column":34},"end":{"line":23,"column":48}},"1":{"start":{"line":24,"column":38},"end":{"line":24,"column":53}},"2":{"start":{"line":25,"column":22},"end":{"line":25,"column":55}},"3":{"start":{"line":27,"column":2},"end":{"line":29,"column":14}},"4":{"start":{"line":28,"column":4},"end":{"line":28,"column":25}},"5":{"start":{"line":32,"column":2},"end":{"line":38,"column":19}},"6":{"start":{"line":33,"column":15},"end":{"line":33,"column":34}},"7":{"start":{"line":34,"column":4},"end":{"line":34,"column":20}},"8":{"start":{"line":34,"column":13},"end":{"line":34,"column":20}},"9":{"start":{"line":36,"column":4},"end":{"line":36,"column":29}},"10":{"start":{"line":37,"column":4},"end":{"line":37,"column":45}},"11":{"start":{"line":40,"column":19},"end":{"line":43,"column":3}},"12":{"start":{"line":41,"column":4},"end":{"line":41,"column":22}},"13":{"start":{"line":42,"column":4},"end":{"line":42,"column":25}},"14":{"start":{"line":45,"column":20},"end":{"line":50,"column":3}},"15":{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},"16":{"start":{"line":47,"column":6},"end":{"line":47,"column":25}},"17":{"start":{"line":48,"column":7},"end":{"line":48,"column":47}},"18":{"start":{"line":52,"column":2},"end":{"line":74,"column":4}},"19":{"start":{"line":58,"column":23},"end":{"line":58,"column":52}},"20":{"start":{"line":59,"column":21},"end":{"line":59,"column":39}}},"fnMap":{"0":{"name":"MultilineTextField","decl":{"start":{"line":4,"column":16},"end":{"line":4,"column":34}},"loc":{"start":{"line":22,"column":1},"end":{"line":75,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":27,"column":12},"end":{"line":27,"column":15}},"loc":{"start":{"line":27,"column":17},"end":{"line":29,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":32,"column":12},"end":{"line":32,"column":15}},"loc":{"start":{"line":32,"column":17},"end":{"line":38,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":40,"column":19},"end":{"line":40,"column":22}},"loc":{"start":{"line":40,"column":24},"end":{"line":43,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":45,"column":20},"end":{"line":45,"column":21}},"loc":{"start":{"line":45,"column":68},"end":{"line":50,"column":3}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":58,"column":16},"end":{"line":58,"column":17}},"loc":{"start":{"line":58,"column":23},"end":{"line":58,"column":52}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":59,"column":15},"end":{"line":59,"column":18}},"loc":{"start":{"line":59,"column":21},"end":{"line":59,"column":39}}}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":2},"end":{"line":5,"column":12}},"type":"default-arg","locations":[{"start":{"line":5,"column":10},"end":{"line":5,"column":12}}]},"1":{"loc":{"start":{"line":11,"column":2},"end":{"line":11,"column":17}},"type":"default-arg","locations":[{"start":{"line":11,"column":12},"end":{"line":11,"column":17}}]},"2":{"loc":{"start":{"line":12,"column":2},"end":{"line":12,"column":13}},"type":"default-arg","locations":[{"start":{"line":12,"column":12},"end":{"line":12,"column":13}}]},"3":{"loc":{"start":{"line":34,"column":4},"end":{"line":34,"column":20}},"type":"if","locations":[{"start":{"line":34,"column":4},"end":{"line":34,"column":20}},{"start":{},"end":{}}]},"4":{"loc":{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},"type":"if","locations":[{"start":{"line":46,"column":4},"end":{"line":49,"column":5}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":46,"column":8},"end":{"line":46,"column":53}},"type":"binary-expr","locations":[{"start":{"line":46,"column":8},"end":{"line":46,"column":25}},{"start":{"line":46,"column":30},"end":{"line":46,"column":39}},{"start":{"line":46,"column":43},"end":{"line":46,"column":52}}]},"6":{"loc":{"start":{"line":66,"column":10},"end":{"line":66,"column":38}},"type":"cond-expr","locations":[{"start":{"line":66,"column":21},"end":{"line":66,"column":27}},{"start":{"line":66,"column":30},"end":{"line":66,"column":38}}]},"7":{"loc":{"start":{"line":70,"column":10},"end":{"line":70,"column":39}},"type":"cond-expr","locations":[{"start":{"line":70,"column":20},"end":{"line":70,"column":34}},{"start":{"line":70,"column":37},"end":{"line":70,"column":39}}]},"8":{"loc":{"start":{"line":71,"column":10},"end":{"line":71,"column":25}},"type":"binary-expr","locations":[{"start":{"line":71,"column":10},"end":{"line":71,"column":19}},{"start":{"line":71,"column":23},"end":{"line":71,"column":25}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"b":{"0":[0],"1":[0],"2":[0],"3":[0,0],"4":[0,0],"5":[0,0,0],"6":[0,0],"7":[0,0],"8":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\components\\ScrollIntoView.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\components\\ScrollIntoView.tsx","statementMap":{"0":{"start":{"line":15,"column":21},"end":{"line":15,"column":49}},"1":{"start":{"line":17,"column":2},"end":{"line":19,"column":5}},"2":{"start":{"line":18,"column":4},"end":{"line":18,"column":86}},"3":{"start":{"line":18,"column":28},"end":{"line":18,"column":86}},"4":{"start":{"line":21,"column":2},"end":{"line":21,"column":34}}},"fnMap":{"0":{"name":"ScrollIntoView","decl":{"start":{"line":13,"column":24},"end":{"line":13,"column":38}},"loc":{"start":{"line":13,"column":38},"end":{"line":22,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":12},"end":{"line":17,"column":15}},"loc":{"start":{"line":17,"column":17},"end":{"line":19,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":18,"column":4},"end":{"line":18,"column":86}},"type":"if","locations":[{"start":{"line":18,"column":4},"end":{"line":18,"column":86}},{"start":{},"end":{}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0},"f":{"0":0,"1":0},"b":{"0":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\components\\TextField.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\components\\TextField.tsx","statementMap":{"0":{"start":{"line":42,"column":34},"end":{"line":42,"column":48}},"1":{"start":{"line":45,"column":22},"end":{"line":48,"column":3}},"2":{"start":{"line":46,"column":4},"end":{"line":46,"column":22}},"3":{"start":{"line":47,"column":4},"end":{"line":47,"column":15}},"4":{"start":{"line":51,"column":24},"end":{"line":53,"column":50}},"5":{"start":{"line":52,"column":4},"end":{"line":53,"column":48}},"6":{"start":{"line":53,"column":7},"end":{"line":53,"column":48}},"7":{"start":{"line":55,"column":2},"end":{"line":68,"column":5}},"8":{"start":{"line":59,"column":21},"end":{"line":59,"column":45}},"9":{"start":{"line":60,"column":19},"end":{"line":60,"column":37}},"10":{"start":{"line":106,"column":38},"end":{"line":106,"column":53}},"11":{"start":{"line":108,"column":2},"end":{"line":110,"column":14}},"12":{"start":{"line":109,"column":4},"end":{"line":109,"column":25}},"13":{"start":{"line":112,"column":19},"end":{"line":112,"column":45}},"14":{"start":{"line":112,"column":25},"end":{"line":112,"column":45}},"15":{"start":{"line":114,"column":2},"end":{"line":123,"column":5}}},"fnMap":{"0":{"name":"RealtimeTextField","decl":{"start":{"line":22,"column":16},"end":{"line":22,"column":33}},"loc":{"start":{"line":40,"column":1},"end":{"line":69,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":45,"column":22},"end":{"line":45,"column":25}},"loc":{"start":{"line":45,"column":27},"end":{"line":48,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":51,"column":24},"end":{"line":51,"column":25}},"loc":{"start":{"line":51,"column":73},"end":{"line":53,"column":50}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":59,"column":14},"end":{"line":59,"column":15}},"loc":{"start":{"line":59,"column":21},"end":{"line":59,"column":45}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":60,"column":13},"end":{"line":60,"column":16}},"loc":{"start":{"line":60,"column":19},"end":{"line":60,"column":37}}},"5":{"name":"TextField","decl":{"start":{"line":89,"column":16},"end":{"line":89,"column":25}},"loc":{"start":{"line":105,"column":1},"end":{"line":124,"column":1}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":108,"column":12},"end":{"line":108,"column":15}},"loc":{"start":{"line":108,"column":17},"end":{"line":110,"column":3}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":112,"column":19},"end":{"line":112,"column":22}},"loc":{"start":{"line":112,"column":25},"end":{"line":112,"column":45}}}},"branchMap":{"0":{"loc":{"start":{"line":23,"column":2},"end":{"line":23,"column":12}},"type":"default-arg","locations":[{"start":{"line":23,"column":10},"end":{"line":23,"column":12}}]},"1":{"loc":{"start":{"line":30,"column":2},"end":{"line":30,"column":17}},"type":"default-arg","locations":[{"start":{"line":30,"column":12},"end":{"line":30,"column":17}}]},"2":{"loc":{"start":{"line":52,"column":4},"end":{"line":53,"column":48}},"type":"if","locations":[{"start":{"line":52,"column":4},"end":{"line":53,"column":48}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":66,"column":18},"end":{"line":66,"column":46}},"type":"cond-expr","locations":[{"start":{"line":66,"column":29},"end":{"line":66,"column":35}},{"start":{"line":66,"column":38},"end":{"line":66,"column":46}}]},"4":{"loc":{"start":{"line":66,"column":77},"end":{"line":66,"column":106}},"type":"cond-expr","locations":[{"start":{"line":66,"column":87},"end":{"line":66,"column":101}},{"start":{"line":66,"column":104},"end":{"line":66,"column":106}}]},"5":{"loc":{"start":{"line":90,"column":2},"end":{"line":90,"column":12}},"type":"default-arg","locations":[{"start":{"line":90,"column":10},"end":{"line":90,"column":12}}]},"6":{"loc":{"start":{"line":96,"column":2},"end":{"line":96,"column":17}},"type":"default-arg","locations":[{"start":{"line":96,"column":12},"end":{"line":96,"column":17}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"b":{"0":[0],"1":[0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0],"6":[0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\components\\components.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\components\\components.tsx","statementMap":{"0":{"start":{"line":12,"column":28},"end":{"line":12,"column":39}},"1":{"start":{"line":14,"column":2},"end":{"line":23,"column":null}},"2":{"start":{"line":16,"column":29},"end":{"line":16,"column":59}},"3":{"start":{"line":16,"column":49},"end":{"line":16,"column":58}},"4":{"start":{"line":19,"column":47},"end":{"line":19,"column":58}}},"fnMap":{"0":{"name":"Counter","decl":{"start":{"line":10,"column":9},"end":{"line":10,"column":16}},"loc":{"start":{"line":10,"column":16},"end":{"line":24,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":23},"end":{"line":16,"column":26}},"loc":{"start":{"line":16,"column":29},"end":{"line":16,"column":59}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":16,"column":38},"end":{"line":16,"column":39}},"loc":{"start":{"line":16,"column":49},"end":{"line":16,"column":58}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":19,"column":41},"end":{"line":19,"column":44}},"loc":{"start":{"line":19,"column":47},"end":{"line":19,"column":58}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0},"f":{"0":0,"1":0,"2":0,"3":0},"b":{}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\components\\Logging\\Filters.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\components\\Logging\\Filters.tsx","statementMap":{"0":{"start":{"line":16,"column":22},"end":{"line":25,"column":2}},"1":{"start":{"line":49,"column":25},"end":{"line":49,"column":54}},"2":{"start":{"line":51,"column":2},"end":{"line":73,"column":null}},"3":{"start":{"line":67,"column":23},"end":{"line":67,"column":47}},"4":{"start":{"line":70,"column":8},"end":{"line":70,"column":26}},"5":{"start":{"line":77,"column":39},"end":{"line":77,"column":57}},"6":{"start":{"line":96,"column":19},"end":{"line":96,"column":87}},"7":{"start":{"line":97,"column":22},"end":{"line":109,"column":3}},"8":{"start":{"line":98,"column":4},"end":{"line":98,"column":58}},"9":{"start":{"line":98,"column":51},"end":{"line":98,"column":58}},"10":{"start":{"line":100,"column":4},"end":{"line":108,"column":7}},"11":{"start":{"line":101,"column":19},"end":{"line":101,"column":32}},"12":{"start":{"line":102,"column":6},"end":{"line":106,"column":9}},"13":{"start":{"line":103,"column":31},"end":{"line":103,"column":77}},"14":{"start":{"line":107,"column":6},"end":{"line":107,"column":18}},"15":{"start":{"line":112,"column":2},"end":{"line":116,"column":9}},"16":{"start":{"line":113,"column":4},"end":{"line":113,"column":69}},"17":{"start":{"line":113,"column":62},"end":{"line":113,"column":69}},"18":{"start":{"line":114,"column":4},"end":{"line":114,"column":24}},"19":{"start":{"line":118,"column":2},"end":{"line":122,"column":5}},"20":{"start":{"line":126,"column":45},"end":{"line":126,"column":63}},"21":{"start":{"line":149,"column":18},"end":{"line":149,"column":46}},"22":{"start":{"line":150,"column":26},"end":{"line":150,"column":41}},"23":{"start":{"line":153,"column":2},"end":{"line":169,"column":13}},"24":{"start":{"line":154,"column":4},"end":{"line":154,"column":22}},"25":{"start":{"line":154,"column":15},"end":{"line":154,"column":22}},"26":{"start":{"line":155,"column":23},"end":{"line":157,"column":5}},"27":{"start":{"line":156,"column":6},"end":{"line":156,"column":71}},"28":{"start":{"line":156,"column":56},"end":{"line":156,"column":71}},"29":{"start":{"line":158,"column":18},"end":{"line":162,"column":5}},"30":{"start":{"line":159,"column":6},"end":{"line":159,"column":37}},"31":{"start":{"line":159,"column":30},"end":{"line":159,"column":37}},"32":{"start":{"line":160,"column":6},"end":{"line":160,"column":21}},"33":{"start":{"line":161,"column":6},"end":{"line":161,"column":25}},"34":{"start":{"line":163,"column":4},"end":{"line":163,"column":55}},"35":{"start":{"line":164,"column":4},"end":{"line":164,"column":48}},"36":{"start":{"line":165,"column":4},"end":{"line":168,"column":6}},"37":{"start":{"line":166,"column":6},"end":{"line":166,"column":60}},"38":{"start":{"line":167,"column":6},"end":{"line":167,"column":53}},"39":{"start":{"line":172,"column":26},"end":{"line":173,"column":57}},"40":{"start":{"line":173,"column":4},"end":{"line":173,"column":56}},"41":{"start":{"line":182,"column":28},"end":{"line":195,"column":3}},"42":{"start":{"line":183,"column":4},"end":{"line":183,"column":90}},"43":{"start":{"line":184,"column":4},"end":{"line":194,"column":7}},"44":{"start":{"line":185,"column":19},"end":{"line":185,"column":32}},"45":{"start":{"line":186,"column":6},"end":{"line":192,"column":9}},"46":{"start":{"line":187,"column":31},"end":{"line":189,"column":16}},"47":{"start":{"line":193,"column":6},"end":{"line":193,"column":18}},"48":{"start":{"line":202,"column":31},"end":{"line":210,"column":3}},"49":{"start":{"line":203,"column":4},"end":{"line":209,"column":7}},"50":{"start":{"line":204,"column":23},"end":{"line":204,"column":71}},"51":{"start":{"line":205,"column":6},"end":{"line":205,"column":43}},"52":{"start":{"line":205,"column":31},"end":{"line":205,"column":43}},"53":{"start":{"line":206,"column":19},"end":{"line":206,"column":32}},"54":{"start":{"line":207,"column":6},"end":{"line":207,"column":28}},"55":{"start":{"line":208,"column":6},"end":{"line":208,"column":18}},"56":{"start":{"line":212,"column":2},"end":{"line":236,"column":6}},"57":{"start":{"line":214,"column":33},"end":{"line":214,"column":65}},"58":{"start":{"line":216,"column":6},"end":{"line":222,"column":9}},"59":{"start":{"line":220,"column":29},"end":{"line":220,"column":64}},"60":{"start":{"line":221,"column":24},"end":{"line":221,"column":55}},"61":{"start":{"line":229,"column":25},"end":{"line":229,"column":78}},"62":{"start":{"line":232,"column":10},"end":{"line":232,"column":28}},"63":{"start":{"line":259,"column":2},"end":{"line":262,"column":9}}},"fnMap":{"0":{"name":"LevelPredicateElement","decl":{"start":{"line":38,"column":9},"end":{"line":38,"column":30}},"loc":{"start":{"line":48,"column":1},"end":{"line":74,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":67,"column":16},"end":{"line":67,"column":17}},"loc":{"start":{"line":67,"column":23},"end":{"line":67,"column":47}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":69,"column":44},"end":{"line":69,"column":45}},"loc":{"start":{"line":70,"column":8},"end":{"line":70,"column":26}}},"3":{"name":"GlobalLevelFilter","decl":{"start":{"line":89,"column":9},"end":{"line":89,"column":26}},"loc":{"start":{"line":95,"column":1},"end":{"line":123,"column":1}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":97,"column":22},"end":{"line":97,"column":23}},"loc":{"start":{"line":97,"column":50},"end":{"line":109,"column":3}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":100,"column":24},"end":{"line":100,"column":25}},"loc":{"start":{"line":100,"column":33},"end":{"line":108,"column":5}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":103,"column":19},"end":{"line":103,"column":20}},"loc":{"start":{"line":103,"column":31},"end":{"line":103,"column":77}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":112,"column":12},"end":{"line":112,"column":15}},"loc":{"start":{"line":112,"column":17},"end":{"line":116,"column":3}}},"8":{"name":"AgentLevelFilters","decl":{"start":{"line":140,"column":9},"end":{"line":140,"column":26}},"loc":{"start":{"line":148,"column":1},"end":{"line":237,"column":1}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":153,"column":12},"end":{"line":153,"column":15}},"loc":{"start":{"line":153,"column":17},"end":{"line":169,"column":3}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":155,"column":23},"end":{"line":155,"column":24}},"loc":{"start":{"line":155,"column":41},"end":{"line":157,"column":5}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":158,"column":18},"end":{"line":158,"column":19}},"loc":{"start":{"line":158,"column":39},"end":{"line":162,"column":5}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":165,"column":11},"end":{"line":165,"column":14}},"loc":{"start":{"line":165,"column":16},"end":{"line":168,"column":5}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":172,"column":62},"end":{"line":172,"column":63}},"loc":{"start":{"line":173,"column":4},"end":{"line":173,"column":56}}},"14":{"name":"(anonymous_14)","decl":{"start":{"line":182,"column":28},"end":{"line":182,"column":29}},"loc":{"start":{"line":182,"column":67},"end":{"line":195,"column":3}}},"15":{"name":"(anonymous_15)","decl":{"start":{"line":184,"column":24},"end":{"line":184,"column":25}},"loc":{"start":{"line":184,"column":33},"end":{"line":194,"column":5}}},"16":{"name":"(anonymous_16)","decl":{"start":{"line":187,"column":19},"end":{"line":187,"column":20}},"loc":{"start":{"line":187,"column":31},"end":{"line":189,"column":16}}},"17":{"name":"(anonymous_17)","decl":{"start":{"line":202,"column":31},"end":{"line":202,"column":32}},"loc":{"start":{"line":202,"column":53},"end":{"line":210,"column":3}}},"18":{"name":"(anonymous_18)","decl":{"start":{"line":203,"column":24},"end":{"line":203,"column":25}},"loc":{"start":{"line":203,"column":33},"end":{"line":209,"column":5}}},"19":{"name":"(anonymous_19)","decl":{"start":{"line":213,"column":25},"end":{"line":213,"column":26}},"loc":{"start":{"line":213,"column":33},"end":{"line":223,"column":5}}},"20":{"name":"(anonymous_20)","decl":{"start":{"line":220,"column":18},"end":{"line":220,"column":19}},"loc":{"start":{"line":220,"column":29},"end":{"line":220,"column":64}}},"21":{"name":"(anonymous_21)","decl":{"start":{"line":221,"column":18},"end":{"line":221,"column":21}},"loc":{"start":{"line":221,"column":24},"end":{"line":221,"column":55}}},"22":{"name":"(anonymous_22)","decl":{"start":{"line":229,"column":18},"end":{"line":229,"column":19}},"loc":{"start":{"line":229,"column":25},"end":{"line":229,"column":78}}},"23":{"name":"(anonymous_23)","decl":{"start":{"line":231,"column":40},"end":{"line":231,"column":41}},"loc":{"start":{"line":232,"column":10},"end":{"line":232,"column":28}}},"24":{"name":"Filters","decl":{"start":{"line":250,"column":24},"end":{"line":250,"column":31}},"loc":{"start":{"line":258,"column":1},"end":{"line":263,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":49,"column":25},"end":{"line":49,"column":54}},"type":"binary-expr","locations":[{"start":{"line":49,"column":25},"end":{"line":49,"column":46}},{"start":{"line":49,"column":50},"end":{"line":49,"column":54}}]},"1":{"loc":{"start":{"line":56,"column":7},"end":{"line":61,"column":30}},"type":"cond-expr","locations":[{"start":{"line":57,"column":10},"end":{"line":60,"column":35}},{"start":{"line":61,"column":10},"end":{"line":61,"column":30}}]},"2":{"loc":{"start":{"line":96,"column":19},"end":{"line":96,"column":87}},"type":"binary-expr","locations":[{"start":{"line":96,"column":19},"end":{"line":96,"column":78}},{"start":{"line":96,"column":82},"end":{"line":96,"column":87}}]},"3":{"loc":{"start":{"line":98,"column":4},"end":{"line":98,"column":58}},"type":"if","locations":[{"start":{"line":98,"column":4},"end":{"line":98,"column":58}},{"start":{},"end":{}}]},"4":{"loc":{"start":{"line":98,"column":8},"end":{"line":98,"column":49}},"type":"binary-expr","locations":[{"start":{"line":98,"column":8},"end":{"line":98,"column":17}},{"start":{"line":98,"column":21},"end":{"line":98,"column":49}}]},"5":{"loc":{"start":{"line":113,"column":4},"end":{"line":113,"column":69}},"type":"if","locations":[{"start":{"line":113,"column":4},"end":{"line":113,"column":69}},{"start":{},"end":{}}]},"6":{"loc":{"start":{"line":154,"column":4},"end":{"line":154,"column":22}},"type":"if","locations":[{"start":{"line":154,"column":4},"end":{"line":154,"column":22}},{"start":{},"end":{}}]},"7":{"loc":{"start":{"line":156,"column":6},"end":{"line":156,"column":71}},"type":"if","locations":[{"start":{"line":156,"column":6},"end":{"line":156,"column":71}},{"start":{},"end":{}}]},"8":{"loc":{"start":{"line":159,"column":6},"end":{"line":159,"column":37}},"type":"if","locations":[{"start":{"line":159,"column":6},"end":{"line":159,"column":37}},{"start":{},"end":{}}]},"9":{"loc":{"start":{"line":183,"column":12},"end":{"line":183,"column":89}},"type":"binary-expr","locations":[{"start":{"line":183,"column":12},"end":{"line":183,"column":17}},{"start":{"line":183,"column":21},"end":{"line":183,"column":80}},{"start":{"line":183,"column":84},"end":{"line":183,"column":89}}]},"10":{"loc":{"start":{"line":187,"column":31},"end":{"line":189,"column":16}},"type":"cond-expr","locations":[{"start":{"line":188,"column":12},"end":{"line":188,"column":56}},{"start":{"line":189,"column":12},"end":{"line":189,"column":16}}]},"11":{"loc":{"start":{"line":205,"column":6},"end":{"line":205,"column":43}},"type":"if","locations":[{"start":{"line":205,"column":6},"end":{"line":205,"column":43}},{"start":{},"end":{}}]},"12":{"loc":{"start":{"line":229,"column":25},"end":{"line":229,"column":78}},"type":"binary-expr","locations":[{"start":{"line":229,"column":25},"end":{"line":229,"column":41}},{"start":{"line":229,"column":45},"end":{"line":229,"column":78}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0,0],"10":[0,0],"11":[0,0],"12":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\components\\Logging\\Logging.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\components\\Logging\\Logging.tsx","statementMap":{"0":{"start":{"line":31,"column":27},"end":{"line":36,"column":3}},"1":{"start":{"line":31,"column":61},"end":{"line":36,"column":2}},"2":{"start":{"line":33,"column":54},"end":{"line":33,"column":79}},"3":{"start":{"line":35,"column":50},"end":{"line":35,"column":73}},"4":{"start":{"line":55,"column":52},"end":{"line":55,"column":72}},"5":{"start":{"line":56,"column":17},"end":{"line":56,"column":36}},"6":{"start":{"line":62,"column":28},"end":{"line":67,"column":6}},"7":{"start":{"line":64,"column":4},"end":{"line":64,"column":40}},"8":{"start":{"line":64,"column":30},"end":{"line":64,"column":40}},"9":{"start":{"line":66,"column":4},"end":{"line":66,"column":48}},"10":{"start":{"line":70,"column":25},"end":{"line":70,"column":68}},"11":{"start":{"line":73,"column":2},"end":{"line":75,"column":25}},"12":{"start":{"line":74,"column":4},"end":{"line":74,"column":29}},"13":{"start":{"line":74,"column":18},"end":{"line":74,"column":29}},"14":{"start":{"line":77,"column":2},"end":{"line":91,"column":9}},"15":{"start":{"line":81,"column":23},"end":{"line":81,"column":61}},"16":{"start":{"line":106,"column":24},"end":{"line":106,"column":52}},"17":{"start":{"line":107,"column":25},"end":{"line":107,"column":52}},"18":{"start":{"line":108,"column":48},"end":{"line":108,"column":68}},"19":{"start":{"line":111,"column":2},"end":{"line":124,"column":41}},"20":{"start":{"line":112,"column":4},"end":{"line":112,"column":39}},"21":{"start":{"line":112,"column":32},"end":{"line":112,"column":39}},"22":{"start":{"line":113,"column":33},"end":{"line":113,"column":54}},"23":{"start":{"line":115,"column":25},"end":{"line":115,"column":55}},"24":{"start":{"line":115,"column":31},"end":{"line":115,"column":55}},"25":{"start":{"line":117,"column":4},"end":{"line":117,"column":65}},"26":{"start":{"line":118,"column":4},"end":{"line":118,"column":69}},"27":{"start":{"line":120,"column":4},"end":{"line":123,"column":null}},"28":{"start":{"line":121,"column":6},"end":{"line":121,"column":70}},"29":{"start":{"line":122,"column":6},"end":{"line":122,"column":74}},"30":{"start":{"line":133,"column":4},"end":{"line":133,"column":71}},"31":{"start":{"line":133,"column":64},"end":{"line":133,"column":71}},"32":{"start":{"line":134,"column":4},"end":{"line":134,"column":66}},"33":{"start":{"line":137,"column":2},"end":{"line":155,"column":9}},"34":{"start":{"line":140,"column":8},"end":{"line":140,"column":null}},"35":{"start":{"line":149,"column":8},"end":{"line":149,"column":32}},"36":{"start":{"line":150,"column":8},"end":{"line":150,"column":40}},"37":{"start":{"line":172,"column":50},"end":{"line":172,"column":97}},"38":{"start":{"line":173,"column":42},"end":{"line":173,"column":67}},"39":{"start":{"line":175,"column":2},"end":{"line":185,"column":9}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":31,"column":51},"end":{"line":31,"column":52}},"loc":{"start":{"line":31,"column":61},"end":{"line":36,"column":2}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":33,"column":23},"end":{"line":33,"column":24}},"loc":{"start":{"line":33,"column":54},"end":{"line":33,"column":79}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":35,"column":21},"end":{"line":35,"column":22}},"loc":{"start":{"line":35,"column":50},"end":{"line":35,"column":73}}},"3":{"name":"LogMessage","decl":{"start":{"line":48,"column":9},"end":{"line":48,"column":19}},"loc":{"start":{"line":54,"column":1},"end":{"line":92,"column":1}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":62,"column":29},"end":{"line":62,"column":32}},"loc":{"start":{"line":62,"column":34},"end":{"line":67,"column":3}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":73,"column":12},"end":{"line":73,"column":15}},"loc":{"start":{"line":73,"column":17},"end":{"line":75,"column":3}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":81,"column":17},"end":{"line":81,"column":20}},"loc":{"start":{"line":81,"column":23},"end":{"line":81,"column":61}}},"7":{"name":"LogMessages","decl":{"start":{"line":105,"column":9},"end":{"line":105,"column":20}},"loc":{"start":{"line":105,"column":72},"end":{"line":156,"column":1}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":111,"column":12},"end":{"line":111,"column":15}},"loc":{"start":{"line":111,"column":17},"end":{"line":124,"column":3}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":115,"column":25},"end":{"line":115,"column":28}},"loc":{"start":{"line":115,"column":31},"end":{"line":115,"column":55}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":120,"column":11},"end":{"line":120,"column":14}},"loc":{"start":{"line":120,"column":16},"end":{"line":123,"column":5}}},"11":{"name":"scrollLastElementIntoView","decl":{"start":{"line":132,"column":11},"end":{"line":132,"column":36}},"loc":{"start":{"line":132,"column":50},"end":{"line":135,"column":3}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":139,"column":23},"end":{"line":139,"column":24}},"loc":{"start":{"line":140,"column":8},"end":{"line":140,"column":null}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":148,"column":15},"end":{"line":148,"column":18}},"loc":{"start":{"line":148,"column":20},"end":{"line":151,"column":7}}},"14":{"name":"Logging","decl":{"start":{"line":171,"column":24},"end":{"line":171,"column":31}},"loc":{"start":{"line":171,"column":31},"end":{"line":186,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":64,"column":4},"end":{"line":64,"column":40}},"type":"if","locations":[{"start":{"line":64,"column":4},"end":{"line":64,"column":40}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":70,"column":25},"end":{"line":70,"column":68}},"type":"binary-expr","locations":[{"start":{"line":70,"column":25},"end":{"line":70,"column":53}},{"start":{"line":70,"column":57},"end":{"line":70,"column":68}}]},"2":{"loc":{"start":{"line":74,"column":4},"end":{"line":74,"column":29}},"type":"if","locations":[{"start":{"line":74,"column":4},"end":{"line":74,"column":29}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":82,"column":8},"end":{"line":84,"column":62}},"type":"cond-expr","locations":[{"start":{"line":83,"column":10},"end":{"line":83,"column":48}},{"start":{"line":84,"column":10},"end":{"line":84,"column":62}}]},"4":{"loc":{"start":{"line":112,"column":4},"end":{"line":112,"column":39}},"type":"if","locations":[{"start":{"line":112,"column":4},"end":{"line":112,"column":39}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":132,"column":37},"end":{"line":132,"column":50}},"type":"default-arg","locations":[{"start":{"line":132,"column":45},"end":{"line":132,"column":50}}]},"6":{"loc":{"start":{"line":133,"column":4},"end":{"line":133,"column":71}},"type":"if","locations":[{"start":{"line":133,"column":4},"end":{"line":133,"column":71}},{"start":{},"end":{}}]},"7":{"loc":{"start":{"line":133,"column":8},"end":{"line":133,"column":62}},"type":"binary-expr","locations":[{"start":{"line":133,"column":9},"end":{"line":133,"column":24}},{"start":{"line":133,"column":28},"end":{"line":133,"column":34}},{"start":{"line":133,"column":39},"end":{"line":133,"column":62}}]},"8":{"loc":{"start":{"line":146,"column":5},"end":{"line":151,"column":null}},"type":"binary-expr","locations":[{"start":{"line":146,"column":5},"end":{"line":146,"column":20}},{"start":{"line":146,"column":24},"end":{"line":151,"column":null}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0],"6":[0,0],"7":[0,0,0],"8":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\components\\Logging\\useLogs.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\components\\Logging\\useLogs.ts","statementMap":{"0":{"start":{"line":65,"column":44},"end":{"line":65,"column":76}},"1":{"start":{"line":67,"column":34},"end":{"line":67,"column":65}},"2":{"start":{"line":70,"column":17},"end":{"line":70,"column":49}},"3":{"start":{"line":72,"column":21},"end":{"line":72,"column":45}},"4":{"start":{"line":74,"column":18},"end":{"line":74,"column":41}},"5":{"start":{"line":77,"column":24},"end":{"line":77,"column":71}},"6":{"start":{"line":84,"column":23},"end":{"line":85,"column":71}},"7":{"start":{"line":85,"column":4},"end":{"line":85,"column":66}},"8":{"start":{"line":93,"column":28},"end":{"line":129,"column":33}},"9":{"start":{"line":94,"column":43},"end":{"line":94,"column":45}},"10":{"start":{"line":95,"column":4},"end":{"line":95,"column":38}},"11":{"start":{"line":97,"column":4},"end":{"line":126,"column":5}},"12":{"start":{"line":98,"column":26},"end":{"line":102,"column":8}},"13":{"start":{"line":105,"column":6},"end":{"line":120,"column":7}},"14":{"start":{"line":106,"column":22},"end":{"line":106,"column":66}},"15":{"start":{"line":107,"column":8},"end":{"line":119,"column":9}},"16":{"start":{"line":109,"column":10},"end":{"line":113,"column":14}},"17":{"start":{"line":109,"column":31},"end":{"line":113,"column":12}},"18":{"start":{"line":115,"column":10},"end":{"line":115,"column":19}},"19":{"start":{"line":118,"column":10},"end":{"line":118,"column":68}},"20":{"start":{"line":123,"column":6},"end":{"line":125,"column":7}},"21":{"start":{"line":124,"column":8},"end":{"line":124,"column":38}},"22":{"start":{"line":128,"column":4},"end":{"line":128,"column":29}},"23":{"start":{"line":132,"column":2},"end":{"line":135,"column":44}},"24":{"start":{"line":133,"column":4},"end":{"line":133,"column":42}},"25":{"start":{"line":134,"column":4},"end":{"line":134,"column":24}},"26":{"start":{"line":143,"column":27},"end":{"line":183,"column":33}},"27":{"start":{"line":145,"column":4},"end":{"line":145,"column":34}},"28":{"start":{"line":148,"column":4},"end":{"line":153,"column":7}},"29":{"start":{"line":149,"column":6},"end":{"line":149,"column":46}},"30":{"start":{"line":149,"column":34},"end":{"line":149,"column":46}},"31":{"start":{"line":150,"column":21},"end":{"line":150,"column":34}},"32":{"start":{"line":151,"column":6},"end":{"line":151,"column":31}},"33":{"start":{"line":152,"column":6},"end":{"line":152,"column":20}},"34":{"start":{"line":156,"column":24},"end":{"line":160,"column":6}},"35":{"start":{"line":163,"column":4},"end":{"line":177,"column":5}},"36":{"start":{"line":164,"column":20},"end":{"line":164,"column":64}},"37":{"start":{"line":165,"column":6},"end":{"line":176,"column":7}},"38":{"start":{"line":167,"column":8},"end":{"line":171,"column":12}},"39":{"start":{"line":167,"column":29},"end":{"line":171,"column":10}},"40":{"start":{"line":173,"column":8},"end":{"line":173,"column":15}},"41":{"start":{"line":175,"column":8},"end":{"line":175,"column":66}},"42":{"start":{"line":180,"column":4},"end":{"line":182,"column":5}},"43":{"start":{"line":181,"column":6},"end":{"line":181,"column":52}},"44":{"start":{"line":181,"column":28},"end":{"line":181,"column":50}},"45":{"start":{"line":193,"column":2},"end":{"line":209,"column":25}},"46":{"start":{"line":195,"column":4},"end":{"line":195,"column":31}},"47":{"start":{"line":195,"column":24},"end":{"line":195,"column":31}},"48":{"start":{"line":197,"column":15},"end":{"line":197,"column":67}},"49":{"start":{"line":198,"column":4},"end":{"line":198,"column":24}},"50":{"start":{"line":200,"column":4},"end":{"line":203,"column":6}},"51":{"start":{"line":201,"column":30},"end":{"line":201,"column":52}},"52":{"start":{"line":202,"column":6},"end":{"line":202,"column":29}},"53":{"start":{"line":205,"column":4},"end":{"line":208,"column":6}},"54":{"start":{"line":206,"column":6},"end":{"line":206,"column":17}},"55":{"start":{"line":207,"column":6},"end":{"line":207,"column":28}},"56":{"start":{"line":211,"column":2},"end":{"line":211,"column":49}}},"fnMap":{"0":{"name":"useLogs","decl":{"start":{"line":63,"column":16},"end":{"line":63,"column":23}},"loc":{"start":{"line":63,"column":73},"end":{"line":212,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":84,"column":35},"end":{"line":84,"column":36}},"loc":{"start":{"line":85,"column":4},"end":{"line":85,"column":66}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":93,"column":40},"end":{"line":93,"column":43}},"loc":{"start":{"line":93,"column":45},"end":{"line":129,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":109,"column":20},"end":{"line":109,"column":21}},"loc":{"start":{"line":109,"column":31},"end":{"line":113,"column":12}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":132,"column":12},"end":{"line":132,"column":15}},"loc":{"start":{"line":132,"column":17},"end":{"line":135,"column":3}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":143,"column":39},"end":{"line":143,"column":40}},"loc":{"start":{"line":143,"column":62},"end":{"line":183,"column":3}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":148,"column":21},"end":{"line":148,"column":22}},"loc":{"start":{"line":148,"column":30},"end":{"line":153,"column":5}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":167,"column":18},"end":{"line":167,"column":19}},"loc":{"start":{"line":167,"column":29},"end":{"line":171,"column":10}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":181,"column":18},"end":{"line":181,"column":19}},"loc":{"start":{"line":181,"column":28},"end":{"line":181,"column":50}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":193,"column":12},"end":{"line":193,"column":15}},"loc":{"start":{"line":193,"column":17},"end":{"line":209,"column":3}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":200,"column":19},"end":{"line":200,"column":20}},"loc":{"start":{"line":200,"column":29},"end":{"line":203,"column":5}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":205,"column":11},"end":{"line":205,"column":14}},"loc":{"start":{"line":205,"column":16},"end":{"line":208,"column":5}}}},"branchMap":{"0":{"loc":{"start":{"line":105,"column":6},"end":{"line":120,"column":7}},"type":"if","locations":[{"start":{"line":105,"column":6},"end":{"line":120,"column":7}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":107,"column":8},"end":{"line":119,"column":9}},"type":"if","locations":[{"start":{"line":107,"column":8},"end":{"line":119,"column":9}},{"start":{"line":116,"column":15},"end":{"line":119,"column":9}}]},"2":{"loc":{"start":{"line":111,"column":26},"end":{"line":111,"column":59}},"type":"binary-expr","locations":[{"start":{"line":111,"column":26},"end":{"line":111,"column":43}},{"start":{"line":111,"column":47},"end":{"line":111,"column":59}}]},"3":{"loc":{"start":{"line":112,"column":34},"end":{"line":112,"column":83}},"type":"binary-expr","locations":[{"start":{"line":112,"column":34},"end":{"line":112,"column":59}},{"start":{"line":112,"column":63},"end":{"line":112,"column":83}}]},"4":{"loc":{"start":{"line":123,"column":6},"end":{"line":125,"column":7}},"type":"if","locations":[{"start":{"line":123,"column":6},"end":{"line":125,"column":7}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":149,"column":6},"end":{"line":149,"column":46}},"type":"if","locations":[{"start":{"line":149,"column":6},"end":{"line":149,"column":46}},{"start":{},"end":{}}]},"6":{"loc":{"start":{"line":163,"column":4},"end":{"line":177,"column":5}},"type":"if","locations":[{"start":{"line":163,"column":4},"end":{"line":177,"column":5}},{"start":{},"end":{}}]},"7":{"loc":{"start":{"line":165,"column":6},"end":{"line":176,"column":7}},"type":"if","locations":[{"start":{"line":165,"column":6},"end":{"line":176,"column":7}},{"start":{"line":174,"column":13},"end":{"line":176,"column":7}}]},"8":{"loc":{"start":{"line":169,"column":24},"end":{"line":169,"column":57}},"type":"binary-expr","locations":[{"start":{"line":169,"column":24},"end":{"line":169,"column":41}},{"start":{"line":169,"column":45},"end":{"line":169,"column":57}}]},"9":{"loc":{"start":{"line":170,"column":32},"end":{"line":170,"column":81}},"type":"binary-expr","locations":[{"start":{"line":170,"column":32},"end":{"line":170,"column":57}},{"start":{"line":170,"column":61},"end":{"line":170,"column":81}}]},"10":{"loc":{"start":{"line":180,"column":4},"end":{"line":182,"column":5}},"type":"if","locations":[{"start":{"line":180,"column":4},"end":{"line":182,"column":5}},{"start":{},"end":{}}]},"11":{"loc":{"start":{"line":195,"column":4},"end":{"line":195,"column":31}},"type":"if","locations":[{"start":{"line":195,"column":4},"end":{"line":195,"column":31}},{"start":{},"end":{}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\ConnectedRobots\\ConnectedRobots.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\ConnectedRobots\\ConnectedRobots.tsx","statementMap":{"0":{"start":{"line":20,"column":36},"end":{"line":20,"column":66}},"1":{"start":{"line":22,"column":2},"end":{"line":47,"column":9}},"2":{"start":{"line":25,"column":24},"end":{"line":25,"column":82}},"3":{"start":{"line":26,"column":4},"end":{"line":43,"column":6}},"4":{"start":{"line":29,"column":6},"end":{"line":29,"column":51}},"5":{"start":{"line":30,"column":6},"end":{"line":42,"column":7}},"6":{"start":{"line":31,"column":21},"end":{"line":31,"column":43}},"7":{"start":{"line":33,"column":8},"end":{"line":38,"column":9}},"8":{"start":{"line":34,"column":10},"end":{"line":34,"column":null}},"9":{"start":{"line":37,"column":10},"end":{"line":37,"column":null}},"10":{"start":{"line":41,"column":8},"end":{"line":41,"column":71}},"11":{"start":{"line":46,"column":4},"end":{"line":46,"column":37}},"12":{"start":{"line":46,"column":17},"end":{"line":46,"column":36}},"13":{"start":{"line":49,"column":2},"end":{"line":59,"column":4}}},"fnMap":{"0":{"name":"ConnectedRobots","decl":{"start":{"line":12,"column":24},"end":{"line":12,"column":39}},"loc":{"start":{"line":12,"column":39},"end":{"line":60,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":22,"column":12},"end":{"line":22,"column":15}},"loc":{"start":{"line":22,"column":17},"end":{"line":47,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":26,"column":28},"end":{"line":26,"column":29}},"loc":{"start":{"line":26,"column":38},"end":{"line":43,"column":5}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":46,"column":11},"end":{"line":46,"column":14}},"loc":{"start":{"line":46,"column":17},"end":{"line":46,"column":36}}}},"branchMap":{"0":{"loc":{"start":{"line":53,"column":33},"end":{"line":53,"column":122}},"type":"cond-expr","locations":[{"start":{"line":53,"column":53},"end":{"line":53,"column":66}},{"start":{"line":53,"column":70},"end":{"line":53,"column":121}}]},"1":{"loc":{"start":{"line":53,"column":70},"end":{"line":53,"column":121}},"type":"cond-expr","locations":[{"start":{"line":53,"column":82},"end":{"line":53,"column":97}},{"start":{"line":53,"column":100},"end":{"line":53,"column":121}}]},"2":{"loc":{"start":{"line":55,"column":11},"end":{"line":55,"column":118}},"type":"cond-expr","locations":[{"start":{"line":55,"column":31},"end":{"line":55,"column":113}},{"start":{"line":55,"column":116},"end":{"line":55,"column":118}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\Home\\Home.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\Home\\Home.tsx","statementMap":{"0":{"start":{"line":14,"column":2},"end":{"line":28,"column":null}}},"fnMap":{"0":{"name":"Home","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":13}},"loc":{"start":{"line":13,"column":13},"end":{"line":29,"column":1}}}},"branchMap":{},"s":{"0":0},"f":{"0":0},"b":{}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\MonitoringPage\\MonitoringPageComponents.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\MonitoringPage\\MonitoringPageComponents.tsx","statementMap":{"0":{"start":{"line":6,"column":41},"end":{"line":37,"column":1}},"1":{"start":{"line":7,"column":48},"end":{"line":7,"column":105}},"2":{"start":{"line":9,"column":19},"end":{"line":20,"column":4}},"3":{"start":{"line":21,"column":2},"end":{"line":36,"column":4}},"4":{"start":{"line":27,"column":27},"end":{"line":27,"column":61}},"5":{"start":{"line":29,"column":29},"end":{"line":29,"column":51}},"6":{"start":{"line":31,"column":31},"end":{"line":31,"column":70}},"7":{"start":{"line":40,"column":39},"end":{"line":64,"column":1}},"8":{"start":{"line":41,"column":18},"end":{"line":45,"column":4}},"9":{"start":{"line":47,"column":2},"end":{"line":63,"column":4}},"10":{"start":{"line":52,"column":10},"end":{"line":52,"column":null}},"11":{"start":{"line":55,"column":30},"end":{"line":55,"column":64}},"12":{"start":{"line":67,"column":43},"end":{"line":91,"column":1}},"13":{"start":{"line":68,"column":26},"end":{"line":68,"column":38}},"14":{"start":{"line":70,"column":21},"end":{"line":74,"column":3}},"15":{"start":{"line":71,"column":4},"end":{"line":71,"column":29}},"16":{"start":{"line":71,"column":22},"end":{"line":71,"column":29}},"17":{"start":{"line":72,"column":4},"end":{"line":72,"column":32}},"18":{"start":{"line":73,"column":4},"end":{"line":73,"column":16}},"19":{"start":{"line":76,"column":2},"end":{"line":90,"column":4}},"20":{"start":{"line":83,"column":27},"end":{"line":83,"column":50}},"21":{"start":{"line":85,"column":28},"end":{"line":85,"column":61}},"22":{"start":{"line":113,"column":53},"end":{"line":180,"column":1}},"23":{"start":{"line":121,"column":2},"end":{"line":179,"column":4}},"24":{"start":{"line":126,"column":10},"end":{"line":126,"column":49}},"25":{"start":{"line":126,"column":37},"end":{"line":126,"column":49}},"26":{"start":{"line":127,"column":27},"end":{"line":127,"column":47}},"27":{"start":{"line":128,"column":32},"end":{"line":128,"column":47}},"28":{"start":{"line":129,"column":32},"end":{"line":129,"column":75}},"29":{"start":{"line":130,"column":31},"end":{"line":130,"column":97}},"30":{"start":{"line":134,"column":38},"end":{"line":147,"column":11}},"31":{"start":{"line":135,"column":12},"end":{"line":135,"column":37}},"32":{"start":{"line":135,"column":30},"end":{"line":135,"column":37}},"33":{"start":{"line":136,"column":12},"end":{"line":146,"column":13}},"34":{"start":{"line":138,"column":14},"end":{"line":138,"column":65}},"35":{"start":{"line":141,"column":14},"end":{"line":143,"column":79}},"36":{"start":{"line":142,"column":16},"end":{"line":143,"column":79}},"37":{"start":{"line":143,"column":17},"end":{"line":143,"column":78}},"38":{"start":{"line":143,"column":39},"end":{"line":143,"column":75}},"39":{"start":{"line":145,"column":14},"end":{"line":145,"column":55}},"40":{"start":{"line":149,"column":10},"end":{"line":175,"column":12}},"41":{"start":{"line":184,"column":30},"end":{"line":228,"column":1}},"42":{"start":{"line":192,"column":38},"end":{"line":192,"column":68}},"43":{"start":{"line":194,"column":4},"end":{"line":220,"column":11}},"44":{"start":{"line":197,"column":26},"end":{"line":197,"column":84}},"45":{"start":{"line":198,"column":6},"end":{"line":216,"column":8}},"46":{"start":{"line":203,"column":8},"end":{"line":215,"column":9}},"47":{"start":{"line":204,"column":23},"end":{"line":204,"column":45}},"48":{"start":{"line":206,"column":10},"end":{"line":211,"column":11}},"49":{"start":{"line":207,"column":12},"end":{"line":207,"column":null}},"50":{"start":{"line":210,"column":12},"end":{"line":210,"column":null}},"51":{"start":{"line":214,"column":10},"end":{"line":214,"column":73}},"52":{"start":{"line":219,"column":6},"end":{"line":219,"column":39}},"53":{"start":{"line":219,"column":19},"end":{"line":219,"column":38}},"54":{"start":{"line":222,"column":2},"end":{"line":227,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":41},"end":{"line":6,"column":44}},"loc":{"start":{"line":6,"column":46},"end":{"line":37,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":27,"column":20},"end":{"line":27,"column":21}},"loc":{"start":{"line":27,"column":27},"end":{"line":27,"column":61}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":29,"column":24},"end":{"line":29,"column":25}},"loc":{"start":{"line":29,"column":29},"end":{"line":29,"column":51}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":31,"column":25},"end":{"line":31,"column":28}},"loc":{"start":{"line":31,"column":31},"end":{"line":31,"column":70}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":40,"column":39},"end":{"line":40,"column":42}},"loc":{"start":{"line":40,"column":44},"end":{"line":64,"column":1}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":51,"column":21},"end":{"line":51,"column":22}},"loc":{"start":{"line":52,"column":10},"end":{"line":52,"column":null}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":55,"column":23},"end":{"line":55,"column":26}},"loc":{"start":{"line":55,"column":30},"end":{"line":55,"column":64}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":67,"column":43},"end":{"line":67,"column":46}},"loc":{"start":{"line":67,"column":48},"end":{"line":91,"column":1}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":70,"column":21},"end":{"line":70,"column":24}},"loc":{"start":{"line":70,"column":26},"end":{"line":74,"column":3}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":83,"column":20},"end":{"line":83,"column":21}},"loc":{"start":{"line":83,"column":27},"end":{"line":83,"column":50}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":85,"column":21},"end":{"line":85,"column":22}},"loc":{"start":{"line":85,"column":28},"end":{"line":85,"column":61}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":113,"column":53},"end":{"line":113,"column":54}},"loc":{"start":{"line":120,"column":5},"end":{"line":180,"column":1}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":125,"column":19},"end":{"line":125,"column":20}},"loc":{"start":{"line":125,"column":33},"end":{"line":176,"column":9}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":134,"column":38},"end":{"line":134,"column":41}},"loc":{"start":{"line":134,"column":43},"end":{"line":147,"column":11}}},"14":{"name":"(anonymous_14)","decl":{"start":{"line":143,"column":30},"end":{"line":143,"column":34}},"loc":{"start":{"line":143,"column":39},"end":{"line":143,"column":75}}},"15":{"name":"(anonymous_15)","decl":{"start":{"line":184,"column":30},"end":{"line":184,"column":33}},"loc":{"start":{"line":184,"column":35},"end":{"line":228,"column":1}}},"16":{"name":"(anonymous_16)","decl":{"start":{"line":194,"column":14},"end":{"line":194,"column":17}},"loc":{"start":{"line":194,"column":19},"end":{"line":220,"column":5}}},"17":{"name":"(anonymous_17)","decl":{"start":{"line":198,"column":30},"end":{"line":198,"column":31}},"loc":{"start":{"line":198,"column":40},"end":{"line":216,"column":7}}},"18":{"name":"(anonymous_18)","decl":{"start":{"line":219,"column":13},"end":{"line":219,"column":16}},"loc":{"start":{"line":219,"column":19},"end":{"line":219,"column":38}}}},"branchMap":{"0":{"loc":{"start":{"line":71,"column":4},"end":{"line":71,"column":29}},"type":"if","locations":[{"start":{"line":71,"column":4},"end":{"line":71,"column":29}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":85,"column":28},"end":{"line":85,"column":61}},"type":"binary-expr","locations":[{"start":{"line":85,"column":28},"end":{"line":85,"column":45}},{"start":{"line":85,"column":49},"end":{"line":85,"column":61}}]},"2":{"loc":{"start":{"line":126,"column":10},"end":{"line":126,"column":49}},"type":"if","locations":[{"start":{"line":126,"column":10},"end":{"line":126,"column":49}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":129,"column":32},"end":{"line":129,"column":75}},"type":"binary-expr","locations":[{"start":{"line":129,"column":32},"end":{"line":129,"column":47}},{"start":{"line":129,"column":51},"end":{"line":129,"column":75}}]},"4":{"loc":{"start":{"line":130,"column":31},"end":{"line":130,"column":97}},"type":"binary-expr","locations":[{"start":{"line":130,"column":32},"end":{"line":130,"column":45}},{"start":{"line":130,"column":49},"end":{"line":130,"column":58}},{"start":{"line":130,"column":64},"end":{"line":130,"column":84}},{"start":{"line":130,"column":88},"end":{"line":130,"column":96}}]},"5":{"loc":{"start":{"line":135,"column":12},"end":{"line":135,"column":37}},"type":"if","locations":[{"start":{"line":135,"column":12},"end":{"line":135,"column":37}},{"start":{},"end":{}}]},"6":{"loc":{"start":{"line":136,"column":12},"end":{"line":146,"column":13}},"type":"if","locations":[{"start":{"line":136,"column":12},"end":{"line":146,"column":13}},{"start":{"line":140,"column":17},"end":{"line":146,"column":13}}]},"7":{"loc":{"start":{"line":136,"column":16},"end":{"line":136,"column":48}},"type":"binary-expr","locations":[{"start":{"line":136,"column":16},"end":{"line":136,"column":36}},{"start":{"line":136,"column":40},"end":{"line":136,"column":48}}]},"8":{"loc":{"start":{"line":141,"column":14},"end":{"line":143,"column":79}},"type":"if","locations":[{"start":{"line":141,"column":14},"end":{"line":143,"column":79}},{"start":{},"end":{}}]},"9":{"loc":{"start":{"line":142,"column":16},"end":{"line":143,"column":79}},"type":"if","locations":[{"start":{"line":142,"column":16},"end":{"line":143,"column":79}},{"start":{},"end":{}}]},"10":{"loc":{"start":{"line":151,"column":15},"end":{"line":157,"column":null}},"type":"binary-expr","locations":[{"start":{"line":151,"column":15},"end":{"line":151,"column":28}},{"start":{"line":152,"column":16},"end":{"line":156,"column":null}}]},"11":{"loc":{"start":{"line":153,"column":58},"end":{"line":153,"column":100}},"type":"cond-expr","locations":[{"start":{"line":153,"column":69},"end":{"line":153,"column":82}},{"start":{"line":153,"column":85},"end":{"line":153,"column":100}}]},"12":{"loc":{"start":{"line":153,"column":104},"end":{"line":153,"column":139}},"type":"cond-expr","locations":[{"start":{"line":153,"column":118},"end":{"line":153,"column":134}},{"start":{"line":153,"column":137},"end":{"line":153,"column":139}}]},"13":{"loc":{"start":{"line":156,"column":19},"end":{"line":156,"column":40}},"type":"cond-expr","locations":[{"start":{"line":156,"column":30},"end":{"line":156,"column":34}},{"start":{"line":156,"column":37},"end":{"line":156,"column":40}}]},"14":{"loc":{"start":{"line":163,"column":34},"end":{"line":163,"column":70}},"type":"cond-expr","locations":[{"start":{"line":163,"column":50},"end":{"line":163,"column":61}},{"start":{"line":163,"column":64},"end":{"line":163,"column":70}}]},"15":{"loc":{"start":{"line":164,"column":30},"end":{"line":164,"column":63}},"type":"cond-expr","locations":[{"start":{"line":164,"column":46},"end":{"line":164,"column":52}},{"start":{"line":164,"column":55},"end":{"line":164,"column":63}}]},"16":{"loc":{"start":{"line":165,"column":25},"end":{"line":165,"column":62}},"type":"cond-expr","locations":[{"start":{"line":165,"column":41},"end":{"line":165,"column":50}},{"start":{"line":165,"column":53},"end":{"line":165,"column":62}}]},"17":{"loc":{"start":{"line":166,"column":35},"end":{"line":166,"column":76}},"type":"cond-expr","locations":[{"start":{"line":166,"column":51},"end":{"line":166,"column":60}},{"start":{"line":166,"column":63},"end":{"line":166,"column":76}}]},"18":{"loc":{"start":{"line":167,"column":27},"end":{"line":167,"column":58}},"type":"cond-expr","locations":[{"start":{"line":167,"column":43},"end":{"line":167,"column":52}},{"start":{"line":167,"column":55},"end":{"line":167,"column":58}}]},"19":{"loc":{"start":{"line":171,"column":17},"end":{"line":171,"column":39}},"type":"binary-expr","locations":[{"start":{"line":171,"column":17},"end":{"line":171,"column":26}},{"start":{"line":171,"column":30},"end":{"line":171,"column":39}}]},"20":{"loc":{"start":{"line":172,"column":17},"end":{"line":172,"column":46}},"type":"binary-expr","locations":[{"start":{"line":172,"column":17},"end":{"line":172,"column":30}},{"start":{"line":172,"column":34},"end":{"line":172,"column":46}}]},"21":{"loc":{"start":{"line":150,"column":21},"end":{"line":150,"column":35}},"type":"binary-expr","locations":[{"start":{"line":150,"column":21},"end":{"line":150,"column":28}},{"start":{"line":150,"column":32},"end":{"line":150,"column":35}}]},"22":{"loc":{"start":{"line":225,"column":18},"end":{"line":225,"column":68}},"type":"cond-expr","locations":[{"start":{"line":225,"column":30},"end":{"line":225,"column":46}},{"start":{"line":225,"column":49},"end":{"line":225,"column":68}}]},"23":{"loc":{"start":{"line":225,"column":72},"end":{"line":225,"column":134}},"type":"cond-expr","locations":[{"start":{"line":225,"column":84},"end":{"line":225,"column":106}},{"start":{"line":225,"column":109},"end":{"line":225,"column":134}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0,0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\Robot\\Robot.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\Robot\\Robot.tsx","statementMap":{"0":{"start":{"line":11,"column":32},"end":{"line":11,"column":44}},"1":{"start":{"line":14,"column":36},"end":{"line":14,"column":51}},"2":{"start":{"line":16,"column":42},"end":{"line":17,"column":58}},"3":{"start":{"line":19,"column":26},"end":{"line":19,"column":61}},"4":{"start":{"line":24,"column":52},"end":{"line":24,"column":63}},"5":{"start":{"line":32,"column":22},"end":{"line":46,"column":3}},"6":{"start":{"line":33,"column":4},"end":{"line":45,"column":5}},"7":{"start":{"line":34,"column":23},"end":{"line":40,"column":8}},"8":{"start":{"line":41,"column":19},"end":{"line":41,"column":40}},"9":{"start":{"line":42,"column":6},"end":{"line":42,"column":24}},"10":{"start":{"line":44,"column":6},"end":{"line":44,"column":54}},"11":{"start":{"line":59,"column":2},"end":{"line":76,"column":26}},"12":{"start":{"line":60,"column":24},"end":{"line":60,"column":68}},"13":{"start":{"line":62,"column":4},"end":{"line":71,"column":6}},"14":{"start":{"line":63,"column":6},"end":{"line":70,"column":7}},"15":{"start":{"line":64,"column":21},"end":{"line":64,"column":43}},"16":{"start":{"line":65,"column":8},"end":{"line":65,"column":68}},"17":{"start":{"line":65,"column":36},"end":{"line":65,"column":68}},"18":{"start":{"line":66,"column":8},"end":{"line":66,"column":123}},"19":{"start":{"line":66,"column":30},"end":{"line":66,"column":123}},"20":{"start":{"line":66,"column":62},"end":{"line":66,"column":121}},"21":{"start":{"line":67,"column":8},"end":{"line":67,"column":140}},"22":{"start":{"line":67,"column":36},"end":{"line":67,"column":140}},"23":{"start":{"line":67,"column":68},"end":{"line":67,"column":138}},"24":{"start":{"line":69,"column":8},"end":{"line":69,"column":59}},"25":{"start":{"line":73,"column":4},"end":{"line":75,"column":6}},"26":{"start":{"line":74,"column":6},"end":{"line":74,"column":26}},"27":{"start":{"line":82,"column":2},"end":{"line":85,"column":21}},"28":{"start":{"line":83,"column":4},"end":{"line":83,"column":61}},"29":{"start":{"line":83,"column":54},"end":{"line":83,"column":61}},"30":{"start":{"line":84,"column":4},"end":{"line":84,"column":77}},"31":{"start":{"line":87,"column":2},"end":{"line":129,"column":4}},"32":{"start":{"line":95,"column":27},"end":{"line":95,"column":53}},"33":{"start":{"line":96,"column":28},"end":{"line":96,"column":89}},"34":{"start":{"line":96,"column":74},"end":{"line":96,"column":88}},"35":{"start":{"line":106,"column":12},"end":{"line":106,"column":null}},"36":{"start":{"line":119,"column":12},"end":{"line":119,"column":null}},"37":{"start":{"line":119,"column":56},"end":{"line":119,"column":77}},"38":{"start":{"line":120,"column":12},"end":{"line":120,"column":null}},"39":{"start":{"line":123,"column":12},"end":{"line":123,"column":null}},"40":{"start":{"line":123,"column":56},"end":{"line":123,"column":88}},"41":{"start":{"line":124,"column":12},"end":{"line":124,"column":null}}},"fnMap":{"0":{"name":"Robot","decl":{"start":{"line":9,"column":24},"end":{"line":9,"column":29}},"loc":{"start":{"line":9,"column":29},"end":{"line":130,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":32,"column":22},"end":{"line":32,"column":27}},"loc":{"start":{"line":32,"column":33},"end":{"line":46,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":59,"column":12},"end":{"line":59,"column":15}},"loc":{"start":{"line":59,"column":17},"end":{"line":76,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":62,"column":28},"end":{"line":62,"column":29}},"loc":{"start":{"line":62,"column":38},"end":{"line":71,"column":5}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":66,"column":46},"end":{"line":66,"column":58}},"loc":{"start":{"line":66,"column":62},"end":{"line":66,"column":121}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":67,"column":52},"end":{"line":67,"column":64}},"loc":{"start":{"line":67,"column":68},"end":{"line":67,"column":138}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":73,"column":11},"end":{"line":73,"column":14}},"loc":{"start":{"line":73,"column":16},"end":{"line":75,"column":5}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":82,"column":12},"end":{"line":82,"column":15}},"loc":{"start":{"line":82,"column":17},"end":{"line":85,"column":3}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":95,"column":20},"end":{"line":95,"column":21}},"loc":{"start":{"line":95,"column":27},"end":{"line":95,"column":53}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":96,"column":21},"end":{"line":96,"column":22}},"loc":{"start":{"line":96,"column":28},"end":{"line":96,"column":89}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":96,"column":68},"end":{"line":96,"column":71}},"loc":{"start":{"line":96,"column":74},"end":{"line":96,"column":88}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":105,"column":28},"end":{"line":105,"column":29}},"loc":{"start":{"line":106,"column":12},"end":{"line":106,"column":null}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":118,"column":27},"end":{"line":118,"column":30}},"loc":{"start":{"line":118,"column":32},"end":{"line":121,"column":11}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":119,"column":33},"end":{"line":119,"column":34}},"loc":{"start":{"line":119,"column":56},"end":{"line":119,"column":77}}},"14":{"name":"(anonymous_14)","decl":{"start":{"line":122,"column":27},"end":{"line":122,"column":30}},"loc":{"start":{"line":122,"column":32},"end":{"line":125,"column":11}}},"15":{"name":"(anonymous_15)","decl":{"start":{"line":123,"column":33},"end":{"line":123,"column":34}},"loc":{"start":{"line":123,"column":56},"end":{"line":123,"column":88}}}},"branchMap":{"0":{"loc":{"start":{"line":65,"column":8},"end":{"line":65,"column":68}},"type":"if","locations":[{"start":{"line":65,"column":8},"end":{"line":65,"column":68}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":66,"column":8},"end":{"line":66,"column":123}},"type":"if","locations":[{"start":{"line":66,"column":8},"end":{"line":66,"column":123}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":67,"column":8},"end":{"line":67,"column":140}},"type":"if","locations":[{"start":{"line":67,"column":8},"end":{"line":67,"column":140}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":83,"column":4},"end":{"line":83,"column":61}},"type":"if","locations":[{"start":{"line":83,"column":4},"end":{"line":83,"column":61}},{"start":{},"end":{}}]},"4":{"loc":{"start":{"line":83,"column":8},"end":{"line":83,"column":52}},"type":"binary-expr","locations":[{"start":{"line":83,"column":8},"end":{"line":83,"column":24}},{"start":{"line":83,"column":28},"end":{"line":83,"column":52}}]},"5":{"loc":{"start":{"line":96,"column":28},"end":{"line":96,"column":89}},"type":"binary-expr","locations":[{"start":{"line":96,"column":28},"end":{"line":96,"column":45}},{"start":{"line":96,"column":49},"end":{"line":96,"column":89}}]},"6":{"loc":{"start":{"line":103,"column":22},"end":{"line":103,"column":45}},"type":"cond-expr","locations":[{"start":{"line":103,"column":34},"end":{"line":103,"column":38}},{"start":{"line":103,"column":41},"end":{"line":103,"column":45}}]},"7":{"loc":{"start":{"line":108,"column":33},"end":{"line":110,"column":59}},"type":"cond-expr","locations":[{"start":{"line":109,"column":20},"end":{"line":109,"column":59}},{"start":{"line":110,"column":20},"end":{"line":110,"column":59}}]},"8":{"loc":{"start":{"line":123,"column":56},"end":{"line":123,"column":88}},"type":"cond-expr","locations":[{"start":{"line":123,"column":82},"end":{"line":123,"column":83}},{"start":{"line":123,"column":86},"end":{"line":123,"column":88}}]},"9":{"loc":{"start":{"line":125,"column":14},"end":{"line":125,"column":56}},"type":"cond-expr","locations":[{"start":{"line":125,"column":40},"end":{"line":125,"column":47}},{"start":{"line":125,"column":50},"end":{"line":125,"column":56}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\SimpleProgram\\SimpleProgram.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\SimpleProgram\\SimpleProgram.tsx","statementMap":{"0":{"start":{"line":13,"column":32},"end":{"line":17,"column":null}},"1":{"start":{"line":14,"column":2},"end":{"line":16,"column":null}},"2":{"start":{"line":24,"column":49},"end":{"line":53,"column":1}},"3":{"start":{"line":25,"column":2},"end":{"line":27,"column":3}},"4":{"start":{"line":26,"column":4},"end":{"line":26,"column":61}},"5":{"start":{"line":29,"column":2},"end":{"line":52,"column":4}},"6":{"start":{"line":32,"column":21},"end":{"line":32,"column":null}},"7":{"start":{"line":38,"column":8},"end":{"line":49,"column":10}},"8":{"start":{"line":58,"column":55},"end":{"line":80,"column":1}},"9":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"10":{"start":{"line":60,"column":4},"end":{"line":60,"column":64}},"11":{"start":{"line":63,"column":2},"end":{"line":79,"column":4}},"12":{"start":{"line":66,"column":24},"end":{"line":66,"column":null}},"13":{"start":{"line":71,"column":8},"end":{"line":76,"column":10}},"14":{"start":{"line":85,"column":49},"end":{"line":102,"column":1}},"15":{"start":{"line":86,"column":2},"end":{"line":88,"column":3}},"16":{"start":{"line":87,"column":4},"end":{"line":87,"column":61}},"17":{"start":{"line":90,"column":2},"end":{"line":101,"column":4}},"18":{"start":{"line":93,"column":21},"end":{"line":93,"column":null}},"19":{"start":{"line":98,"column":8},"end":{"line":98,"column":75}},"20":{"start":{"line":113,"column":44},"end":{"line":134,"column":null}},"21":{"start":{"line":118,"column":2},"end":{"line":133,"column":null}},"22":{"start":{"line":142,"column":32},"end":{"line":190,"column":1}},"23":{"start":{"line":143,"column":22},"end":{"line":143,"column":59}},"24":{"start":{"line":143,"column":45},"end":{"line":143,"column":58}},"25":{"start":{"line":144,"column":26},"end":{"line":144,"column":67}},"26":{"start":{"line":144,"column":49},"end":{"line":144,"column":66}},"27":{"start":{"line":145,"column":26},"end":{"line":145,"column":67}},"28":{"start":{"line":145,"column":49},"end":{"line":145,"column":66}},"29":{"start":{"line":146,"column":29},"end":{"line":146,"column":73}},"30":{"start":{"line":146,"column":52},"end":{"line":146,"column":72}},"31":{"start":{"line":148,"column":19},"end":{"line":148,"column":32}},"32":{"start":{"line":149,"column":38},"end":{"line":149,"column":55}},"33":{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},"34":{"start":{"line":152,"column":4},"end":{"line":152,"column":62}},"35":{"start":{"line":155,"column":18},"end":{"line":155,"column":38}},"36":{"start":{"line":157,"column":2},"end":{"line":189,"column":4}},"37":{"start":{"line":167,"column":27},"end":{"line":167,"column":54}},"38":{"start":{"line":167,"column":48},"end":{"line":167,"column":53}},"39":{"start":{"line":174,"column":27},"end":{"line":174,"column":54}},"40":{"start":{"line":174,"column":48},"end":{"line":174,"column":53}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":13,"column":32},"end":{"line":13,"column":33}},"loc":{"start":{"line":14,"column":2},"end":{"line":16,"column":null}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":24,"column":49},"end":{"line":24,"column":50}},"loc":{"start":{"line":24,"column":63},"end":{"line":53,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":31,"column":17},"end":{"line":31,"column":18}},"loc":{"start":{"line":31,"column":28},"end":{"line":50,"column":7}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":58,"column":55},"end":{"line":58,"column":56}},"loc":{"start":{"line":58,"column":72},"end":{"line":80,"column":1}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":65,"column":20},"end":{"line":65,"column":21}},"loc":{"start":{"line":65,"column":31},"end":{"line":77,"column":7}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":85,"column":49},"end":{"line":85,"column":50}},"loc":{"start":{"line":85,"column":63},"end":{"line":102,"column":1}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":92,"column":17},"end":{"line":92,"column":18}},"loc":{"start":{"line":92,"column":28},"end":{"line":99,"column":7}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":113,"column":44},"end":{"line":113,"column":45}},"loc":{"start":{"line":118,"column":2},"end":{"line":133,"column":null}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":142,"column":32},"end":{"line":142,"column":35}},"loc":{"start":{"line":142,"column":37},"end":{"line":190,"column":1}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":143,"column":38},"end":{"line":143,"column":39}},"loc":{"start":{"line":143,"column":45},"end":{"line":143,"column":58}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":144,"column":42},"end":{"line":144,"column":43}},"loc":{"start":{"line":144,"column":49},"end":{"line":144,"column":66}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":145,"column":42},"end":{"line":145,"column":43}},"loc":{"start":{"line":145,"column":49},"end":{"line":145,"column":66}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":146,"column":45},"end":{"line":146,"column":46}},"loc":{"start":{"line":146,"column":52},"end":{"line":146,"column":72}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":167,"column":21},"end":{"line":167,"column":24}},"loc":{"start":{"line":167,"column":27},"end":{"line":167,"column":54}}},"14":{"name":"(anonymous_14)","decl":{"start":{"line":167,"column":41},"end":{"line":167,"column":42}},"loc":{"start":{"line":167,"column":48},"end":{"line":167,"column":53}}},"15":{"name":"(anonymous_15)","decl":{"start":{"line":174,"column":21},"end":{"line":174,"column":24}},"loc":{"start":{"line":174,"column":27},"end":{"line":174,"column":54}}},"16":{"name":"(anonymous_16)","decl":{"start":{"line":174,"column":41},"end":{"line":174,"column":42}},"loc":{"start":{"line":174,"column":48},"end":{"line":174,"column":53}}}},"branchMap":{"0":{"loc":{"start":{"line":25,"column":2},"end":{"line":27,"column":3}},"type":"if","locations":[{"start":{"line":25,"column":2},"end":{"line":27,"column":3}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":42,"column":16},"end":{"line":42,"column":68}},"type":"cond-expr","locations":[{"start":{"line":42,"column":32},"end":{"line":42,"column":50}},{"start":{"line":42,"column":53},"end":{"line":42,"column":68}}]},"2":{"loc":{"start":{"line":45,"column":15},"end":{"line":45,"column":40}},"type":"cond-expr","locations":[{"start":{"line":45,"column":31},"end":{"line":45,"column":34}},{"start":{"line":45,"column":37},"end":{"line":45,"column":40}}]},"3":{"loc":{"start":{"line":47,"column":13},"end":{"line":47,"column":47}},"type":"binary-expr","locations":[{"start":{"line":47,"column":13},"end":{"line":47,"column":29}},{"start":{"line":47,"column":33},"end":{"line":47,"column":47}}]},"4":{"loc":{"start":{"line":39,"column":19},"end":{"line":39,"column":33}},"type":"binary-expr","locations":[{"start":{"line":39,"column":19},"end":{"line":39,"column":26}},{"start":{"line":39,"column":30},"end":{"line":39,"column":33}}]},"5":{"loc":{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},"type":"if","locations":[{"start":{"line":59,"column":2},"end":{"line":61,"column":3}},{"start":{},"end":{}}]},"6":{"loc":{"start":{"line":74,"column":13},"end":{"line":74,"column":47}},"type":"binary-expr","locations":[{"start":{"line":74,"column":13},"end":{"line":74,"column":26}},{"start":{"line":74,"column":30},"end":{"line":74,"column":47}}]},"7":{"loc":{"start":{"line":72,"column":19},"end":{"line":72,"column":36}},"type":"binary-expr","locations":[{"start":{"line":72,"column":19},"end":{"line":72,"column":29}},{"start":{"line":72,"column":33},"end":{"line":72,"column":36}}]},"8":{"loc":{"start":{"line":86,"column":2},"end":{"line":88,"column":3}},"type":"if","locations":[{"start":{"line":86,"column":2},"end":{"line":88,"column":3}},{"start":{},"end":{}}]},"9":{"loc":{"start":{"line":98,"column":41},"end":{"line":98,"column":68}},"type":"binary-expr","locations":[{"start":{"line":98,"column":41},"end":{"line":98,"column":50}},{"start":{"line":98,"column":54},"end":{"line":98,"column":68}}]},"10":{"loc":{"start":{"line":98,"column":24},"end":{"line":98,"column":38}},"type":"binary-expr","locations":[{"start":{"line":98,"column":24},"end":{"line":98,"column":31}},{"start":{"line":98,"column":35},"end":{"line":98,"column":38}}]},"11":{"loc":{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},"type":"if","locations":[{"start":{"line":151,"column":2},"end":{"line":153,"column":3}},{"start":{},"end":{}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\TemplatePage\\Template.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\TemplatePage\\Template.tsx","statementMap":{"0":{"start":{"line":4,"column":2},"end":{"line":8,"column":null}}},"fnMap":{"0":{"name":"TemplatePage","decl":{"start":{"line":3,"column":9},"end":{"line":3,"column":21}},"loc":{"start":{"line":3,"column":21},"end":{"line":9,"column":1}}}},"branchMap":{},"s":{"0":0},"f":{"0":0},"b":{}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\VisProg.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\VisProg.tsx","statementMap":{"0":{"start":{"line":29,"column":29},"end":{"line":35,"column":2}},"1":{"start":{"line":42,"column":17},"end":{"line":57,"column":2}},"2":{"start":{"line":42,"column":40},"end":{"line":57,"column":2}},"3":{"start":{"line":67,"column":18},"end":{"line":131,"column":1}},"4":{"start":{"line":82,"column":6},"end":{"line":82,"column":40}},"5":{"start":{"line":83,"column":26},"end":{"line":83,"column":37}},"6":{"start":{"line":85,"column":2},"end":{"line":92,"column":5}},"7":{"start":{"line":86,"column":20},"end":{"line":89,"column":5}},"8":{"start":{"line":87,"column":6},"end":{"line":87,"column":45}},"9":{"start":{"line":87,"column":38},"end":{"line":87,"column":45}},"10":{"start":{"line":88,"column":6},"end":{"line":88,"column":45}},"11":{"start":{"line":88,"column":38},"end":{"line":88,"column":45}},"12":{"start":{"line":90,"column":4},"end":{"line":90,"column":48}},"13":{"start":{"line":91,"column":4},"end":{"line":91,"column":64}},"14":{"start":{"line":91,"column":17},"end":{"line":91,"column":63}},"15":{"start":{"line":94,"column":2},"end":{"line":130,"column":4}},"16":{"start":{"line":111,"column":33},"end":{"line":111,"column":55}},"17":{"start":{"line":123,"column":33},"end":{"line":123,"column":39}},"18":{"start":{"line":124,"column":33},"end":{"line":124,"column":39}},"19":{"start":{"line":141,"column":2},"end":{"line":145,"column":4}},"20":{"start":{"line":150,"column":17},"end":{"line":150,"column":31}},"21":{"start":{"line":151,"column":18},"end":{"line":151,"column":26}},"22":{"start":{"line":152,"column":2},"end":{"line":152,"column":48}},"23":{"start":{"line":153,"column":2},"end":{"line":167,"column":72}},"24":{"start":{"line":161,"column":4},"end":{"line":161,"column":null}},"25":{"start":{"line":161,"column":17},"end":{"line":161,"column":null}},"26":{"start":{"line":162,"column":4},"end":{"line":162,"column":65}},"27":{"start":{"line":166,"column":4},"end":{"line":166,"column":73}},"28":{"start":{"line":167,"column":17},"end":{"line":167,"column":70}},"29":{"start":{"line":168,"column":2},"end":{"line":168,"column":23}},"30":{"start":{"line":175,"column":20},"end":{"line":175,"column":43}},"31":{"start":{"line":176,"column":2},"end":{"line":180,"column":7}},"32":{"start":{"line":176,"column":49},"end":{"line":176,"column":66}},"33":{"start":{"line":178,"column":22},"end":{"line":178,"column":42}},"34":{"start":{"line":179,"column":6},"end":{"line":179,"column":null}},"35":{"start":{"line":191,"column":52},"end":{"line":191,"column":67}},"36":{"start":{"line":192,"column":26},"end":{"line":192,"column":75}},"37":{"start":{"line":192,"column":53},"end":{"line":192,"column":74}},"38":{"start":{"line":194,"column":21},"end":{"line":199,"column":3}},"39":{"start":{"line":195,"column":19},"end":{"line":195,"column":33}},"40":{"start":{"line":196,"column":4},"end":{"line":196,"column":32}},"41":{"start":{"line":197,"column":4},"end":{"line":197,"column":31}},"42":{"start":{"line":198,"column":4},"end":{"line":198,"column":18}},"43":{"start":{"line":201,"column":2},"end":{"line":210,"column":3}},"44":{"start":{"line":202,"column":4},"end":{"line":209,"column":6}},"45":{"start":{"line":204,"column":59},"end":{"line":204,"column":86}},"46":{"start":{"line":212,"column":2},"end":{"line":217,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":42,"column":17},"end":{"line":42,"column":18}},"loc":{"start":{"line":42,"column":40},"end":{"line":57,"column":2}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":67,"column":18},"end":{"line":67,"column":21}},"loc":{"start":{"line":67,"column":23},"end":{"line":131,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":85,"column":12},"end":{"line":85,"column":15}},"loc":{"start":{"line":85,"column":17},"end":{"line":92,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":86,"column":20},"end":{"line":86,"column":21}},"loc":{"start":{"line":86,"column":41},"end":{"line":89,"column":5}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":91,"column":11},"end":{"line":91,"column":14}},"loc":{"start":{"line":91,"column":17},"end":{"line":91,"column":63}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":111,"column":16},"end":{"line":111,"column":17}},"loc":{"start":{"line":111,"column":33},"end":{"line":111,"column":55}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":123,"column":27},"end":{"line":123,"column":30}},"loc":{"start":{"line":123,"column":33},"end":{"line":123,"column":39}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":124,"column":27},"end":{"line":124,"column":30}},"loc":{"start":{"line":124,"column":33},"end":{"line":124,"column":39}}},"8":{"name":"VisualProgrammingUI","decl":{"start":{"line":140,"column":9},"end":{"line":140,"column":28}},"loc":{"start":{"line":140,"column":28},"end":{"line":146,"column":1}}},"9":{"name":"runProgramm","decl":{"start":{"line":149,"column":16},"end":{"line":149,"column":27}},"loc":{"start":{"line":149,"column":27},"end":{"line":169,"column":1}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":160,"column":9},"end":{"line":160,"column":10}},"loc":{"start":{"line":160,"column":17},"end":{"line":167,"column":3}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":167,"column":11},"end":{"line":167,"column":14}},"loc":{"start":{"line":167,"column":17},"end":{"line":167,"column":70}}},"12":{"name":"graphReducer","decl":{"start":{"line":174,"column":16},"end":{"line":174,"column":28}},"loc":{"start":{"line":174,"column":28},"end":{"line":181,"column":1}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":176,"column":42},"end":{"line":176,"column":43}},"loc":{"start":{"line":176,"column":49},"end":{"line":176,"column":66}}},"14":{"name":"(anonymous_14)","decl":{"start":{"line":177,"column":9},"end":{"line":177,"column":10}},"loc":{"start":{"line":177,"column":15},"end":{"line":180,"column":5}}},"15":{"name":"VisProgPage","decl":{"start":{"line":190,"column":9},"end":{"line":190,"column":20}},"loc":{"start":{"line":190,"column":20},"end":{"line":218,"column":1}}},"16":{"name":"(anonymous_16)","decl":{"start":{"line":192,"column":42},"end":{"line":192,"column":43}},"loc":{"start":{"line":192,"column":53},"end":{"line":192,"column":74}}},"17":{"name":"(anonymous_17)","decl":{"start":{"line":194,"column":21},"end":{"line":194,"column":24}},"loc":{"start":{"line":194,"column":26},"end":{"line":199,"column":3}}},"18":{"name":"(anonymous_18)","decl":{"start":{"line":204,"column":53},"end":{"line":204,"column":56}},"loc":{"start":{"line":204,"column":59},"end":{"line":204,"column":86}}}},"branchMap":{"0":{"loc":{"start":{"line":87,"column":6},"end":{"line":87,"column":45}},"type":"if","locations":[{"start":{"line":87,"column":6},"end":{"line":87,"column":45}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":87,"column":10},"end":{"line":87,"column":36}},"type":"binary-expr","locations":[{"start":{"line":87,"column":10},"end":{"line":87,"column":19}},{"start":{"line":87,"column":23},"end":{"line":87,"column":36}}]},"2":{"loc":{"start":{"line":88,"column":6},"end":{"line":88,"column":45}},"type":"if","locations":[{"start":{"line":88,"column":6},"end":{"line":88,"column":45}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":88,"column":10},"end":{"line":88,"column":36}},"type":"binary-expr","locations":[{"start":{"line":88,"column":10},"end":{"line":88,"column":19}},{"start":{"line":88,"column":23},"end":{"line":88,"column":36}}]},"4":{"loc":{"start":{"line":161,"column":4},"end":{"line":161,"column":null}},"type":"if","locations":[{"start":{"line":161,"column":4},"end":{"line":161,"column":null}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":201,"column":2},"end":{"line":210,"column":3}},"type":"if","locations":[{"start":{"line":201,"column":2},"end":{"line":210,"column":3}},{"start":{},"end":{}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\EditorUndoRedo.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\EditorUndoRedo.ts","statementMap":{"0":{"start":{"line":28,"column":24},"end":{"line":129,"column":1}},"1":{"start":{"line":33,"column":52},"end":{"line":129,"column":1}},"2":{"start":{"line":34,"column":36},"end":{"line":34,"column":40}},"3":{"start":{"line":42,"column":22},"end":{"line":45,"column":5}},"4":{"start":{"line":42,"column":65},"end":{"line":45,"column":4}},"5":{"start":{"line":47,"column":23},"end":{"line":47,"column":44}},"6":{"start":{"line":49,"column":2},"end":{"line":128,"column":null}},"7":{"start":{"line":56,"column":20},"end":{"line":56,"column":25}},"8":{"start":{"line":58,"column":6},"end":{"line":63,"column":7}},"9":{"start":{"line":59,"column":8},"end":{"line":62,"column":11}},"10":{"start":{"line":72,"column":20},"end":{"line":72,"column":25}},"11":{"start":{"line":73,"column":6},"end":{"line":73,"column":37}},"12":{"start":{"line":73,"column":30},"end":{"line":73,"column":37}},"13":{"start":{"line":75,"column":23},"end":{"line":75,"column":40}},"14":{"start":{"line":76,"column":44},"end":{"line":76,"column":62}},"15":{"start":{"line":78,"column":6},"end":{"line":81,"column":9}},"16":{"start":{"line":83,"column":6},"end":{"line":83,"column":41}},"17":{"start":{"line":91,"column":20},"end":{"line":91,"column":25}},"18":{"start":{"line":92,"column":6},"end":{"line":92,"column":39}},"19":{"start":{"line":92,"column":32},"end":{"line":92,"column":39}},"20":{"start":{"line":94,"column":23},"end":{"line":94,"column":42}},"21":{"start":{"line":95,"column":44},"end":{"line":95,"column":62}},"22":{"start":{"line":97,"column":6},"end":{"line":100,"column":9}},"23":{"start":{"line":102,"column":6},"end":{"line":102,"column":39}},"24":{"start":{"line":113,"column":6},"end":{"line":113,"column":27}},"25":{"start":{"line":114,"column":6},"end":{"line":114,"column":35}},"26":{"start":{"line":115,"column":6},"end":{"line":115,"column":51}},"27":{"start":{"line":115,"column":24},"end":{"line":115,"column":51}},"28":{"start":{"line":124,"column":6},"end":{"line":126,"column":13}},"29":{"start":{"line":125,"column":8},"end":{"line":125,"column":38}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":28,"column":24},"end":{"line":28,"column":null}},"loc":{"start":{"line":33,"column":52},"end":{"line":129,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":33,"column":52},"end":{"line":33,"column":53}},"loc":{"start":{"line":33,"column":70},"end":{"line":129,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":42,"column":22},"end":{"line":42,"column":23}},"loc":{"start":{"line":42,"column":65},"end":{"line":45,"column":4}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":55,"column":18},"end":{"line":55,"column":21}},"loc":{"start":{"line":55,"column":23},"end":{"line":65,"column":5}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":71,"column":10},"end":{"line":71,"column":13}},"loc":{"start":{"line":71,"column":15},"end":{"line":84,"column":5}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":90,"column":10},"end":{"line":90,"column":13}},"loc":{"start":{"line":90,"column":15},"end":{"line":103,"column":5}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":112,"column":22},"end":{"line":112,"column":25}},"loc":{"start":{"line":112,"column":27},"end":{"line":116,"column":5}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":123,"column":20},"end":{"line":123,"column":23}},"loc":{"start":{"line":123,"column":25},"end":{"line":127,"column":5}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":124,"column":39},"end":{"line":124,"column":42}},"loc":{"start":{"line":124,"column":44},"end":{"line":126,"column":7}}}},"branchMap":{"0":{"loc":{"start":{"line":58,"column":6},"end":{"line":63,"column":7}},"type":"if","locations":[{"start":{"line":58,"column":6},"end":{"line":63,"column":7}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":73,"column":6},"end":{"line":73,"column":37}},"type":"if","locations":[{"start":{"line":73,"column":6},"end":{"line":73,"column":37}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":92,"column":6},"end":{"line":92,"column":39}},"type":"if","locations":[{"start":{"line":92,"column":6},"end":{"line":92,"column":39}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":115,"column":6},"end":{"line":115,"column":51}},"type":"if","locations":[{"start":{"line":115,"column":6},"end":{"line":115,"column":51}},{"start":{},"end":{}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\HandleRuleLogic.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\HandleRuleLogic.ts","statementMap":{"0":{"start":{"line":35,"column":26},"end":{"line":39,"column":null}},"1":{"start":{"line":38,"column":52},"end":{"line":38,"column":99}},"2":{"start":{"line":42,"column":22},"end":{"line":53,"column":1}},"3":{"start":{"line":48,"column":21},"end":{"line":50,"column":40}},"4":{"start":{"line":49,"column":17},"end":{"line":49,"column":42}},"5":{"start":{"line":50,"column":20},"end":{"line":50,"column":39}},"6":{"start":{"line":52,"column":2},"end":{"line":52,"column":89}},"7":{"start":{"line":75,"column":16},"end":{"line":75,"column":45}},"8":{"start":{"line":76,"column":24},"end":{"line":76,"column":68}},"9":{"start":{"line":76,"column":48},"end":{"line":76,"column":67}},"10":{"start":{"line":79,"column":2},"end":{"line":85,"column":40}},"11":{"start":{"line":80,"column":4},"end":{"line":80,"column":43}},"12":{"start":{"line":87,"column":2},"end":{"line":109,"column":4}},"13":{"start":{"line":90,"column":37},"end":{"line":92,"column":76}},"14":{"start":{"line":94,"column":4},"end":{"line":94,"column":74}},"15":{"start":{"line":94,"column":24},"end":{"line":94,"column":73}},"16":{"start":{"line":96,"column":30},"end":{"line":96,"column":112}},"17":{"start":{"line":96,"column":51},"end":{"line":96,"column":111}},"18":{"start":{"line":100,"column":39},"end":{"line":104,"column":6}},"19":{"start":{"line":105,"column":24},"end":{"line":105,"column":84}},"20":{"start":{"line":108,"column":4},"end":{"line":108,"column":59}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":38,"column":16},"end":{"line":38,"column":17}},"loc":{"start":{"line":38,"column":49},"end":{"line":38,"column":100}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":42,"column":22},"end":{"line":42,"column":null}},"loc":{"start":{"line":46,"column":17},"end":{"line":53,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":49,"column":9},"end":{"line":49,"column":13}},"loc":{"start":{"line":49,"column":17},"end":{"line":49,"column":42}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":50,"column":10},"end":{"line":50,"column":16}},"loc":{"start":{"line":50,"column":20},"end":{"line":50,"column":39}}},"4":{"name":"useHandleRules","decl":{"start":{"line":69,"column":16},"end":{"line":69,"column":30}},"loc":{"start":{"line":73,"column":21},"end":{"line":110,"column":1}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":76,"column":37},"end":{"line":76,"column":38}},"loc":{"start":{"line":76,"column":48},"end":{"line":76,"column":67}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":79,"column":12},"end":{"line":79,"column":15}},"loc":{"start":{"line":79,"column":17},"end":{"line":85,"column":3}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":87,"column":9},"end":{"line":87,"column":10}},"loc":{"start":{"line":87,"column":36},"end":{"line":109,"column":3}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":96,"column":43},"end":{"line":96,"column":47}},"loc":{"start":{"line":96,"column":51},"end":{"line":96,"column":111}}}},"branchMap":{"0":{"loc":{"start":{"line":52,"column":9},"end":{"line":52,"column":88}},"type":"cond-expr","locations":[{"start":{"line":52,"column":22},"end":{"line":52,"column":65}},{"start":{"line":52,"column":68},"end":{"line":52,"column":88}}]},"1":{"loc":{"start":{"line":90,"column":37},"end":{"line":92,"column":76}},"type":"cond-expr","locations":[{"start":{"line":91,"column":8},"end":{"line":91,"column":18}},{"start":{"line":92,"column":8},"end":{"line":92,"column":76}}]},"2":{"loc":{"start":{"line":94,"column":4},"end":{"line":94,"column":74}},"type":"if","locations":[{"start":{"line":94,"column":4},"end":{"line":94,"column":74}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":96,"column":51},"end":{"line":96,"column":111}},"type":"binary-expr","locations":[{"start":{"line":96,"column":51},"end":{"line":96,"column":73}},{"start":{"line":96,"column":77},"end":{"line":96,"column":111}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\HandleRules.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\HandleRules.ts","statementMap":{"0":{"start":{"line":12,"column":2},"end":{"line":17,"column":null}},"1":{"start":{"line":13,"column":23},"end":{"line":13,"column":95}},"2":{"start":{"line":13,"column":66},"end":{"line":13,"column":87}},"3":{"start":{"line":14,"column":4},"end":{"line":16,"column":108}},"4":{"start":{"line":14,"column":34},"end":{"line":14,"column":53}},"5":{"start":{"line":26,"column":2},"end":{"line":31,"column":null}},"6":{"start":{"line":27,"column":23},"end":{"line":27,"column":89}},"7":{"start":{"line":27,"column":66},"end":{"line":27,"column":87}},"8":{"start":{"line":28,"column":4},"end":{"line":30,"column":113}},"9":{"start":{"line":28,"column":34},"end":{"line":28,"column":108}},"10":{"start":{"line":39,"column":2},"end":{"line":43,"column":3}},"11":{"start":{"line":40,"column":4},"end":{"line":42,"column":82}}},"fnMap":{"0":{"name":"allowOnlyConnectionsFromType","decl":{"start":{"line":11,"column":16},"end":{"line":11,"column":44}},"loc":{"start":{"line":11,"column":64},"end":{"line":18,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":10},"end":{"line":12,"column":11}},"loc":{"start":{"line":12,"column":26},"end":{"line":17,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":13,"column":58},"end":{"line":13,"column":62}},"loc":{"start":{"line":13,"column":66},"end":{"line":13,"column":87}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":14,"column":26},"end":{"line":14,"column":30}},"loc":{"start":{"line":14,"column":34},"end":{"line":14,"column":53}}},"4":{"name":"allowOnlyConnectionsFromHandle","decl":{"start":{"line":25,"column":16},"end":{"line":25,"column":46}},"loc":{"start":{"line":25,"column":94},"end":{"line":32,"column":1}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":26,"column":10},"end":{"line":26,"column":11}},"loc":{"start":{"line":26,"column":26},"end":{"line":31,"column":3}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":27,"column":58},"end":{"line":27,"column":62}},"loc":{"start":{"line":27,"column":66},"end":{"line":27,"column":87}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":28,"column":24},"end":{"line":28,"column":30}},"loc":{"start":{"line":28,"column":34},"end":{"line":28,"column":108}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":39,"column":2},"end":{"line":39,"column":3}},"loc":{"start":{"line":39,"column":20},"end":{"line":43,"column":3}}}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":11},"end":{"line":16,"column":107}},"type":"cond-expr","locations":[{"start":{"line":15,"column":8},"end":{"line":15,"column":28}},{"start":{"line":16,"column":8},"end":{"line":16,"column":107}}]},"1":{"loc":{"start":{"line":28,"column":11},"end":{"line":30,"column":112}},"type":"cond-expr","locations":[{"start":{"line":29,"column":8},"end":{"line":29,"column":28}},{"start":{"line":30,"column":8},"end":{"line":30,"column":112}}]},"2":{"loc":{"start":{"line":28,"column":34},"end":{"line":28,"column":108}},"type":"binary-expr","locations":[{"start":{"line":28,"column":34},"end":{"line":28,"column":69}},{"start":{"line":28,"column":73},"end":{"line":28,"column":108}}]},"3":{"loc":{"start":{"line":40,"column":11},"end":{"line":42,"column":81}},"type":"cond-expr","locations":[{"start":{"line":41,"column":8},"end":{"line":41,"column":28}},{"start":{"line":42,"column":8},"end":{"line":42,"column":81}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\NodeRegistry.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\NodeRegistry.ts","statementMap":{"0":{"start":{"line":80,"column":25},"end":{"line":89,"column":2}},"1":{"start":{"line":96,"column":28},"end":{"line":105,"column":2}},"2":{"start":{"line":114,"column":27},"end":{"line":123,"column":null}},"3":{"start":{"line":132,"column":31},"end":{"line":153,"column":null}},"4":{"start":{"line":161,"column":34},"end":{"line":182,"column":null}},"5":{"start":{"line":189,"column":27},"end":{"line":192,"column":null}},"6":{"start":{"line":190,"column":15},"end":{"line":190,"column":20}},"7":{"start":{"line":191,"column":13},"end":{"line":191,"column":18}},"8":{"start":{"line":200,"column":28},"end":{"line":206,"column":null}},"9":{"start":{"line":201,"column":15},"end":{"line":201,"column":20}},"10":{"start":{"line":202,"column":13},"end":{"line":202,"column":18}},"11":{"start":{"line":203,"column":15},"end":{"line":203,"column":20}},"12":{"start":{"line":204,"column":22},"end":{"line":204,"column":27}},"13":{"start":{"line":205,"column":25},"end":{"line":205,"column":30}},"14":{"start":{"line":211,"column":28},"end":{"line":220,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":190,"column":9},"end":{"line":190,"column":12}},"loc":{"start":{"line":190,"column":15},"end":{"line":190,"column":20}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":191,"column":7},"end":{"line":191,"column":10}},"loc":{"start":{"line":191,"column":13},"end":{"line":191,"column":18}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":201,"column":9},"end":{"line":201,"column":12}},"loc":{"start":{"line":201,"column":15},"end":{"line":201,"column":20}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":202,"column":7},"end":{"line":202,"column":10}},"loc":{"start":{"line":202,"column":13},"end":{"line":202,"column":18}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":203,"column":9},"end":{"line":203,"column":12}},"loc":{"start":{"line":203,"column":15},"end":{"line":203,"column":20}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":204,"column":16},"end":{"line":204,"column":19}},"loc":{"start":{"line":204,"column":22},"end":{"line":204,"column":27}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":205,"column":19},"end":{"line":205,"column":22}},"loc":{"start":{"line":205,"column":25},"end":{"line":205,"column":30}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"b":{}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\VisProgStores.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\VisProgStores.tsx","statementMap":{"0":{"start":{"line":33,"column":24},"end":{"line":33,"column":71}},"1":{"start":{"line":34,"column":4},"end":{"line":43,"column":null}},"2":{"start":{"line":48,"column":20},"end":{"line":48,"column":91}},"3":{"start":{"line":49,"column":18},"end":{"line":49,"column":83}},"4":{"start":{"line":50,"column":27},"end":{"line":50,"column":158}},"5":{"start":{"line":52,"column":32},"end":{"line":52,"column":71}},"6":{"start":{"line":56,"column":29},"end":{"line":56,"column":31}},"7":{"start":{"line":70,"column":21},"end":{"line":310,"column":null}},"8":{"start":{"line":70,"column":63},"end":{"line":310,"column":4}},"9":{"start":{"line":82,"column":26},"end":{"line":82,"column":48}},"10":{"start":{"line":87,"column":30},"end":{"line":87,"column":82}},"11":{"start":{"line":89,"column":28},"end":{"line":89,"column":85}},"12":{"start":{"line":89,"column":50},"end":{"line":89,"column":84}},"13":{"start":{"line":93,"column":4},"end":{"line":101,"column":9}},"14":{"start":{"line":94,"column":22},"end":{"line":94,"column":33}},"15":{"start":{"line":96,"column":27},"end":{"line":96,"column":65}},"16":{"start":{"line":96,"column":45},"end":{"line":96,"column":64}},"17":{"start":{"line":97,"column":27},"end":{"line":97,"column":65}},"18":{"start":{"line":97,"column":45},"end":{"line":97,"column":64}},"19":{"start":{"line":99,"column":8},"end":{"line":99,"column":116}},"20":{"start":{"line":99,"column":26},"end":{"line":99,"column":114}},"21":{"start":{"line":100,"column":8},"end":{"line":100,"column":116}},"22":{"start":{"line":100,"column":26},"end":{"line":100,"column":114}},"23":{"start":{"line":107,"column":4},"end":{"line":107,"column":null}},"24":{"start":{"line":115,"column":4},"end":{"line":115,"column":25}},"25":{"start":{"line":116,"column":4},"end":{"line":116,"column":51}},"26":{"start":{"line":119,"column":18},"end":{"line":119,"column":29}},"27":{"start":{"line":121,"column":23},"end":{"line":121,"column":67}},"28":{"start":{"line":121,"column":41},"end":{"line":121,"column":66}},"29":{"start":{"line":122,"column":23},"end":{"line":122,"column":67}},"30":{"start":{"line":122,"column":41},"end":{"line":122,"column":66}},"31":{"start":{"line":124,"column":4},"end":{"line":124,"column":118}},"32":{"start":{"line":124,"column":22},"end":{"line":124,"column":116}},"33":{"start":{"line":125,"column":4},"end":{"line":125,"column":118}},"34":{"start":{"line":125,"column":22},"end":{"line":125,"column":116}},"35":{"start":{"line":132,"column":4},"end":{"line":132,"column":41}},"36":{"start":{"line":133,"column":4},"end":{"line":133,"column":71}},"37":{"start":{"line":136,"column":18},"end":{"line":136,"column":29}},"38":{"start":{"line":138,"column":26},"end":{"line":138,"column":68}},"39":{"start":{"line":138,"column":44},"end":{"line":138,"column":66}},"40":{"start":{"line":139,"column":26},"end":{"line":139,"column":68}},"41":{"start":{"line":139,"column":44},"end":{"line":139,"column":66}},"42":{"start":{"line":140,"column":26},"end":{"line":140,"column":74}},"43":{"start":{"line":140,"column":44},"end":{"line":140,"column":72}},"44":{"start":{"line":141,"column":26},"end":{"line":141,"column":74}},"45":{"start":{"line":141,"column":44},"end":{"line":141,"column":72}},"46":{"start":{"line":143,"column":4},"end":{"line":143,"column":83}},"47":{"start":{"line":143,"column":76},"end":{"line":143,"column":83}},"48":{"start":{"line":145,"column":4},"end":{"line":145,"column":107}},"49":{"start":{"line":146,"column":4},"end":{"line":146,"column":107}},"50":{"start":{"line":148,"column":4},"end":{"line":148,"column":101}},"51":{"start":{"line":149,"column":4},"end":{"line":149,"column":101}},"52":{"start":{"line":153,"column":4},"end":{"line":153,"column":25}},"53":{"start":{"line":154,"column":4},"end":{"line":154,"column":null}},"54":{"start":{"line":165,"column":4},"end":{"line":177,"column":5}},"55":{"start":{"line":167,"column":6},"end":{"line":167,"column":66}},"56":{"start":{"line":167,"column":45},"end":{"line":167,"column":61}},"57":{"start":{"line":170,"column":20},"end":{"line":170,"column":31}},"58":{"start":{"line":172,"column":25},"end":{"line":172,"column":64}},"59":{"start":{"line":172,"column":43},"end":{"line":172,"column":62}},"60":{"start":{"line":173,"column":25},"end":{"line":173,"column":64}},"61":{"start":{"line":173,"column":43},"end":{"line":173,"column":62}},"62":{"start":{"line":175,"column":6},"end":{"line":175,"column":94}},"63":{"start":{"line":176,"column":6},"end":{"line":176,"column":94}},"64":{"start":{"line":178,"column":4},"end":{"line":178,"column":43}},"65":{"start":{"line":186,"column":4},"end":{"line":186,"column":25}},"66":{"start":{"line":189,"column":20},"end":{"line":189,"column":55}},"67":{"start":{"line":189,"column":42},"end":{"line":189,"column":54}},"68":{"start":{"line":190,"column":24},"end":{"line":190,"column":86}},"69":{"start":{"line":190,"column":64},"end":{"line":190,"column":80}},"70":{"start":{"line":193,"column":4},"end":{"line":197,"column":9}},"71":{"start":{"line":194,"column":6},"end":{"line":197,"column":9}},"72":{"start":{"line":195,"column":39},"end":{"line":195,"column":54}},"73":{"start":{"line":196,"column":39},"end":{"line":196,"column":81}},"74":{"start":{"line":203,"column":23},"end":{"line":203,"column":37}},"75":{"start":{"line":208,"column":23},"end":{"line":208,"column":37}},"76":{"start":{"line":214,"column":4},"end":{"line":214,"column":25}},"77":{"start":{"line":215,"column":4},"end":{"line":222,"column":7}},"78":{"start":{"line":217,"column":8},"end":{"line":219,"column":9}},"79":{"start":{"line":218,"column":10},"end":{"line":218,"column":61}},"80":{"start":{"line":220,"column":8},"end":{"line":220,"column":20}},"81":{"start":{"line":229,"column":4},"end":{"line":229,"column":25}},"82":{"start":{"line":230,"column":4},"end":{"line":230,"column":43}},"83":{"start":{"line":252,"column":16},"end":{"line":252,"column":51}},"84":{"start":{"line":253,"column":18},"end":{"line":253,"column":45}},"85":{"start":{"line":256,"column":33},"end":{"line":261,"column":5}},"86":{"start":{"line":257,"column":6},"end":{"line":259,"column":63}},"87":{"start":{"line":260,"column":6},"end":{"line":260,"column":null}},"88":{"start":{"line":263,"column":4},"end":{"line":265,"column":null}},"89":{"start":{"line":276,"column":23},"end":{"line":276,"column":41}},"90":{"start":{"line":277,"column":6},"end":{"line":277,"column":51}},"91":{"start":{"line":278,"column":6},"end":{"line":278,"column":39}},"92":{"start":{"line":288,"column":4},"end":{"line":292,"column":null}},"93":{"start":{"line":289,"column":23},"end":{"line":289,"column":41}},"94":{"start":{"line":290,"column":6},"end":{"line":290,"column":47}},"95":{"start":{"line":291,"column":6},"end":{"line":291,"column":40}},"96":{"start":{"line":302,"column":4},"end":{"line":308,"column":null}},"97":{"start":{"line":303,"column":23},"end":{"line":303,"column":41}},"98":{"start":{"line":304,"column":6},"end":{"line":306,"column":null}},"99":{"start":{"line":305,"column":8},"end":{"line":305,"column":null}},"100":{"start":{"line":305,"column":42},"end":{"line":305,"column":null}},"101":{"start":{"line":307,"column":6},"end":{"line":307,"column":40}}},"fnMap":{"0":{"name":"createNode","decl":{"start":{"line":32,"column":9},"end":{"line":32,"column":19}},"loc":{"start":{"line":32,"column":118},"end":{"line":44,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":70,"column":48},"end":{"line":70,"column":49}},"loc":{"start":{"line":70,"column":63},"end":{"line":310,"column":4}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":82,"column":17},"end":{"line":82,"column":18}},"loc":{"start":{"line":82,"column":26},"end":{"line":82,"column":48}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":87,"column":17},"end":{"line":87,"column":18}},"loc":{"start":{"line":87,"column":30},"end":{"line":87,"column":82}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":89,"column":17},"end":{"line":89,"column":18}},"loc":{"start":{"line":89,"column":28},"end":{"line":89,"column":85}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":89,"column":42},"end":{"line":89,"column":46}},"loc":{"start":{"line":89,"column":50},"end":{"line":89,"column":84}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":91,"column":17},"end":{"line":91,"column":18}},"loc":{"start":{"line":91,"column":27},"end":{"line":102,"column":3}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":93,"column":18},"end":{"line":93,"column":19}},"loc":{"start":{"line":93,"column":27},"end":{"line":101,"column":7}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":96,"column":38},"end":{"line":96,"column":39}},"loc":{"start":{"line":96,"column":45},"end":{"line":96,"column":64}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":97,"column":38},"end":{"line":97,"column":39}},"loc":{"start":{"line":97,"column":45},"end":{"line":97,"column":64}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":106,"column":17},"end":{"line":106,"column":18}},"loc":{"start":{"line":106,"column":29},"end":{"line":108,"column":3}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":114,"column":13},"end":{"line":114,"column":14}},"loc":{"start":{"line":114,"column":28},"end":{"line":126,"column":3}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":121,"column":34},"end":{"line":121,"column":35}},"loc":{"start":{"line":121,"column":41},"end":{"line":121,"column":66}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":122,"column":34},"end":{"line":122,"column":35}},"loc":{"start":{"line":122,"column":41},"end":{"line":122,"column":66}}},"14":{"name":"(anonymous_14)","decl":{"start":{"line":131,"column":15},"end":{"line":131,"column":16}},"loc":{"start":{"line":131,"column":42},"end":{"line":150,"column":3}}},"15":{"name":"(anonymous_15)","decl":{"start":{"line":138,"column":37},"end":{"line":138,"column":38}},"loc":{"start":{"line":138,"column":44},"end":{"line":138,"column":66}}},"16":{"name":"(anonymous_16)","decl":{"start":{"line":139,"column":37},"end":{"line":139,"column":38}},"loc":{"start":{"line":139,"column":44},"end":{"line":139,"column":66}}},"17":{"name":"(anonymous_17)","decl":{"start":{"line":140,"column":37},"end":{"line":140,"column":38}},"loc":{"start":{"line":140,"column":44},"end":{"line":140,"column":72}}},"18":{"name":"(anonymous_18)","decl":{"start":{"line":141,"column":37},"end":{"line":141,"column":38}},"loc":{"start":{"line":141,"column":44},"end":{"line":141,"column":72}}},"19":{"name":"(anonymous_19)","decl":{"start":{"line":152,"column":20},"end":{"line":152,"column":23}},"loc":{"start":{"line":152,"column":25},"end":{"line":155,"column":3}}},"20":{"name":"(anonymous_20)","decl":{"start":{"line":164,"column":18},"end":{"line":164,"column":19}},"loc":{"start":{"line":164,"column":33},"end":{"line":179,"column":3}}},"21":{"name":"(anonymous_21)","decl":{"start":{"line":167,"column":38},"end":{"line":167,"column":39}},"loc":{"start":{"line":167,"column":45},"end":{"line":167,"column":61}}},"22":{"name":"(anonymous_22)","decl":{"start":{"line":172,"column":36},"end":{"line":172,"column":37}},"loc":{"start":{"line":172,"column":43},"end":{"line":172,"column":62}}},"23":{"name":"(anonymous_23)","decl":{"start":{"line":173,"column":36},"end":{"line":173,"column":37}},"loc":{"start":{"line":173,"column":43},"end":{"line":173,"column":62}}},"24":{"name":"(anonymous_24)","decl":{"start":{"line":185,"column":14},"end":{"line":185,"column":15}},"loc":{"start":{"line":185,"column":25},"end":{"line":198,"column":3}}},"25":{"name":"(anonymous_25)","decl":{"start":{"line":189,"column":37},"end":{"line":189,"column":38}},"loc":{"start":{"line":189,"column":42},"end":{"line":189,"column":54}}},"26":{"name":"(anonymous_26)","decl":{"start":{"line":190,"column":57},"end":{"line":190,"column":58}},"loc":{"start":{"line":190,"column":64},"end":{"line":190,"column":80}}},"27":{"name":"(anonymous_27)","decl":{"start":{"line":195,"column":32},"end":{"line":195,"column":33}},"loc":{"start":{"line":195,"column":39},"end":{"line":195,"column":54}}},"28":{"name":"(anonymous_28)","decl":{"start":{"line":196,"column":32},"end":{"line":196,"column":33}},"loc":{"start":{"line":196,"column":39},"end":{"line":196,"column":81}}},"29":{"name":"(anonymous_29)","decl":{"start":{"line":203,"column":12},"end":{"line":203,"column":13}},"loc":{"start":{"line":203,"column":23},"end":{"line":203,"column":37}}},"30":{"name":"(anonymous_30)","decl":{"start":{"line":208,"column":12},"end":{"line":208,"column":13}},"loc":{"start":{"line":208,"column":23},"end":{"line":208,"column":37}}},"31":{"name":"(anonymous_31)","decl":{"start":{"line":213,"column":18},"end":{"line":213,"column":19}},"loc":{"start":{"line":213,"column":35},"end":{"line":223,"column":3}}},"32":{"name":"(anonymous_32)","decl":{"start":{"line":216,"column":29},"end":{"line":216,"column":30}},"loc":{"start":{"line":216,"column":38},"end":{"line":221,"column":7}}},"33":{"name":"(anonymous_33)","decl":{"start":{"line":228,"column":11},"end":{"line":228,"column":12}},"loc":{"start":{"line":228,"column":26},"end":{"line":231,"column":3}}},"34":{"name":"(anonymous_34)","decl":{"start":{"line":251,"column":18},"end":{"line":251,"column":19}},"loc":{"start":{"line":251,"column":51},"end":{"line":266,"column":3}}},"35":{"name":"(anonymous_35)","decl":{"start":{"line":256,"column":33},"end":{"line":256,"column":36}},"loc":{"start":{"line":256,"column":38},"end":{"line":261,"column":5}}},"36":{"name":"(anonymous_36)","decl":{"start":{"line":275,"column":17},"end":{"line":275,"column":18}},"loc":{"start":{"line":275,"column":45},"end":{"line":279,"column":3}}},"37":{"name":"(anonymous_37)","decl":{"start":{"line":287,"column":25},"end":{"line":287,"column":26}},"loc":{"start":{"line":287,"column":46},"end":{"line":293,"column":3}}},"38":{"name":"(anonymous_38)","decl":{"start":{"line":288,"column":9},"end":{"line":288,"column":12}},"loc":{"start":{"line":288,"column":14},"end":{"line":292,"column":5}}},"39":{"name":"(anonymous_39)","decl":{"start":{"line":301,"column":23},"end":{"line":301,"column":24}},"loc":{"start":{"line":301,"column":34},"end":{"line":309,"column":3}}},"40":{"name":"(anonymous_40)","decl":{"start":{"line":302,"column":8},"end":{"line":302,"column":11}},"loc":{"start":{"line":302,"column":13},"end":{"line":308,"column":5}}},"41":{"name":"(anonymous_41)","decl":{"start":{"line":304,"column":23},"end":{"line":304,"column":24}},"loc":{"start":{"line":304,"column":33},"end":{"line":306,"column":7}}}},"branchMap":{"0":{"loc":{"start":{"line":99,"column":8},"end":{"line":99,"column":116}},"type":"if","locations":[{"start":{"line":99,"column":8},"end":{"line":99,"column":116}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":100,"column":8},"end":{"line":100,"column":116}},"type":"if","locations":[{"start":{"line":100,"column":8},"end":{"line":100,"column":116}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":124,"column":4},"end":{"line":124,"column":118}},"type":"if","locations":[{"start":{"line":124,"column":4},"end":{"line":124,"column":118}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":125,"column":4},"end":{"line":125,"column":118}},"type":"if","locations":[{"start":{"line":125,"column":4},"end":{"line":125,"column":118}},{"start":{},"end":{}}]},"4":{"loc":{"start":{"line":143,"column":4},"end":{"line":143,"column":83}},"type":"if","locations":[{"start":{"line":143,"column":4},"end":{"line":143,"column":83}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":143,"column":8},"end":{"line":143,"column":74}},"type":"binary-expr","locations":[{"start":{"line":143,"column":8},"end":{"line":143,"column":39}},{"start":{"line":143,"column":43},"end":{"line":143,"column":74}}]},"6":{"loc":{"start":{"line":165,"column":4},"end":{"line":177,"column":5}},"type":"if","locations":[{"start":{"line":165,"column":4},"end":{"line":177,"column":5}},{"start":{},"end":{}}]},"7":{"loc":{"start":{"line":193,"column":4},"end":{"line":197,"column":9}},"type":"if","locations":[{"start":{"line":193,"column":4},"end":{"line":197,"column":9}},{"start":{},"end":{}}]},"8":{"loc":{"start":{"line":193,"column":8},"end":{"line":193,"column":49}},"type":"binary-expr","locations":[{"start":{"line":193,"column":8},"end":{"line":193,"column":32}},{"start":{"line":193,"column":36},"end":{"line":193,"column":49}}]},"9":{"loc":{"start":{"line":196,"column":39},"end":{"line":196,"column":81}},"type":"binary-expr","locations":[{"start":{"line":196,"column":39},"end":{"line":196,"column":58}},{"start":{"line":196,"column":62},"end":{"line":196,"column":81}}]},"10":{"loc":{"start":{"line":217,"column":8},"end":{"line":219,"column":9}},"type":"if","locations":[{"start":{"line":217,"column":8},"end":{"line":219,"column":9}},{"start":{},"end":{}}]},"11":{"loc":{"start":{"line":263,"column":11},"end":{"line":265,"column":30}},"type":"cond-expr","locations":[{"start":{"line":264,"column":8},"end":{"line":264,"column":13}},{"start":{"line":265,"column":8},"end":{"line":265,"column":30}}]},"12":{"loc":{"start":{"line":305,"column":8},"end":{"line":305,"column":null}},"type":"if","locations":[{"start":{"line":305,"column":8},"end":{"line":305,"column":null}},{"start":{},"end":{}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":0,"82":0,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\components\\DragDropSidebar.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\components\\DragDropSidebar.tsx","statementMap":{"0":{"start":{"line":34,"column":23},"end":{"line":34,"column":51}},"1":{"start":{"line":35,"column":34},"end":{"line":35,"column":70}},"2":{"start":{"line":39,"column":2},"end":{"line":48,"column":5}},"3":{"start":{"line":42,"column":6},"end":{"line":42,"column":46}},"4":{"start":{"line":45,"column":6},"end":{"line":45,"column":34}},"5":{"start":{"line":46,"column":6},"end":{"line":46,"column":63}},"6":{"start":{"line":50,"column":2},"end":{"line":61,"column":null}},"7":{"start":{"line":76,"column":22},"end":{"line":76,"column":45}},"8":{"start":{"line":79,"column":22},"end":{"line":79,"column":50}},"9":{"start":{"line":80,"column":13},"end":{"line":80,"column":32}},"10":{"start":{"line":83,"column":18},"end":{"line":88,"column":null}},"11":{"start":{"line":89,"column":2},"end":{"line":89,"column":19}},"12":{"start":{"line":103,"column":35},"end":{"line":103,"column":49}},"13":{"start":{"line":109,"column":25},"end":{"line":127,"column":null}},"14":{"start":{"line":111,"column":19},"end":{"line":111,"column":56}},"15":{"start":{"line":112,"column":23},"end":{"line":112,"column":52}},"16":{"start":{"line":116,"column":8},"end":{"line":120,"column":43}},"17":{"start":{"line":122,"column":6},"end":{"line":125,"column":7}},"18":{"start":{"line":123,"column":25},"end":{"line":123,"column":61}},"19":{"start":{"line":124,"column":8},"end":{"line":124,"column":42}},"20":{"start":{"line":132,"column":25},"end":{"line":137,"column":5}},"21":{"start":{"line":133,"column":24},"end":{"line":133,"column":38}},"22":{"start":{"line":134,"column":26},"end":{"line":137,"column":4}},"23":{"start":{"line":139,"column":2},"end":{"line":158,"column":4}},"24":{"start":{"line":147,"column":10},"end":{"line":148,"column":null}}},"fnMap":{"0":{"name":"DraggableNode","decl":{"start":{"line":33,"column":9},"end":{"line":33,"column":22}},"loc":{"start":{"line":33,"column":84},"end":{"line":62,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":41,"column":12},"end":{"line":41,"column":13}},"loc":{"start":{"line":41,"column":37},"end":{"line":43,"column":5}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":44,"column":15},"end":{"line":44,"column":16}},"loc":{"start":{"line":44,"column":29},"end":{"line":47,"column":5}}},"3":{"name":"addNodeToFlow","decl":{"start":{"line":75,"column":9},"end":{"line":75,"column":22}},"loc":{"start":{"line":75,"column":77},"end":{"line":90,"column":1}}},"4":{"name":"DndToolbar","decl":{"start":{"line":102,"column":16},"end":{"line":102,"column":26}},"loc":{"start":{"line":102,"column":26},"end":{"line":159,"column":1}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":110,"column":4},"end":{"line":110,"column":5}},"loc":{"start":{"line":110,"column":69},"end":{"line":126,"column":5}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":133,"column":10},"end":{"line":133,"column":11}},"loc":{"start":{"line":133,"column":24},"end":{"line":133,"column":38}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":134,"column":7},"end":{"line":134,"column":8}},"loc":{"start":{"line":134,"column":26},"end":{"line":137,"column":4}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":146,"column":28},"end":{"line":146,"column":29}},"loc":{"start":{"line":147,"column":10},"end":{"line":148,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":79,"column":22},"end":{"line":79,"column":50}},"type":"binary-expr","locations":[{"start":{"line":79,"column":22},"end":{"line":79,"column":44}},{"start":{"line":79,"column":48},"end":{"line":79,"column":50}}]},"1":{"loc":{"start":{"line":116,"column":8},"end":{"line":120,"column":43}},"type":"binary-expr","locations":[{"start":{"line":116,"column":8},"end":{"line":116,"column":16}},{"start":{"line":117,"column":8},"end":{"line":117,"column":41}},{"start":{"line":118,"column":8},"end":{"line":118,"column":42}},{"start":{"line":119,"column":8},"end":{"line":119,"column":40}},{"start":{"line":120,"column":8},"end":{"line":120,"column":43}}]},"2":{"loc":{"start":{"line":122,"column":6},"end":{"line":125,"column":7}},"type":"if","locations":[{"start":{"line":122,"column":6},"end":{"line":125,"column":7}},{"start":{},"end":{}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"b":{"0":[0,0],"1":[0,0,0,0,0],"2":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\components\\GestureValueEditor.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\components\\GestureValueEditor.tsx","statementMap":{"0":{"start":{"line":22,"column":21},"end":{"line":35,"column":63}},"1":{"start":{"line":42,"column":24},"end":{"line":437,"column":null}},"2":{"start":{"line":452,"column":26},"end":{"line":452,"column":59}},"3":{"start":{"line":455,"column":40},"end":{"line":455,"column":52}},"4":{"start":{"line":458,"column":48},"end":{"line":458,"column":62}},"5":{"start":{"line":459,"column":56},"end":{"line":459,"column":78}},"6":{"start":{"line":462,"column":23},"end":{"line":462,"column":51}},"7":{"start":{"line":465,"column":27},"end":{"line":482,"column":3}},"8":{"start":{"line":466,"column":4},"end":{"line":466,"column":21}},"9":{"start":{"line":468,"column":4},"end":{"line":481,"column":5}},"10":{"start":{"line":469,"column":6},"end":{"line":469,"column":37}},"11":{"start":{"line":470,"column":6},"end":{"line":470,"column":21}},"12":{"start":{"line":471,"column":6},"end":{"line":471,"column":46}},"13":{"start":{"line":472,"column":6},"end":{"line":472,"column":31}},"14":{"start":{"line":475,"column":6},"end":{"line":475,"column":20}},"15":{"start":{"line":476,"column":25},"end":{"line":477,"column":null}},"16":{"start":{"line":477,"column":15},"end":{"line":477,"column":56}},"17":{"start":{"line":479,"column":6},"end":{"line":479,"column":36}},"18":{"start":{"line":479,"column":23},"end":{"line":479,"column":36}},"19":{"start":{"line":480,"column":6},"end":{"line":480,"column":32}},"20":{"start":{"line":485,"column":26},"end":{"line":487,"column":3}},"21":{"start":{"line":486,"column":4},"end":{"line":486,"column":18}},"22":{"start":{"line":490,"column":29},"end":{"line":504,"column":3}},"23":{"start":{"line":491,"column":4},"end":{"line":491,"column":29}},"24":{"start":{"line":492,"column":4},"end":{"line":492,"column":23}},"25":{"start":{"line":494,"column":4},"end":{"line":503,"column":5}},"26":{"start":{"line":495,"column":6},"end":{"line":495,"column":46}},"27":{"start":{"line":496,"column":6},"end":{"line":496,"column":31}},"28":{"start":{"line":498,"column":23},"end":{"line":499,"column":null}},"29":{"start":{"line":499,"column":8},"end":{"line":499,"column":61}},"30":{"start":{"line":501,"column":6},"end":{"line":501,"column":39}},"31":{"start":{"line":502,"column":6},"end":{"line":502,"column":46}},"32":{"start":{"line":507,"column":33},"end":{"line":511,"column":3}},"33":{"start":{"line":508,"column":4},"end":{"line":508,"column":31}},"34":{"start":{"line":509,"column":4},"end":{"line":509,"column":25}},"35":{"start":{"line":510,"column":4},"end":{"line":510,"column":30}},"36":{"start":{"line":514,"column":27},"end":{"line":522,"column":3}},"37":{"start":{"line":515,"column":4},"end":{"line":515,"column":36}},"38":{"start":{"line":515,"column":29},"end":{"line":515,"column":36}},"39":{"start":{"line":517,"column":21},"end":{"line":518,"column":null}},"40":{"start":{"line":518,"column":6},"end":{"line":518,"column":62}},"41":{"start":{"line":520,"column":4},"end":{"line":520,"column":37}},"42":{"start":{"line":521,"column":4},"end":{"line":521,"column":44}},"43":{"start":{"line":525,"column":26},"end":{"line":525,"column":54}},"44":{"start":{"line":529,"column":2},"end":{"line":610,"column":4}},"45":{"start":{"line":538,"column":27},"end":{"line":538,"column":53}},"46":{"start":{"line":545,"column":27},"end":{"line":545,"column":50}},"47":{"start":{"line":558,"column":18},"end":{"line":559,"column":null}},"48":{"start":{"line":561,"column":35},"end":{"line":561,"column":69}},"49":{"start":{"line":562,"column":40},"end":{"line":562,"column":58}},"50":{"start":{"line":572,"column":31},"end":{"line":572,"column":65}},"51":{"start":{"line":584,"column":31},"end":{"line":584,"column":62}},"52":{"start":{"line":590,"column":16},"end":{"line":590,"column":34}},"53":{"start":{"line":596,"column":16},"end":{"line":597,"column":null}},"54":{"start":{"line":600,"column":33},"end":{"line":600,"column":53}}},"fnMap":{"0":{"name":"GestureValueEditor","decl":{"start":{"line":444,"column":24},"end":{"line":444,"column":42}},"loc":{"start":{"line":449,"column":26},"end":{"line":611,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":465,"column":27},"end":{"line":465,"column":28}},"loc":{"start":{"line":465,"column":57},"end":{"line":482,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":477,"column":8},"end":{"line":477,"column":11}},"loc":{"start":{"line":477,"column":15},"end":{"line":477,"column":56}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":485,"column":26},"end":{"line":485,"column":27}},"loc":{"start":{"line":485,"column":42},"end":{"line":487,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":490,"column":29},"end":{"line":490,"column":30}},"loc":{"start":{"line":490,"column":50},"end":{"line":504,"column":3}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":498,"column":46},"end":{"line":498,"column":52}},"loc":{"start":{"line":499,"column":8},"end":{"line":499,"column":61}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":507,"column":33},"end":{"line":507,"column":34}},"loc":{"start":{"line":507,"column":56},"end":{"line":511,"column":3}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":514,"column":27},"end":{"line":514,"column":30}},"loc":{"start":{"line":514,"column":32},"end":{"line":522,"column":3}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":517,"column":44},"end":{"line":517,"column":50}},"loc":{"start":{"line":518,"column":6},"end":{"line":518,"column":62}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":525,"column":26},"end":{"line":525,"column":27}},"loc":{"start":{"line":525,"column":51},"end":{"line":525,"column":54}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":538,"column":21},"end":{"line":538,"column":24}},"loc":{"start":{"line":538,"column":27},"end":{"line":538,"column":53}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":545,"column":21},"end":{"line":545,"column":24}},"loc":{"start":{"line":545,"column":27},"end":{"line":545,"column":50}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":557,"column":41},"end":{"line":557,"column":42}},"loc":{"start":{"line":558,"column":18},"end":{"line":559,"column":null}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":561,"column":29},"end":{"line":561,"column":32}},"loc":{"start":{"line":561,"column":35},"end":{"line":561,"column":69}}},"14":{"name":"(anonymous_14)","decl":{"start":{"line":562,"column":33},"end":{"line":562,"column":34}},"loc":{"start":{"line":562,"column":40},"end":{"line":562,"column":58}}},"15":{"name":"(anonymous_15)","decl":{"start":{"line":572,"column":24},"end":{"line":572,"column":25}},"loc":{"start":{"line":572,"column":31},"end":{"line":572,"column":65}}},"16":{"name":"(anonymous_16)","decl":{"start":{"line":584,"column":24},"end":{"line":584,"column":25}},"loc":{"start":{"line":584,"column":31},"end":{"line":584,"column":62}}},"17":{"name":"(anonymous_17)","decl":{"start":{"line":589,"column":32},"end":{"line":589,"column":33}},"loc":{"start":{"line":590,"column":16},"end":{"line":590,"column":34}}},"18":{"name":"(anonymous_18)","decl":{"start":{"line":595,"column":32},"end":{"line":595,"column":33}},"loc":{"start":{"line":596,"column":16},"end":{"line":597,"column":null}}},"19":{"name":"(anonymous_19)","decl":{"start":{"line":600,"column":27},"end":{"line":600,"column":30}},"loc":{"start":{"line":600,"column":33},"end":{"line":600,"column":53}}}},"branchMap":{"0":{"loc":{"start":{"line":448,"column":2},"end":{"line":448,"column":30}},"type":"default-arg","locations":[{"start":{"line":448,"column":16},"end":{"line":448,"column":30}}]},"1":{"loc":{"start":{"line":468,"column":4},"end":{"line":481,"column":5}},"type":"if","locations":[{"start":{"line":468,"column":4},"end":{"line":481,"column":5}},{"start":{"line":473,"column":11},"end":{"line":481,"column":5}}]},"2":{"loc":{"start":{"line":469,"column":15},"end":{"line":469,"column":35}},"type":"binary-expr","locations":[{"start":{"line":469,"column":15},"end":{"line":469,"column":26}},{"start":{"line":469,"column":30},"end":{"line":469,"column":35}}]},"3":{"loc":{"start":{"line":479,"column":6},"end":{"line":479,"column":36}},"type":"if","locations":[{"start":{"line":479,"column":6},"end":{"line":479,"column":36}},{"start":{},"end":{}}]},"4":{"loc":{"start":{"line":494,"column":4},"end":{"line":503,"column":5}},"type":"if","locations":[{"start":{"line":494,"column":4},"end":{"line":503,"column":5}},{"start":{"line":497,"column":11},"end":{"line":503,"column":5}}]},"5":{"loc":{"start":{"line":515,"column":4},"end":{"line":515,"column":36}},"type":"if","locations":[{"start":{"line":515,"column":4},"end":{"line":515,"column":36}},{"start":{},"end":{}}]},"6":{"loc":{"start":{"line":537,"column":49},"end":{"line":537,"column":87}},"type":"cond-expr","locations":[{"start":{"line":537,"column":69},"end":{"line":537,"column":82}},{"start":{"line":537,"column":85},"end":{"line":537,"column":87}}]},"7":{"loc":{"start":{"line":544,"column":49},"end":{"line":544,"column":84}},"type":"cond-expr","locations":[{"start":{"line":544,"column":66},"end":{"line":544,"column":79}},{"start":{"line":544,"column":82},"end":{"line":544,"column":84}}]},"8":{"loc":{"start":{"line":553,"column":9},"end":{"line":606,"column":null}},"type":"cond-expr","locations":[{"start":{"line":554,"column":10},"end":{"line":578,"column":null}},{"start":{"line":581,"column":10},"end":{"line":605,"column":null}}]},"9":{"loc":{"start":{"line":555,"column":13},"end":{"line":567,"column":null}},"type":"binary-expr","locations":[{"start":{"line":555,"column":13},"end":{"line":555,"column":28}},{"start":{"line":556,"column":14},"end":{"line":566,"column":null}}]},"10":{"loc":{"start":{"line":576,"column":48},"end":{"line":576,"column":102}},"type":"cond-expr","locations":[{"start":{"line":576,"column":66},"end":{"line":576,"column":97}},{"start":{"line":576,"column":100},"end":{"line":576,"column":102}}]},"11":{"loc":{"start":{"line":599,"column":52},"end":{"line":599,"column":88}},"type":"cond-expr","locations":[{"start":{"line":599,"column":68},"end":{"line":599,"column":83}},{"start":{"line":599,"column":86},"end":{"line":599,"column":88}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0},"b":{"0":[0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\components\\NodeComponents.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\components\\NodeComponents.tsx","statementMap":{"0":{"start":{"line":32,"column":30},"end":{"line":32,"column":44}},"1":{"start":{"line":35,"column":27},"end":{"line":37,"column":3}},"2":{"start":{"line":36,"column":4},"end":{"line":36,"column":23}},"3":{"start":{"line":39,"column":19},"end":{"line":39,"column":94}},"4":{"start":{"line":39,"column":40},"end":{"line":39,"column":58}},"5":{"start":{"line":40,"column":2},"end":{"line":46,"column":20}},"6":{"start":{"line":68,"column":40},"end":{"line":68,"column":55}},"7":{"start":{"line":69,"column":35},"end":{"line":69,"column":50}},"8":{"start":{"line":70,"column":30},"end":{"line":70,"column":59}},"9":{"start":{"line":72,"column":27},"end":{"line":79,"column":3}},"10":{"start":{"line":73,"column":17},"end":{"line":73,"column":86}},"11":{"start":{"line":74,"column":4},"end":{"line":78,"column":7}},"12":{"start":{"line":81,"column":2},"end":{"line":121,"column":null}},"13":{"start":{"line":85,"column":10},"end":{"line":85,"column":29}},"14":{"start":{"line":86,"column":10},"end":{"line":86,"column":32}},"15":{"start":{"line":87,"column":10},"end":{"line":87,"column":28}},"16":{"start":{"line":90,"column":10},"end":{"line":90,"column":29}},"17":{"start":{"line":93,"column":10},"end":{"line":96,"column":11}},"18":{"start":{"line":94,"column":12},"end":{"line":94,"column":31}},"19":{"start":{"line":95,"column":12},"end":{"line":95,"column":33}},"20":{"start":{"line":98,"column":29},"end":{"line":98,"column":50}}},"fnMap":{"0":{"name":"Toolbar","decl":{"start":{"line":31,"column":16},"end":{"line":31,"column":23}},"loc":{"start":{"line":31,"column":59},"end":{"line":47,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":35,"column":27},"end":{"line":35,"column":30}},"loc":{"start":{"line":35,"column":32},"end":{"line":37,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":39,"column":30},"end":{"line":39,"column":31}},"loc":{"start":{"line":39,"column":40},"end":{"line":39,"column":58}}},"3":{"name":"Tooltip","decl":{"start":{"line":67,"column":16},"end":{"line":67,"column":23}},"loc":{"start":{"line":67,"column":60},"end":{"line":122,"column":1}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":72,"column":27},"end":{"line":72,"column":30}},"loc":{"start":{"line":72,"column":32},"end":{"line":79,"column":3}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":84,"column":21},"end":{"line":84,"column":24}},"loc":{"start":{"line":84,"column":26},"end":{"line":88,"column":9}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":89,"column":19},"end":{"line":89,"column":22}},"loc":{"start":{"line":89,"column":24},"end":{"line":91,"column":9}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":92,"column":21},"end":{"line":92,"column":24}},"loc":{"start":{"line":92,"column":26},"end":{"line":97,"column":9}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":98,"column":23},"end":{"line":98,"column":26}},"loc":{"start":{"line":98,"column":29},"end":{"line":98,"column":50}}}},"branchMap":{"0":{"loc":{"start":{"line":81,"column":9},"end":{"line":121,"column":14}},"type":"cond-expr","locations":[{"start":{"line":82,"column":5},"end":{"line":119,"column":null}},{"start":{"line":121,"column":6},"end":{"line":121,"column":14}}]},"1":{"loc":{"start":{"line":93,"column":10},"end":{"line":96,"column":11}},"type":"if","locations":[{"start":{"line":93,"column":10},"end":{"line":96,"column":11}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":102,"column":7},"end":{"line":118,"column":null}},"type":"binary-expr","locations":[{"start":{"line":102,"column":7},"end":{"line":102,"column":18}},{"start":{"line":102,"column":22},"end":{"line":118,"column":null}}]},"3":{"loc":{"start":{"line":115,"column":13},"end":{"line":115,"column":59}},"type":"binary-expr","locations":[{"start":{"line":115,"column":13},"end":{"line":115,"column":35}},{"start":{"line":115,"column":39},"end":{"line":115,"column":59}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\components\\Plan.default.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\components\\Plan.default.ts","statementMap":{"0":{"start":{"line":3,"column":33},"end":{"line":7,"column":null}}},"fnMap":{},"branchMap":{},"s":{"0":0},"f":{},"b":{}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\components\\Plan.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\components\\Plan.tsx","statementMap":{"0":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"1":{"start":{"line":28,"column":15},"end":{"line":28,"column":null}},"2":{"start":{"line":29,"column":4},"end":{"line":32,"column":null}},"3":{"start":{"line":31,"column":37},"end":{"line":31,"column":58}},"4":{"start":{"line":39,"column":18},"end":{"line":39,"column":24}},"5":{"start":{"line":40,"column":21},"end":{"line":40,"column":64}},"6":{"start":{"line":40,"column":40},"end":{"line":40,"column":63}},"7":{"start":{"line":41,"column":4},"end":{"line":62,"column":5}},"8":{"start":{"line":43,"column":12},"end":{"line":46,"column":null}},"9":{"start":{"line":48,"column":12},"end":{"line":54,"column":null}},"10":{"start":{"line":56,"column":12},"end":{"line":59,"column":null}},"11":{"start":{"line":61,"column":12},"end":{"line":61,"column":null}},"12":{"start":{"line":73,"column":4},"end":{"line":73,"column":null}},"13":{"start":{"line":73,"column":15},"end":{"line":73,"column":null}},"14":{"start":{"line":74,"column":4},"end":{"line":85,"column":21}},"15":{"start":{"line":74,"column":39},"end":{"line":74,"column":57}},"16":{"start":{"line":77,"column":36},"end":{"line":77,"column":55}},"17":{"start":{"line":78,"column":23},"end":{"line":78,"column":34}},"18":{"start":{"line":79,"column":25},"end":{"line":79,"column":60}},"19":{"start":{"line":79,"column":44},"end":{"line":79,"column":59}},"20":{"start":{"line":81,"column":8},"end":{"line":81,"column":59}},"21":{"start":{"line":81,"column":46},"end":{"line":81,"column":59}},"22":{"start":{"line":83,"column":8},"end":{"line":83,"column":null}},"23":{"start":{"line":94,"column":22},"end":{"line":94,"column":64}},"24":{"start":{"line":94,"column":47},"end":{"line":94,"column":63}},"25":{"start":{"line":95,"column":4},"end":{"line":100,"column":22}},"26":{"start":{"line":97,"column":23},"end":{"line":97,"column":34}},"27":{"start":{"line":98,"column":25},"end":{"line":98,"column":60}},"28":{"start":{"line":98,"column":44},"end":{"line":98,"column":59}},"29":{"start":{"line":99,"column":8},"end":{"line":99,"column":null}},"30":{"start":{"line":112,"column":4},"end":{"line":123,"column":5}},"31":{"start":{"line":114,"column":12},"end":{"line":114,"column":null}},"32":{"start":{"line":115,"column":12},"end":{"line":115,"column":40}},"33":{"start":{"line":117,"column":12},"end":{"line":117,"column":null}},"34":{"start":{"line":118,"column":12},"end":{"line":118,"column":37}},"35":{"start":{"line":120,"column":12},"end":{"line":120,"column":null}},"36":{"start":{"line":121,"column":12},"end":{"line":121,"column":37}}},"fnMap":{"0":{"name":"PlanReduce","decl":{"start":{"line":27,"column":16},"end":{"line":27,"column":26}},"loc":{"start":{"line":27,"column":54},"end":{"line":33,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":31,"column":30},"end":{"line":31,"column":31}},"loc":{"start":{"line":31,"column":37},"end":{"line":31,"column":58}}},"2":{"name":"StepReduce","decl":{"start":{"line":37,"column":9},"end":{"line":37,"column":19}},"loc":{"start":{"line":37,"column":60},"end":{"line":63,"column":1}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":40,"column":33},"end":{"line":40,"column":34}},"loc":{"start":{"line":40,"column":40},"end":{"line":40,"column":63}}},"4":{"name":"DoesPlanIterate","decl":{"start":{"line":71,"column":16},"end":{"line":71,"column":31}},"loc":{"start":{"line":71,"column":60},"end":{"line":86,"column":1}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":74,"column":29},"end":{"line":74,"column":30}},"loc":{"start":{"line":74,"column":39},"end":{"line":74,"column":57}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":77,"column":26},"end":{"line":77,"column":27}},"loc":{"start":{"line":77,"column":36},"end":{"line":77,"column":55}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":77,"column":61},"end":{"line":77,"column":62}},"loc":{"start":{"line":77,"column":74},"end":{"line":84,"column":9}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":79,"column":37},"end":{"line":79,"column":38}},"loc":{"start":{"line":79,"column":44},"end":{"line":79,"column":59}}},"9":{"name":"HasCheckingSubGoal","decl":{"start":{"line":93,"column":16},"end":{"line":93,"column":34}},"loc":{"start":{"line":93,"column":61},"end":{"line":101,"column":1}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":94,"column":40},"end":{"line":94,"column":41}},"loc":{"start":{"line":94,"column":47},"end":{"line":94,"column":63}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":95,"column":25},"end":{"line":95,"column":26}},"loc":{"start":{"line":95,"column":38},"end":{"line":100,"column":5}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":98,"column":37},"end":{"line":98,"column":38}},"loc":{"start":{"line":98,"column":44},"end":{"line":98,"column":59}}},"13":{"name":"GetActionValue","decl":{"start":{"line":110,"column":16},"end":{"line":110,"column":30}},"loc":{"start":{"line":110,"column":45},"end":{"line":124,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},"type":"if","locations":[{"start":{"line":28,"column":4},"end":{"line":28,"column":null}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":41,"column":4},"end":{"line":62,"column":5}},"type":"switch","locations":[{"start":{"line":42,"column":8},"end":{"line":46,"column":null}},{"start":{"line":47,"column":8},"end":{"line":54,"column":null}},{"start":{"line":55,"column":8},"end":{"line":59,"column":null}},{"start":{"line":60,"column":8},"end":{"line":61,"column":null}}]},"2":{"loc":{"start":{"line":51,"column":26},"end":{"line":51,"column":62}},"type":"cond-expr","locations":[{"start":{"line":51,"column":46},"end":{"line":51,"column":51}},{"start":{"line":51,"column":54},"end":{"line":51,"column":62}}]},"3":{"loc":{"start":{"line":61,"column":19},"end":{"line":61,"column":62}},"type":"cond-expr","locations":[{"start":{"line":61,"column":30},"end":{"line":61,"column":57}},{"start":{"line":61,"column":60},"end":{"line":61,"column":62}}]},"4":{"loc":{"start":{"line":73,"column":4},"end":{"line":73,"column":null}},"type":"if","locations":[{"start":{"line":73,"column":4},"end":{"line":73,"column":null}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":74,"column":11},"end":{"line":85,"column":20}},"type":"binary-expr","locations":[{"start":{"line":74,"column":11},"end":{"line":74,"column":69}},{"start":{"line":75,"column":5},"end":{"line":85,"column":20}}]},"6":{"loc":{"start":{"line":81,"column":8},"end":{"line":81,"column":59}},"type":"if","locations":[{"start":{"line":81,"column":8},"end":{"line":81,"column":59}},{"start":{},"end":{}}]},"7":{"loc":{"start":{"line":81,"column":12},"end":{"line":81,"column":44}},"type":"binary-expr","locations":[{"start":{"line":81,"column":12},"end":{"line":81,"column":21}},{"start":{"line":81,"column":25},"end":{"line":81,"column":44}}]},"8":{"loc":{"start":{"line":83,"column":16},"end":{"line":83,"column":72}},"type":"binary-expr","locations":[{"start":{"line":83,"column":16},"end":{"line":83,"column":24}},{"start":{"line":83,"column":28},"end":{"line":83,"column":46}},{"start":{"line":83,"column":50},"end":{"line":83,"column":72}}]},"9":{"loc":{"start":{"line":99,"column":16},"end":{"line":99,"column":50}},"type":"binary-expr","locations":[{"start":{"line":99,"column":16},"end":{"line":99,"column":24}},{"start":{"line":99,"column":28},"end":{"line":99,"column":50}}]},"10":{"loc":{"start":{"line":112,"column":4},"end":{"line":123,"column":5}},"type":"switch","locations":[{"start":{"line":113,"column":8},"end":{"line":115,"column":40}},{"start":{"line":116,"column":8},"end":{"line":118,"column":37}},{"start":{"line":119,"column":8},"end":{"line":121,"column":37}},{"start":{"line":122,"column":8},"end":{"line":122,"column":16}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0},"b":{"0":[0,0],"1":[0,0,0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0,0],"9":[0,0],"10":[0,0,0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\components\\PlanEditingFunctions.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\components\\PlanEditingFunctions.tsx","statementMap":{"0":{"start":{"line":12,"column":31},"end":{"line":15,"column":null}},"1":{"start":{"line":17,"column":4},"end":{"line":20,"column":null}},"2":{"start":{"line":31,"column":24},"end":{"line":33,"column":null}},"3":{"start":{"line":32,"column":40},"end":{"line":32,"column":55}},"4":{"start":{"line":34,"column":4},"end":{"line":34,"column":null}}},"fnMap":{"0":{"name":"insertGoalInPlan","decl":{"start":{"line":11,"column":16},"end":{"line":11,"column":32}},"loc":{"start":{"line":11,"column":63},"end":{"line":21,"column":1}}},"1":{"name":"deleteGoalInPlanByID","decl":{"start":{"line":30,"column":16},"end":{"line":30,"column":36}},"loc":{"start":{"line":30,"column":63},"end":{"line":35,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":32,"column":33},"end":{"line":32,"column":34}},"loc":{"start":{"line":32,"column":40},"end":{"line":32,"column":55}}}},"branchMap":{"0":{"loc":{"start":{"line":34,"column":11},"end":{"line":34,"column":66}},"type":"cond-expr","locations":[{"start":{"line":34,"column":43},"end":{"line":34,"column":52}},{"start":{"line":34,"column":55},"end":{"line":34,"column":66}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\components\\PlanEditor.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\components\\PlanEditor.tsx","statementMap":{"0":{"start":{"line":21,"column":20},"end":{"line":21,"column":58}},"1":{"start":{"line":22,"column":36},"end":{"line":22,"column":63}},"2":{"start":{"line":23,"column":44},"end":{"line":23,"column":75}},"3":{"start":{"line":24,"column":58},"end":{"line":24,"column":81}},"4":{"start":{"line":25,"column":46},"end":{"line":25,"column":58}},"5":{"start":{"line":26,"column":60},"end":{"line":26,"column":84}},"6":{"start":{"line":27,"column":28},"end":{"line":27,"column":42}},"7":{"start":{"line":28,"column":16},"end":{"line":28,"column":36}},"8":{"start":{"line":31,"column":21},"end":{"line":35,"column":3}},"9":{"start":{"line":32,"column":4},"end":{"line":32,"column":25}},"10":{"start":{"line":33,"column":4},"end":{"line":33,"column":77}},"11":{"start":{"line":34,"column":4},"end":{"line":34,"column":35}},"12":{"start":{"line":37,"column":36},"end":{"line":43,"column":3}},"13":{"start":{"line":38,"column":4},"end":{"line":38,"column":25}},"14":{"start":{"line":39,"column":4},"end":{"line":39,"column":97}},"15":{"start":{"line":40,"column":4},"end":{"line":40,"column":null}},"16":{"start":{"line":41,"column":4},"end":{"line":41,"column":null}},"17":{"start":{"line":42,"column":4},"end":{"line":42,"column":35}},"18":{"start":{"line":45,"column":19},"end":{"line":50,"column":3}},"19":{"start":{"line":46,"column":4},"end":{"line":46,"column":25}},"20":{"start":{"line":47,"column":4},"end":{"line":47,"column":22}},"21":{"start":{"line":47,"column":15},"end":{"line":47,"column":22}},"22":{"start":{"line":48,"column":4},"end":{"line":48,"column":40}},"23":{"start":{"line":49,"column":4},"end":{"line":49,"column":35}},"24":{"start":{"line":52,"column":16},"end":{"line":56,"column":3}},"25":{"start":{"line":53,"column":4},"end":{"line":53,"column":24}},"26":{"start":{"line":54,"column":4},"end":{"line":54,"column":31}},"27":{"start":{"line":55,"column":4},"end":{"line":55,"column":23}},"28":{"start":{"line":58,"column":22},"end":{"line":69,"column":3}},"29":{"start":{"line":59,"column":15},"end":{"line":59,"column":34}},"30":{"start":{"line":60,"column":4},"end":{"line":60,"column":null}},"31":{"start":{"line":61,"column":4},"end":{"line":68,"column":5}},"32":{"start":{"line":63,"column":5},"end":{"line":63,"column":57}},"33":{"start":{"line":65,"column":8},"end":{"line":65,"column":93}},"34":{"start":{"line":67,"column":8},"end":{"line":67,"column":57}},"35":{"start":{"line":71,"column":2},"end":{"line":249,"column":2}},"36":{"start":{"line":98,"column":18},"end":{"line":98,"column":54}},"37":{"start":{"line":118,"column":30},"end":{"line":118,"column":78}},"38":{"start":{"line":120,"column":30},"end":{"line":120,"column":52}},"39":{"start":{"line":153,"column":26},"end":{"line":153,"column":49}},"40":{"start":{"line":153,"column":42},"end":{"line":153,"column":49}},"41":{"start":{"line":155,"column":41},"end":{"line":155,"column":54}},"42":{"start":{"line":156,"column":26},"end":{"line":158,"column":69}},"43":{"start":{"line":161,"column":26},"end":{"line":161,"column":48}},"44":{"start":{"line":162,"column":26},"end":{"line":162,"column":53}},"45":{"start":{"line":182,"column":22},"end":{"line":185,"column":null}},"46":{"start":{"line":189,"column":26},"end":{"line":193,"column":27}},"47":{"start":{"line":190,"column":26},"end":{"line":192,"column":84}},"48":{"start":{"line":192,"column":63},"end":{"line":192,"column":79}},"49":{"start":{"line":195,"column":26},"end":{"line":197,"column":84}},"50":{"start":{"line":197,"column":63},"end":{"line":197,"column":79}},"51":{"start":{"line":206,"column":44},"end":{"line":206,"column":60}},"52":{"start":{"line":207,"column":57},"end":{"line":207,"column":73}},"53":{"start":{"line":228,"column":18},"end":{"line":228,"column":41}},"54":{"start":{"line":228,"column":34},"end":{"line":228,"column":41}},"55":{"start":{"line":229,"column":18},"end":{"line":229,"column":36}},"56":{"start":{"line":230,"column":18},"end":{"line":230,"column":26}},"57":{"start":{"line":240,"column":18},"end":{"line":240,"column":36}},"58":{"start":{"line":241,"column":18},"end":{"line":241,"column":26}}},"fnMap":{"0":{"name":"PlanEditorDialog","decl":{"start":{"line":15,"column":24},"end":{"line":15,"column":40}},"loc":{"start":{"line":19,"column":24},"end":{"line":250,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":31,"column":21},"end":{"line":31,"column":24}},"loc":{"start":{"line":31,"column":26},"end":{"line":35,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":37,"column":36},"end":{"line":37,"column":39}},"loc":{"start":{"line":37,"column":41},"end":{"line":43,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":45,"column":19},"end":{"line":45,"column":22}},"loc":{"start":{"line":45,"column":24},"end":{"line":50,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":52,"column":16},"end":{"line":52,"column":19}},"loc":{"start":{"line":52,"column":21},"end":{"line":56,"column":3}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":58,"column":22},"end":{"line":58,"column":33}},"loc":{"start":{"line":58,"column":35},"end":{"line":69,"column":3}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":97,"column":28},"end":{"line":97,"column":29}},"loc":{"start":{"line":98,"column":18},"end":{"line":98,"column":54}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":117,"column":36},"end":{"line":117,"column":37}},"loc":{"start":{"line":117,"column":42},"end":{"line":121,"column":27}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":152,"column":31},"end":{"line":152,"column":34}},"loc":{"start":{"line":152,"column":36},"end":{"line":163,"column":23}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":181,"column":39},"end":{"line":181,"column":40}},"loc":{"start":{"line":182,"column":22},"end":{"line":185,"column":null}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":188,"column":33},"end":{"line":188,"column":34}},"loc":{"start":{"line":188,"column":39},"end":{"line":193,"column":28}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":192,"column":56},"end":{"line":192,"column":57}},"loc":{"start":{"line":192,"column":63},"end":{"line":192,"column":79}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":194,"column":31},"end":{"line":194,"column":34}},"loc":{"start":{"line":194,"column":36},"end":{"line":198,"column":23}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":197,"column":56},"end":{"line":197,"column":57}},"loc":{"start":{"line":197,"column":63},"end":{"line":197,"column":79}}},"14":{"name":"(anonymous_14)","decl":{"start":{"line":206,"column":39},"end":{"line":206,"column":40}},"loc":{"start":{"line":206,"column":44},"end":{"line":206,"column":60}}},"15":{"name":"(anonymous_15)","decl":{"start":{"line":207,"column":52},"end":{"line":207,"column":53}},"loc":{"start":{"line":207,"column":57},"end":{"line":207,"column":73}}},"16":{"name":"(anonymous_16)","decl":{"start":{"line":227,"column":23},"end":{"line":227,"column":26}},"loc":{"start":{"line":227,"column":28},"end":{"line":231,"column":15}}},"17":{"name":"(anonymous_17)","decl":{"start":{"line":239,"column":23},"end":{"line":239,"column":26}},"loc":{"start":{"line":239,"column":28},"end":{"line":242,"column":15}}}},"branchMap":{"0":{"loc":{"start":{"line":47,"column":4},"end":{"line":47,"column":22}},"type":"if","locations":[{"start":{"line":47,"column":4},"end":{"line":47,"column":22}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":61,"column":4},"end":{"line":68,"column":5}},"type":"switch","locations":[{"start":{"line":62,"column":4},"end":{"line":63,"column":57}},{"start":{"line":64,"column":4},"end":{"line":65,"column":93}},{"start":{"line":66,"column":4},"end":{"line":67,"column":57}}]},"2":{"loc":{"start":{"line":73,"column":7},"end":{"line":76,"column":null}},"type":"binary-expr","locations":[{"start":{"line":73,"column":7},"end":{"line":73,"column":12}},{"start":{"line":74,"column":10},"end":{"line":74,"column":null}}]},"3":{"loc":{"start":{"line":74,"column":57},"end":{"line":74,"column":109}},"type":"cond-expr","locations":[{"start":{"line":74,"column":71},"end":{"line":74,"column":96}},{"start":{"line":74,"column":99},"end":{"line":74,"column":109}}]},"4":{"loc":{"start":{"line":78,"column":7},"end":{"line":81,"column":null}},"type":"binary-expr","locations":[{"start":{"line":78,"column":7},"end":{"line":78,"column":11}},{"start":{"line":79,"column":10},"end":{"line":79,"column":null}}]},"5":{"loc":{"start":{"line":92,"column":16},"end":{"line":92,"column":72}},"type":"cond-expr","locations":[{"start":{"line":92,"column":45},"end":{"line":92,"column":56}},{"start":{"line":92,"column":59},"end":{"line":92,"column":72}}]},"6":{"loc":{"start":{"line":94,"column":11},"end":{"line":100,"column":null}},"type":"binary-expr","locations":[{"start":{"line":94,"column":11},"end":{"line":94,"column":20}},{"start":{"line":95,"column":14},"end":{"line":100,"column":45}}]},"7":{"loc":{"start":{"line":104,"column":11},"end":{"line":213,"column":null}},"type":"binary-expr","locations":[{"start":{"line":104,"column":11},"end":{"line":104,"column":20}},{"start":{"line":104,"column":25},"end":{"line":212,"column":null}}]},"8":{"loc":{"start":{"line":108,"column":19},"end":{"line":111,"column":25}},"type":"binary-expr","locations":[{"start":{"line":108,"column":20},"end":{"line":108,"column":25}},{"start":{"line":108,"column":29},"end":{"line":108,"column":40}},{"start":{"line":108,"column":44},"end":{"line":108,"column":72}},{"start":{"line":108,"column":76},"end":{"line":108,"column":98}},{"start":{"line":108,"column":104},"end":{"line":110,"column":null}}]},"9":{"loc":{"start":{"line":129,"column":19},"end":{"line":145,"column":null}},"type":"cond-expr","locations":[{"start":{"line":131,"column":22},"end":{"line":135,"column":null}},{"start":{"line":138,"column":22},"end":{"line":143,"column":null}}]},"10":{"loc":{"start":{"line":142,"column":30},"end":{"line":143,"column":42}},"type":"cond-expr","locations":[{"start":{"line":142,"column":59},"end":{"line":142,"column":72}},{"start":{"line":143,"column":32},"end":{"line":143,"column":42}}]},"11":{"loc":{"start":{"line":153,"column":26},"end":{"line":153,"column":49}},"type":"if","locations":[{"start":{"line":153,"column":26},"end":{"line":153,"column":49}},{"start":{},"end":{}}]},"12":{"loc":{"start":{"line":173,"column":19},"end":{"line":176,"column":null}},"type":"binary-expr","locations":[{"start":{"line":173,"column":19},"end":{"line":173,"column":47}},{"start":{"line":174,"column":22},"end":{"line":174,"column":null}}]},"13":{"loc":{"start":{"line":189,"column":26},"end":{"line":193,"column":27}},"type":"if","locations":[{"start":{"line":189,"column":26},"end":{"line":193,"column":27}},{"start":{},"end":{}}]},"14":{"loc":{"start":{"line":189,"column":30},"end":{"line":189,"column":64}},"type":"binary-expr","locations":[{"start":{"line":189,"column":30},"end":{"line":189,"column":47}},{"start":{"line":189,"column":51},"end":{"line":189,"column":64}}]},"15":{"loc":{"start":{"line":205,"column":24},"end":{"line":208,"column":54}},"type":"cond-expr","locations":[{"start":{"line":206,"column":28},"end":{"line":207,"column":96}},{"start":{"line":208,"column":27},"end":{"line":208,"column":53}}]},"16":{"loc":{"start":{"line":206,"column":28},"end":{"line":207,"column":96}},"type":"cond-expr","locations":[{"start":{"line":207,"column":24},"end":{"line":207,"column":38}},{"start":{"line":207,"column":41},"end":{"line":207,"column":96}}]},"17":{"loc":{"start":{"line":208,"column":27},"end":{"line":208,"column":53}},"type":"binary-expr","locations":[{"start":{"line":208,"column":27},"end":{"line":208,"column":47}},{"start":{"line":208,"column":51},"end":{"line":208,"column":53}}]},"18":{"loc":{"start":{"line":228,"column":18},"end":{"line":228,"column":41}},"type":"if","locations":[{"start":{"line":228,"column":18},"end":{"line":228,"column":41}},{"start":{},"end":{}}]},"19":{"loc":{"start":{"line":232,"column":15},"end":{"line":232,"column":64}},"type":"cond-expr","locations":[{"start":{"line":232,"column":44},"end":{"line":232,"column":53}},{"start":{"line":232,"column":56},"end":{"line":232,"column":64}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0},"b":{"0":[0,0],"1":[0,0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0,0,0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\components\\RuleBasedHandle.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\components\\RuleBasedHandle.tsx","statementMap":{"0":{"start":{"line":19,"column":15},"end":{"line":19,"column":26}},"1":{"start":{"line":22,"column":2},"end":{"line":22,"column":38}},"2":{"start":{"line":23,"column":19},"end":{"line":23,"column":60}},"3":{"start":{"line":26,"column":22},"end":{"line":30,"column":4}},"4":{"start":{"line":33,"column":40},"end":{"line":33,"column":115}},"5":{"start":{"line":35,"column":2},"end":{"line":48,"column":4}},"6":{"start":{"line":42,"column":23},"end":{"line":42,"column":57}},"7":{"start":{"line":43,"column":8},"end":{"line":43,"column":31}},"8":{"start":{"line":44,"column":8},"end":{"line":44,"column":34}},"9":{"start":{"line":57,"column":15},"end":{"line":57,"column":26}},"10":{"start":{"line":60,"column":2},"end":{"line":60,"column":38}},"11":{"start":{"line":61,"column":19},"end":{"line":61,"column":60}},"12":{"start":{"line":63,"column":22},"end":{"line":67,"column":4}},"13":{"start":{"line":70,"column":40},"end":{"line":70,"column":115}},"14":{"start":{"line":72,"column":2},"end":{"line":86,"column":4}},"15":{"start":{"line":80,"column":23},"end":{"line":80,"column":57}},"16":{"start":{"line":81,"column":8},"end":{"line":81,"column":31}},"17":{"start":{"line":82,"column":8},"end":{"line":82,"column":34}}},"fnMap":{"0":{"name":"MultiConnectionHandle","decl":{"start":{"line":13,"column":16},"end":{"line":13,"column":37}},"loc":{"start":{"line":18,"column":41},"end":{"line":49,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":41,"column":25},"end":{"line":41,"column":26}},"loc":{"start":{"line":41,"column":40},"end":{"line":45,"column":7}}},"2":{"name":"SingleConnectionHandle","decl":{"start":{"line":51,"column":16},"end":{"line":51,"column":38}},"loc":{"start":{"line":56,"column":41},"end":{"line":87,"column":1}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":79,"column":25},"end":{"line":79,"column":26}},"loc":{"start":{"line":79,"column":40},"end":{"line":83,"column":7}}}},"branchMap":{"0":{"loc":{"start":{"line":16,"column":2},"end":{"line":16,"column":12}},"type":"default-arg","locations":[{"start":{"line":16,"column":10},"end":{"line":16,"column":12}}]},"1":{"loc":{"start":{"line":22,"column":11},"end":{"line":22,"column":37}},"type":"cond-expr","locations":[{"start":{"line":22,"column":20},"end":{"line":22,"column":26}},{"start":{"line":22,"column":29},"end":{"line":22,"column":37}}]},"2":{"loc":{"start":{"line":40,"column":44},"end":{"line":40,"column":100}},"type":"cond-expr","locations":[{"start":{"line":40,"column":71},"end":{"line":40,"column":85}},{"start":{"line":40,"column":88},"end":{"line":40,"column":100}}]},"3":{"loc":{"start":{"line":54,"column":2},"end":{"line":54,"column":12}},"type":"default-arg","locations":[{"start":{"line":54,"column":10},"end":{"line":54,"column":12}}]},"4":{"loc":{"start":{"line":60,"column":11},"end":{"line":60,"column":37}},"type":"cond-expr","locations":[{"start":{"line":60,"column":20},"end":{"line":60,"column":26}},{"start":{"line":60,"column":29},"end":{"line":60,"column":37}}]},"5":{"loc":{"start":{"line":77,"column":45},"end":{"line":77,"column":101}},"type":"cond-expr","locations":[{"start":{"line":77,"column":72},"end":{"line":77,"column":86}},{"start":{"line":77,"column":89},"end":{"line":77,"column":101}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0],"1":[0,0],"2":[0,0],"3":[0],"4":[0,0],"5":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\components\\SaveLoadPanel.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\components\\SaveLoadPanel.tsx","statementMap":{"0":{"start":{"line":8,"column":16},"end":{"line":8,"column":44}},"1":{"start":{"line":8,"column":36},"end":{"line":8,"column":43}},"2":{"start":{"line":9,"column":16},"end":{"line":9,"column":44}},"3":{"start":{"line":9,"column":36},"end":{"line":9,"column":43}},"4":{"start":{"line":10,"column":19},"end":{"line":10,"column":50}},"5":{"start":{"line":10,"column":39},"end":{"line":10,"column":49}},"6":{"start":{"line":11,"column":19},"end":{"line":11,"column":50}},"7":{"start":{"line":11,"column":39},"end":{"line":11,"column":49}},"8":{"start":{"line":13,"column":32},"end":{"line":13,"column":61}},"9":{"start":{"line":16,"column":19},"end":{"line":16,"column":56}},"10":{"start":{"line":18,"column":17},"end":{"line":22,"column":3}},"11":{"start":{"line":19,"column":17},"end":{"line":19,"column":57}},"12":{"start":{"line":20,"column":16},"end":{"line":20,"column":41}},"13":{"start":{"line":21,"column":4},"end":{"line":21,"column":20}},"14":{"start":{"line":25,"column":27},"end":{"line":41,"column":3}},"15":{"start":{"line":26,"column":17},"end":{"line":26,"column":36}},"16":{"start":{"line":27,"column":4},"end":{"line":27,"column":22}},"17":{"start":{"line":27,"column":15},"end":{"line":27,"column":22}},"18":{"start":{"line":28,"column":4},"end":{"line":40,"column":5}},"19":{"start":{"line":29,"column":19},"end":{"line":29,"column":36}},"20":{"start":{"line":30,"column":21},"end":{"line":30,"column":53}},"21":{"start":{"line":31,"column":6},"end":{"line":31,"column":81}},"22":{"start":{"line":31,"column":42},"end":{"line":31,"column":81}},"23":{"start":{"line":32,"column":6},"end":{"line":32,"column":29}},"24":{"start":{"line":33,"column":6},"end":{"line":33,"column":29}},"25":{"start":{"line":35,"column":6},"end":{"line":35,"column":23}},"26":{"start":{"line":36,"column":6},"end":{"line":36,"column":44}},"27":{"start":{"line":39,"column":6},"end":{"line":39,"column":56}},"28":{"start":{"line":39,"column":28},"end":{"line":39,"column":56}},"29":{"start":{"line":43,"column":22},"end":{"line":43,"column":38}},"30":{"start":{"line":44,"column":2},"end":{"line":68,"column":4}},"31":{"start":{"line":50,"column":25},"end":{"line":50,"column":44}}},"fnMap":{"0":{"name":"SaveLoadPanel","decl":{"start":{"line":7,"column":24},"end":{"line":7,"column":37}},"loc":{"start":{"line":7,"column":37},"end":{"line":69,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":29},"end":{"line":8,"column":30}},"loc":{"start":{"line":8,"column":36},"end":{"line":8,"column":43}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":9,"column":29},"end":{"line":9,"column":30}},"loc":{"start":{"line":9,"column":36},"end":{"line":9,"column":43}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":10,"column":32},"end":{"line":10,"column":33}},"loc":{"start":{"line":10,"column":39},"end":{"line":10,"column":49}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":11,"column":32},"end":{"line":11,"column":33}},"loc":{"start":{"line":11,"column":39},"end":{"line":11,"column":49}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":18,"column":17},"end":{"line":18,"column":22}},"loc":{"start":{"line":18,"column":56},"end":{"line":22,"column":3}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":25,"column":27},"end":{"line":25,"column":32}},"loc":{"start":{"line":25,"column":70},"end":{"line":41,"column":3}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":50,"column":19},"end":{"line":50,"column":22}},"loc":{"start":{"line":50,"column":25},"end":{"line":50,"column":44}}}},"branchMap":{"0":{"loc":{"start":{"line":18,"column":24},"end":{"line":18,"column":52}},"type":"default-arg","locations":[{"start":{"line":18,"column":36},"end":{"line":18,"column":52}}]},"1":{"loc":{"start":{"line":27,"column":4},"end":{"line":27,"column":22}},"type":"if","locations":[{"start":{"line":27,"column":4},"end":{"line":27,"column":22}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":31,"column":6},"end":{"line":31,"column":81}},"type":"if","locations":[{"start":{"line":31,"column":6},"end":{"line":31,"column":81}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":31,"column":10},"end":{"line":31,"column":40}},"type":"binary-expr","locations":[{"start":{"line":31,"column":10},"end":{"line":31,"column":23}},{"start":{"line":31,"column":27},"end":{"line":31,"column":40}}]},"4":{"loc":{"start":{"line":39,"column":6},"end":{"line":39,"column":56}},"type":"if","locations":[{"start":{"line":39,"column":6},"end":{"line":39,"column":56}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":49,"column":16},"end":{"line":49,"column":30}},"type":"binary-expr","locations":[{"start":{"line":49,"column":16},"end":{"line":49,"column":23}},{"start":{"line":49,"column":27},"end":{"line":49,"column":30}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"b":{"0":[0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\BasicBeliefNode.default.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\BasicBeliefNode.default.ts","statementMap":{"0":{"start":{"line":7,"column":60},"end":{"line":12,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":0},"f":{},"b":{}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\BeliefGlobals.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\BeliefGlobals.ts","statementMap":{"0":{"start":{"line":8,"column":2},"end":{"line":13,"column":3}},"1":{"start":{"line":10,"column":6},"end":{"line":10,"column":50}},"2":{"start":{"line":12,"column":6},"end":{"line":12,"column":53}},"3":{"start":{"line":16,"column":54},"end":{"line":25,"column":1}},"4":{"start":{"line":17,"column":20},"end":{"line":17,"column":43}},"5":{"start":{"line":18,"column":19},"end":{"line":18,"column":103}},"6":{"start":{"line":18,"column":38},"end":{"line":18,"column":102}},"7":{"start":{"line":19,"column":2},"end":{"line":19,"column":45}},"8":{"start":{"line":19,"column":17},"end":{"line":19,"column":45}},"9":{"start":{"line":21,"column":19},"end":{"line":21,"column":74}},"10":{"start":{"line":22,"column":2},"end":{"line":24,"column":27}},"11":{"start":{"line":30,"column":42},"end":{"line":63,"column":1}},"12":{"start":{"line":31,"column":25},"end":{"line":31,"column":48}},"13":{"start":{"line":32,"column":30},"end":{"line":32,"column":83}},"14":{"start":{"line":45,"column":28},"end":{"line":46,"column":54}},"15":{"start":{"line":46,"column":22},"end":{"line":46,"column":53}},"16":{"start":{"line":48,"column":4},"end":{"line":48,"column":66}},"17":{"start":{"line":48,"column":38},"end":{"line":48,"column":66}},"18":{"start":{"line":49,"column":4},"end":{"line":50,"column":41}},"19":{"start":{"line":49,"column":37},"end":{"line":49,"column":61}},"20":{"start":{"line":49,"column":64},"end":{"line":50,"column":41}},"21":{"start":{"line":52,"column":17},"end":{"line":53,"column":42}},"22":{"start":{"line":52,"column":45},"end":{"line":52,"column":81}},"23":{"start":{"line":53,"column":22},"end":{"line":53,"column":41}},"24":{"start":{"line":55,"column":4},"end":{"line":57,"column":29}},"25":{"start":{"line":60,"column":2},"end":{"line":62,"column":58}}},"fnMap":{"0":{"name":"BeliefGlobalReduce","decl":{"start":{"line":7,"column":16},"end":{"line":7,"column":34}},"loc":{"start":{"line":7,"column":66},"end":{"line":14,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":16,"column":54},"end":{"line":16,"column":55}},"loc":{"start":{"line":16,"column":71},"end":{"line":25,"column":1}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":30},"end":{"line":18,"column":34}},"loc":{"start":{"line":18,"column":38},"end":{"line":18,"column":102}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":30,"column":42},"end":{"line":30,"column":43}},"loc":{"start":{"line":30,"column":72},"end":{"line":63,"column":1}}},"4":{"name":"checkForCycle","decl":{"start":{"line":44,"column":11},"end":{"line":44,"column":24}},"loc":{"start":{"line":44,"column":68},"end":{"line":58,"column":3}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":46,"column":14},"end":{"line":46,"column":18}},"loc":{"start":{"line":46,"column":22},"end":{"line":46,"column":53}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":49,"column":29},"end":{"line":49,"column":33}},"loc":{"start":{"line":49,"column":37},"end":{"line":49,"column":61}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":52,"column":37},"end":{"line":52,"column":41}},"loc":{"start":{"line":52,"column":45},"end":{"line":52,"column":81}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":53,"column":12},"end":{"line":53,"column":18}},"loc":{"start":{"line":53,"column":22},"end":{"line":53,"column":41}}}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":2},"end":{"line":13,"column":3}},"type":"switch","locations":[{"start":{"line":9,"column":4},"end":{"line":10,"column":50}},{"start":{"line":11,"column":4},"end":{"line":12,"column":53}}]},"1":{"loc":{"start":{"line":18,"column":38},"end":{"line":18,"column":102}},"type":"binary-expr","locations":[{"start":{"line":18,"column":38},"end":{"line":18,"column":67}},{"start":{"line":18,"column":71},"end":{"line":18,"column":102}}]},"2":{"loc":{"start":{"line":19,"column":2},"end":{"line":19,"column":45}},"type":"if","locations":[{"start":{"line":19,"column":2},"end":{"line":19,"column":45}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":22,"column":9},"end":{"line":24,"column":26}},"type":"cond-expr","locations":[{"start":{"line":23,"column":6},"end":{"line":23,"column":118}},{"start":{"line":24,"column":6},"end":{"line":24,"column":26}}]},"4":{"loc":{"start":{"line":22,"column":10},"end":{"line":22,"column":83}},"type":"binary-expr","locations":[{"start":{"line":22,"column":10},"end":{"line":22,"column":44}},{"start":{"line":22,"column":48},"end":{"line":22,"column":83}}]},"5":{"loc":{"start":{"line":48,"column":4},"end":{"line":48,"column":66}},"type":"if","locations":[{"start":{"line":48,"column":4},"end":{"line":48,"column":66}},{"start":{},"end":{}}]},"6":{"loc":{"start":{"line":49,"column":4},"end":{"line":50,"column":41}},"type":"if","locations":[{"start":{"line":49,"column":4},"end":{"line":50,"column":41}},{"start":{},"end":{}}]},"7":{"loc":{"start":{"line":55,"column":11},"end":{"line":57,"column":28}},"type":"cond-expr","locations":[{"start":{"line":56,"column":8},"end":{"line":56,"column":12}},{"start":{"line":57,"column":8},"end":{"line":57,"column":28}}]},"8":{"loc":{"start":{"line":60,"column":9},"end":{"line":62,"column":57}},"type":"cond-expr","locations":[{"start":{"line":61,"column":6},"end":{"line":61,"column":50}},{"start":{"line":62,"column":6},"end":{"line":62,"column":57}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\EndNode.default.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\EndNode.default.ts","statementMap":{"0":{"start":{"line":6,"column":44},"end":{"line":10,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":0},"f":{},"b":{}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\EndNode.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\EndNode.tsx","statementMap":{"0":{"start":{"line":30,"column":2},"end":{"line":42,"column":4}},"1":{"start":{"line":53,"column":2},"end":{"line":55,"column":null}},"2":{"start":{"line":58,"column":26},"end":{"line":60,"column":80}}},"fnMap":{"0":{"name":"EndNode","decl":{"start":{"line":29,"column":24},"end":{"line":29,"column":31}},"loc":{"start":{"line":29,"column":57},"end":{"line":43,"column":1}}},"1":{"name":"EndReduce","decl":{"start":{"line":51,"column":16},"end":{"line":51,"column":25}},"loc":{"start":{"line":51,"column":52},"end":{"line":56,"column":1}}},"2":{"name":"EndConnectionTarget","decl":{"start":{"line":67,"column":16},"end":{"line":67,"column":35}},"loc":{"start":{"line":67,"column":74},"end":{"line":69,"column":1}}},"3":{"name":"EndConnectionSource","decl":{"start":{"line":76,"column":16},"end":{"line":76,"column":35}},"loc":{"start":{"line":76,"column":74},"end":{"line":78,"column":1}}},"4":{"name":"EndDisconnectionTarget","decl":{"start":{"line":85,"column":16},"end":{"line":85,"column":38}},"loc":{"start":{"line":85,"column":77},"end":{"line":87,"column":1}}},"5":{"name":"EndDisconnectionSource","decl":{"start":{"line":94,"column":16},"end":{"line":94,"column":38}},"loc":{"start":{"line":94,"column":77},"end":{"line":96,"column":1}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},"b":{}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\GoalNode.default.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\GoalNode.default.ts","statementMap":{"0":{"start":{"line":6,"column":46},"end":{"line":14,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":0},"f":{},"b":{}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\GoalNode.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\GoalNode.tsx","statementMap":{"0":{"start":{"line":47,"column":27},"end":{"line":47,"column":41}},"1":{"start":{"line":48,"column":17},"end":{"line":48,"column":37}},"2":{"start":{"line":50,"column":24},"end":{"line":50,"column":47}},"3":{"start":{"line":51,"column":22},"end":{"line":51,"column":43}},"4":{"start":{"line":52,"column":22},"end":{"line":52,"column":56}},"5":{"start":{"line":53,"column":26},"end":{"line":53,"column":90}},"6":{"start":{"line":55,"column":25},"end":{"line":57,"column":3}},"7":{"start":{"line":56,"column":4},"end":{"line":56,"column":54}},"8":{"start":{"line":59,"column":17},"end":{"line":61,"column":3}},"9":{"start":{"line":60,"column":4},"end":{"line":60,"column":null}},"10":{"start":{"line":63,"column":22},"end":{"line":65,"column":3}},"11":{"start":{"line":64,"column":4},"end":{"line":64,"column":51}},"12":{"start":{"line":67,"column":2},"end":{"line":127,"column":6}},"13":{"start":{"line":75,"column":29},"end":{"line":75,"column":41}},"14":{"start":{"line":102,"column":27},"end":{"line":102,"column":91}},"15":{"start":{"line":111,"column":20},"end":{"line":114,"column":23}},"16":{"start":{"line":137,"column":15},"end":{"line":137,"column":40}},"17":{"start":{"line":138,"column":4},"end":{"line":144,"column":null}},"18":{"start":{"line":148,"column":27},"end":{"line":150,"column":51}},"19":{"start":{"line":159,"column":16},"end":{"line":159,"column":45}},"20":{"start":{"line":160,"column":20},"end":{"line":160,"column":61}},"21":{"start":{"line":160,"column":38},"end":{"line":160,"column":60}},"22":{"start":{"line":161,"column":2},"end":{"line":161,"column":54}},"23":{"start":{"line":161,"column":47},"end":{"line":161,"column":54}},"24":{"start":{"line":163,"column":15},"end":{"line":163,"column":45}},"25":{"start":{"line":166,"column":2},"end":{"line":173,"column":3}},"26":{"start":{"line":167,"column":4},"end":{"line":167,"column":null}},"27":{"start":{"line":172,"column":4},"end":{"line":172,"column":null}},"28":{"start":{"line":192,"column":15},"end":{"line":192,"column":45}},"29":{"start":{"line":193,"column":2},"end":{"line":193,"column":null}}},"fnMap":{"0":{"name":"GoalNode","decl":{"start":{"line":46,"column":24},"end":{"line":46,"column":32}},"loc":{"start":{"line":46,"column":64},"end":{"line":128,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":55,"column":25},"end":{"line":55,"column":26}},"loc":{"start":{"line":55,"column":43},"end":{"line":57,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":59,"column":17},"end":{"line":59,"column":18}},"loc":{"start":{"line":59,"column":35},"end":{"line":61,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":63,"column":22},"end":{"line":63,"column":23}},"loc":{"start":{"line":63,"column":41},"end":{"line":65,"column":3}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":75,"column":20},"end":{"line":75,"column":21}},"loc":{"start":{"line":75,"column":29},"end":{"line":75,"column":41}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":102,"column":20},"end":{"line":102,"column":21}},"loc":{"start":{"line":102,"column":27},"end":{"line":102,"column":91}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":110,"column":26},"end":{"line":110,"column":27}},"loc":{"start":{"line":110,"column":35},"end":{"line":115,"column":19}}},"7":{"name":"GoalReduce","decl":{"start":{"line":136,"column":16},"end":{"line":136,"column":26}},"loc":{"start":{"line":136,"column":53},"end":{"line":145,"column":1}}},"8":{"name":"GoalConnectionTarget","decl":{"start":{"line":157,"column":16},"end":{"line":157,"column":36}},"loc":{"start":{"line":157,"column":75},"end":{"line":174,"column":1}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":160,"column":31},"end":{"line":160,"column":32}},"loc":{"start":{"line":160,"column":38},"end":{"line":160,"column":60}}},"10":{"name":"GoalConnectionSource","decl":{"start":{"line":181,"column":16},"end":{"line":181,"column":36}},"loc":{"start":{"line":181,"column":75},"end":{"line":183,"column":1}}},"11":{"name":"GoalDisconnectionTarget","decl":{"start":{"line":190,"column":16},"end":{"line":190,"column":39}},"loc":{"start":{"line":190,"column":78},"end":{"line":194,"column":1}}},"12":{"name":"GoalDisconnectionSource","decl":{"start":{"line":201,"column":16},"end":{"line":201,"column":39}},"loc":{"start":{"line":201,"column":78},"end":{"line":203,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":53,"column":26},"end":{"line":53,"column":90}},"type":"binary-expr","locations":[{"start":{"line":53,"column":26},"end":{"line":53,"column":49}},{"start":{"line":53,"column":53},"end":{"line":53,"column":90}}]},"1":{"loc":{"start":{"line":80,"column":7},"end":{"line":90,"column":13}},"type":"binary-expr","locations":[{"start":{"line":80,"column":8},"end":{"line":80,"column":21}},{"start":{"line":80,"column":25},"end":{"line":80,"column":40}},{"start":{"line":80,"column":46},"end":{"line":89,"column":null}}]},"2":{"loc":{"start":{"line":92,"column":17},"end":{"line":92,"column":159}},"type":"cond-expr","locations":[{"start":{"line":92,"column":30},"end":{"line":92,"column":84}},{"start":{"line":92,"column":87},"end":{"line":92,"column":159}}]},"3":{"loc":{"start":{"line":94,"column":7},"end":{"line":104,"column":null}},"type":"binary-expr","locations":[{"start":{"line":94,"column":7},"end":{"line":94,"column":16}},{"start":{"line":94,"column":21},"end":{"line":103,"column":null}}]},"4":{"loc":{"start":{"line":94,"column":72},"end":{"line":94,"column":111}},"type":"cond-expr","locations":[{"start":{"line":94,"column":86},"end":{"line":94,"column":88}},{"start":{"line":94,"column":91},"end":{"line":94,"column":111}}]},"5":{"loc":{"start":{"line":95,"column":9},"end":{"line":95,"column":35}},"type":"cond-expr","locations":[{"start":{"line":95,"column":23},"end":{"line":95,"column":25}},{"start":{"line":95,"column":28},"end":{"line":95,"column":35}}]},"6":{"loc":{"start":{"line":96,"column":38},"end":{"line":96,"column":110}},"type":"cond-expr","locations":[{"start":{"line":96,"column":53},"end":{"line":96,"column":81}},{"start":{"line":96,"column":84},"end":{"line":96,"column":110}}]},"7":{"loc":{"start":{"line":100,"column":20},"end":{"line":100,"column":88}},"type":"binary-expr","locations":[{"start":{"line":100,"column":20},"end":{"line":100,"column":32}},{"start":{"line":100,"column":37},"end":{"line":100,"column":46}},{"start":{"line":100,"column":50},"end":{"line":100,"column":87}}]},"8":{"loc":{"start":{"line":101,"column":19},"end":{"line":101,"column":104}},"type":"binary-expr","locations":[{"start":{"line":101,"column":19},"end":{"line":101,"column":31}},{"start":{"line":101,"column":35},"end":{"line":101,"column":48}},{"start":{"line":101,"column":53},"end":{"line":101,"column":62}},{"start":{"line":101,"column":66},"end":{"line":101,"column":103}}]},"9":{"loc":{"start":{"line":102,"column":27},"end":{"line":102,"column":91}},"type":"cond-expr","locations":[{"start":{"line":102,"column":41},"end":{"line":102,"column":70}},{"start":{"line":102,"column":73},"end":{"line":102,"column":91}}]},"10":{"loc":{"start":{"line":142,"column":16},"end":{"line":142,"column":85}},"type":"binary-expr","locations":[{"start":{"line":142,"column":16},"end":{"line":142,"column":29}},{"start":{"line":142,"column":34},"end":{"line":142,"column":43}},{"start":{"line":142,"column":47},"end":{"line":142,"column":84}}]},"11":{"loc":{"start":{"line":143,"column":12},"end":{"line":143,"column":58}},"type":"cond-expr","locations":[{"start":{"line":143,"column":24},"end":{"line":143,"column":53}},{"start":{"line":143,"column":56},"end":{"line":143,"column":58}}]},"12":{"loc":{"start":{"line":161,"column":2},"end":{"line":161,"column":54}},"type":"if","locations":[{"start":{"line":161,"column":2},"end":{"line":161,"column":54}},{"start":{},"end":{}}]},"13":{"loc":{"start":{"line":161,"column":6},"end":{"line":161,"column":45}},"type":"binary-expr","locations":[{"start":{"line":161,"column":6},"end":{"line":161,"column":16}},{"start":{"line":161,"column":20},"end":{"line":161,"column":45}}]},"14":{"loc":{"start":{"line":166,"column":2},"end":{"line":173,"column":3}},"type":"if","locations":[{"start":{"line":166,"column":2},"end":{"line":173,"column":3}},{"start":{"line":171,"column":7},"end":{"line":173,"column":3}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"b":{"0":[0,0],"1":[0,0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0,0],"8":[0,0,0,0],"9":[0,0],"10":[0,0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\InferredBeliefNode.default.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\InferredBeliefNode.default.ts","statementMap":{"0":{"start":{"line":7,"column":66},"end":{"line":16,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":0},"f":{},"b":{}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\InferredBeliefNode.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\InferredBeliefNode.tsx","statementMap":{"0":{"start":{"line":41,"column":15},"end":{"line":41,"column":55}},"1":{"start":{"line":43,"column":2},"end":{"line":51,"column":3}},"2":{"start":{"line":43,"column":52},"end":{"line":44,"column":63}},"3":{"start":{"line":46,"column":27},"end":{"line":46,"column":88}},"4":{"start":{"line":47,"column":4},"end":{"line":50,"column":5}},"5":{"start":{"line":47,"column":39},"end":{"line":47,"column":68}},"6":{"start":{"line":48,"column":25},"end":{"line":48,"column":66}},"7":{"start":{"line":48,"column":67},"end":{"line":48,"column":73}},"8":{"start":{"line":49,"column":26},"end":{"line":49,"column":68}},"9":{"start":{"line":49,"column":69},"end":{"line":49,"column":75}},"10":{"start":{"line":69,"column":15},"end":{"line":69,"column":55}},"11":{"start":{"line":71,"column":2},"end":{"line":71,"column":87}},"12":{"start":{"line":71,"column":50},"end":{"line":71,"column":87}},"13":{"start":{"line":72,"column":2},"end":{"line":72,"column":89}},"14":{"start":{"line":72,"column":51},"end":{"line":72,"column":89}},"15":{"start":{"line":84,"column":37},"end":{"line":86,"column":75}},"16":{"start":{"line":93,"column":15},"end":{"line":93,"column":25}},"17":{"start":{"line":94,"column":29},"end":{"line":94,"column":43}},"18":{"start":{"line":96,"column":52},"end":{"line":96,"column":66}},"19":{"start":{"line":100,"column":24},"end":{"line":100,"column":42}},"20":{"start":{"line":101,"column":4},"end":{"line":101,"column":38}},"21":{"start":{"line":103,"column":4},"end":{"line":109,"column":7}},"22":{"start":{"line":112,"column":2},"end":{"line":151,"column":4}},"23":{"start":{"line":161,"column":15},"end":{"line":161,"column":50}},"24":{"start":{"line":162,"column":21},"end":{"line":162,"column":79}},"25":{"start":{"line":162,"column":42},"end":{"line":162,"column":78}},"26":{"start":{"line":163,"column":22},"end":{"line":163,"column":81}},"27":{"start":{"line":163,"column":43},"end":{"line":163,"column":80}},"28":{"start":{"line":165,"column":2},"end":{"line":165,"column":61}},"29":{"start":{"line":165,"column":21},"end":{"line":165,"column":61}},"30":{"start":{"line":166,"column":2},"end":{"line":166,"column":63}},"31":{"start":{"line":166,"column":22},"end":{"line":166,"column":63}},"32":{"start":{"line":168,"column":42},"end":{"line":173,"column":4}},"33":{"start":{"line":175,"column":2},"end":{"line":175,"column":null}}},"fnMap":{"0":{"name":"InferredBeliefConnectionTarget","decl":{"start":{"line":40,"column":16},"end":{"line":40,"column":46}},"loc":{"start":{"line":40,"column":85},"end":{"line":52,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":43,"column":42},"end":{"line":43,"column":43}},"loc":{"start":{"line":43,"column":52},"end":{"line":44,"column":63}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":47,"column":31},"end":{"line":47,"column":35}},"loc":{"start":{"line":47,"column":39},"end":{"line":47,"column":68}}},"3":{"name":"InferredBeliefConnectionSource","decl":{"start":{"line":59,"column":16},"end":{"line":59,"column":46}},"loc":{"start":{"line":59,"column":85},"end":{"line":61,"column":1}}},"4":{"name":"InferredBeliefDisconnectionTarget","decl":{"start":{"line":68,"column":16},"end":{"line":68,"column":49}},"loc":{"start":{"line":68,"column":88},"end":{"line":73,"column":1}}},"5":{"name":"InferredBeliefDisconnectionSource","decl":{"start":{"line":80,"column":16},"end":{"line":80,"column":49}},"loc":{"start":{"line":80,"column":88},"end":{"line":82,"column":1}}},"6":{"name":"InferredBeliefNode","decl":{"start":{"line":92,"column":24},"end":{"line":92,"column":42}},"loc":{"start":{"line":92,"column":79},"end":{"line":152,"column":1}}},"7":{"name":"onToggle","decl":{"start":{"line":99,"column":11},"end":{"line":99,"column":19}},"loc":{"start":{"line":99,"column":19},"end":{"line":110,"column":3}}},"8":{"name":"InferredBeliefReduce","decl":{"start":{"line":160,"column":16},"end":{"line":160,"column":36}},"loc":{"start":{"line":160,"column":62},"end":{"line":176,"column":1}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":162,"column":32},"end":{"line":162,"column":33}},"loc":{"start":{"line":162,"column":42},"end":{"line":162,"column":78}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":163,"column":33},"end":{"line":163,"column":34}},"loc":{"start":{"line":163,"column":43},"end":{"line":163,"column":80}}}},"branchMap":{"0":{"loc":{"start":{"line":43,"column":2},"end":{"line":51,"column":3}},"type":"if","locations":[{"start":{"line":43,"column":2},"end":{"line":51,"column":3}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":43,"column":52},"end":{"line":44,"column":63}},"type":"binary-expr","locations":[{"start":{"line":43,"column":52},"end":{"line":43,"column":77}},{"start":{"line":44,"column":7},"end":{"line":44,"column":63}}]},"2":{"loc":{"start":{"line":47,"column":4},"end":{"line":50,"column":5}},"type":"switch","locations":[{"start":{"line":48,"column":6},"end":{"line":48,"column":73}},{"start":{"line":49,"column":6},"end":{"line":49,"column":75}}]},"3":{"loc":{"start":{"line":71,"column":2},"end":{"line":71,"column":87}},"type":"if","locations":[{"start":{"line":71,"column":2},"end":{"line":71,"column":87}},{"start":{},"end":{}}]},"4":{"loc":{"start":{"line":72,"column":2},"end":{"line":72,"column":89}},"type":"if","locations":[{"start":{"line":72,"column":2},"end":{"line":72,"column":89}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":165,"column":2},"end":{"line":165,"column":61}},"type":"if","locations":[{"start":{"line":165,"column":2},"end":{"line":165,"column":61}},{"start":{},"end":{}}]},"6":{"loc":{"start":{"line":166,"column":2},"end":{"line":166,"column":63}},"type":"if","locations":[{"start":{"line":166,"column":2},"end":{"line":166,"column":63}},{"start":{},"end":{}}]},"7":{"loc":{"start":{"line":171,"column":14},"end":{"line":171,"column":57}},"type":"cond-expr","locations":[{"start":{"line":171,"column":45},"end":{"line":171,"column":50}},{"start":{"line":171,"column":53},"end":{"line":171,"column":57}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\NormNode.default.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\NormNode.default.ts","statementMap":{"0":{"start":{"line":6,"column":46},"end":{"line":13,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":0},"f":{},"b":{}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\NormNode.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\NormNode.tsx","statementMap":{"0":{"start":{"line":38,"column":15},"end":{"line":38,"column":25}},"1":{"start":{"line":39,"column":27},"end":{"line":39,"column":41}},"2":{"start":{"line":41,"column":24},"end":{"line":41,"column":53}},"3":{"start":{"line":42,"column":22},"end":{"line":42,"column":49}},"4":{"start":{"line":44,"column":19},"end":{"line":46,"column":3}},"5":{"start":{"line":45,"column":4},"end":{"line":45,"column":44}},"6":{"start":{"line":48,"column":22},"end":{"line":50,"column":3}},"7":{"start":{"line":49,"column":4},"end":{"line":49,"column":57}},"8":{"start":{"line":52,"column":2},"end":{"line":87,"column":6}},"9":{"start":{"line":60,"column":29},"end":{"line":60,"column":42}},"10":{"start":{"line":70,"column":27},"end":{"line":70,"column":56}},"11":{"start":{"line":97,"column":15},"end":{"line":97,"column":40}},"12":{"start":{"line":100,"column":42},"end":{"line":105,"column":4}},"13":{"start":{"line":107,"column":2},"end":{"line":112,"column":3}},"14":{"start":{"line":108,"column":26},"end":{"line":108,"column":74}},"15":{"start":{"line":108,"column":47},"end":{"line":108,"column":73}},"16":{"start":{"line":110,"column":4},"end":{"line":110,"column":50}},"17":{"start":{"line":110,"column":36},"end":{"line":110,"column":50}},"18":{"start":{"line":111,"column":4},"end":{"line":111,"column":null}},"19":{"start":{"line":113,"column":2},"end":{"line":113,"column":null}},"20":{"start":{"line":116,"column":27},"end":{"line":118,"column":48}},"21":{"start":{"line":126,"column":15},"end":{"line":126,"column":45}},"22":{"start":{"line":128,"column":2},"end":{"line":130,"column":5}},"23":{"start":{"line":128,"column":52},"end":{"line":128,"column":137}},"24":{"start":{"line":129,"column":6},"end":{"line":129,"column":37}},"25":{"start":{"line":148,"column":15},"end":{"line":148,"column":45}},"26":{"start":{"line":150,"column":2},"end":{"line":150,"column":null}},"27":{"start":{"line":150,"column":39},"end":{"line":150,"column":null}}},"fnMap":{"0":{"name":"NormNode","decl":{"start":{"line":37,"column":24},"end":{"line":37,"column":32}},"loc":{"start":{"line":37,"column":59},"end":{"line":88,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":44,"column":19},"end":{"line":44,"column":20}},"loc":{"start":{"line":44,"column":37},"end":{"line":46,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":48,"column":22},"end":{"line":48,"column":23}},"loc":{"start":{"line":48,"column":41},"end":{"line":50,"column":3}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":60,"column":20},"end":{"line":60,"column":21}},"loc":{"start":{"line":60,"column":29},"end":{"line":60,"column":42}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":70,"column":20},"end":{"line":70,"column":21}},"loc":{"start":{"line":70,"column":27},"end":{"line":70,"column":56}}},"5":{"name":"NormReduce","decl":{"start":{"line":96,"column":16},"end":{"line":96,"column":26}},"loc":{"start":{"line":96,"column":52},"end":{"line":114,"column":1}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":108,"column":37},"end":{"line":108,"column":38}},"loc":{"start":{"line":108,"column":47},"end":{"line":108,"column":73}}},"7":{"name":"NormConnectionTarget","decl":{"start":{"line":125,"column":16},"end":{"line":125,"column":36}},"loc":{"start":{"line":125,"column":75},"end":{"line":131,"column":1}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":128,"column":42},"end":{"line":128,"column":43}},"loc":{"start":{"line":128,"column":52},"end":{"line":128,"column":137}}},"9":{"name":"NormConnectionSource","decl":{"start":{"line":138,"column":16},"end":{"line":138,"column":36}},"loc":{"start":{"line":138,"column":75},"end":{"line":140,"column":1}}},"10":{"name":"NormDisconnectionTarget","decl":{"start":{"line":147,"column":16},"end":{"line":147,"column":39}},"loc":{"start":{"line":147,"column":78},"end":{"line":151,"column":1}}},"11":{"name":"NormDisconnectionSource","decl":{"start":{"line":158,"column":16},"end":{"line":158,"column":39}},"loc":{"start":{"line":158,"column":78},"end":{"line":160,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":69,"column":19},"end":{"line":69,"column":41}},"type":"binary-expr","locations":[{"start":{"line":69,"column":19},"end":{"line":69,"column":32}},{"start":{"line":69,"column":36},"end":{"line":69,"column":41}}]},"1":{"loc":{"start":{"line":75,"column":7},"end":{"line":77,"column":13}},"type":"binary-expr","locations":[{"start":{"line":75,"column":7},"end":{"line":75,"column":21}},{"start":{"line":75,"column":26},"end":{"line":76,"column":null}}]},"2":{"loc":{"start":{"line":107,"column":2},"end":{"line":112,"column":3}},"type":"if","locations":[{"start":{"line":107,"column":2},"end":{"line":112,"column":3}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":110,"column":4},"end":{"line":110,"column":50}},"type":"if","locations":[{"start":{"line":110,"column":4},"end":{"line":110,"column":50}},{"start":{},"end":{}}]},"4":{"loc":{"start":{"line":128,"column":2},"end":{"line":130,"column":5}},"type":"if","locations":[{"start":{"line":128,"column":2},"end":{"line":130,"column":5}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":128,"column":52},"end":{"line":128,"column":137}},"type":"binary-expr","locations":[{"start":{"line":128,"column":52},"end":{"line":128,"column":77}},{"start":{"line":128,"column":81},"end":{"line":128,"column":137}}]},"6":{"loc":{"start":{"line":150,"column":2},"end":{"line":150,"column":null}},"type":"if","locations":[{"start":{"line":150,"column":2},"end":{"line":150,"column":null}},{"start":{},"end":{}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\PhaseNode.default.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\PhaseNode.default.ts","statementMap":{"0":{"start":{"line":6,"column":48},"end":{"line":13,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":0},"f":{},"b":{}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\PhaseNode.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\PhaseNode.tsx","statementMap":{"0":{"start":{"line":39,"column":15},"end":{"line":39,"column":25}},"1":{"start":{"line":40,"column":27},"end":{"line":40,"column":41}},"2":{"start":{"line":41,"column":22},"end":{"line":41,"column":90}},"3":{"start":{"line":41,"column":41},"end":{"line":41,"column":90}},"4":{"start":{"line":42,"column":25},"end":{"line":42,"column":56}},"5":{"start":{"line":44,"column":2},"end":{"line":70,"column":4}},"6":{"start":{"line":80,"column":21},"end":{"line":80,"column":38}},"7":{"start":{"line":81,"column":17},"end":{"line":81,"column":47}},"8":{"start":{"line":84,"column":38},"end":{"line":86,"column":24}},"9":{"start":{"line":85,"column":27},"end":{"line":85,"column":31}},"10":{"start":{"line":86,"column":22},"end":{"line":86,"column":23}},"11":{"start":{"line":89,"column":35},"end":{"line":91,"column":24}},"12":{"start":{"line":90,"column":25},"end":{"line":90,"column":53}},"13":{"start":{"line":91,"column":22},"end":{"line":91,"column":23}},"14":{"start":{"line":94,"column":32},"end":{"line":94,"column":34}},"15":{"start":{"line":95,"column":4},"end":{"line":96,"column":78}},"16":{"start":{"line":96,"column":6},"end":{"line":96,"column":78}},"17":{"start":{"line":96,"column":45},"end":{"line":96,"column":76}},"18":{"start":{"line":99,"column":44},"end":{"line":102,"column":6}},"19":{"start":{"line":104,"column":4},"end":{"line":116,"column":7}},"20":{"start":{"line":105,"column":30},"end":{"line":105,"column":81}},"21":{"start":{"line":105,"column":62},"end":{"line":105,"column":80}},"22":{"start":{"line":106,"column":24},"end":{"line":106,"column":69}},"23":{"start":{"line":107,"column":8},"end":{"line":115,"column":9}},"24":{"start":{"line":108,"column":12},"end":{"line":108,"column":67}},"25":{"start":{"line":109,"column":12},"end":{"line":109,"column":36}},"26":{"start":{"line":111,"column":12},"end":{"line":111,"column":36}},"27":{"start":{"line":112,"column":12},"end":{"line":114,"column":13}},"28":{"start":{"line":113,"column":15},"end":{"line":113,"column":null}},"29":{"start":{"line":118,"column":4},"end":{"line":118,"column":18}},"30":{"start":{"line":121,"column":28},"end":{"line":123,"column":62}},"31":{"start":{"line":131,"column":15},"end":{"line":131,"column":46}},"32":{"start":{"line":133,"column":16},"end":{"line":133,"column":45}},"33":{"start":{"line":134,"column":21},"end":{"line":134,"column":69}},"34":{"start":{"line":134,"column":42},"end":{"line":134,"column":67}},"35":{"start":{"line":135,"column":2},"end":{"line":143,"column":3}},"36":{"start":{"line":136,"column":18},"end":{"line":136,"column":24}},"37":{"start":{"line":137,"column":18},"end":{"line":137,"column":43}},"38":{"start":{"line":137,"column":44},"end":{"line":137,"column":50}},"39":{"start":{"line":142,"column":13},"end":{"line":142,"column":47}},"40":{"start":{"line":142,"column":48},"end":{"line":142,"column":54}},"41":{"start":{"line":152,"column":15},"end":{"line":152,"column":46}},"42":{"start":{"line":153,"column":16},"end":{"line":153,"column":45}},"43":{"start":{"line":155,"column":21},"end":{"line":155,"column":68}},"44":{"start":{"line":155,"column":42},"end":{"line":155,"column":67}},"45":{"start":{"line":156,"column":2},"end":{"line":156,"column":61}},"46":{"start":{"line":156,"column":20},"end":{"line":156,"column":61}},"47":{"start":{"line":160,"column":2},"end":{"line":164,"column":3}},"48":{"start":{"line":161,"column":18},"end":{"line":161,"column":51}},"49":{"start":{"line":161,"column":52},"end":{"line":161,"column":58}},"50":{"start":{"line":162,"column":16},"end":{"line":162,"column":41}},"51":{"start":{"line":162,"column":42},"end":{"line":162,"column":48}},"52":{"start":{"line":163,"column":13},"end":{"line":163,"column":19}},"53":{"start":{"line":173,"column":15},"end":{"line":173,"column":46}},"54":{"start":{"line":175,"column":16},"end":{"line":175,"column":45}},"55":{"start":{"line":176,"column":21},"end":{"line":176,"column":68}},"56":{"start":{"line":176,"column":42},"end":{"line":176,"column":67}},"57":{"start":{"line":177,"column":21},"end":{"line":177,"column":61}},"58":{"start":{"line":178,"column":2},"end":{"line":188,"column":3}},"59":{"start":{"line":179,"column":18},"end":{"line":179,"column":24}},"60":{"start":{"line":180,"column":18},"end":{"line":180,"column":44}},"61":{"start":{"line":180,"column":45},"end":{"line":180,"column":51}},"62":{"start":{"line":186,"column":6},"end":{"line":186,"column":101}},"63":{"start":{"line":186,"column":56},"end":{"line":186,"column":97}},"64":{"start":{"line":186,"column":84},"end":{"line":186,"column":97}},"65":{"start":{"line":187,"column":6},"end":{"line":187,"column":12}},"66":{"start":{"line":198,"column":15},"end":{"line":198,"column":46}},"67":{"start":{"line":199,"column":16},"end":{"line":199,"column":45}},"68":{"start":{"line":203,"column":2},"end":{"line":205,"column":3}},"69":{"start":{"line":203,"column":27},"end":{"line":203,"column":93}},"70":{"start":{"line":204,"column":4},"end":{"line":204,"column":28}}},"fnMap":{"0":{"name":"PhaseNode","decl":{"start":{"line":38,"column":24},"end":{"line":38,"column":33}},"loc":{"start":{"line":38,"column":61},"end":{"line":71,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":41,"column":22},"end":{"line":41,"column":23}},"loc":{"start":{"line":41,"column":41},"end":{"line":41,"column":90}}},"2":{"name":"PhaseReduce","decl":{"start":{"line":79,"column":16},"end":{"line":79,"column":27}},"loc":{"start":{"line":79,"column":53},"end":{"line":119,"column":1}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":85,"column":16},"end":{"line":85,"column":17}},"loc":{"start":{"line":85,"column":27},"end":{"line":85,"column":31}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":86,"column":13},"end":{"line":86,"column":14}},"loc":{"start":{"line":86,"column":22},"end":{"line":86,"column":23}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":90,"column":16},"end":{"line":90,"column":17}},"loc":{"start":{"line":90,"column":25},"end":{"line":90,"column":53}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":91,"column":13},"end":{"line":91,"column":14}},"loc":{"start":{"line":91,"column":22},"end":{"line":91,"column":23}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":96,"column":35},"end":{"line":96,"column":36}},"loc":{"start":{"line":96,"column":45},"end":{"line":96,"column":76}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":104,"column":25},"end":{"line":104,"column":26}},"loc":{"start":{"line":104,"column":34},"end":{"line":116,"column":5}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":105,"column":51},"end":{"line":105,"column":52}},"loc":{"start":{"line":105,"column":62},"end":{"line":105,"column":80}}},"10":{"name":"PhaseConnectionTarget","decl":{"start":{"line":130,"column":16},"end":{"line":130,"column":37}},"loc":{"start":{"line":130,"column":76},"end":{"line":144,"column":1}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":134,"column":32},"end":{"line":134,"column":33}},"loc":{"start":{"line":134,"column":42},"end":{"line":134,"column":67}}},"12":{"name":"PhaseConnectionSource","decl":{"start":{"line":151,"column":16},"end":{"line":151,"column":37}},"loc":{"start":{"line":151,"column":76},"end":{"line":165,"column":1}}},"13":{"name":"(anonymous_13)","decl":{"start":{"line":155,"column":32},"end":{"line":155,"column":33}},"loc":{"start":{"line":155,"column":42},"end":{"line":155,"column":67}}},"14":{"name":"PhaseDisconnectionTarget","decl":{"start":{"line":172,"column":16},"end":{"line":172,"column":40}},"loc":{"start":{"line":172,"column":79},"end":{"line":190,"column":1}}},"15":{"name":"(anonymous_15)","decl":{"start":{"line":176,"column":32},"end":{"line":176,"column":33}},"loc":{"start":{"line":176,"column":42},"end":{"line":176,"column":67}}},"16":{"name":"(anonymous_16)","decl":{"start":{"line":186,"column":43},"end":{"line":186,"column":44}},"loc":{"start":{"line":186,"column":53},"end":{"line":186,"column":99}}},"17":{"name":"PhaseDisconnectionSource","decl":{"start":{"line":197,"column":16},"end":{"line":197,"column":40}},"loc":{"start":{"line":197,"column":79},"end":{"line":206,"column":1}}},"18":{"name":"(anonymous_18)","decl":{"start":{"line":203,"column":17},"end":{"line":203,"column":18}},"loc":{"start":{"line":203,"column":27},"end":{"line":203,"column":93}}}},"branchMap":{"0":{"loc":{"start":{"line":95,"column":4},"end":{"line":96,"column":78}},"type":"if","locations":[{"start":{"line":95,"column":4},"end":{"line":96,"column":78}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":107,"column":8},"end":{"line":115,"column":9}},"type":"if","locations":[{"start":{"line":107,"column":8},"end":{"line":115,"column":9}},{"start":{"line":110,"column":15},"end":{"line":115,"column":9}}]},"2":{"loc":{"start":{"line":135,"column":2},"end":{"line":143,"column":3}},"type":"switch","locations":[{"start":{"line":136,"column":4},"end":{"line":136,"column":24}},{"start":{"line":137,"column":4},"end":{"line":137,"column":50}},{"start":{"line":142,"column":4},"end":{"line":142,"column":54}}]},"3":{"loc":{"start":{"line":156,"column":2},"end":{"line":156,"column":61}},"type":"if","locations":[{"start":{"line":156,"column":2},"end":{"line":156,"column":61}},{"start":{},"end":{}}]},"4":{"loc":{"start":{"line":160,"column":2},"end":{"line":164,"column":3}},"type":"switch","locations":[{"start":{"line":161,"column":4},"end":{"line":161,"column":58}},{"start":{"line":162,"column":4},"end":{"line":162,"column":48}},{"start":{"line":163,"column":4},"end":{"line":163,"column":19}}]},"5":{"loc":{"start":{"line":177,"column":21},"end":{"line":177,"column":61}},"type":"cond-expr","locations":[{"start":{"line":177,"column":34},"end":{"line":177,"column":49}},{"start":{"line":177,"column":52},"end":{"line":177,"column":61}}]},"6":{"loc":{"start":{"line":178,"column":2},"end":{"line":188,"column":3}},"type":"switch","locations":[{"start":{"line":179,"column":4},"end":{"line":179,"column":24}},{"start":{"line":180,"column":4},"end":{"line":180,"column":51}},{"start":{"line":185,"column":4},"end":{"line":187,"column":12}}]},"7":{"loc":{"start":{"line":186,"column":56},"end":{"line":186,"column":97}},"type":"if","locations":[{"start":{"line":186,"column":56},"end":{"line":186,"column":97}},{"start":{},"end":{}}]},"8":{"loc":{"start":{"line":203,"column":2},"end":{"line":205,"column":3}},"type":"if","locations":[{"start":{"line":203,"column":2},"end":{"line":205,"column":3}},{"start":{},"end":{}}]},"9":{"loc":{"start":{"line":203,"column":27},"end":{"line":203,"column":93}},"type":"binary-expr","locations":[{"start":{"line":203,"column":27},"end":{"line":203,"column":52}},{"start":{"line":203,"column":56},"end":{"line":203,"column":93}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0,0],"3":[0,0],"4":[0,0,0],"5":[0,0],"6":[0,0,0],"7":[0,0],"8":[0,0],"9":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\StartNode.default.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\StartNode.default.ts","statementMap":{"0":{"start":{"line":6,"column":48},"end":{"line":10,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":0},"f":{},"b":{}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\StartNode.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\StartNode.tsx","statementMap":{"0":{"start":{"line":28,"column":2},"end":{"line":40,"column":4}},"1":{"start":{"line":51,"column":2},"end":{"line":53,"column":null}},"2":{"start":{"line":56,"column":28},"end":{"line":58,"column":80}}},"fnMap":{"0":{"name":"StartNode","decl":{"start":{"line":27,"column":24},"end":{"line":27,"column":33}},"loc":{"start":{"line":27,"column":61},"end":{"line":41,"column":1}}},"1":{"name":"StartReduce","decl":{"start":{"line":49,"column":16},"end":{"line":49,"column":27}},"loc":{"start":{"line":49,"column":54},"end":{"line":54,"column":1}}},"2":{"name":"StartConnectionTarget","decl":{"start":{"line":65,"column":16},"end":{"line":65,"column":37}},"loc":{"start":{"line":65,"column":76},"end":{"line":67,"column":1}}},"3":{"name":"StartConnectionSource","decl":{"start":{"line":74,"column":16},"end":{"line":74,"column":37}},"loc":{"start":{"line":74,"column":76},"end":{"line":76,"column":1}}},"4":{"name":"StartDisconnectionTarget","decl":{"start":{"line":83,"column":16},"end":{"line":83,"column":40}},"loc":{"start":{"line":83,"column":79},"end":{"line":85,"column":1}}},"5":{"name":"StartDisconnectionSource","decl":{"start":{"line":92,"column":16},"end":{"line":92,"column":40}},"loc":{"start":{"line":92,"column":79},"end":{"line":94,"column":1}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},"b":{}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\TriggerNode.default.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\TriggerNode.default.ts","statementMap":{"0":{"start":{"line":6,"column":52},"end":{"line":11,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":0},"f":{},"b":{}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\TriggerNode.tsx": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\pages\\VisProgPage\\visualProgrammingUI\\nodes\\TriggerNode.tsx","statementMap":{"0":{"start":{"line":47,"column":15},"end":{"line":47,"column":25}},"1":{"start":{"line":48,"column":27},"end":{"line":48,"column":41}},"2":{"start":{"line":50,"column":17},"end":{"line":52,"column":3}},"3":{"start":{"line":51,"column":4},"end":{"line":51,"column":null}},"4":{"start":{"line":54,"column":2},"end":{"line":99,"column":6}},"5":{"start":{"line":60,"column":35},"end":{"line":60,"column":47}},"6":{"start":{"line":92,"column":12},"end":{"line":95,"column":15}},"7":{"start":{"line":109,"column":15},"end":{"line":109,"column":43}},"8":{"start":{"line":110,"column":24},"end":{"line":110,"column":91}},"9":{"start":{"line":110,"column":57},"end":{"line":110,"column":78}},"10":{"start":{"line":111,"column":24},"end":{"line":111,"column":85}},"11":{"start":{"line":112,"column":2},"end":{"line":117,"column":null}},"12":{"start":{"line":122,"column":30},"end":{"line":124,"column":74}},"13":{"start":{"line":133,"column":15},"end":{"line":133,"column":48}},"14":{"start":{"line":135,"column":16},"end":{"line":135,"column":45}},"15":{"start":{"line":136,"column":20},"end":{"line":136,"column":61}},"16":{"start":{"line":136,"column":38},"end":{"line":136,"column":60}},"17":{"start":{"line":137,"column":2},"end":{"line":137,"column":25}},"18":{"start":{"line":137,"column":18},"end":{"line":137,"column":25}},"19":{"start":{"line":139,"column":2},"end":{"line":153,"column":3}},"20":{"start":{"line":140,"column":6},"end":{"line":140,"column":37}},"21":{"start":{"line":143,"column":7},"end":{"line":153,"column":3}},"22":{"start":{"line":145,"column":4},"end":{"line":152,"column":5}},"23":{"start":{"line":146,"column":6},"end":{"line":146,"column":null}},"24":{"start":{"line":151,"column":6},"end":{"line":151,"column":null}},"25":{"start":{"line":172,"column":15},"end":{"line":172,"column":48}},"26":{"start":{"line":174,"column":4},"end":{"line":174,"column":null}},"27":{"start":{"line":174,"column":41},"end":{"line":174,"column":null}},"28":{"start":{"line":176,"column":2},"end":{"line":176,"column":null}}},"fnMap":{"0":{"name":"TriggerNode","decl":{"start":{"line":46,"column":24},"end":{"line":46,"column":35}},"loc":{"start":{"line":46,"column":65},"end":{"line":100,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":50,"column":17},"end":{"line":50,"column":18}},"loc":{"start":{"line":50,"column":35},"end":{"line":52,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":60,"column":26},"end":{"line":60,"column":27}},"loc":{"start":{"line":60,"column":35},"end":{"line":60,"column":47}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":91,"column":18},"end":{"line":91,"column":19}},"loc":{"start":{"line":91,"column":27},"end":{"line":96,"column":11}}},"4":{"name":"TriggerReduce","decl":{"start":{"line":108,"column":16},"end":{"line":108,"column":29}},"loc":{"start":{"line":108,"column":55},"end":{"line":119,"column":1}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":110,"column":52},"end":{"line":110,"column":53}},"loc":{"start":{"line":110,"column":57},"end":{"line":110,"column":78}}},"6":{"name":"TriggerConnectionTarget","decl":{"start":{"line":131,"column":16},"end":{"line":131,"column":39}},"loc":{"start":{"line":131,"column":78},"end":{"line":154,"column":1}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":136,"column":31},"end":{"line":136,"column":32}},"loc":{"start":{"line":136,"column":38},"end":{"line":136,"column":60}}},"8":{"name":"TriggerConnectionSource","decl":{"start":{"line":161,"column":16},"end":{"line":161,"column":39}},"loc":{"start":{"line":161,"column":78},"end":{"line":163,"column":1}}},"9":{"name":"TriggerDisconnectionTarget","decl":{"start":{"line":170,"column":16},"end":{"line":170,"column":42}},"loc":{"start":{"line":170,"column":81},"end":{"line":177,"column":1}}},"10":{"name":"TriggerDisconnectionSource","decl":{"start":{"line":184,"column":16},"end":{"line":184,"column":42}},"loc":{"start":{"line":184,"column":81},"end":{"line":186,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":64,"column":73},"end":{"line":64,"column":100}},"type":"cond-expr","locations":[{"start":{"line":64,"column":90},"end":{"line":64,"column":92}},{"start":{"line":64,"column":95},"end":{"line":64,"column":100}}]},"1":{"loc":{"start":{"line":64,"column":108},"end":{"line":64,"column":136}},"type":"cond-expr","locations":[{"start":{"line":64,"column":125},"end":{"line":64,"column":129}},{"start":{"line":64,"column":132},"end":{"line":64,"column":136}}]},"2":{"loc":{"start":{"line":65,"column":46},"end":{"line":65,"column":86}},"type":"cond-expr","locations":[{"start":{"line":65,"column":59},"end":{"line":65,"column":80}},{"start":{"line":65,"column":84},"end":{"line":65,"column":86}}]},"3":{"loc":{"start":{"line":65,"column":102},"end":{"line":65,"column":124}},"type":"cond-expr","locations":[{"start":{"line":65,"column":114},"end":{"line":65,"column":116}},{"start":{"line":65,"column":119},"end":{"line":65,"column":124}}]},"4":{"loc":{"start":{"line":65,"column":132},"end":{"line":65,"column":155}},"type":"cond-expr","locations":[{"start":{"line":65,"column":144},"end":{"line":65,"column":148}},{"start":{"line":65,"column":151},"end":{"line":65,"column":155}}]},"5":{"loc":{"start":{"line":110,"column":24},"end":{"line":110,"column":91}},"type":"cond-expr","locations":[{"start":{"line":110,"column":41},"end":{"line":110,"column":79}},{"start":{"line":110,"column":82},"end":{"line":110,"column":91}}]},"6":{"loc":{"start":{"line":111,"column":24},"end":{"line":111,"column":85}},"type":"cond-expr","locations":[{"start":{"line":111,"column":40},"end":{"line":111,"column":80}},{"start":{"line":111,"column":83},"end":{"line":111,"column":85}}]},"7":{"loc":{"start":{"line":116,"column":10},"end":{"line":116,"column":56}},"type":"cond-expr","locations":[{"start":{"line":116,"column":23},"end":{"line":116,"column":25}},{"start":{"line":116,"column":28},"end":{"line":116,"column":56}}]},"8":{"loc":{"start":{"line":137,"column":2},"end":{"line":137,"column":25}},"type":"if","locations":[{"start":{"line":137,"column":2},"end":{"line":137,"column":25}},{"start":{},"end":{}}]},"9":{"loc":{"start":{"line":139,"column":2},"end":{"line":153,"column":3}},"type":"if","locations":[{"start":{"line":139,"column":2},"end":{"line":153,"column":3}},{"start":{"line":143,"column":7},"end":{"line":153,"column":3}}]},"10":{"loc":{"start":{"line":139,"column":6},"end":{"line":139,"column":58}},"type":"binary-expr","locations":[{"start":{"line":139,"column":6},"end":{"line":139,"column":39}},{"start":{"line":139,"column":41},"end":{"line":139,"column":58}}]},"11":{"loc":{"start":{"line":143,"column":7},"end":{"line":153,"column":3}},"type":"if","locations":[{"start":{"line":143,"column":7},"end":{"line":153,"column":3}},{"start":{},"end":{}}]},"12":{"loc":{"start":{"line":145,"column":4},"end":{"line":152,"column":5}},"type":"if","locations":[{"start":{"line":145,"column":4},"end":{"line":152,"column":5}},{"start":{"line":150,"column":9},"end":{"line":152,"column":5}}]},"13":{"loc":{"start":{"line":174,"column":4},"end":{"line":174,"column":null}},"type":"if","locations":[{"start":{"line":174,"column":4},"end":{"line":174,"column":null}},{"start":{},"end":{}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\utils\\SaveLoad.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\utils\\SaveLoad.ts","statementMap":{"0":{"start":{"line":12,"column":18},"end":{"line":17,"column":4}},"1":{"start":{"line":18,"column":2},"end":{"line":18,"column":84}}},"fnMap":{"0":{"name":"makeProjectBlob","decl":{"start":{"line":11,"column":16},"end":{"line":11,"column":31}},"loc":{"start":{"line":11,"column":74},"end":{"line":19,"column":1}}}},"branchMap":{},"s":{"0":0,"1":0},"f":{"0":0},"b":{}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\utils\\cellStore.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\utils\\cellStore.ts","statementMap":{"0":{"start":{"line":56,"column":14},"end":{"line":56,"column":21}},"1":{"start":{"line":57,"column":20},"end":{"line":57,"column":41}},"2":{"start":{"line":58,"column":2},"end":{"line":68,"column":4}},"3":{"start":{"line":59,"column":15},"end":{"line":59,"column":20}},"4":{"start":{"line":61,"column":6},"end":{"line":61,"column":79}},"5":{"start":{"line":62,"column":6},"end":{"line":62,"column":37}},"6":{"start":{"line":62,"column":33},"end":{"line":62,"column":37}},"7":{"start":{"line":65,"column":6},"end":{"line":65,"column":30}},"8":{"start":{"line":66,"column":6},"end":{"line":66,"column":46}},"9":{"start":{"line":66,"column":19},"end":{"line":66,"column":45}},"10":{"start":{"line":95,"column":2},"end":{"line":95,"column":57}}},"fnMap":{"0":{"name":"cell","decl":{"start":{"line":55,"column":16},"end":{"line":55,"column":20}},"loc":{"start":{"line":55,"column":34},"end":{"line":69,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":59,"column":9},"end":{"line":59,"column":12}},"loc":{"start":{"line":59,"column":15},"end":{"line":59,"column":20}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":60,"column":9},"end":{"line":60,"column":10}},"loc":{"start":{"line":60,"column":18},"end":{"line":63,"column":5}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":64,"column":15},"end":{"line":64,"column":16}},"loc":{"start":{"line":64,"column":28},"end":{"line":67,"column":5}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":66,"column":13},"end":{"line":66,"column":16}},"loc":{"start":{"line":66,"column":19},"end":{"line":66,"column":45}}},"5":{"name":"useCell","decl":{"start":{"line":94,"column":16},"end":{"line":94,"column":23}},"loc":{"start":{"line":94,"column":37},"end":{"line":96,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":61,"column":14},"end":{"line":61,"column":78}},"type":"cond-expr","locations":[{"start":{"line":61,"column":44},"end":{"line":61,"column":71}},{"start":{"line":61,"column":74},"end":{"line":61,"column":78}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},"b":{"0":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\utils\\duplicateIndices.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\utils\\duplicateIndices.ts","statementMap":{"0":{"start":{"line":8,"column":20},"end":{"line":8,"column":42}},"1":{"start":{"line":10,"column":2},"end":{"line":13,"column":5}},"2":{"start":{"line":11,"column":4},"end":{"line":11,"column":56}},"3":{"start":{"line":11,"column":31},"end":{"line":11,"column":56}},"4":{"start":{"line":12,"column":4},"end":{"line":12,"column":34}},"5":{"start":{"line":16,"column":2},"end":{"line":18,"column":12}},"6":{"start":{"line":17,"column":20},"end":{"line":17,"column":35}}},"fnMap":{"0":{"name":"duplicateIndices","decl":{"start":{"line":7,"column":24},"end":{"line":7,"column":40}},"loc":{"start":{"line":7,"column":54},"end":{"line":19,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":16},"end":{"line":10,"column":17}},"loc":{"start":{"line":10,"column":29},"end":{"line":13,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":17,"column":12},"end":{"line":17,"column":16}},"loc":{"start":{"line":17,"column":20},"end":{"line":17,"column":35}}}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":4},"end":{"line":11,"column":56}},"type":"if","locations":[{"start":{"line":11,"column":4},"end":{"line":11,"column":56}},{"start":{},"end":{}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\utils\\formatDuration.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\utils\\formatDuration.ts","statementMap":{"0":{"start":{"line":8,"column":21},"end":{"line":8,"column":35}},"1":{"start":{"line":9,"column":2},"end":{"line":9,"column":43}},"2":{"start":{"line":9,"column":18},"end":{"line":9,"column":43}},"3":{"start":{"line":11,"column":16},"end":{"line":11,"column":48}},"4":{"start":{"line":12,"column":18},"end":{"line":12,"column":60}},"5":{"start":{"line":13,"column":18},"end":{"line":13,"column":57}},"6":{"start":{"line":14,"column":23},"end":{"line":14,"column":52}},"7":{"start":{"line":16,"column":2},"end":{"line":20,"column":50}}},"fnMap":{"0":{"name":"formatDuration","decl":{"start":{"line":7,"column":24},"end":{"line":7,"column":38}},"loc":{"start":{"line":7,"column":57},"end":{"line":21,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":2},"end":{"line":9,"column":43}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":9,"column":43}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":16,"column":10},"end":{"line":16,"column":31}},"type":"cond-expr","locations":[{"start":{"line":16,"column":23},"end":{"line":16,"column":26}},{"start":{"line":16,"column":29},"end":{"line":16,"column":31}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"f":{"0":0},"b":{"0":[0,0],"1":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\utils\\orderPhaseNodes.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\utils\\orderPhaseNodes.ts","statementMap":{"0":{"start":{"line":12,"column":16},"end":{"line":12,"column":58}},"1":{"start":{"line":12,"column":35},"end":{"line":12,"column":57}},"2":{"start":{"line":13,"column":2},"end":{"line":15,"column":3}},"3":{"start":{"line":14,"column":4},"end":{"line":14,"column":68}},"4":{"start":{"line":18,"column":41},"end":{"line":18,"column":43}},"5":{"start":{"line":19,"column":16},"end":{"line":19,"column":59}},"6":{"start":{"line":19,"column":42},"end":{"line":19,"column":57}},"7":{"start":{"line":20,"column":43},"end":{"line":20,"column":48}},"8":{"start":{"line":23,"column":2},"end":{"line":37,"column":3}},"9":{"start":{"line":24,"column":4},"end":{"line":24,"column":40}},"10":{"start":{"line":26,"column":4},"end":{"line":28,"column":5}},"11":{"start":{"line":27,"column":6},"end":{"line":27,"column":88}},"12":{"start":{"line":30,"column":4},"end":{"line":30,"column":54}},"13":{"start":{"line":30,"column":48},"end":{"line":30,"column":54}},"14":{"start":{"line":32,"column":4},"end":{"line":32,"column":58}},"15":{"start":{"line":34,"column":4},"end":{"line":36,"column":5}},"16":{"start":{"line":35,"column":6},"end":{"line":35,"column":128}},"17":{"start":{"line":39,"column":2},"end":{"line":39,"column":27}}},"fnMap":{"0":{"name":"orderPhaseNodeArray","decl":{"start":{"line":10,"column":24},"end":{"line":10,"column":43}},"loc":{"start":{"line":10,"column":62},"end":{"line":40,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":27},"end":{"line":12,"column":31}},"loc":{"start":{"line":12,"column":35},"end":{"line":12,"column":57}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":19,"column":34},"end":{"line":19,"column":38}},"loc":{"start":{"line":19,"column":42},"end":{"line":19,"column":57}}}},"branchMap":{"0":{"loc":{"start":{"line":13,"column":2},"end":{"line":15,"column":3}},"type":"if","locations":[{"start":{"line":13,"column":2},"end":{"line":15,"column":3}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":26,"column":4},"end":{"line":28,"column":5}},"type":"if","locations":[{"start":{"line":26,"column":4},"end":{"line":28,"column":5}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":30,"column":4},"end":{"line":30,"column":54}},"type":"if","locations":[{"start":{"line":30,"column":4},"end":{"line":30,"column":54}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":34,"column":4},"end":{"line":36,"column":5}},"type":"if","locations":[{"start":{"line":34,"column":4},"end":{"line":36,"column":5}},{"start":{},"end":{}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\utils\\priorityFiltering.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\utils\\priorityFiltering.ts","statementMap":{"0":{"start":{"line":12,"column":24},"end":{"line":12,"column":26}},"1":{"start":{"line":13,"column":20},"end":{"line":13,"column":24}},"2":{"start":{"line":14,"column":2},"end":{"line":22,"column":3}},"3":{"start":{"line":15,"column":4},"end":{"line":21,"column":5}},"4":{"start":{"line":16,"column":28},"end":{"line":16,"column":56}},"5":{"start":{"line":17,"column":6},"end":{"line":17,"column":43}},"6":{"start":{"line":17,"column":34},"end":{"line":17,"column":43}},"7":{"start":{"line":18,"column":6},"end":{"line":18,"column":67}},"8":{"start":{"line":18,"column":48},"end":{"line":18,"column":67}},"9":{"start":{"line":19,"column":6},"end":{"line":19,"column":43}},"10":{"start":{"line":20,"column":6},"end":{"line":20,"column":49}},"11":{"start":{"line":23,"column":2},"end":{"line":23,"column":21}}},"fnMap":{"0":{"name":"applyPriorityPredicates","decl":{"start":{"line":11,"column":16},"end":{"line":11,"column":39}},"loc":{"start":{"line":11,"column":95},"end":{"line":24,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":4},"end":{"line":21,"column":5}},"type":"if","locations":[{"start":{"line":15,"column":4},"end":{"line":21,"column":5}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":17,"column":6},"end":{"line":17,"column":43}},"type":"if","locations":[{"start":{"line":17,"column":6},"end":{"line":17,"column":43}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":18,"column":6},"end":{"line":18,"column":67}},"type":"if","locations":[{"start":{"line":18,"column":6},"end":{"line":18,"column":67}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":20,"column":20},"end":{"line":20,"column":48}},"type":"binary-expr","locations":[{"start":{"line":20,"column":20},"end":{"line":20,"column":31}},{"start":{"line":20,"column":35},"end":{"line":20,"column":48}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0},"f":{"0":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0]}} +,"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\utils\\programStore.ts": {"path":"C:\\Users\\jvana\\Documents\\School\\SoftP\\pepperplus-ui\\src\\utils\\programStore.ts","statementMap":{"0":{"start":{"line":31,"column":24},"end":{"line":84,"column":3}},"1":{"start":{"line":31,"column":60},"end":{"line":84,"column":2}},"2":{"start":{"line":36,"column":48},"end":{"line":36,"column":95}},"3":{"start":{"line":40,"column":25},"end":{"line":40,"column":45}},"4":{"start":{"line":46,"column":21},"end":{"line":46,"column":84}},"5":{"start":{"line":46,"column":62},"end":{"line":46,"column":83}},"6":{"start":{"line":50,"column":23},"end":{"line":50,"column":92}},"7":{"start":{"line":50,"column":67},"end":{"line":50,"column":91}},"8":{"start":{"line":55,"column":20},"end":{"line":55,"column":40}},"9":{"start":{"line":56,"column":18},"end":{"line":56,"column":74}},"10":{"start":{"line":56,"column":45},"end":{"line":56,"column":73}},"11":{"start":{"line":57,"column":4},"end":{"line":59,"column":5}},"12":{"start":{"line":58,"column":6},"end":{"line":58,"column":57}},"13":{"start":{"line":60,"column":4},"end":{"line":60,"column":null}},"14":{"start":{"line":66,"column":20},"end":{"line":66,"column":40}},"15":{"start":{"line":67,"column":18},"end":{"line":67,"column":74}},"16":{"start":{"line":67,"column":45},"end":{"line":67,"column":73}},"17":{"start":{"line":68,"column":4},"end":{"line":70,"column":5}},"18":{"start":{"line":69,"column":6},"end":{"line":69,"column":57}},"19":{"start":{"line":71,"column":4},"end":{"line":71,"column":null}},"20":{"start":{"line":77,"column":20},"end":{"line":77,"column":40}},"21":{"start":{"line":78,"column":18},"end":{"line":78,"column":74}},"22":{"start":{"line":78,"column":45},"end":{"line":78,"column":73}},"23":{"start":{"line":79,"column":4},"end":{"line":81,"column":5}},"24":{"start":{"line":80,"column":6},"end":{"line":80,"column":60}},"25":{"start":{"line":82,"column":4},"end":{"line":82,"column":null}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":31,"column":45},"end":{"line":31,"column":46}},"loc":{"start":{"line":31,"column":60},"end":{"line":84,"column":2}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":36,"column":19},"end":{"line":36,"column":20}},"loc":{"start":{"line":36,"column":48},"end":{"line":36,"column":95}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":40,"column":19},"end":{"line":40,"column":22}},"loc":{"start":{"line":40,"column":25},"end":{"line":40,"column":45}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":46,"column":15},"end":{"line":46,"column":18}},"loc":{"start":{"line":46,"column":21},"end":{"line":46,"column":84}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":46,"column":53},"end":{"line":46,"column":58}},"loc":{"start":{"line":46,"column":62},"end":{"line":46,"column":83}}},"5":{"name":"(anonymous_5)","decl":{"start":{"line":50,"column":17},"end":{"line":50,"column":20}},"loc":{"start":{"line":50,"column":23},"end":{"line":50,"column":92}}},"6":{"name":"(anonymous_6)","decl":{"start":{"line":50,"column":55},"end":{"line":50,"column":56}},"loc":{"start":{"line":50,"column":67},"end":{"line":50,"column":91}}},"7":{"name":"(anonymous_7)","decl":{"start":{"line":54,"column":19},"end":{"line":54,"column":20}},"loc":{"start":{"line":54,"column":38},"end":{"line":61,"column":3}}},"8":{"name":"(anonymous_8)","decl":{"start":{"line":56,"column":38},"end":{"line":56,"column":41}},"loc":{"start":{"line":56,"column":45},"end":{"line":56,"column":73}}},"9":{"name":"(anonymous_9)","decl":{"start":{"line":65,"column":19},"end":{"line":65,"column":20}},"loc":{"start":{"line":65,"column":38},"end":{"line":72,"column":3}}},"10":{"name":"(anonymous_10)","decl":{"start":{"line":67,"column":38},"end":{"line":67,"column":41}},"loc":{"start":{"line":67,"column":45},"end":{"line":67,"column":73}}},"11":{"name":"(anonymous_11)","decl":{"start":{"line":76,"column":22},"end":{"line":76,"column":23}},"loc":{"start":{"line":76,"column":41},"end":{"line":83,"column":3}}},"12":{"name":"(anonymous_12)","decl":{"start":{"line":78,"column":38},"end":{"line":78,"column":41}},"loc":{"start":{"line":78,"column":45},"end":{"line":78,"column":73}}}},"branchMap":{"0":{"loc":{"start":{"line":57,"column":4},"end":{"line":59,"column":5}},"type":"if","locations":[{"start":{"line":57,"column":4},"end":{"line":59,"column":5}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":68,"column":4},"end":{"line":70,"column":5}},"type":"if","locations":[{"start":{"line":68,"column":4},"end":{"line":70,"column":5}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":79,"column":4},"end":{"line":81,"column":5}},"type":"if","locations":[{"start":{"line":79,"column":4},"end":{"line":81,"column":5}},{"start":{},"end":{}}]}},"s":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0]}} +} diff --git a/coverage/lcov-report/base.css b/coverage/lcov-report/base.css new file mode 100644 index 0000000..f418035 --- /dev/null +++ b/coverage/lcov-report/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/lcov-report/block-navigation.js b/coverage/lcov-report/block-navigation.js new file mode 100644 index 0000000..530d1ed --- /dev/null +++ b/coverage/lcov-report/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selector that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/coverage/lcov-report/favicon.png b/coverage/lcov-report/favicon.png new file mode 100644 index 0000000..c1525b8 Binary files /dev/null and b/coverage/lcov-report/favicon.png differ diff --git a/coverage/lcov-report/index.html b/coverage/lcov-report/index.html new file mode 100644 index 0000000..d365d69 --- /dev/null +++ b/coverage/lcov-report/index.html @@ -0,0 +1,311 @@ + + + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 0% + Statements + 0/1162 +
+ + +
+ 0% + Branches + 0/559 +
+ + +
+ 0% + Functions + 0/428 +
+ + +
+ 0% + Lines + 0/1004 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
src +
+
0%0/40%0/20%0/20%0/4
src/components +
+
0%0/470%0/280%0/210%0/43
src/components/Logging +
+
0%0/1610%0/690%0/520%0/144
src/pages/ConnectedRobots +
+
0%0/140%0/60%0/40%0/13
src/pages/Home +
+
0%0/1100%0/00%0/10%0/1
src/pages/MonitoringPage +
+
0%0/550%0/500%0/190%0/50
src/pages/Robot +
+
0%0/420%0/200%0/160%0/33
src/pages/SimpleProgram +
+
0%0/410%0/240%0/170%0/35
src/pages/TemplatePage +
+
0%0/1100%0/00%0/10%0/1
src/pages/VisProgPage +
+
0%0/470%0/120%0/190%0/40
src/pages/VisProgPage/visualProgrammingUI +
+
0%0/1800%0/500%0/760%0/148
src/pages/VisProgPage/visualProgrammingUI/components +
+
0%0/2530%0/1340%0/850%0/232
src/pages/VisProgPage/visualProgrammingUI/nodes +
+
0%0/2320%0/1340%0/870%0/191
src/utils +
+
0%0/840%0/300%0/280%0/69
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/prettify.css b/coverage/lcov-report/prettify.css new file mode 100644 index 0000000..b317a7c --- /dev/null +++ b/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/lcov-report/prettify.js b/coverage/lcov-report/prettify.js new file mode 100644 index 0000000..b322523 --- /dev/null +++ b/coverage/lcov-report/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/lcov-report/sort-arrow-sprite.png b/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000..6ed6831 Binary files /dev/null and b/coverage/lcov-report/sort-arrow-sprite.png differ diff --git a/coverage/lcov-report/sorter.js b/coverage/lcov-report/sorter.js new file mode 100644 index 0000000..4ed70ae --- /dev/null +++ b/coverage/lcov-report/sorter.js @@ -0,0 +1,210 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + + // Try to create a RegExp from the searchValue. If it fails (invalid regex), + // it will be treated as a plain text search + let searchRegex; + try { + searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive + } catch (error) { + searchRegex = null; + } + + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + let isMatch = false; + + if (searchRegex) { + // If a valid regex was created, use it for matching + isMatch = searchRegex.test(row.textContent); + } else { + // Otherwise, fall back to the original plain text search + isMatch = row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()); + } + + row.style.display = isMatch ? '' : 'none'; + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/coverage/lcov-report/src/App.tsx.html b/coverage/lcov-report/src/App.tsx.html new file mode 100644 index 0000000..72ab99e --- /dev/null +++ b/coverage/lcov-report/src/App.tsx.html @@ -0,0 +1,196 @@ + + + + + + Code coverage report for src/App.tsx + + + + + + + + + +
+
+

All files / src App.tsx

+
+ +
+ 0% + Statements + 0/3 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Routes, Route, Link } from 'react-router'
+import './App.css'
+import TemplatePage from './pages/TemplatePage/Template.tsx'
+import Home from './pages/Home/Home.tsx'
+import Robot from './pages/Robot/Robot.tsx';
+import ConnectedRobots from './pages/ConnectedRobots/ConnectedRobots.tsx'
+import VisProg from "./pages/VisProgPage/VisProg.tsx";
+import {useState} from "react";
+import Logging from "./components/Logging/Logging.tsx";
+ 
+ 
+function App(){
+  const [showLogs, setShowLogs] = useState(false);
+ 
+  return (
+    <>
+      <header>
+        <Link to={"/"}>Home</Link>
+        <button onClick={() => setShowLogs(!showLogs)}>Toggle Logging</button>
+      </header>
+      <div className={"flex-row justify-center flex-1 min-height-0"}>
+        <main className={"flex-col align-center flex-1 scroll-y"}>
+          <Routes>
+            <Route path="/" element={<Home />} />
+            <Route path="/template" element={<TemplatePage />} />
+            <Route path="/editor" element={<VisProg />} />
+            <Route path="/robot" element={<Robot />} />
+            <Route path="/ConnectedRobots" element={<ConnectedRobots />} />
+        </Routes>
+        </main>
+        {showLogs && <Logging />}
+      </div>
+    </>
+  );
+}
+ 
+export default App
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/components/Logging/Filters.tsx.html b/coverage/lcov-report/src/components/Logging/Filters.tsx.html new file mode 100644 index 0000000..ecad6dc --- /dev/null +++ b/coverage/lcov-report/src/components/Logging/Filters.tsx.html @@ -0,0 +1,874 @@ + + + + + + Code coverage report for src/components/Logging/Filters.tsx + + + + + + + + + +
+
+

All files / src/components/Logging Filters.tsx

+
+ +
+ 0% + Statements + 0/64 +
+ + +
+ 0% + Branches + 0/27 +
+ + +
+ 0% + Functions + 0/25 +
+ + +
+ 0% + Lines + 0/58 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {useEffect, useRef, useState} from "react";
+ 
+import type {LogFilterPredicate} from "./useLogs.ts";
+ 
+import styles from "./Filters.module.css";
+ 
+/**
+ * A generic setter type compatible with React's state setters.
+ */
+type Setter<T> = (value: T | ((prev: T) => T)) => void;
+ 
+/**
+ * Mapping of log level names to their corresponding numeric severity.
+ * Used for comparison in log filtering predicates.
+ */
+const optionMapping = new Map([
+  ["ALL", 0],
+  ["LLM", 9],
+  ["DEBUG", 10],
+  ["INFO", 20],
+  ["WARNING", 30],
+  ["ERROR", 40],
+  ["CRITICAL", 50],
+  ["NONE", 999_999_999_999], // It is technically possible to have a higher level, but this is fine
+]);
+ 
+/**
+ * Renders a single log-level selector (dropdown) for a specific filter target.
+ *
+ * Used by both the global filter and agent-specific filters.
+ *
+ * @param name - The display name or identifier for the filter target.
+ * @param level - The currently selected log level.
+ * @param setLevel - Function to update the selected log level.
+ * @param onDelete - Optional callback for deleting this filter element.
+ * @returns A JSX element that renders a labeled dropdown for selecting log levels.
+ */
+function LevelPredicateElement({
+  name,
+  level,
+  setLevel,
+  onDelete,
+}: {
+  name: string;
+  level: string;
+  setLevel: (level: string) => void;
+  onDelete?: () => void;
+}) {
+  const normalizedName = name.split(".").pop() || name;
+ 
+  return <div className={"flex-row gap-sm align-center"}>
+    <label
+      htmlFor={`log_level_${name}`}
+      className={"font-small"}
+    >
+      {onDelete
+        ? <button
+          className={`no-button ${styles.deletable}`}
+          onClick={onDelete}
+        >{normalizedName}:</button>
+        : normalizedName + ':'
+      }
+    </label>
+    <select
+      id={`log_level_${name}`}
+      value={level}
+      onChange={(e) => setLevel(e.target.value)}
+    >
+      {Array.from(optionMapping.keys()).map((key) => (
+        <option key={key} value={key}>{key}</option>
+      ))}
+    </select>
+  </div>
+}
+ 
+/** Key used for the global log-level predicate in the filter map. */
+const GLOBAL_LOG_LEVEL_PREDICATE_KEY = "global_log_level";
+ 
+/**
+ * Renders and manages the **global log-level filter**.
+ *
+ * This component defines a baseline log level that all logs must meet or exceed
+ * to be displayed, unless overridden by per-agent filters.
+ *
+ * @param filterPredicates - Map of current log filter predicates.
+ * @param setFilterPredicates - Setter function to update the filter predicates map.
+ * @returns A JSX element rendering the global log-level selector.
+ */
+function GlobalLevelFilter({
+  filterPredicates,
+  setFilterPredicates,
+}: {
+  filterPredicates: Map<string, LogFilterPredicate>;
+  setFilterPredicates: Setter<Map<string, LogFilterPredicate>>;
+}) {
+  const selected = filterPredicates.get(GLOBAL_LOG_LEVEL_PREDICATE_KEY)?.value || "ALL";
+  const setSelected = (selected: string | null) => {
+    if (!selected || !optionMapping.has(selected)) return;
+ 
+    setFilterPredicates((curr) => {
+      const next = new Map(curr);
+      next.set(GLOBAL_LOG_LEVEL_PREDICATE_KEY, {
+        predicate: (record) => record.levelno >= optionMapping.get(selected)!,
+        priority: 0,
+        value: selected,
+      });
+      return next;
+    });
+  }
+ 
+  // Initialize default global level on mount.
+  useEffect(() => {
+    if (filterPredicates.has(GLOBAL_LOG_LEVEL_PREDICATE_KEY)) return;
+    setSelected("INFO");
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, []); // Run only once when the component mounts, not when anything changes
+ 
+  return <LevelPredicateElement
+    name={"Global"}
+    level={selected}
+    setLevel={setSelected}
+  />;
+}
+ 
+/** Prefix for agent-specific log-level predicate keys in the filter map. */
+const AGENT_LOG_LEVEL_PREDICATE_KEY_PREFIX = "agent_log_level_";
+ 
+/**
+ * Renders and manages **per-agent log-level filters**.
+ *
+ * Allows the user to set specific log levels for individual agents, overriding
+ * the global filter for those agents. Includes functionality to add, edit,
+ * or remove agent-level filters.
+ *
+ * @param filterPredicates - Map of current log filter predicates.
+ * @param setFilterPredicates - Setter function to update the filter predicates map.
+ * @param agentNames - Set of agent names available for filtering.
+ * @returns A JSX element rendering agent-level filters and a dropdown to add new ones.
+ */
+function AgentLevelFilters({
+  filterPredicates,
+  setFilterPredicates,
+  agentNames,
+}: {
+  filterPredicates: Map<string, LogFilterPredicate>;
+  setFilterPredicates: Setter<Map<string, LogFilterPredicate>>;
+  agentNames: Set<string>;
+}) {
+  const rootRef = useRef<HTMLDivElement>(null);
+  const [open, setOpen] = useState(false);
+ 
+  // Close dropdown or panels when clicking outside or pressing Escape.
+  useEffect(() => {
+    if (!open) return;
+    const onDocClick = (e: MouseEvent) => {
+      if (!rootRef.current?.contains(e.target as Node)) setOpen(false);
+    };
+    const onKey = (e: KeyboardEvent) => {
+      if (e.key !== "Escape") return;
+      setOpen(false);
+      e.preventDefault(); // Don't exit fullscreen mode
+    };
+    document.addEventListener("mousedown", onDocClick);
+    document.addEventListener("keydown", onKey);
+    return () => {
+      document.removeEventListener("mousedown", onDocClick);
+      document.removeEventListener("keydown", onKey);
+    };
+  }, [open]);
+ 
+  // Identify which predicates correspond to agents.
+  const agentPredicates = [...filterPredicates.keys()].filter((key) =>
+    key.startsWith(AGENT_LOG_LEVEL_PREDICATE_KEY_PREFIX));
+ 
+ /**
+   * Creates or updates the log filter predicate for a specific agent.
+   * Falls back to the global log level if no level is specified.
+   *
+   * @param agentName - The name of the agent to filter.
+   * @param level - Optional log level to apply; defaults to the global level.
+   */
+  const setAgentPredicate = (agentName: string, level?: string ) => {
+    level = level ?? filterPredicates.get(GLOBAL_LOG_LEVEL_PREDICATE_KEY)?.value ?? "ALL";
+    setFilterPredicates((prev) => {
+      const next = new Map(prev);
+      next.set(AGENT_LOG_LEVEL_PREDICATE_KEY_PREFIX + agentName, {
+        predicate: (record) => record.name === agentName
+          ? record.levelno >= optionMapping.get(level!)!
+          : null,
+        priority: 1,
+        value: {agentName, level},
+      });
+      return next;
+    });
+  }
+ 
+  /**
+   * Deletes the log filter predicate for a specific agent.
+   *
+   * @param agentName - The name of the agent whose filter should be removed.
+   */
+  const deleteAgentPredicate = (agentName: string) => {
+    setFilterPredicates((curr) => {
+      const fullName = AGENT_LOG_LEVEL_PREDICATE_KEY_PREFIX + agentName;
+      if (!curr.has(fullName)) return curr; // Return unchanged, no re-render
+      const next = new Map(curr);
+      next.delete(fullName);
+      return next;
+    });
+  }
+ 
+  return <>
+    {agentPredicates.map((key) => {
+      const {agentName, level} = filterPredicates.get(key)!.value;
+ 
+      return <LevelPredicateElement
+        key={key}
+        name={agentName}
+        level={level}
+        setLevel={(level) => setAgentPredicate(agentName, level)}
+        onDelete={() => deleteAgentPredicate(agentName)}
+      />;
+    })}
+    <div className={"flex-row gap-sm align-center"}>
+      <label htmlFor={"add_agent"} className={"font-small"}>Add:</label>
+      <select
+        id={"add_agent"}
+        value={""}
+        onChange={(e) => !!e.target.value && setAgentPredicate(e.target.value)}
+      >
+        {["", ...agentNames.keys()].map((key) => (
+          <option key={key} value={key}>{key.split(".").pop()}</option>
+        ))}
+      </select>
+    </div>
+  </>;
+}
+ 
+/**
+ * Main Filters component that aggregates global and per-agent log filters.
+ *
+ * Combines the global log-level filter and agent-specific filters into a unified UI.
+ * Updates a shared `Map<string, LogFilterPredicate>` to determine which logs are shown.
+ *
+ * @param filterPredicates - The map of all active log filter predicates.
+ * @param setFilterPredicates - Setter to update the map of predicates.
+ * @param agentNames - Set of available agent names to display filters for.
+ * @returns A React component that renders all log filter controls.
+ */
+export default function Filters({
+  filterPredicates,
+  setFilterPredicates,
+  agentNames,
+}: {
+  filterPredicates: Map<string, LogFilterPredicate>;
+  setFilterPredicates: Setter<Map<string, LogFilterPredicate>>;
+  agentNames: Set<string>;
+}) {
+  return <div className={"flex-1 flex-row flex-wrap gap-md align-center"}>
+    <GlobalLevelFilter filterPredicates={filterPredicates} setFilterPredicates={setFilterPredicates} />
+    <AgentLevelFilters filterPredicates={filterPredicates} setFilterPredicates={setFilterPredicates} agentNames={agentNames} />
+  </div>;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/components/Logging/Logging.tsx.html b/coverage/lcov-report/src/components/Logging/Logging.tsx.html new file mode 100644 index 0000000..77464e0 --- /dev/null +++ b/coverage/lcov-report/src/components/Logging/Logging.tsx.html @@ -0,0 +1,643 @@ + + + + + + Code coverage report for src/components/Logging/Logging.tsx + + + + + + + + + +
+
+

All files / src/components/Logging Logging.tsx

+
+ +
+ 0% + Statements + 0/40 +
+ + +
+ 0% + Branches + 0/18 +
+ + +
+ 0% + Functions + 0/15 +
+ + +
+ 0% + Lines + 0/34 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {useEffect, useRef, useState} from "react";
+import {create} from "zustand";
+ 
+import formatDuration from "../../utils/formatDuration.ts";
+import {type LogFilterPredicate, type LogRecord, useLogs} from "./useLogs.ts";
+import Filters from "./Filters.tsx";
+import {type Cell, useCell} from "../../utils/cellStore.ts";
+ 
+import styles from "./Logging.module.css";
+ 
+ 
+/**
+ * Zustand store definition for managing user preferences related to logging.
+ *
+ * Includes flags for toggling relative timestamps and automatic scroll behavior.
+ */
+type LoggingSettings = {
+  /** Whether to display log timestamps as relative (e.g., "2m 15s ago") instead of absolute. */
+  showRelativeTime: boolean;
+  /** Updates the `showRelativeTime` setting. */
+  setShowRelativeTime: (showRelativeTime: boolean) => void;
+  /** Whether the log view should automatically scroll to the newest entry. */
+  scrollToBottom: boolean;
+  /** Updates the `scrollToBottom` setting. */
+  setScrollToBottom: (scrollToBottom: boolean) => void;
+};
+ 
+/**
+ * Global Zustand store for logging UI preferences.
+ */
+const useLoggingSettings = create<LoggingSettings>((set) => ({
+  showRelativeTime: false,
+  setShowRelativeTime: (showRelativeTime: boolean) => set({ showRelativeTime }),
+  scrollToBottom: true,
+  setScrollToBottom: (scrollToBottom: boolean) => set({ scrollToBottom }),
+}));
+ 
+/**
+ * Renders a single log message entry with colored level indicators and timestamp formatting.
+ *
+ * This component automatically re-renders when the underlying log record (`recordCell`)
+ * changes. It also triggers the `onUpdate` callback whenever the record updates (e.g., for auto-scrolling).
+ *
+ * @param recordCell - A reactive `Cell` containing a single `LogRecord`.
+ * @param onUpdate - Optional callback triggered when the log entry updates.
+ * @returns A JSX element displaying a formatted log message.
+ */
+function LogMessage({
+  recordCell,
+  onUpdate,
+}: {
+  recordCell: Cell<LogRecord>,
+  onUpdate?: () => void,
+}) {
+  const { showRelativeTime, setShowRelativeTime } = useLoggingSettings();
+  const record = useCell(recordCell);
+ 
+  /**
+   * Normalizes the log level number to a multiple of 10, 
+   * for which there are CSS styles. (e.g., INFO = 20, ERROR = 40).
+   */
+  const normalizedLevelNo = (() => {
+    // By default, the highest level is 50 (CRITICAL). Custom levels can be higher, but we don't have more critical color.
+    if (record.levelno >= 50) return 50;
+ 
+    return Math.round(record.levelno / 10) * 10;
+  })();
+ 
+  /** Simplifies the logger name by showing only the last path segment. */
+  const normalizedName = record.name.split(".").pop() || record.name;
+ 
+  // Notify parent component (e.g. for scroll updates) when this record changes.
+  useEffect(() => {
+    if (onUpdate) onUpdate();
+  }, [record, onUpdate]);
+ 
+  return <div className={`${styles.logContainer} round-md border-lg flex-row gap-md`}>
+    <div className={`${styles[`accented${normalizedLevelNo}`]} flex-col padding-sm justify-between`}>
+      <span className={"mono bold"}>{record.levelname}</span>
+      <span className={"mono clickable font-small"}
+        onClick={() => setShowRelativeTime(!showRelativeTime)}
+      >{showRelativeTime
+        ? formatDuration(record.relativeCreated)
+        : new Date(record.created * 1000).toLocaleTimeString()
+      }</span>
+    </div>
+    <div className={"flex-col flex-1 padding-sm"}>
+      <span className={"mono"}>{normalizedName}</span>
+      <span>{record.message}</span>
+    </div>
+  </div>;
+}
+ 
+/**
+ * Displays a scrollable list of log messages.
+ *
+ * Handles:
+ * - Auto-scrolling when new messages arrive.
+ * - Allowing users to scroll manually and disable auto-scroll.
+ * - A floating "Scroll to bottom" button when not at the bottom.
+ *
+ * @param recordCells - Array of reactive log records to display.
+ * @returns A scrollable log list component.
+ */
+function LogMessages({ recordCells }: { recordCells: Cell<LogRecord>[] }) {
+  const scrollableRef = useRef<HTMLDivElement>(null);
+  const lastElementRef = useRef<HTMLLIElement>(null)
+  const { scrollToBottom, setScrollToBottom } = useLoggingSettings();
+ 
+  // Disable auto-scroll if the user manually scrolls.
+  useEffect(() => {
+    if (!scrollableRef.current) return;
+    const currentScrollableRef = scrollableRef.current;
+ 
+    const handleScroll = () => setScrollToBottom(false);
+ 
+    currentScrollableRef.addEventListener("wheel", handleScroll);
+    currentScrollableRef.addEventListener("touchmove", handleScroll);
+ 
+    return () => {
+      currentScrollableRef.removeEventListener("wheel", handleScroll);
+      currentScrollableRef.removeEventListener("touchmove", handleScroll);
+    }
+  }, [scrollableRef, setScrollToBottom]);
+ 
+  /**
+   * Scrolls the last log message into view if auto-scroll is enabled,
+   * or if forced (e.g., user clicks "Scroll to bottom").
+   *
+   * @param force - If true, forces scrolling even if `scrollToBottom` is false.
+   */
+  function scrollLastElementIntoView(force = false) {
+    if ((!scrollToBottom && !force) || !lastElementRef.current) return;
+    lastElementRef.current.scrollIntoView({ behavior: "smooth" });
+  }
+ 
+  return <div ref={scrollableRef} className={"min-height-0 scroll-y padding-b-md"}>
+    <ol className={`${styles.noNumbers} margin-0 flex-col gap-md`}>
+      {recordCells.map((recordCell, i) => (
+        <li key={`${i}_${recordCell.get().firstRelativeCreated}`}>
+          <LogMessage recordCell={recordCell} onUpdate={scrollLastElementIntoView} />
+        </li>
+      ))}
+      <li ref={lastElementRef}></li>
+    </ol>
+    {!scrollToBottom && <button
+      className={styles.floatingButton}
+      onClick={() => {
+        setScrollToBottom(true);
+        scrollLastElementIntoView(true);
+      }}
+    >
+      Scroll to bottom
+    </button>}
+  </div>;
+}
+ 
+/**
+ * Top-level logging panel component.
+ *
+ * Combines:
+ * - The `Filters` component for adjusting log visibility.
+ * - The `LogMessages` component for displaying filtered logs.
+ * - Zustand-managed UI settings (auto-scroll, timestamp display).
+ *
+ * This component uses the `useLogs` hook to fetch and filter logs based on
+ * active predicates, and re-renders automatically as new logs arrive.
+ *
+ * @returns The complete logging UI as a React element.
+ */
+export default function Logging() {
+  const [filterPredicates, setFilterPredicates] = useState(new Map<string, LogFilterPredicate>());
+  const { filteredLogs, distinctNames } = useLogs(filterPredicates)
+ 
+  return <div className={`flex-col gap-lg min-height-0 ${styles.loggingContainer}`}>
+    <div className={"flex-row gap-lg justify-between align-center"}>
+      <h2 className={"margin-0"}>Logs</h2>
+      <Filters
+        filterPredicates={filterPredicates}
+        setFilterPredicates={setFilterPredicates}
+        agentNames={distinctNames}
+      />
+    </div>
+    <LogMessages recordCells={filteredLogs} />
+  </div>;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/components/Logging/index.html b/coverage/lcov-report/src/components/Logging/index.html new file mode 100644 index 0000000..4123885 --- /dev/null +++ b/coverage/lcov-report/src/components/Logging/index.html @@ -0,0 +1,146 @@ + + + + + + Code coverage report for src/components/Logging + + + + + + + + + +
+
+

All files src/components/Logging

+
+ +
+ 0% + Statements + 0/161 +
+ + +
+ 0% + Branches + 0/69 +
+ + +
+ 0% + Functions + 0/52 +
+ + +
+ 0% + Lines + 0/144 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
Filters.tsx +
+
0%0/640%0/270%0/250%0/58
Logging.tsx +
+
0%0/400%0/180%0/150%0/34
useLogs.ts +
+
0%0/570%0/240%0/120%0/52
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/components/Logging/useLogs.ts.html b/coverage/lcov-report/src/components/Logging/useLogs.ts.html new file mode 100644 index 0000000..b18dae3 --- /dev/null +++ b/coverage/lcov-report/src/components/Logging/useLogs.ts.html @@ -0,0 +1,721 @@ + + + + + + Code coverage report for src/components/Logging/useLogs.ts + + + + + + + + + +
+
+

All files / src/components/Logging useLogs.ts

+
+ +
+ 0% + Statements + 0/57 +
+ + +
+ 0% + Branches + 0/24 +
+ + +
+ 0% + Functions + 0/12 +
+ + +
+ 0% + Lines + 0/52 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {useCallback, useEffect, useRef, useState} from "react";
+ 
+import {applyPriorityPredicates, type PriorityFilterPredicate} from "../../utils/priorityFiltering.ts";
+import {cell, type Cell} from "../../utils/cellStore.ts";
+ 
+/**
+ * Represents a single log record emitted by the backend logging system.
+ *
+ * @property name - The name of the logger or source (e.g., `"agent.core"`).
+ * @property message - The message content of the log record.
+ * @property levelname - The human-readable severity level (e.g., `"INFO"`, `"ERROR"`).
+ * @property levelno - The numeric severity value corresponding to `levelname`.
+ * @property created - The UNIX timestamp (in seconds) when this record was created.
+ * @property relativeCreated - The time (in milliseconds) since the logging system started.
+ * @property reference - (Optional) A reference identifier linking related log messages.
+ * @property firstCreated - Timestamp of the first log in this reference group.
+ * @property firstRelativeCreated - Relative timestamp of the first log in this reference group.
+ */
+export type LogRecord = {
+  name: string;
+  message: string;
+  levelname: 'LLM' | 'DEBUG' | 'INFO' | 'WARNING' | 'ERROR' | 'CRITICAL' | string;
+  levelno: number;
+  created: number;
+  relativeCreated: number;
+  reference?: string;
+  firstCreated: number;
+  firstRelativeCreated: number;
+};
+ 
+/**
+ * A log filter predicate with priority support, used to determine whether
+ * a log record should be displayed.
+ *
+ * This extends a general `PriorityFilterPredicate` and includes an optional
+ * `value` field for UI metadata (e.g., selected log level or agent).
+ *
+ * @template T - The type of record being filtered (here, `LogRecord`).
+ */
+export type LogFilterPredicate = PriorityFilterPredicate<LogRecord> & { 
+  // eslint-disable-next-line @typescript-eslint/no-explicit-any
+  value: any };
+ 
+ /**
+ * React hook that manages the lifecycle of log records, including:
+ * - Receiving live log messages via Server-Sent Events (SSE),
+ * - Applying priority-based filtering rules,
+ * - Managing distinct logger names and reference-linked messages.
+ *
+ * Returns both the filtered logs (as reactive `Cell<LogRecord>` objects)
+ * and a set of distinct logger names for use in UI components (e.g., Filters).
+ *
+ * @param filterPredicates - A `Map` of log filter predicates, keyed by ID or type.
+ * @returns An object containing:
+ * - `filteredLogs`: The currently visible (filtered) log messages.
+ * - `distinctNames`: A set of all distinct logger names encountered.
+ *
+ * @example
+ * ```ts
+ * const { filteredLogs, distinctNames } = useLogs(activeFilters);
+ * ```
+ */
+export function useLogs(filterPredicates: Map<string, LogFilterPredicate>) {
+  /** Distinct logger names encountered across all logs. */
+  const [distinctNames, setDistinctNames] = useState<Set<string>>(new Set());
+  /** Filtered logs that pass all active predicates, stored as reactive cells. */
+  const [filtered, setFiltered] = useState<Cell<LogRecord>[]>([]);
+ 
+  /** Persistent reference to the active EventSource connection. */
+  const sseRef = useRef<EventSource | null>(null);
+  /** Keeps a stable reference to the current filter map (avoids re-renders). */
+  const filtersRef = useRef(filterPredicates);
+  /** Stores all received logs (the unfiltered full history). */
+  const logsRef = useRef<LogRecord[]>([]);
+ 
+  /** Map to store the first message for each reference, instance can be updated to change contents. */
+  const firstByRefRef = useRef<Map<string, Cell<LogRecord>>>(new Map());
+ 
+  /**
+   * Apply all active filter predicates to a log record.
+   * @param log The log record to apply the filters to.
+   * @returns `true` if the record passes all filters; otherwise `false`.
+   */
+  const applyFilters = useCallback((log: LogRecord) =>
+    applyPriorityPredicates(log, [...filtersRef.current.values()]), []);
+ 
+  /**
+   * Fully recomputes the filtered log list based on the current
+   * filter predicates and historical logs.
+   *
+   * Should be invoked whenever the filter map changes.
+   */
+  const recomputeFiltered = useCallback(() => {
+    const newFiltered: Cell<LogRecord>[] = [];
+    firstByRefRef.current = new Map();
+ 
+    for (const message of logsRef.current) {
+      const messageCell = cell<LogRecord>({
+        ...message,
+        firstCreated: message.created,
+        firstRelativeCreated: message.relativeCreated,
+      });
+ 
+      // Handle reference grouping: update the first message in the group.
+      if (message.reference) {
+        const first = firstByRefRef.current.get(message.reference);
+        if (first) {
+          // Update the first's contents
+          first.set((prev) => ({
+            ...message,
+            firstCreated: prev.firstCreated ?? prev.created,
+            firstRelativeCreated: prev.firstRelativeCreated ?? prev.relativeCreated,
+          }));
+ 
+          continue; // Don't add it to the list again (it's a duplicate).
+        } else {
+          // Add the first message with this reference to the registry
+          firstByRefRef.current.set(message.reference, messageCell);
+        }
+      }
+ 
+      // Include only if it passes current filters.
+      if (applyFilters(message)) {
+        newFiltered.push(messageCell);
+      }
+    }
+ 
+    setFiltered(newFiltered);
+  }, [applyFilters, setFiltered]);
+ 
+  // Re-filter all logs whenever filter predicates change.
+  useEffect(() => {
+    filtersRef.current = filterPredicates;
+    recomputeFiltered();
+  }, [filterPredicates, recomputeFiltered]);
+ 
+  /**
+   * Handles a newly received log record.
+   * Updates the full log history, distinct names set, and filtered log list.
+   *
+   * @param message - The new log record to process.
+   */
+  const handleNewMessage = useCallback((message: LogRecord) => {
+    // Store in complete history for future refiltering.
+    logsRef.current.push(message);
+ 
+    // Track distinct logger names.
+    setDistinctNames((prev) => {
+      if (prev.has(message.name)) return prev;
+      const newSet = new Set(prev);
+      newSet.add(message.name);
+      return newSet;
+    });
+ 
+    // Wrap in a reactive cell for UI binding.
+    const messageCell = cell<LogRecord>({
+      ...message,
+      firstCreated: message.created,
+      firstRelativeCreated: message.relativeCreated,
+    });
+ 
+    // Handle reference-linked updates.
+    if (message.reference) {
+      const first = firstByRefRef.current.get(message.reference);
+      if (first) {
+        // Update the first's contents
+        first.set((prev) => ({
+          ...message,
+          firstCreated: prev.firstCreated ?? prev.created,
+          firstRelativeCreated: prev.firstRelativeCreated ?? prev.relativeCreated,
+        }));
+ 
+        return; // Do not duplicate reference group entries.
+      } else {
+        firstByRefRef.current.set(message.reference, messageCell);
+      }
+    }
+ 
+    // Only append if message passes filters.
+    if (applyFilters(message)) {
+      setFiltered((curr) => [...curr, messageCell]);
+    }
+  }, [applyFilters, setFiltered]);
+ 
+  /**
+   * Initializes the SSE (Server-Sent Events) stream for real-time logs.
+   *
+   * Subscribes to messages from the backend logging endpoint and
+   * dispatches each message to `handleNewMessage`.
+   *
+   * Cleans up the EventSource connection when the component unmounts.
+   */
+  useEffect(() => {
+    // Only create one SSE connection for the lifetime of the hook.
+    if (sseRef.current) return;
+ 
+    const es = new EventSource("http://localhost:8000/logs/stream");
+    sseRef.current = es;
+ 
+    es.onmessage = (event) => {
+      const data: LogRecord = JSON.parse(event.data);
+      handleNewMessage(data);
+    };
+ 
+    return () => {
+      es.close();
+      sseRef.current = null;
+    };
+  }, [handleNewMessage]);
+ 
+  return {filteredLogs: filtered, distinctNames};
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/components/MultilineTextField.tsx.html b/coverage/lcov-report/src/components/MultilineTextField.tsx.html new file mode 100644 index 0000000..2a63cab --- /dev/null +++ b/coverage/lcov-report/src/components/MultilineTextField.tsx.html @@ -0,0 +1,310 @@ + + + + + + Code coverage report for src/components/MultilineTextField.tsx + + + + + + + + + +
+
+

All files / src/components MultilineTextField.tsx

+
+ +
+ 0% + Statements + 0/21 +
+ + +
+ 0% + Branches + 0/16 +
+ + +
+ 0% + Functions + 0/7 +
+ + +
+ 0% + Lines + 0/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useEffect, useRef, useState } from "react";
+import styles from "./TextField.module.css";
+ 
+export function MultilineTextField({
+  value = "",
+  setValue,
+  placeholder,
+  className,
+  id,
+  ariaLabel,
+  invalid = false,
+  minRows = 3,
+}: {
+  value: string;
+  setValue: (value: string) => void;
+  placeholder?: string;
+  className?: string;
+  id?: string;
+  ariaLabel?: string;
+  invalid?: boolean;
+  minRows?: number;
+}) {
+  const [readOnly, setReadOnly] = useState(true);
+  const [inputValue, setInputValue] = useState(value);
+  const textareaRef = useRef<HTMLTextAreaElement>(null);
+ 
+  useEffect(() => {
+    setInputValue(value);
+  }, [value]);
+ 
+  // Auto-grow logic
+  useEffect(() => {
+    const el = textareaRef.current;
+    if (!el) return;
+ 
+    el.style.height = "auto";
+    el.style.height = `${el.scrollHeight}px`;
+  }, [inputValue]);
+ 
+  const onCommit = () => {
+    setReadOnly(true);
+    setValue(inputValue);
+  };
+ 
+  const onKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {
+    if (e.key === "Enter" && (e.ctrlKey || e.metaKey)) {
+      e.preventDefault();
+      (e.target as HTMLTextAreaElement).blur();
+    }
+  };
+ 
+  return (
+    <textarea
+      ref={textareaRef}
+      rows={minRows}
+      placeholder={placeholder}
+      value={inputValue}
+      onChange={(e) => setInputValue(e.target.value)}
+      onFocus={() => setReadOnly(false)}
+      onBlur={onCommit}
+      onKeyDown={onKeyDown}
+      readOnly={readOnly}
+      id={id}
+      aria-label={ariaLabel}
+      className={`
+        ${readOnly ? "drag" : "nodrag"}
+        flex-1
+        ${styles.textField}
+        ${styles.multiline}
+        ${invalid ? styles.invalid : ""}
+        ${className ?? ""}
+      `}
+    />
+  );
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/components/ScrollIntoView.tsx.html b/coverage/lcov-report/src/components/ScrollIntoView.tsx.html new file mode 100644 index 0000000..6210019 --- /dev/null +++ b/coverage/lcov-report/src/components/ScrollIntoView.tsx.html @@ -0,0 +1,151 @@ + + + + + + Code coverage report for src/components/ScrollIntoView.tsx + + + + + + + + + +
+
+

All files / src/components ScrollIntoView.tsx

+
+ +
+ 0% + Statements + 0/5 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {useEffect, useRef} from "react";
+ 
+/**
+ * A React component that automatically scrolls itself into view whenever rendered.
+ *
+ * This component is especially useful in scrollable containers to keep the most
+ * recent content visible (e.g., chat applications, live logs, or notifications).
+ *
+ * It uses the browser's `Element.scrollIntoView()` API with smooth scrolling behavior.
+ *
+ * @returns A `<div>` element that scrolls into view when mounted or updated.
+ */
+export default function ScrollIntoView() {
+  /** Ref to the DOM element that will be scrolled into view. */
+  const elementRef = useRef<HTMLDivElement>(null);
+ 
+  useEffect(() => {
+    if (elementRef.current) elementRef.current.scrollIntoView({ behavior: "smooth" });
+  });
+ 
+  return <div ref={elementRef} />;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/components/TextField.tsx.html b/coverage/lcov-report/src/components/TextField.tsx.html new file mode 100644 index 0000000..045f643 --- /dev/null +++ b/coverage/lcov-report/src/components/TextField.tsx.html @@ -0,0 +1,457 @@ + + + + + + Code coverage report for src/components/TextField.tsx + + + + + + + + + +
+
+

All files / src/components TextField.tsx

+
+ +
+ 0% + Statements + 0/16 +
+ + +
+ 0% + Branches + 0/10 +
+ + +
+ 0% + Functions + 0/8 +
+ + +
+ 0% + Lines + 0/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {useEffect, useState} from "react";
+import styles from "./TextField.module.css";
+ 
+/**
+ * A styled text input that updates its value **in real time** at every keystroke.
+ *
+ * Automatically toggles between read-only and editable modes to integrate with
+ * drag-based UIs (like React Flow). Calls `onCommit` when editing is completed.
+ *
+ * @param props - Component properties.
+ * @param props.value - The current text input value.
+ * @param props.setValue - Callback invoked on every keystroke to update the value.
+ * @param props.onCommit - Callback invoked when editing is finalized (on blur or Enter).
+ * @param props.placeholder - Optional placeholder text displayed when the input is empty.
+ * @param props.className - Optional additional CSS class names.
+ * @param props.id - Optional unique HTML `id` for the input element.
+ * @param props.ariaLabel - Optional ARIA label for accessibility.
+ * @param props.invalid - If true, applies error styling to indicate invalid input.
+ *
+ * @returns A styled `<input>` element that updates its value in real time.
+ */
+export function RealtimeTextField({
+  value = "",
+  setValue,
+  onCommit,
+  placeholder,
+  className,
+  id,
+  ariaLabel,
+  invalid = false,
+} : {
+  value: string,
+  setValue: (value: string) => void,
+  onCommit: () => void,
+  placeholder?: string,
+  className?: string,
+  id?: string,
+  ariaLabel?: string,
+  invalid?: boolean,
+}) {
+  /** Tracks whether the input is currently read-only (for drag compatibility). */
+  const [readOnly, setReadOnly] = useState(true);
+ 
+  /** Finalizes editing and calls `onCommit` when the user exits the field. */
+  const updateData  = () => {
+    setReadOnly(true);
+    onCommit();
+  };
+ 
+  /** Handles the Enter key — commits the input by triggering a blur event. */
+  const updateOnEnter = (event: React.KeyboardEvent<HTMLInputElement>) => { 
+    if (event.key === "Enter") 
+      (event.target as HTMLInputElement).blur(); };
+ 
+  return <input
+    type={"text"}
+    placeholder={placeholder}
+    value={value}
+    onChange={(e) => setValue(e.target.value)}
+    onFocus={() => setReadOnly(false)}
+    onBlur={updateData}
+    onKeyDown={updateOnEnter}
+    readOnly={readOnly}
+    id={id}
+    // ReactFlow uses the "drag" / "nodrag" classes to enable / disable dragging of nodes
+    className={`${readOnly ? "drag" : "nodrag"} flex-1 ${styles.textField} ${invalid ? styles.invalid : ""} ${className}`}
+    aria-label={ariaLabel}
+  />;
+}
+ 
+/**
+ * A styled text input that updates its value **only on commit** (when the user
+ * presses Enter or clicks outside the input).
+ *
+ * Internally wraps `RealtimeTextField` and buffers input changes locally,
+ * calling `setValue` only once editing is complete.
+ *
+ * @param props - Component properties.
+ * @param props.value - The current text input value.
+ * @param props.setValue - Callback invoked when the user commits the change.
+ * @param props.placeholder - Optional placeholder text displayed when the input is empty.
+ * @param props.className - Optional additional CSS class names.
+ * @param props.id - Optional unique HTML `id` for the input element.
+ * @param props.ariaLabel - Optional ARIA label for accessibility.
+ * @param props.invalid - If true, applies error styling to indicate invalid input.
+ *
+ * @returns A styled `<input>` element that updates its parent state only on commit.
+ */
+export function TextField({
+  value = "",
+  setValue,
+  placeholder,
+  className,
+  id,
+  ariaLabel,
+  invalid = false,
+} : {
+  value: string,
+  setValue: (value: string) => void,
+  placeholder?: string,
+  className?: string,
+  id?: string,
+  ariaLabel?: string,
+  invalid?: boolean,
+}) {
+  const [inputValue, setInputValue] = useState(value);
+ 
+  useEffect(() => {
+    setInputValue(value);
+  }, [value]);
+ 
+  const onCommit = () => setValue(inputValue);
+ 
+  return <RealtimeTextField
+    placeholder={placeholder}
+    value={inputValue}
+    setValue={setInputValue}
+    onCommit={onCommit}
+    id={id}
+    className={className}
+    ariaLabel={ariaLabel}
+    invalid={invalid}
+  />;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/components/components.tsx.html b/coverage/lcov-report/src/components/components.tsx.html new file mode 100644 index 0000000..265c19b --- /dev/null +++ b/coverage/lcov-report/src/components/components.tsx.html @@ -0,0 +1,157 @@ + + + + + + Code coverage report for src/components/components.tsx + + + + + + + + + +
+
+

All files / src/components components.tsx

+
+ +
+ 0% + Statements + 0/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 0% + Lines + 0/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState } from 'react'
+ 
+/**
+ * A minimal counter component that demonstrates basic React state handling.
+ *
+ * Maintains an internal count value and provides buttons to increment and reset it.
+ *
+ * @returns A JSX element rendering the counter UI.
+ */
+function Counter() {
+  /** The current counter value. */
+  const [count, setCount] = useState(0)
+ 
+  return (
+    <div className="card">
+      <button onClick={() => setCount((count) => count + 1)}>
+        count is {count}
+      </button>
+      <button className='reset' onClick={() => setCount(0)}>
+        Reset Counter
+      </button>
+    </div>
+  )
+}
+export default Counter
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/components/index.html b/coverage/lcov-report/src/components/index.html new file mode 100644 index 0000000..7591816 --- /dev/null +++ b/coverage/lcov-report/src/components/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/components + + + + + + + + + +
+
+

All files src/components

+
+ +
+ 0% + Statements + 0/47 +
+ + +
+ 0% + Branches + 0/28 +
+ + +
+ 0% + Functions + 0/21 +
+ + +
+ 0% + Lines + 0/43 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
MultilineTextField.tsx +
+
0%0/210%0/160%0/70%0/20
ScrollIntoView.tsx +
+
0%0/50%0/20%0/20%0/4
TextField.tsx +
+
0%0/160%0/100%0/80%0/15
components.tsx +
+
0%0/5100%0/00%0/40%0/4
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/index.html b/coverage/lcov-report/src/index.html new file mode 100644 index 0000000..0fa5cfc --- /dev/null +++ b/coverage/lcov-report/src/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src + + + + + + + + + +
+
+

All files src

+
+ +
+ 0% + Statements + 0/4 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/2 +
+ + +
+ 0% + Lines + 0/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
App.tsx +
+
0%0/30%0/20%0/20%0/3
main.tsx +
+
0%0/1100%0/0100%0/00%0/1
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/main.tsx.html b/coverage/lcov-report/src/main.tsx.html new file mode 100644 index 0000000..f31a2fc --- /dev/null +++ b/coverage/lcov-report/src/main.tsx.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for src/main.tsx + + + + + + + + + +
+
+

All files / src main.tsx

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { StrictMode } from 'react'
+import { createRoot } from 'react-dom/client'
+import { BrowserRouter } from 'react-router'
+import './index.css'
+import App from './App.tsx'
+ 
+createRoot(document.getElementById('root')!).render(
+  <StrictMode>
+    <BrowserRouter>
+      <App />
+    </BrowserRouter>
+  </StrictMode>,
+)
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/ConnectedRobots/ConnectedRobots.tsx.html b/coverage/lcov-report/src/pages/ConnectedRobots/ConnectedRobots.tsx.html new file mode 100644 index 0000000..2097523 --- /dev/null +++ b/coverage/lcov-report/src/pages/ConnectedRobots/ConnectedRobots.tsx.html @@ -0,0 +1,265 @@ + + + + + + Code coverage report for src/pages/ConnectedRobots/ConnectedRobots.tsx + + + + + + + + + +
+
+

All files / src/pages/ConnectedRobots ConnectedRobots.tsx

+
+ +
+ 0% + Statements + 0/14 +
+ + +
+ 0% + Branches + 0/6 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 0% + Lines + 0/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useEffect, useState } from 'react'
+ 
+/**
+ * Displays the current connection status of a robot in real time.
+ *
+ * Opens an SSE connection to the backend (`/robot/ping_stream`) that emits
+ * simple boolean JSON messages (`true` or `false`). Updates automatically when
+ * the robot connects or disconnects.
+ *
+ * @returns A React element showing the current robot connection status.
+ */
+export default function ConnectedRobots() {
+  
+  /**
+   * The current connection state:
+   * - `true`: Robot is connected.
+   * - `false`: Robot is not connected.
+   * - `null`: Connection status is unknown (initial check in progress).
+   */
+  const [connected, setConnected] = useState<boolean | null>(null);
+ 
+  useEffect(() => {
+    // Open a Server-Sent Events (SSE) connection to receive live ping updates.
+    // We're expecting a stream of data like that looks like this: `data = False` or `data = True`
+    const eventSource = new EventSource("http://localhost:8000/robot/ping_stream");
+    eventSource.onmessage = (event) => {
+    
+      // Expecting messages in JSON format: `true` or `false`
+      console.log("received message:", event.data);
+      try {
+        const data = JSON.parse(event.data);
+ 
+        try {
+          setConnected(data)
+        }
+        catch {
+          console.log("couldnt extract connected from incoming ping data")
+        }
+ 
+      } catch {
+        console.log("Ping message not in correct format:", event.data);
+      }
+    };
+ 
+    // Clean up the SSE connection when the component unmounts.
+    return () => eventSource.close();
+  }, []);
+ 
+  return (
+    <div>
+      <h1>Is robot currently connected?</h1>
+      <div>
+        <h2>Robot is currently: {connected == null ? "checking..." : (connected ? "connected! 🟢" : "not connected... 🔴")} </h2>
+        <h3>
+          {connected == null ? "If checking continues, make sure CB is properly loaded with robot at least once." : ""}
+        </h3>
+      </div>
+    </div>
+  );
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/ConnectedRobots/index.html b/coverage/lcov-report/src/pages/ConnectedRobots/index.html new file mode 100644 index 0000000..da9d973 --- /dev/null +++ b/coverage/lcov-report/src/pages/ConnectedRobots/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/pages/ConnectedRobots + + + + + + + + + +
+
+

All files src/pages/ConnectedRobots

+
+ +
+ 0% + Statements + 0/14 +
+ + +
+ 0% + Branches + 0/6 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 0% + Lines + 0/13 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
ConnectedRobots.tsx +
+
0%0/140%0/60%0/40%0/13
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/Home/Home.tsx.html b/coverage/lcov-report/src/pages/Home/Home.tsx.html new file mode 100644 index 0000000..c3eb97f --- /dev/null +++ b/coverage/lcov-report/src/pages/Home/Home.tsx.html @@ -0,0 +1,175 @@ + + + + + + Code coverage report for src/pages/Home/Home.tsx + + + + + + + + + +
+
+

All files / src/pages/Home Home.tsx

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Link } from 'react-router'
+import pepperLogo from '../../assets/pepper_transp2_small.svg'
+import styles from './Home.module.css'
+ 
+/**
+ * The home page component providing navigation and project branding.
+ *
+ * Renders the Pepper logo and a set of navigational links 
+ * implemented via React Router.
+ *
+ * @returns A JSX element representing the app’s home page.
+ */
+function Home() {
+  return (
+    <div className={`flex-col ${styles.gapXl}`}>
+      <div className="logoPepperScaling">
+        <a href="https://git.science.uu.nl/ics/sp/2025/n25b" target="_blank">
+          <img src={pepperLogo} className="logopepper" alt="Pepper logo" />
+        </a>
+      </div>
+      <div className={styles.links}>
+        <Link to={"/robot"}>Robot Interaction →</Link>
+        <Link to={"/editor"}>Editor →</Link>
+        <Link to={"/template"}>Template →</Link>
+        <Link to={"/ConnectedRobots"}>Connected Robots →</Link>
+      </div>
+    </div>
+  )
+}
+ 
+export default Home
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/Home/index.html b/coverage/lcov-report/src/pages/Home/index.html new file mode 100644 index 0000000..ec48b99 --- /dev/null +++ b/coverage/lcov-report/src/pages/Home/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/pages/Home + + + + + + + + + +
+
+

All files src/pages/Home

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
Home.tsx +
+
0%0/1100%0/00%0/10%0/1
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/MonitoringPage/MonitoringPageComponents.tsx.html b/coverage/lcov-report/src/pages/MonitoringPage/MonitoringPageComponents.tsx.html new file mode 100644 index 0000000..5c087e4 --- /dev/null +++ b/coverage/lcov-report/src/pages/MonitoringPage/MonitoringPageComponents.tsx.html @@ -0,0 +1,766 @@ + + + + + + Code coverage report for src/pages/MonitoringPage/MonitoringPageComponents.tsx + + + + + + + + + +
+
+

All files / src/pages/MonitoringPage MonitoringPageComponents.tsx

+
+ +
+ 0% + Statements + 0/55 +
+ + +
+ 0% + Branches + 0/50 +
+ + +
+ 0% + Functions + 0/19 +
+ + +
+ 0% + Lines + 0/50 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import React, { useEffect, useState } from 'react';
+import styles from './MonitoringPage.module.css';
+import { sendAPICall } from './MonitoringPageAPI';
+ 
+// --- GESTURE COMPONENT ---
+export const GestureControls: React.FC = () => {
+  const [selectedGesture, setSelectedGesture] = useState("animations/Stand/BodyTalk/Speaking/BodyTalk_1");
+ 
+  const gestures = [
+    { label: "Wave", value: "animations/Stand/Gestures/Hey_1" }, 
+    { label: "Think", value: "animations/Stand/Emotions/Neutral/Puzzled_1" }, 
+    { label: "Explain", value: "animations/Stand/Gestures/Explain_4" }, 
+    { label: "You", value: "animations/Stand/Gestures/You_1" }, 
+    { label: "Happy", value: "animations/Stand/Emotions/Positive/Happy_1" }, 
+    { label: "Laugh", value: "animations/Stand/Emotions/Positive/Laugh_2" }, 
+    { label: "Lonely", value: "animations/Stand/Emotions/Neutral/Lonely_1" }, 
+    { label: "Suprise", value: "animations/Stand/Emotions/Negative/Surprise_1" }, 
+    { label: "Hurt", value: "animations/Stand/Emotions/Negative/Hurt_2" }, 
+    { label: "Angry", value: "animations/Stand/Emotions/Negative/Angry_4" },
+  ];
+  return (
+    <div className={styles.gestures}>
+      <h4>Gestures</h4>
+      <div className={styles.gestureInputGroup}>
+        <select 
+          value={selectedGesture} 
+          onChange={(e) => setSelectedGesture(e.target.value)}
+        >
+          {gestures.map(g => <option key={g.value} value={g.value}>{g.label}</option>)}
+        </select>
+        <button onClick={() => sendAPICall("gesture", selectedGesture)}>
+          Actuate
+        </button>
+      </div>
+    </div>
+  );
+};
+ 
+// --- PRESET SPEECH COMPONENT ---
+export const SpeechPresets: React.FC = () => {
+  const phrases = [
+    { label: "Hello, I'm Pepper", text: "Hello, I'm Pepper" },
+    { label: "Repeat please", text: "Could you repeat that please" },
+    { label: "About yourself", text: "Tell me something about yourself" },
+  ];
+ 
+  return (
+    <div className={styles.speech}>
+      <h4>Speech Presets</h4>
+      <ul>
+        {phrases.map((phrase, i) => (
+          <li key={i}>
+            <button 
+              className={styles.speechBtn} 
+              onClick={() =>  sendAPICall("speech", phrase.text)}
+            >
+              "{phrase.label}"
+            </button>
+          </li>
+        ))}
+      </ul>
+    </div>
+  );
+};
+ 
+// --- DIRECT SPEECH (INPUT) COMPONENT ---
+export const DirectSpeechInput: React.FC = () => {
+  const [text, setText] = useState("");
+ 
+  const handleSend = () => {
+    if (!text.trim()) return;
+    sendAPICall("speech", text);
+    setText(""); // Clear after sending
+  };
+ 
+  return (
+    <div className={styles.directSpeech}>
+      <h4>Direct Pepper Speech</h4>
+      <div className={styles.speechInput}>
+        <input 
+          type="text" 
+          value={text}
+          onChange={(e) => setText(e.target.value)}
+          placeholder="Type message..." 
+          onKeyDown={(e) => e.key === 'Enter' && handleSend()}
+        />
+        <button onClick={handleSend}>Send</button>
+      </div>
+    </div>
+  );
+};
+ 
+// --- interface for goals/triggers/norms/conditional norms ---
+type StatusItem = {
+  id?: string | number;
+  achieved?: boolean;
+  description?: string;
+  label?: string;
+  norm?: string;
+  name?: string;
+};
+ 
+interface StatusListProps {
+  title: string;
+  items: StatusItem[];
+  type: 'goal' | 'trigger' | 'norm'| 'cond_norm';
+  activeIds: Record<string, boolean>;
+  setActiveIds?: React.Dispatch<React.SetStateAction<Record<string, boolean>>>; 
+  currentGoalIndex?: number;
+}
+ 
+// --- STATUS LIST COMPONENT ---
+export const StatusList: React.FC<StatusListProps> = ({ 
+  title, 
+  items, 
+  type, 
+  activeIds, 
+  setActiveIds,
+  currentGoalIndex // Destructure this prop
+}) => {
+  return (
+    <section className={styles.phaseBox}>
+      <h3>{title}</h3>
+      <ul>
+        {items.map((item, idx) => {
+          if (item.id === undefined) return null;
+          const isActive = !!activeIds[item.id];
+          const showIndicator = type !== 'norm';
+          const isCurrentGoal = type === 'goal' && idx === currentGoalIndex;
+          const canOverride =  (showIndicator && !isActive) || (type === 'cond_norm' && isActive); 
+ 
+         
+ 
+          const handleOverrideClick = () => {
+            if (!canOverride) return;
+            if (type === 'cond_norm' && isActive){  
+              {/* Unachieve conditional norm */}
+              sendAPICall("override_unachieve", String(item.id));
+            }
+            else {
+              if(type === 'goal')
+                if(setActiveIds)
+                {setActiveIds(prev => ({ ...prev, [String(item.id)]: true }));}
+            
+              sendAPICall("override", String(item.id));
+            }
+          };
+ 
+          return (
+            <li key={item.id ?? idx} className={styles.statusItem}>
+              {showIndicator && (
+                <span 
+                  className={`${styles.statusIndicator} ${isActive ? styles.active : styles.inactive} ${canOverride ? styles.clickable : ''}`}
+                  onClick={handleOverrideClick}
+                >
+                  {isActive ? "✔️" : "❌"}
+                </span>
+              )}
+              <span 
+                className={styles.itemDescription}
+                style={{ 
+                  // Visual Feedback
+                  textDecoration: isCurrentGoal ? 'underline' : 'none',
+                  fontWeight: isCurrentGoal ? 'bold' : 'normal',
+                  color: isCurrentGoal ? '#007bff' : 'inherit',
+                  backgroundColor: isCurrentGoal ? '#e7f3ff' : 'transparent', // Added subtle highlight
+                  padding: isCurrentGoal ? '2px 4px' : '0',
+                  borderRadius: '4px'
+                }}
+              >
+                {item.name || item.norm}
+                {isCurrentGoal && " (Current)"} 
+              </span>
+            </li>
+          );
+        })}
+      </ul>
+    </section>
+  );
+};
+ 
+ 
+// --- Robot Connected --- 
+export const RobotConnected = () => {
+ 
+  /**
+     * The current connection state:
+     * - `true`: Robot is connected.
+     * - `false`: Robot is not connected.
+     * - `null`: Connection status is unknown (initial check in progress).
+     */
+    const [connected, setConnected] = useState<boolean | null>(null);
+  
+    useEffect(() => {
+      // Open a Server-Sent Events (SSE) connection to receive live ping updates.
+      // We're expecting a stream of data like that looks like this: `data = False` or `data = True`
+      const eventSource = new EventSource("http://localhost:8000/robot/ping_stream");
+      eventSource.onmessage = (event) => {
+      
+        // Expecting messages in JSON format: `true` or `false`
+        //commented out this log as it clutters console logs, but might be useful to debug
+        //console.log("received message:", event.data);
+        try {
+          const data = JSON.parse(event.data);
+  
+          try {
+            setConnected(data)
+          }
+          catch {
+            console.log("couldnt extract connected from incoming ping data")
+          }
+  
+        } catch {
+          console.log("Ping message not in correct format:", event.data);
+        }
+      };
+  
+      // Clean up the SSE connection when the component unmounts.
+      return () => eventSource.close();
+    }, []);
+ 
+  return  (
+  <div>
+    <h3>Connection:</h3>
+    <p className={connected ? styles.connected : styles.disconnected }>{connected ? "● Robot is connected" : "● Robot is disconnected"}</p>
+  </div>
+  )
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/MonitoringPage/index.html b/coverage/lcov-report/src/pages/MonitoringPage/index.html new file mode 100644 index 0000000..a70bfe2 --- /dev/null +++ b/coverage/lcov-report/src/pages/MonitoringPage/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/pages/MonitoringPage + + + + + + + + + +
+
+

All files src/pages/MonitoringPage

+
+ +
+ 0% + Statements + 0/55 +
+ + +
+ 0% + Branches + 0/50 +
+ + +
+ 0% + Functions + 0/19 +
+ + +
+ 0% + Lines + 0/50 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
MonitoringPageComponents.tsx +
+
0%0/550%0/500%0/190%0/50
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/Robot/Robot.tsx.html b/coverage/lcov-report/src/pages/Robot/Robot.tsx.html new file mode 100644 index 0000000..f4f9c9f --- /dev/null +++ b/coverage/lcov-report/src/pages/Robot/Robot.tsx.html @@ -0,0 +1,475 @@ + + + + + + Code coverage report for src/pages/Robot/Robot.tsx + + + + + + + + + +
+
+

All files / src/pages/Robot Robot.tsx

+
+ +
+ 0% + Statements + 0/42 +
+ + +
+ 0% + Branches + 0/20 +
+ + +
+ 0% + Functions + 0/16 +
+ + +
+ 0% + Lines + 0/33 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useEffect, useRef } from 'react'
+ 
+/**
+ * Displays a live robot interaction panel with user input, conversation history,
+ * and real-time updates from the robot backend via Server-Sent Events (SSE).
+ *
+ * @returns A React element rendering the interactive robot UI.
+ */
+export default function Robot() {
+  /** The text message currently entered by the user. */
+  const [message, setMessage] = useState('');
+ 
+  /** Whether the robot’s microphone or listening mode is currently active. */
+  const [listening, setListening] = useState(false);
+  /** The ongoing conversation history as a sequence of user/assistant messages. */
+  const [conversation, setConversation] = useState<
+  {"role": "user" | "assistant", "content": string}[]>([])
+  /** Reference to the scrollable conversation container for auto-scrolling. */
+  const conversationRef = useRef<HTMLDivElement | null>(null);
+  /**
+   * Index used to force refresh the SSE connection or clear conversation.
+   * Incrementing this value triggers a reset of the live data stream.
+   */
+  const [conversationIndex, setConversationIndex] = useState(0);
+ 
+  /**
+   * Sends a message to the robot backend.
+   *
+   * Makes a POST request to `/message` with the user’s text.
+   * The backend may respond with confirmation or error information.
+   */
+  const sendMessage = async () => {
+    try {
+      const response = await fetch("http://localhost:8000/message", {
+        method: "POST",
+        headers: {
+          "Content-Type": "application/json",
+        },
+        body: JSON.stringify({ message }),
+      });
+      const data = await response.json();
+      console.log(data);
+    } catch (error) {
+      console.error("Error sending message: ", error);
+    }
+  };
+ 
+   /**
+   * Establishes a persistent Server-Sent Events (SSE) connection
+   * to receive real-time updates from the robot backend.
+   *
+   * Handles three event types:
+   * - `voice_active`: whether the robot is currently listening.
+   * - `speech`: recognized user speech input.
+   * - `llm_response`: the robot’s language model-generated reply.
+   *
+   * The connection resets whenever `conversationIndex` changes.
+   */
+  useEffect(() => {
+    const eventSource = new EventSource("http://localhost:8000/sse");
+ 
+    eventSource.onmessage = (event) => {
+      try {
+        const data = JSON.parse(event.data);
+        if ("voice_active" in data) setListening(data.voice_active);
+        if ("speech" in data) setConversation(conversation => [...conversation, {"role": "user", "content": data.speech}]);
+        if ("llm_response" in data) setConversation(conversation => [...conversation, {"role": "assistant", "content": data.llm_response}]);
+      } catch {
+        console.log("Unparsable SSE message:", event.data);
+      }
+    };
+ 
+    return () => {
+      eventSource.close();
+    };
+  }, [conversationIndex]);
+ 
+  /**
+   * Automatically scrolls the conversation view to the bottom
+   * whenever a new message is added.
+   */
+  useEffect(() => {
+    if (!conversationRef || !conversationRef.current) return;
+    conversationRef.current.scrollTop = conversationRef.current.scrollHeight;
+  }, [conversation]);
+ 
+  return (
+    <>
+      <h1>Robot interaction</h1>
+      <h2>Force robot speech</h2>
+      <div className={"flex-row gap-md justify-center"}>
+        <input
+          type="text"
+          value={message}
+          onChange={(e) => setMessage(e.target.value)}
+          onKeyDown={(e) => e.key === "Enter" && sendMessage().then(() => setMessage(""))}
+          placeholder="Enter a message"
+        />
+        <button onClick={sendMessage}>Speak</button>
+      </div>
+      <div className={"flex-col gap-lg align-center"}>
+        <h2>Conversation</h2>
+        <p>Listening {listening ? "🟢" : "🔴"}</p>
+        <div style={{ maxHeight: "200px", maxWidth: "600px", overflowY: "auto"}} ref={conversationRef}>
+          {conversation.map((item, i) => (
+            <p key={i}
+              style={{
+                backgroundColor: item["role"] == "user"
+                  ? "color-mix(in oklab, canvas, blue 20%)"
+                  : "color-mix(in oklab, canvas, gray 20%)",
+                whiteSpace: "pre-line",
+              }}
+              className={"round-md padding-md"}
+            >{item["content"]}</p>
+          ))}
+        </div>
+        <div className={"flex-row gap-md justify-center"}>
+          <button onClick={() => {
+            setConversationIndex((conversationIndex) => conversationIndex + 1)
+            setConversation([])
+          }}>Reset</button>
+          <button onClick={() => {
+            setConversationIndex((conversationIndex) => conversationIndex == -1 ? 0 : -1)
+            setConversation([])
+          }}>{conversationIndex == -1 ? "Start" : "Stop"}</button>
+        </div>
+      </div>
+    </>
+  );
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/Robot/index.html b/coverage/lcov-report/src/pages/Robot/index.html new file mode 100644 index 0000000..0d0a729 --- /dev/null +++ b/coverage/lcov-report/src/pages/Robot/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/pages/Robot + + + + + + + + + +
+
+

All files src/pages/Robot

+
+ +
+ 0% + Statements + 0/42 +
+ + +
+ 0% + Branches + 0/20 +
+ + +
+ 0% + Functions + 0/16 +
+ + +
+ 0% + Lines + 0/33 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
Robot.tsx +
+
0%0/420%0/200%0/160%0/33
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/SimpleProgram/SimpleProgram.tsx.html b/coverage/lcov-report/src/pages/SimpleProgram/SimpleProgram.tsx.html new file mode 100644 index 0000000..2de95a4 --- /dev/null +++ b/coverage/lcov-report/src/pages/SimpleProgram/SimpleProgram.tsx.html @@ -0,0 +1,661 @@ + + + + + + Code coverage report for src/pages/SimpleProgram/SimpleProgram.tsx + + + + + + + + + +
+
+

All files / src/pages/SimpleProgram SimpleProgram.tsx

+
+ +
+ 0% + Statements + 0/41 +
+ + +
+ 0% + Branches + 0/24 +
+ + +
+ 0% + Functions + 0/17 +
+ + +
+ 0% + Lines + 0/35 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import React from "react";
+import styles from "./SimpleProgram.module.css";
+import useProgramStore from "../../utils/programStore.ts";
+ 
+/**
+ * Generic container box with a header and content area.
+ */
+type BoxProps = {
+  title: string;
+  children: React.ReactNode;
+};
+ 
+const Box: React.FC<BoxProps> = ({ title, children }) => (
+  <div className={styles.box}>
+    <div className={styles.boxHeader}>{title}</div>
+    <div className={styles.boxContent}>{children}</div>
+  </div>
+);
+ 
+/**
+ * Renders a list of goals for a phase.
+ * Expects goal-like objects from the program store.
+ */
+const GoalList: React.FC<{ goals: unknown[] }> = ({ goals }) => {
+  if (!goals.length) {
+    return <p className={styles.empty}>No goals defined.</p>;
+  }
+ 
+  return (
+    <ul className={styles.iconList}>
+      {goals.map((g, idx) => {
+        const goal = g as {
+          id?: string;
+          description?: string;
+          achieved?: boolean;
+        };
+ 
+        return (
+          <li key={goal.id ?? idx}>
+            <span
+              className={
+                goal.achieved ? styles.successIcon : styles.failIcon
+              }
+            >
+              {goal.achieved ? "✔" : "✖"}
+            </span>
+            {goal.description ?? "Unnamed goal"}
+          </li>
+        );
+      })}
+    </ul>
+  );
+};
+ 
+/**
+ * Renders a list of triggers for a phase.
+ */
+const TriggerList: React.FC<{ triggers: unknown[] }> = ({ triggers }) => {
+  if (!triggers.length) {
+    return <p className={styles.empty}>No triggers defined.</p>;
+  }
+ 
+  return (
+    <ul className={styles.iconList}>
+      {triggers.map((t, idx) => {
+        const trigger = t as {
+          id?: string;
+          label?: string;
+        };
+ 
+        return (
+          <li key={trigger.id ?? idx}>
+            <span className={styles.failIcon}>✖</span>
+            {trigger.label ?? "Unnamed trigger"}
+          </li>
+        );
+      })}
+    </ul>
+  );
+};
+ 
+/**
+ * Renders a list of norms for a phase.
+ */
+const NormList: React.FC<{ norms: unknown[] }> = ({ norms }) => {
+  if (!norms.length) {
+    return <p className={styles.empty}>No norms defined.</p>;
+  }
+ 
+  return (
+    <ul className={styles.bulletList}>
+      {norms.map((n, idx) => {
+        const norm = n as {
+          id?: string;
+          norm?: string;
+        };
+ 
+        return <li key={norm.id ?? idx}>{norm.norm ?? "Unnamed norm"}</li>;
+      })}
+    </ul>
+  );
+};
+ 
+/**
+ * Displays all phase-related information in a grid layout.
+ */
+type PhaseGridProps = {
+  norms: unknown[];
+  goals: unknown[];
+  triggers: unknown[];
+};
+ 
+const PhaseGrid: React.FC<PhaseGridProps> = ({
+  norms,
+  goals,
+  triggers,
+}) => (
+  <div className={styles.phaseGrid}>
+    <Box title="Norms">
+      <NormList norms={norms} />
+    </Box>
+ 
+    <Box title="Triggers">
+      <TriggerList triggers={triggers} />
+    </Box>
+ 
+    <Box title="Goals">
+      <GoalList goals={goals} />
+    </Box>
+ 
+    <Box title="Conditional Norms">
+      <p className={styles.empty}>No conditional norms defined.</p>
+    </Box>
+  </div>
+);
+ 
+/**
+ * Main program viewer.
+ * Reads all data from the program store and allows
+ * navigating between phases.
+ */
+const SimpleProgram: React.FC = () => {
+  const getPhaseIds = useProgramStore((s) => s.getPhaseIds);
+  const getNormsInPhase = useProgramStore((s) => s.getNormsInPhase);
+  const getGoalsInPhase = useProgramStore((s) => s.getGoalsInPhase);
+  const getTriggersInPhase = useProgramStore((s) => s.getTriggersInPhase);
+ 
+  const phaseIds = getPhaseIds();
+  const [phaseIndex, setPhaseIndex] = React.useState(0);
+ 
+  if (phaseIds.length === 0) {
+    return <p className={styles.empty}>No program loaded.</p>;
+  }
+ 
+  const phaseId = phaseIds[phaseIndex];
+ 
+  return (
+    <div className={styles.container}>
+      <header className={styles.header}>
+        <h2>
+          Phase {phaseIndex + 1} / {phaseIds.length}
+        </h2>
+ 
+        <div className={styles.controls}>
+          <button
+            disabled={phaseIndex === 0}
+            onClick={() => setPhaseIndex((i) => i - 1)}
+          >
+            ◀ Prev
+          </button>
+ 
+          <button
+            disabled={phaseIndex === phaseIds.length - 1}
+            onClick={() => setPhaseIndex((i) => i + 1)}
+          >
+            Next ▶
+          </button>
+        </div>
+      </header>
+ 
+      <div className={styles.content}>
+        <PhaseGrid
+          norms={getNormsInPhase(phaseId)}
+          goals={getGoalsInPhase(phaseId)}
+          triggers={getTriggersInPhase(phaseId)}
+        />
+      </div>
+    </div>
+  );
+};
+ 
+export default SimpleProgram;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/SimpleProgram/index.html b/coverage/lcov-report/src/pages/SimpleProgram/index.html new file mode 100644 index 0000000..8e47b81 --- /dev/null +++ b/coverage/lcov-report/src/pages/SimpleProgram/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/pages/SimpleProgram + + + + + + + + + +
+
+

All files src/pages/SimpleProgram

+
+ +
+ 0% + Statements + 0/41 +
+ + +
+ 0% + Branches + 0/24 +
+ + +
+ 0% + Functions + 0/17 +
+ + +
+ 0% + Lines + 0/35 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
SimpleProgram.tsx +
+
0%0/410%0/240%0/170%0/35
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/TemplatePage/Template.tsx.html b/coverage/lcov-report/src/pages/TemplatePage/Template.tsx.html new file mode 100644 index 0000000..7a20a5a --- /dev/null +++ b/coverage/lcov-report/src/pages/TemplatePage/Template.tsx.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for src/pages/TemplatePage/Template.tsx + + + + + + + + + +
+
+

All files / src/pages/TemplatePage Template.tsx

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11  +  +  +  +  +  +  +  +  +  + 
import Counter from '../../components/components.tsx'
+ 
+function TemplatePage() {
+  return (
+    <>
+      <Counter />
+    </>
+  )
+}
+ 
+export default TemplatePage
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/TemplatePage/index.html b/coverage/lcov-report/src/pages/TemplatePage/index.html new file mode 100644 index 0000000..320267c --- /dev/null +++ b/coverage/lcov-report/src/pages/TemplatePage/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/pages/TemplatePage + + + + + + + + + +
+
+

All files src/pages/TemplatePage

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
Template.tsx +
+
0%0/1100%0/00%0/10%0/1
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/VisProg.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/VisProg.tsx.html new file mode 100644 index 0000000..82c4456 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/VisProg.tsx.html @@ -0,0 +1,745 @@ + + + + + + Code coverage report for src/pages/VisProgPage/VisProg.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage VisProg.tsx

+
+ +
+ 0% + Statements + 0/47 +
+ + +
+ 0% + Branches + 0/12 +
+ + +
+ 0% + Functions + 0/19 +
+ + +
+ 0% + Lines + 0/40 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Background,
+  Controls,
+  Panel,
+  ReactFlow,
+  ReactFlowProvider,
+  MarkerType,
+} from '@xyflow/react';
+import '@xyflow/react/dist/style.css';
+import {type CSSProperties, useEffect, useState} from "react";
+import {useShallow} from 'zustand/react/shallow';
+import orderPhaseNodeArray from "../../utils/orderPhaseNodes.ts";
+import useProgramStore from "../../utils/programStore.ts";
+import {DndToolbar} from './visualProgrammingUI/components/DragDropSidebar.tsx';
+import type {PhaseNode} from "./visualProgrammingUI/nodes/PhaseNode.tsx";
+import useFlowStore from './visualProgrammingUI/VisProgStores.tsx';
+import type {FlowState} from './visualProgrammingUI/VisProgTypes.tsx';
+import styles from './VisProg.module.css'
+import { NodeReduces, NodeTypes } from './visualProgrammingUI/NodeRegistry.ts';
+import SaveLoadPanel from './visualProgrammingUI/components/SaveLoadPanel.tsx';
+import MonitoringPage from '../MonitoringPage/MonitoringPage.tsx';
+ 
+// --| config starting params for flow |--
+ 
+ 
+/**
+ * defines how the default edge looks inside the editor
+ */
+const DEFAULT_EDGE_OPTIONS = {
+  type: 'default',
+  markerEnd: {
+    type: MarkerType.ArrowClosed,
+    color: '#505050',
+  },
+};
+ 
+ 
+/**
+ * defines what functions in the FlowState store map to which names,
+ * @param state
+ */
+const selector = (state: FlowState) => ({
+  nodes: state.nodes,
+  edges: state.edges,
+  onNodesChange: state.onNodesChange,
+  onEdgesDelete: state.onEdgesDelete,
+  onEdgesChange: state.onEdgesChange,
+  onConnect: state.onConnect,
+  onReconnectStart: state.onReconnectStart,
+  onReconnectEnd: state.onReconnectEnd,
+  onReconnect: state.onReconnect,
+  undo: state.undo,
+  redo: state.redo,
+  beginBatchAction: state.beginBatchAction,
+  endBatchAction: state.endBatchAction,
+  scrollable: state.scrollable
+});
+ 
+// --| define ReactFlow editor |--
+ 
+/**
+ * Defines the ReactFlow visual programming editor component
+ * any implementations of editor logic should be encapsulated where possible
+ * so the Component definition stays as readable as possible
+ * @constructor
+ */
+const VisProgUI = () => {
+  const {
+    nodes, edges,
+    onNodesChange,
+    onEdgesDelete,
+    onEdgesChange,
+    onConnect,
+    onReconnect,
+    onReconnectStart,
+    onReconnectEnd,
+    undo,
+    redo,
+    beginBatchAction,
+    endBatchAction,
+    scrollable
+  } = useFlowStore(useShallow(selector)); // instructs the editor to use the corresponding functions from the FlowStore
+  const [zoom, setZoom] = useState(1);
+  // adds ctrl+z and ctrl+y support to respectively undo and redo actions
+  useEffect(() => {
+    const handler = (e: KeyboardEvent) => {
+      if (e.ctrlKey && e.key === 'z') undo();
+      if (e.ctrlKey && e.key === 'y') redo();
+    };
+    window.addEventListener('keydown', handler);
+    return () => window.removeEventListener('keydown', handler);
+  });
+ 
+  return (
+    <div className={`${styles.innerEditorContainer} round-lg border-lg`} style={({'--flow-zoom': zoom} as CSSProperties)}>
+      <ReactFlow
+        nodes={nodes}
+        edges={edges}
+        defaultEdgeOptions={DEFAULT_EDGE_OPTIONS}
+        nodeTypes={NodeTypes}
+        onNodesChange={onNodesChange}
+        onEdgesDelete={onEdgesDelete}
+        onEdgesChange={onEdgesChange}
+        onReconnect={onReconnect}
+        onReconnectStart={onReconnectStart}
+        onReconnectEnd={onReconnectEnd}
+        onConnect={onConnect}
+        onNodeDragStart={beginBatchAction}
+        onNodeDragStop={endBatchAction}
+        preventScrolling={scrollable}
+        onMove={(_, viewport) => setZoom(viewport.zoom)}
+        snapToGrid
+        fitView
+        proOptions={{hideAttribution: true}}
+      >
+        <Panel position="top-center" className={styles.dndPanel}>
+          <DndToolbar/> {/* contains the drag and drop panel for nodes */}
+          </Panel>
+          <Panel position = "bottom-left" className={styles.saveLoadPanel}>
+            <SaveLoadPanel></SaveLoadPanel>
+          </Panel>
+        <Panel position="bottom-center">
+          <button onClick={() => undo()}>undo</button>
+          <button onClick={() => redo()}>Redo</button>
+        </Panel>
+        <Controls/>
+        <Background/>
+      </ReactFlow>
+    </div>
+  );
+};
+ 
+/**
+ * Places the VisProgUI component inside a ReactFlowProvider
+ *
+ * Wrapping the editor component inside a ReactFlowProvider
+ * allows us to access and interact with the components inside the editor, outside the editor definition,
+ * thus facilitating the addition of node specific functions inside their node definitions
+ */
+function VisualProgrammingUI() {
+  return (
+    <ReactFlowProvider>
+      <VisProgUI/>
+    </ReactFlowProvider>
+  );
+}
+ 
+// currently outputs the prepared program to the console
+export function runProgramm() {
+  const phases = graphReducer();
+  const program = {phases}
+  console.log(JSON.stringify(program, null, 2));
+  fetch(
+    "http://localhost:8000/program",
+    {
+      method: "POST",
+      headers: {"Content-Type": "application/json"},
+      body: JSON.stringify(program),
+    }
+  ).then((res) => {
+    if (!res.ok) throw new Error("Failed communicating with the backend.")
+    console.log("Successfully sent the program to the backend.");
+ 
+    // store reduced program in global program store for further use in the UI
+    // when the program was sent to the backend successfully:
+    useProgramStore.getState().setProgramState(structuredClone(program));
+  }).catch(() => console.log("Failed to send program to the backend."));
+  console.log(program);
+}
+ 
+/**
+ * Reduces the graph into its phases' information and recursively calls their reducing function
+ */ 
+export function graphReducer() {
+  const { nodes } = useFlowStore.getState();
+  return orderPhaseNodeArray(nodes.filter((n) => n.type == 'phase') as PhaseNode [])
+    .map((n) => {
+      const reducer = NodeReduces['phase'];
+      return reducer(n, nodes)
+    }); 
+}
+ 
+ 
+ 
+/**
+ * houses the entire page, so also UI elements
+ * that are not a part of the Visual Programming UI
+ * @constructor
+ */
+function VisProgPage() {
+  const [showSimpleProgram, setShowSimpleProgram] = useState(false);
+  const setProgramState = useProgramStore((state) => state.setProgramState);
+ 
+  const runProgram = () => {
+    const phases = graphReducer();       // reduce graph
+    setProgramState({ phases });          // <-- save to store
+    setShowSimpleProgram(true);          // show SimpleProgram
+    runProgramm();                        // send to backend if needed
+  };
+ 
+  if (showSimpleProgram) {
+    return (
+    <div>
+      <button className={styles.backButton} onClick={() => setShowSimpleProgram(false)}>
+        Back to Editor ◀ 
+      </button>
+      <MonitoringPage/>
+    </div>
+    );
+  }
+ 
+  return (
+    <>
+      <VisualProgrammingUI/>
+      <button onClick={runProgram}>run program</button>
+    </>
+  )
+}
+ 
+export default VisProgPage
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/index.html b/coverage/lcov-report/src/pages/VisProgPage/index.html new file mode 100644 index 0000000..20ebb95 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/pages/VisProgPage + + + + + + + + + +
+
+

All files src/pages/VisProgPage

+
+ +
+ 0% + Statements + 0/47 +
+ + +
+ 0% + Branches + 0/12 +
+ + +
+ 0% + Functions + 0/19 +
+ + +
+ 0% + Lines + 0/40 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
VisProg.tsx +
+
0%0/470%0/120%0/190%0/40
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/EditorUndoRedo.ts.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/EditorUndoRedo.ts.html new file mode 100644 index 0000000..6ff75bd --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/EditorUndoRedo.ts.html @@ -0,0 +1,469 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/EditorUndoRedo.ts + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI EditorUndoRedo.ts

+
+ +
+ 0% + Statements + 0/30 +
+ + +
+ 0% + Branches + 0/8 +
+ + +
+ 0% + Functions + 0/9 +
+ + +
+ 0% + Lines + 0/26 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import type {Edge, Node} from "@xyflow/react";
+import type {StateCreator, StoreApi } from 'zustand/vanilla';
+import type {FlowState} from "./VisProgTypes.tsx";
+ 
+export type FlowSnapshot = {
+  nodes: Node[];
+  edges: Edge[];
+}
+ 
+/**
+ * A reduced version of the flowState type,
+ * This removes the functions that are provided by UndoRedo from the expected input type
+ */
+type BaseFlowState = Omit<FlowState, 'undo' | 'redo' | 'pushSnapshot' | 'beginBatchAction' | 'endBatchAction'>;
+ 
+ 
+/**
+ * UndoRedo is implemented as a middleware for the FlowState store,
+ * this allows us to keep the undo redo logic separate from the flowState,
+ * and thus from the internal editor logic
+ *
+ * Allows users to undo and redo actions in the visual programming editor
+ *
+ * @param {(set: StoreApi<FlowState>["setState"], get: () => FlowState, api: StoreApi<FlowState>) => BaseFlowState} config
+ * @returns {StateCreator<FlowState>}
+ * @constructor
+ */
+export const UndoRedo = (
+  config: (
+    set: StoreApi<FlowState>['setState'],
+    get: () => FlowState,
+    api: StoreApi<FlowState>
+  ) => BaseFlowState ) : StateCreator<FlowState> => (set, get, api) => {
+  let batchTimeout: number | null = null;
+ 
+  /**
+   * Captures the current state for
+   *
+   * @param {BaseFlowState} state - the current state of the editor
+   * @returns {FlowSnapshot} - returns a snapshot of the current editor state
+   */
+  const getSnapshot = (state : BaseFlowState) : FlowSnapshot => (structuredClone({
+    nodes: state.nodes,
+    edges: state.edges
+  }));
+ 
+  const initialState = config(set, get, api);
+ 
+  return {
+    ...initialState,
+ 
+    /**
+     *  Adds a snapshot of the current state to the undo history
+     */
+    pushSnapshot: () => {
+      const state = get();
+      // we don't add new snapshots during an ongoing batch action
+      if (!state.isBatchAction) {
+        set({
+          past: [...state.past, getSnapshot(state)],
+          future: []
+        });
+      }
+ 
+    },
+ 
+    /**
+     * Undoes the last action from the editor,
+     * The state before undoing is added to the future for potential redoing
+     */
+    undo: () => {
+      const state = get();
+      if (!state.past.length) return;
+ 
+      const snapshot = state.past.pop()!; // pop last snapshot
+      const currentSnapshot: FlowSnapshot = getSnapshot(state);
+ 
+      set({
+        nodes: snapshot.nodes,
+        edges: snapshot.edges,
+      });
+ 
+      state.future.push(currentSnapshot); // push current to redo
+    },
+ 
+    /**
+     * redoes the last undone action,
+     * The state before redoing is added to the past for potential undoing
+     */
+    redo: () => {
+      const state = get();
+      if (!state.future.length) return;
+ 
+      const snapshot = state.future.pop()!; // pop last redo
+      const currentSnapshot: FlowSnapshot = getSnapshot(state);
+ 
+      set({
+        nodes: snapshot.nodes,
+        edges: snapshot.edges,
+      });
+ 
+      state.past.push(currentSnapshot); // push current to undo
+    },
+ 
+    /**
+     * Begins a batched action
+     *
+     * An example of a batched action is dragging a node in the editor,
+     * where we want the entire action of moving a node to a different position
+     * to be covered by one undoable snapshot
+     */
+    beginBatchAction: () => {
+      get().pushSnapshot();
+      set({ isBatchAction: true });
+      if (batchTimeout) clearTimeout(batchTimeout);
+    },
+ 
+    /**
+     * Ends a batched action,
+     * a very short timeout is used to prevent new snapshots from being added
+     * until we are certain that the batch event is finished
+     */
+    endBatchAction: () => {
+      batchTimeout = window.setTimeout(() => {
+        set({ isBatchAction: false });
+      }, 10);
+    }
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/HandleRuleLogic.ts.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/HandleRuleLogic.ts.html new file mode 100644 index 0000000..a6df515 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/HandleRuleLogic.ts.html @@ -0,0 +1,412 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/HandleRuleLogic.ts + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI HandleRuleLogic.ts

+
+ +
+ 0% + Statements + 0/21 +
+ + +
+ 0% + Branches + 0/8 +
+ + +
+ 0% + Functions + 0/9 +
+ + +
+ 0% + Lines + 0/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {type Connection} from "@xyflow/react";
+import {useEffect} from "react";
+import useFlowStore from "./VisProgStores.tsx";
+ 
+export type ConnectionContext = {
+  connectionCount: number;
+  source: {
+    id: string;
+    handleId: string;
+  }
+  target: {
+    id: string;
+    handleId: string;
+  }
+}
+ 
+export type HandleRule = (
+  connection: Connection,
+  context: ConnectionContext
+) => RuleResult;
+ 
+/**
+ * A RuleResult describes the outcome of validating a HandleRule
+ *
+ * if a rule is not satisfied, the RuleResult includes a message that is used inside a tooltip
+ * that tells the user why their attempted connection is not possible
+ */
+export type RuleResult =
+  | { isSatisfied: true }
+  | { isSatisfied: false, message: string };
+ 
+/**
+ * default RuleResults, can be used to create more readable handleRule definitions
+ */
+export const ruleResult = {
+  satisfied: { isSatisfied: true } as RuleResult,
+  unknownError: {isSatisfied: false, message: "Unknown Error" } as RuleResult,
+  notSatisfied: (message: string) : RuleResult => { return {isSatisfied: false, message: message } }
+}
+ 
+ 
+const evaluateRules = (
+  rules: HandleRule[],
+  connection: Connection,
+  context: ConnectionContext
+) : RuleResult => {
+  // evaluate the rules and check if there is at least one unsatisfied rule
+  const failedRule = rules
+    .map(rule => rule(connection, context))
+    .find(result => !result.isSatisfied);
+ 
+  return failedRule ? ruleResult.notSatisfied(failedRule.message) : ruleResult.satisfied;
+}
+ 
+ 
+/**
+ * !DOCUMENTATION NOT FINISHED!
+ *
+ * - The output is a single RuleResult, meaning we only show one error message.
+ * Error messages are prioritised by listOrder; Thus, if multiple HandleRules evaluate to false,
+ * we only send the error message of the first failed rule in the target's registered list of rules.
+ *
+ * @param {string} nodeId
+ * @param {string} handleId
+ * @param type
+ * @param {HandleRule[]} rules
+ * @returns {(c: Connection) => RuleResult} a function that validates an attempted connection
+ */
+export function useHandleRules(
+  nodeId: string,
+  handleId: string,
+  type: "source" | "target",
+  rules: HandleRule[],
+) : (c: Connection) => RuleResult {
+  const edges = useFlowStore.getState().edges;
+  const registerRules = useFlowStore((state) => state.registerRules);
+ 
+ 
+  useEffect(() => {
+    registerRules(nodeId, handleId, rules);
+    // the following eslint disable is required as it wants us to use all possible dependencies for the useEffect statement,
+    // however this would result in an infinite loop because it would change one of its own dependencies
+    // so we only use those dependencies that we don't change ourselves
+    // eslint-disable-next-line react-hooks/exhaustive-deps
+  }, [handleId, nodeId, registerRules]);
+ 
+  return (connection: Connection) => {
+    // inside this function we consider the target to be the target of the isValidConnection event
+    // and not the target in the actual connection
+    const { target, targetHandle } = type === "source"
+      ? connection
+      : { target: connection.source, targetHandle: connection.sourceHandle };
+ 
+    if (!targetHandle) {throw new Error("No target handle was provided");}
+ 
+    const targetConnections = edges.filter(edge => edge.target === target && edge.targetHandle === targetHandle);
+ 
+ 
+    // we construct the connectionContext
+    const context: ConnectionContext = {
+      connectionCount: targetConnections.length,
+      source: {id: nodeId, handleId: handleId},
+      target: {id: target, handleId: targetHandle},
+    };
+    const targetRules = useFlowStore.getState().getTargetRules(target, targetHandle);
+ 
+    // finally we return a function that evaluates all rules using the created context
+    return evaluateRules(targetRules, connection, context);
+  };
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/HandleRules.ts.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/HandleRules.ts.html new file mode 100644 index 0000000..335d975 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/HandleRules.ts.html @@ -0,0 +1,223 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/HandleRules.ts + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI HandleRules.ts

+
+ +
+ 0% + Statements + 0/12 +
+ + +
+ 0% + Branches + 0/8 +
+ + +
+ 0% + Functions + 0/9 +
+ + +
+ 0% + Lines + 0/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  type HandleRule,
+  ruleResult
+} from "./HandleRuleLogic.ts";
+import useFlowStore from "./VisProgStores.tsx";
+ 
+ 
+/**
+ * this specifies what types of nodes can make a connection to a handle that uses this rule
+ */
+export function allowOnlyConnectionsFromType(nodeTypes: string[]) : HandleRule  {
+  return ((_, {source}) => {
+    const sourceType = useFlowStore.getState().nodes.find(node => node.id === source.id)!.type!;
+    return nodeTypes.find(type => sourceType === type)
+      ? ruleResult.satisfied
+      : ruleResult.notSatisfied(`the target doesn't allow connections from nodes with type: ${sourceType}`);
+  })
+}
+ 
+/**
+ * similar to allowOnlyConnectionsFromType,
+ * this is a more specific variant that allows you to restrict connections to specific handles on each nodeType
+ */
+//
+export function allowOnlyConnectionsFromHandle(handles: {nodeType: string, handleId: string}[]) : HandleRule  {
+  return ((_, {source}) => {
+    const sourceNode = useFlowStore.getState().nodes.find(node => node.id === source.id)!;
+    return handles.find(handle => sourceNode.type === handle.nodeType && source.handleId === handle.handleId)
+      ? ruleResult.satisfied
+      : ruleResult.notSatisfied(`the target doesn't allow connections from nodes with type: ${sourceNode.type}`);
+  })
+}
+ 
+ 
+/**
+ * This rule prevents a node from making a connection between its own handles
+ */
+export const noSelfConnections : HandleRule =
+  (connection, _) => {
+    return connection.source !== connection.target
+      ? ruleResult.satisfied
+      : ruleResult.notSatisfied("nodes are not allowed to connect to themselves");
+  }
+ 
+ 
+ 
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/NodeRegistry.ts.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/NodeRegistry.ts.html new file mode 100644 index 0000000..f7becdd --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/NodeRegistry.ts.html @@ -0,0 +1,742 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/NodeRegistry.ts + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI NodeRegistry.ts

+
+ +
+ 0% + Statements + 0/15 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/7 +
+ + +
+ 0% + Lines + 0/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import EndNode, {
+  EndConnectionTarget,
+  EndConnectionSource,
+  EndDisconnectionTarget,
+  EndDisconnectionSource,
+  EndReduce,
+  EndTooltip
+} from "./nodes/EndNode";
+import { EndNodeDefaults } from "./nodes/EndNode.default";
+import StartNode, {
+  StartConnectionTarget,
+  StartConnectionSource,
+  StartDisconnectionTarget,
+  StartDisconnectionSource,
+  StartReduce,
+  StartTooltip
+} from "./nodes/StartNode";
+import { StartNodeDefaults } from "./nodes/StartNode.default";
+import PhaseNode, {
+  PhaseConnectionTarget,
+  PhaseConnectionSource,
+  PhaseDisconnectionTarget,
+  PhaseDisconnectionSource,
+  PhaseReduce,
+  PhaseTooltip
+} from "./nodes/PhaseNode";
+import { PhaseNodeDefaults } from "./nodes/PhaseNode.default";
+import NormNode, {
+  NormConnectionTarget,
+  NormConnectionSource,
+  NormDisconnectionTarget,
+  NormDisconnectionSource,
+  NormReduce,
+  NormTooltip
+} from "./nodes/NormNode";
+import { NormNodeDefaults } from "./nodes/NormNode.default";
+import GoalNode, {
+  GoalConnectionTarget,
+  GoalConnectionSource,
+  GoalDisconnectionTarget,
+  GoalDisconnectionSource,
+  GoalReduce,
+  GoalTooltip
+} from "./nodes/GoalNode";
+import { GoalNodeDefaults } from "./nodes/GoalNode.default";
+import TriggerNode, {
+  TriggerConnectionTarget,
+  TriggerConnectionSource,
+  TriggerDisconnectionTarget,
+  TriggerDisconnectionSource,
+  TriggerReduce,
+  TriggerTooltip
+} from "./nodes/TriggerNode";
+import { TriggerNodeDefaults } from "./nodes/TriggerNode.default";
+import InferredBeliefNode, {
+  InferredBeliefConnectionTarget,
+  InferredBeliefConnectionSource,
+  InferredBeliefDisconnectionTarget,
+  InferredBeliefDisconnectionSource,
+  InferredBeliefReduce, InferredBeliefTooltip
+} from "./nodes/InferredBeliefNode";
+import { InferredBeliefNodeDefaults } from "./nodes/InferredBeliefNode.default";
+import BasicBeliefNode, {
+  BasicBeliefConnectionSource,
+  BasicBeliefConnectionTarget,
+  BasicBeliefDisconnectionSource,
+  BasicBeliefDisconnectionTarget,
+  BasicBeliefReduce
+,
+  BasicBeliefTooltip
+} from "./nodes/BasicBeliefNode.tsx";
+import { BasicBeliefNodeDefaults } from "./nodes/BasicBeliefNode.default.ts";
+ 
+/**
+ * Registered node types in the visual programming system.
+ * 
+ * Key: the node type string used in the flow graph.
+ * Value: the corresponding React component for rendering the node.
+ */
+export const NodeTypes = {
+  start: StartNode,
+  end: EndNode,
+  phase: PhaseNode,
+  norm: NormNode,
+  goal: GoalNode,
+  trigger: TriggerNode,
+  basic_belief: BasicBeliefNode,
+  inferred_belief: InferredBeliefNode,
+};
+ 
+/**
+ * Default data and settings for each node type.
+ * These are defined in the <node>.default.ts files.
+ * These defaults are used when a new node is created to initialize its properties.
+ */
+export const NodeDefaults = {
+  start: StartNodeDefaults,
+  end: EndNodeDefaults,
+  phase: PhaseNodeDefaults,
+  norm: NormNodeDefaults,
+  goal: GoalNodeDefaults,
+  trigger: TriggerNodeDefaults,
+  basic_belief: BasicBeliefNodeDefaults,
+  inferred_belief: InferredBeliefNodeDefaults,
+};
+ 
+ 
+/**
+ * Reduce functions for each node type.
+ * 
+ * A reduce function extracts the relevant data from a node and its children.
+ * Used during graph evaluation or export.
+ */
+export const NodeReduces = {
+  start: StartReduce,
+  end: EndReduce,
+  phase: PhaseReduce,
+  norm: NormReduce,
+  goal: GoalReduce,
+  trigger: TriggerReduce,
+  basic_belief: BasicBeliefReduce,
+  inferred_belief: InferredBeliefReduce,
+}
+ 
+ 
+/**
+ * Connection functions for each node type.
+ * 
+ * These functions define any additional actions a node may perform
+ * when a new connection is made
+ */
+export const NodeConnections = {
+  Targets: {
+    start: StartConnectionTarget,
+    end: EndConnectionTarget,
+    phase: PhaseConnectionTarget,
+    norm: NormConnectionTarget,
+    goal: GoalConnectionTarget,
+    trigger: TriggerConnectionTarget,
+    basic_belief: BasicBeliefConnectionTarget,
+    inferred_belief: InferredBeliefConnectionTarget,
+  },
+  Sources: {
+    start: StartConnectionSource,
+    end: EndConnectionSource,
+    phase: PhaseConnectionSource,
+    norm: NormConnectionSource,
+    goal: GoalConnectionSource,
+    trigger: TriggerConnectionSource,
+    basic_belief: BasicBeliefConnectionSource,
+    inferred_belief: InferredBeliefConnectionSource,
+  }
+}
+ 
+/**
+ * Disconnection functions for each node type.
+ *
+ * These functions define any additional actions a node may perform
+ * when a connection is disconnected
+ */
+export const NodeDisconnections = {
+  Targets: {
+    start: StartDisconnectionTarget,
+    end: EndDisconnectionTarget,
+    phase: PhaseDisconnectionTarget,
+    norm: NormDisconnectionTarget,
+    goal: GoalDisconnectionTarget,
+    trigger: TriggerDisconnectionTarget,
+    basic_belief: BasicBeliefDisconnectionTarget,
+    inferred_belief: InferredBeliefDisconnectionTarget,
+  },
+  Sources: {
+    start: StartDisconnectionSource,
+    end: EndDisconnectionSource,
+    phase: PhaseDisconnectionSource,
+    norm: NormDisconnectionSource,
+    goal: GoalDisconnectionSource,
+    trigger: TriggerDisconnectionSource,
+    basic_belief: BasicBeliefDisconnectionSource,
+    inferred_belief: InferredBeliefDisconnectionSource,
+  },
+}
+ 
+/**
+ * Defines whether a node type can be deleted.
+ * 
+ * Returns a function per node type. Nodes not explicitly listed are deletable by default.
+ */
+export const NodeDeletes = {
+  start: () => false,
+  end: () => false,
+}
+ 
+/**
+ * Defines which node types are considered variables in a phase node.
+ * 
+ * Any node type not listed here is automatically treated as part of a phase.
+ * This allows the system to dynamically group nodes under a phase node.
+ */
+export const NodesInPhase = {
+  start: () => false,
+  end: () => false,
+  phase: () => false,
+  basic_belief: () => false,
+  inferred_belief: () => false,
+}
+ 
+/**
+ * Collects the tooltips for all nodeTypes so they can be accessed by the tooltip component
+ */
+export const NodeTooltips = {
+  start: StartTooltip,
+  end: EndTooltip,
+  phase: PhaseTooltip,
+  norm: NormTooltip,
+  goal: GoalTooltip,
+  trigger: TriggerTooltip,
+  basic_belief: BasicBeliefTooltip,
+  inferred_belief: InferredBeliefTooltip,
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/VisProgStores.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/VisProgStores.tsx.html new file mode 100644 index 0000000..4756c1a --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/VisProgStores.tsx.html @@ -0,0 +1,1024 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/VisProgStores.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI VisProgStores.tsx

+
+ +
+ 0% + Statements + 0/102 +
+ + +
+ 0% + Branches + 0/26 +
+ + +
+ 0% + Functions + 0/42 +
+ + +
+ 0% + Lines + 0/81 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { create } from 'zustand';
+import {
+  applyNodeChanges,
+  applyEdgeChanges,
+  addEdge,
+  reconnectEdge,
+  type Node,
+  type Edge,
+  type XYPosition,
+} from '@xyflow/react';
+import '@xyflow/react/dist/style.css';
+import type { FlowState } from './VisProgTypes';
+import {
+  NodeDefaults,
+  NodeConnections as NodeCs,
+  NodeDisconnections as NodeDs,
+  NodeDeletes
+} from './NodeRegistry';
+import { UndoRedo } from "./EditorUndoRedo.ts";
+ 
+ 
+/**
+ * A Function to create a new node with the correct default data and properties.
+ *
+ * @param id - The unique ID of the node.
+ * @param type - The type of node to create (must exist in NodeDefaults).
+ * @param position - The XY position of the node in the flow canvas.
+ * @param data - The data object to initialize the node with.
+ * @param deletable - Optional flag to indicate if the node can be deleted (can be deleted by default).
+ * @returns A fully initialized Node object ready to be added to the flow.
+ */
+function createNode(id: string, type: string, position: XYPosition, data: Record<string, unknown>, deletable?: boolean) {
+    const defaultData = NodeDefaults[type as keyof typeof NodeDefaults]
+    return {
+      id,
+      type,
+      position,
+      deletable,
+      data: {
+        ...JSON.parse(JSON.stringify(defaultData)),
+        ...data,
+      },
+    }
+}
+ 
+  //* Initial nodes, created by using createNode. */
+  // Start and End don't need to apply the UUID, since they are technically never compiled into a program.
+  const startNode = createNode('start', 'start', {x: 110, y: 100}, {label: "Start"}, false)
+  const endNode = createNode('end', 'end', {x: 590, y: 100}, {label: "End"}, false)
+  const initialPhaseNode = createNode(crypto.randomUUID(), 'phase', {x:235, y:100}, {label: "Phase 1", children : [], isFirstPhase: false, nextPhaseId: null})
+ 
+  const initialNodes : Node[] = [startNode, endNode, initialPhaseNode,];
+ 
+// Initial edges, leave empty as setting initial edges...
+// ...breaks logic that is dependent on connection events
+const initialEdges: Edge[] = [];
+ 
+ 
+/**
+ * useFlowStore contains the implementation for all editor functionality
+ * and stores the current state of the visual programming editor
+ *
+ *  * Provides:
+ * - Node and edge state management
+ * - Node creation, deletion, and updates
+ * - Custom connection handling via NodeConnects
+ * - Edge reconnection handling
+ * - Undo Redo functionality through custom middleware
+ */
+const useFlowStore = create<FlowState>(UndoRedo((set, get) => ({
+  nodes: initialNodes,
+  edges: initialEdges,
+  edgeReconnectSuccessful: true,
+  scrollable: true,
+ 
+  /**
+   * handles changing the scrollable state of the editor,
+   * this is used to control if scrolling is captured by the editor
+   * or if it's available to other components within the reactFlowProvider
+   * @param {boolean} val - the desired state
+   */
+  setScrollable: (val) => set({scrollable: val}),
+ 
+   /**
+   * Handles changes to nodes triggered by ReactFlow.
+   */
+  onNodesChange: (changes) => set({nodes: applyNodeChanges(changes, get().nodes)}),
+ 
+  onNodesDelete: (nodes) => nodes.forEach(node => get().unregisterNodeRules(node.id)),
+ 
+  onEdgesDelete: (edges) => {
+    // we make sure any affected nodes get updated to reflect removal of edges
+    edges.forEach((edge) => {
+        const nodes = get().nodes;
+ 
+        const sourceNode = nodes.find((n) => n.id == edge.source);
+        const targetNode = nodes.find((n) => n.id == edge.target);
+ 
+        if (sourceNode) { NodeDs.Sources[sourceNode.type as keyof typeof NodeDs.Sources](sourceNode, edge.target); }
+        if (targetNode) { NodeDs.Targets[targetNode.type as keyof typeof NodeDs.Targets](targetNode, edge.source); }
+      });
+  },
+  /**
+   * Handles changes to edges triggered by ReactFlow.
+   */
+  onEdgesChange: (changes) => {
+    set({ edges: applyEdgeChanges(changes, get().edges) })
+  },
+ 
+  /**
+   * Handles creating a new connection between nodes.
+   * Updates edges and calls the node-specific connection functions.
+   */
+  onConnect: (connection) => {
+    get().pushSnapshot();
+    set({edges: addEdge(connection, get().edges)});
+ 
+    // We make sure to perform any required data updates on the newly connected nodes
+    const nodes = get().nodes;
+ 
+    const sourceNode = nodes.find((n) => n.id == connection.source);
+    const targetNode = nodes.find((n) => n.id == connection.target);
+ 
+    if (sourceNode) { NodeCs.Sources[sourceNode.type as keyof typeof NodeCs.Sources](sourceNode, connection.target); }
+    if (targetNode) { NodeCs.Targets[targetNode.type as keyof typeof NodeCs.Targets](targetNode, connection.source); }
+  },
+ 
+  /**
+   * Handles reconnecting an edge between nodes.
+   */
+  onReconnect: (oldEdge, newConnection) => {
+    get().edgeReconnectSuccessful = true;
+    set({ edges: reconnectEdge(oldEdge, newConnection, get().edges) });
+ 
+    // We make sure to perform any required data updates on the newly reconnected nodes
+    const nodes = get().nodes;
+ 
+    const oldSourceNode = nodes.find((n) => n.id == oldEdge.source)!;
+    const oldTargetNode = nodes.find((n) => n.id == oldEdge.target)!;
+    const newSourceNode = nodes.find((n) => n.id == newConnection.source)!;
+    const newTargetNode = nodes.find((n) => n.id == newConnection.target)!;
+ 
+    if (oldSourceNode === newSourceNode && oldTargetNode === newTargetNode) return;
+ 
+    NodeCs.Sources[newSourceNode.type as keyof typeof NodeCs.Sources](newSourceNode, newConnection.target);
+    NodeCs.Targets[newTargetNode.type as keyof typeof NodeCs.Targets](newTargetNode, newConnection.source);
+ 
+    NodeDs.Sources[oldSourceNode.type as keyof typeof NodeDs.Sources](oldSourceNode, oldEdge.target);
+    NodeDs.Targets[oldTargetNode.type as keyof typeof NodeDs.Targets](oldTargetNode, oldEdge.source);
+  },
+ 
+  onReconnectStart: () => {
+    get().pushSnapshot();
+    set({ edgeReconnectSuccessful: false })
+  },
+ 
+  /**
+   * handles potential dropping (deleting) of an edge
+   * if it is not reconnected to a node after detaching it
+   *
+   * @param _evt - the event
+   * @param edge - the described edge
+   */
+  onReconnectEnd: (_evt, edge) => {
+    if (!get().edgeReconnectSuccessful) {
+      // delete the edge from the flowState
+      set({ edges: get().edges.filter((e) => e.id !== edge.id) });
+ 
+      // update node data to reflect the dropped edge
+      const nodes = get().nodes;
+ 
+      const sourceNode = nodes.find((n) => n.id == edge.source)!;
+      const targetNode = nodes.find((n) => n.id == edge.target)!;
+ 
+      NodeDs.Sources[sourceNode.type as keyof typeof NodeDs.Sources](sourceNode, edge.target);
+      NodeDs.Targets[targetNode.type as keyof typeof NodeDs.Targets](targetNode, edge.source);
+    }
+    set({ edgeReconnectSuccessful: true });
+  },
+ 
+  /**
+   * Deletes a node by ID, respecting NodeDeletes rules.
+   * Also removes all edges connected to that node.
+   */
+  deleteNode: (nodeId) => {
+    get().pushSnapshot();
+ 
+    // Let's find our node to check if they have a special deletion function
+    const ourNode = get().nodes.find((n)=>n.id==nodeId);
+    const ourFunction = Object.entries(NodeDeletes).find(([t])=>t==ourNode?.type)?.[1]
+    
+    // If there's no function, OR, our function tells us we can delete it, let's do so...
+    if (ourFunction == undefined || ourFunction()) {
+      set({
+      nodes: get().nodes.filter((n) => n.id !== nodeId),
+      edges: get().edges.filter((e) => e.source !== nodeId && e.target !== nodeId),
+      })}
+  },
+ 
+  /**
+   * Replaces the entire nodes array in the store.
+   */
+  setNodes: (nodes) => set({ nodes }),
+ 
+  /**
+   * Replaces the entire edges array in the store.
+   */
+  setEdges: (edges) => set({ edges }),
+ 
+  /**
+   * Updates the data of a node by merging new data with existing data.
+   */
+  updateNodeData: (nodeId, data) => {
+    get().pushSnapshot();
+    set({
+      nodes: get().nodes.map((node) => {
+        if (node.id === nodeId) {
+          node = { ...node, data: { ...node.data, ...data }};
+        }
+        return node;
+      }),
+    });
+  },
+ 
+  /**
+   * Adds a new node to the flow store.
+   */
+  addNode: (node: Node) => {
+    get().pushSnapshot();
+    set({ nodes: [...get().nodes, node] });
+  },
+ 
+  // undo redo default values
+  past: [],
+  future: [],
+  isBatchAction: false,
+ 
+  // handleRuleRegistry definitions
+  /**
+   * stores registered rules for handle connection validation
+   */
+  ruleRegistry: new Map(),
+ 
+  /**
+   * gets the rules registered by that handle described by the given node and handle ids
+   *
+   * @param {string} targetNodeId
+   * @param {string} targetHandleId
+   * @returns {HandleRule[]}
+   */
+  getTargetRules: (targetNodeId, targetHandleId) => {
+    const key = `${targetNodeId}:${targetHandleId}`;
+    const rules = get().ruleRegistry.get(key);
+ 
+    // helper function that handles a situation where no rules were registered
+    const missingRulesResponse = () => {
+      console.warn(
+        `No rules were registered for the following handle "${key}"!
+          returning and empty handleRule[] to avoid crashing`);
+      return []
+    }
+ 
+    return rules
+      ? rules
+      : missingRulesResponse()
+  },
+ 
+  /**
+   * registers a handle's connection rules
+   *
+   * @param {string} nodeId
+   * @param {string} handleId
+   * @param {HandleRule[]} rules
+   */
+  registerRules: (nodeId, handleId, rules) => {
+      const registry = get().ruleRegistry;
+      registry.set(`${nodeId}:${handleId}`, rules);
+      set({ ruleRegistry: registry }) ;
+  },
+ 
+  /**
+   * unregisters a handles connection rules
+   *
+   * @param {string} nodeId
+   * @param {string} handleId
+   */
+  unregisterHandleRules: (nodeId, handleId) => {
+    set( () => {
+      const registry = get().ruleRegistry;
+      registry.delete(`${nodeId}:${handleId}`);
+      return { ruleRegistry: registry };
+    })
+  },
+ 
+  /**
+   * unregisters connection rules for all handles on the given node
+   * used for cleaning up rules on node deletion
+   *
+   * @param {string} nodeId
+   */
+  unregisterNodeRules: (nodeId) => {
+    set(() => {
+      const registry = get().ruleRegistry;
+      registry.forEach((_,key) => {
+        if (key.startsWith(`${nodeId}:`)) registry.delete(key)
+      })
+      return { ruleRegistry: registry };
+    })
+  }
+  }))
+);
+ 
+export default useFlowStore;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/CustomNodeHandles.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/CustomNodeHandles.tsx.html new file mode 100644 index 0000000..189817c --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/CustomNodeHandles.tsx.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/components/CustomNodeHandles.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/components CustomNodeHandles.tsx

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +3022x +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +13x +  +  +  +  +  +13x +  +  +  +  +  +  +  +22x
import {
+  Handle,
+  useNodeConnections,
+  type HandleType,
+  type Position
+} from '@xyflow/react';
+ 
+ 
+const LimitedConnectionCountHandle = (props: {
+  node_id: string,
+  type: HandleType,
+  position: Position,
+  connection_count: number,
+  id?: string
+}) => {
+  const connections = useNodeConnections({
+    id: props.node_id,
+    handleType: props.type,
+    handleId: props.id,
+  });
+ 
+  return (
+    <Handle
+      {...props}
+      isConnectable={connections.length < props.connection_count}
+    />
+  );
+};
+ 
+export default LimitedConnectionCountHandle;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/DragDropSidebar.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/DragDropSidebar.tsx.html new file mode 100644 index 0000000..44da99a --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/DragDropSidebar.tsx.html @@ -0,0 +1,562 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/components/DragDropSidebar.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/components DragDropSidebar.tsx

+
+ +
+ 0% + Statements + 0/25 +
+ + +
+ 0% + Branches + 0/9 +
+ + +
+ 0% + Functions + 0/9 +
+ + +
+ 0% + Lines + 0/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useDraggable } from '@neodrag/react';
+import { useReactFlow, type XYPosition } from '@xyflow/react';
+import { type ReactNode, useCallback, useRef, useState } from 'react';
+import useFlowStore from '../VisProgStores';
+import styles from '../../VisProg.module.css';
+import { NodeDefaults, type NodeTypes} from '../NodeRegistry'
+import {Tooltip} from "./NodeComponents.tsx";
+ 
+/**
+ * Props for a draggable node within the drag-and-drop toolbar.
+ *
+ * @property className - Optional custom CSS classes for styling.
+ * @property children - The visual content or label rendered inside the draggable node.
+ * @property nodeType - The type of node represented (key from `NodeTypes`).
+ * @property onDrop - Function called when the node is dropped on the flow pane.
+ */
+interface DraggableNodeProps {
+  className?: string;
+  children: ReactNode;
+  nodeType: keyof typeof NodeTypes;
+  onDrop: (nodeType: keyof typeof NodeTypes, position: XYPosition) => void;
+}
+ 
+/**
+ * A draggable node element used in the drag-and-drop toolbar.
+ *
+ * Integrates with the NeoDrag library to handle drag events.
+ * On drop, it calls the provided `onDrop` function with the node type and drop position.
+ *
+ * @param props - The draggable node configuration.
+ * @returns A React element representing a draggable node.
+ */
+function DraggableNode({ className, children, nodeType, onDrop }: DraggableNodeProps) {
+  const draggableRef = useRef<HTMLDivElement>(null);
+  const [position, setPosition] = useState<XYPosition>({ x: 0, y: 0 });
+ 
+  // The NeoDrag hook enables smooth drag functionality for this element.
+  // @ts-expect-error: NeoDrag typing incompatibility — safe to ignore.
+  useDraggable(draggableRef, {
+    position,
+    onDrag: ({ offsetX, offsetY }) => {
+      setPosition({ x: offsetX, y: offsetY });
+    },
+    onDragEnd: ({ event }) => {
+      setPosition({ x: 0, y: 0 });
+      onDrop(nodeType, { x: event.clientX, y: event.clientY });
+    },
+  });
+ 
+  return (
+    <Tooltip nodeType={nodeType}>
+      <div>
+        <div className={className}
+             ref={draggableRef}
+             id={`draggable-${nodeType}`}
+             data-testid={`draggable-${nodeType}`}
+        >
+          {children}
+        </div>
+      </div>
+    </Tooltip>)
+}
+ 
+/**
+ * Adds a new node to the flow graph.
+ *
+ * Handles:
+ * - Automatic node ID generation based on existing nodes of the same type.
+ * - Loading of default data from the `NodeDefaults` registry.
+ * - Integration with the flow store to update global node state.
+ *
+ * @param nodeType - The type of node to create (from `NodeTypes`).
+ * @param position - The XY position in the flow canvas where the node will appear.
+ */
+function addNodeToFlow(nodeType: keyof typeof NodeTypes, position: XYPosition) {
+  const { addNode } = useFlowStore.getState();
+ 
+  // Load any predefined data for this node type.
+  const defaultData = NodeDefaults[nodeType] ?? {}
+  const id = crypto.randomUUID();
+  
+  // Create new node
+  const newNode = {
+    id: id,
+    type: nodeType,
+    position,
+    data: JSON.parse(JSON.stringify(defaultData))
+  }
+  addNode(newNode);
+}
+ 
+/**
+ * The drag-and-drop toolbar component for the visual programming interface.
+ *
+ * Displays draggable node templates based on entries in `NodeDefaults`.
+ * Each droppable node can be dragged into the flow pane to instantiate it.
+ *
+ * Automatically filters nodes whose `droppable` flag is set to `true`.
+ *
+ * @returns A React element representing the drag-and-drop toolbar.
+ */
+export function DndToolbar() {
+  const { screenToFlowPosition } = useReactFlow();
+ 
+  /**
+   * Handles dropping a node onto the flow pane.
+   * Translates screen coordinates into flow coordinates using React Flow utilities.
+   */
+  const handleNodeDrop = useCallback(
+    (nodeType: keyof typeof NodeTypes, screenPosition: XYPosition) => {
+      const flow = document.querySelector('.react-flow');
+      const flowRect = flow?.getBoundingClientRect();
+      
+      // Only add the node if it is inside the flow canvas area.
+      const isInFlow =
+        flowRect &&
+        screenPosition.x >= flowRect.left &&
+        screenPosition.x <= flowRect.right &&
+        screenPosition.y >= flowRect.top &&
+        screenPosition.y <= flowRect.bottom;
+ 
+      if (isInFlow) {
+        const position = screenToFlowPosition(screenPosition);
+        addNodeToFlow(nodeType, position);
+      }
+    },
+    [screenToFlowPosition],
+  );
+ 
+ 
+  // Map over the default nodes to get all nodes that can be dropped from the toolbar.
+  const droppableNodes = Object.entries(NodeDefaults)
+  .filter(([, data]) => data.droppable)
+  .map(([type, data]) => ({ 
+    type: type as DraggableNodeProps['nodeType'], 
+    data 
+  }));
+ 
+  return (
+    <div className={`flex-col gap-lg padding-md ${styles.innerDndPanel}`} id={"draggable-sidebar"}>
+      <div className="description">
+        You can drag these nodes to the pane to create new nodes.
+      </div>
+      <div className={`flex-row gap-lg ${styles.dndNodeContainer}`}>
+        {/* Maps over all the nodes that are droppable, and puts them in the panel */}
+        {droppableNodes.map(({type, data}) => (
+          <DraggableNode
+            key={type}
+            className={styles[`draggable-node-${type}`]} // Our current style signature for nodes
+            nodeType={type}
+            onDrop={handleNodeDrop}
+          >
+            {data.label}
+          </DraggableNode>
+        ))}
+      </div>
+    </div>
+  );
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/GestureValueEditor.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/GestureValueEditor.tsx.html new file mode 100644 index 0000000..055ca9b --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/GestureValueEditor.tsx.html @@ -0,0 +1,1915 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/components/GestureValueEditor.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/components GestureValueEditor.tsx

+
+ +
+ 0% + Statements + 0/55 +
+ + +
+ 0% + Branches + 0/23 +
+ + +
+ 0% + Functions + 0/20 +
+ + +
+ 0% + Lines + 0/53 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { useState, useRef } from "react";
+import styles from './GestureValueEditor.module.css'
+ 
+/**
+ * Props for the GestureValueEditor component.
+ * - value: current gesture value (controlled by parent)
+ * - setValue: callback to update the gesture value in parent state
+ * - placeholder: optional placeholder text for the input field
+ */
+type GestureValueEditorProps = {
+  value: string;
+  setValue: (value: string) => void;
+  setType: (value: boolean) => void;
+  placeholder?: string;
+};
+ 
+/**
+ * List of high-level gesture "tags".
+ * These are human-readable categories or semantic labels.
+ * In a real app, these would likely be loaded from an external source.
+ */
+const GESTURE_TAGS = ["above", "affirmative", "afford", "agitated", "all", "allright", "alright", "any", 
+            "assuage", "attemper", "back", "bashful", "beg", "beseech", "blank", 
+            "body language", "bored", "bow", "but", "call", "calm", "choose", "choice", "cloud", 
+            "cogitate", "cool", "crazy", "disappointed", "down", "earth", "empty", "embarrassed", 
+            "enthusiastic", "entire", "estimate", "except", "exalted", "excited", "explain", "far", 
+            "field", "floor", "forlorn", "friendly", "front", "frustrated", "gentle", "gift", 
+            "give", "ground", "happy", "hello", "her", "here", "hey", "hi", "him", "hopeless", 
+            "hysterical", "I", "implore", "indicate", "joyful", "me", "meditate", "modest", 
+            "negative", "nervous", "no", "not know", "nothing", "offer", "ok", "once upon a time", 
+            "oppose", "or", "pacify", "pick", "placate", "please", "present", "proffer", "quiet", 
+            "reason", "refute", "reject", "rousing", "sad", "select", "shamefaced", "show", 
+            "show sky", "sky", "soothe", "sun", "supplicate", "tablet", "tall", "them", "there", 
+            "think", "timid", "top", "unless", "up", "upstairs", "void", "warm", "winner", "yeah", 
+            "yes", "yoo-hoo", "you", "your", "zero", "zestful"];
+ 
+/**
+ * List of concrete gesture animation paths.
+ * These represent specific animation assets and are used in "single" mode
+ * with autocomplete-style selection, also would be loaded from an external source.
+ */
+const GESTURE_SINGLES = [
+        "animations/Stand/BodyTalk/Listening/Listening_1",
+        "animations/Stand/BodyTalk/Listening/Listening_2",
+        "animations/Stand/BodyTalk/Listening/Listening_3",
+        "animations/Stand/BodyTalk/Listening/Listening_4",
+        "animations/Stand/BodyTalk/Listening/Listening_5",
+        "animations/Stand/BodyTalk/Listening/Listening_6",
+        "animations/Stand/BodyTalk/Listening/Listening_7",
+        "animations/Stand/BodyTalk/Speaking/BodyTalk_1",
+        "animations/Stand/BodyTalk/Speaking/BodyTalk_10",
+        "animations/Stand/BodyTalk/Speaking/BodyTalk_11",
+        "animations/Stand/BodyTalk/Speaking/BodyTalk_12",
+        "animations/Stand/BodyTalk/Speaking/BodyTalk_13",
+        "animations/Stand/BodyTalk/Speaking/BodyTalk_14",
+        "animations/Stand/BodyTalk/Speaking/BodyTalk_15",
+        "animations/Stand/BodyTalk/Speaking/BodyTalk_16",
+        "animations/Stand/BodyTalk/Speaking/BodyTalk_2",
+        "animations/Stand/BodyTalk/Speaking/BodyTalk_3",
+        "animations/Stand/BodyTalk/Speaking/BodyTalk_4",
+        "animations/Stand/BodyTalk/Speaking/BodyTalk_5",
+        "animations/Stand/BodyTalk/Speaking/BodyTalk_6",
+        "animations/Stand/BodyTalk/Speaking/BodyTalk_7",
+        "animations/Stand/BodyTalk/Speaking/BodyTalk_8",
+        "animations/Stand/BodyTalk/Speaking/BodyTalk_9",
+        "animations/Stand/BodyTalk/Thinking/Remember_1",
+        "animations/Stand/BodyTalk/Thinking/Remember_2",
+        "animations/Stand/BodyTalk/Thinking/Remember_3",
+        "animations/Stand/BodyTalk/Thinking/ThinkingLoop_1",
+        "animations/Stand/BodyTalk/Thinking/ThinkingLoop_2",
+        "animations/Stand/Emotions/Negative/Angry_1",
+        "animations/Stand/Emotions/Negative/Angry_2",
+        "animations/Stand/Emotions/Negative/Angry_3",
+        "animations/Stand/Emotions/Negative/Angry_4",
+        "animations/Stand/Emotions/Negative/Anxious_1",
+        "animations/Stand/Emotions/Negative/Bored_1",
+        "animations/Stand/Emotions/Negative/Bored_2",
+        "animations/Stand/Emotions/Negative/Disappointed_1",
+        "animations/Stand/Emotions/Negative/Exhausted_1",
+        "animations/Stand/Emotions/Negative/Exhausted_2",
+        "animations/Stand/Emotions/Negative/Fear_1",
+        "animations/Stand/Emotions/Negative/Fear_2",
+        "animations/Stand/Emotions/Negative/Fearful_1",
+        "animations/Stand/Emotions/Negative/Frustrated_1",
+        "animations/Stand/Emotions/Negative/Humiliated_1",
+        "animations/Stand/Emotions/Negative/Hurt_1",
+        "animations/Stand/Emotions/Negative/Hurt_2",
+        "animations/Stand/Emotions/Negative/Late_1",
+        "animations/Stand/Emotions/Negative/Sad_1",
+        "animations/Stand/Emotions/Negative/Sad_2",
+        "animations/Stand/Emotions/Negative/Shocked_1",
+        "animations/Stand/Emotions/Negative/Sorry_1",
+        "animations/Stand/Emotions/Negative/Surprise_1",
+        "animations/Stand/Emotions/Negative/Surprise_2",
+        "animations/Stand/Emotions/Negative/Surprise_3",
+        "animations/Stand/Emotions/Neutral/Alienated_1",
+        "animations/Stand/Emotions/Neutral/AskForAttention_1",
+        "animations/Stand/Emotions/Neutral/AskForAttention_2",
+        "animations/Stand/Emotions/Neutral/AskForAttention_3",
+        "animations/Stand/Emotions/Neutral/Cautious_1",
+        "animations/Stand/Emotions/Neutral/Confused_1",
+        "animations/Stand/Emotions/Neutral/Determined_1",
+        "animations/Stand/Emotions/Neutral/Embarrassed_1",
+        "animations/Stand/Emotions/Neutral/Hesitation_1",
+        "animations/Stand/Emotions/Neutral/Innocent_1",
+        "animations/Stand/Emotions/Neutral/Lonely_1",
+        "animations/Stand/Emotions/Neutral/Mischievous_1",
+        "animations/Stand/Emotions/Neutral/Puzzled_1",
+        "animations/Stand/Emotions/Neutral/Sneeze",
+        "animations/Stand/Emotions/Neutral/Stubborn_1",
+        "animations/Stand/Emotions/Neutral/Suspicious_1",
+        "animations/Stand/Emotions/Positive/Amused_1",
+        "animations/Stand/Emotions/Positive/Confident_1",
+        "animations/Stand/Emotions/Positive/Ecstatic_1",
+        "animations/Stand/Emotions/Positive/Enthusiastic_1",
+        "animations/Stand/Emotions/Positive/Excited_1",
+        "animations/Stand/Emotions/Positive/Excited_2",
+        "animations/Stand/Emotions/Positive/Excited_3",
+        "animations/Stand/Emotions/Positive/Happy_1",
+        "animations/Stand/Emotions/Positive/Happy_2",
+        "animations/Stand/Emotions/Positive/Happy_3",
+        "animations/Stand/Emotions/Positive/Happy_4",
+        "animations/Stand/Emotions/Positive/Hungry_1",
+        "animations/Stand/Emotions/Positive/Hysterical_1",
+        "animations/Stand/Emotions/Positive/Interested_1",
+        "animations/Stand/Emotions/Positive/Interested_2",
+        "animations/Stand/Emotions/Positive/Laugh_1",
+        "animations/Stand/Emotions/Positive/Laugh_2",
+        "animations/Stand/Emotions/Positive/Laugh_3",
+        "animations/Stand/Emotions/Positive/Mocker_1",
+        "animations/Stand/Emotions/Positive/Optimistic_1",
+        "animations/Stand/Emotions/Positive/Peaceful_1",
+        "animations/Stand/Emotions/Positive/Proud_1",
+        "animations/Stand/Emotions/Positive/Proud_2",
+        "animations/Stand/Emotions/Positive/Proud_3",
+        "animations/Stand/Emotions/Positive/Relieved_1",
+        "animations/Stand/Emotions/Positive/Shy_1",
+        "animations/Stand/Emotions/Positive/Shy_2",
+        "animations/Stand/Emotions/Positive/Sure_1",
+        "animations/Stand/Emotions/Positive/Winner_1",
+        "animations/Stand/Emotions/Positive/Winner_2",
+        "animations/Stand/Gestures/Angry_1",
+        "animations/Stand/Gestures/Angry_2",
+        "animations/Stand/Gestures/Angry_3",
+        "animations/Stand/Gestures/BowShort_1",
+        "animations/Stand/Gestures/BowShort_2",
+        "animations/Stand/Gestures/BowShort_3",
+        "animations/Stand/Gestures/But_1",
+        "animations/Stand/Gestures/CalmDown_1",
+        "animations/Stand/Gestures/CalmDown_2",
+        "animations/Stand/Gestures/CalmDown_3",
+        "animations/Stand/Gestures/CalmDown_4",
+        "animations/Stand/Gestures/CalmDown_5",
+        "animations/Stand/Gestures/CalmDown_6",
+        "animations/Stand/Gestures/Choice_1",
+        "animations/Stand/Gestures/ComeOn_1",
+        "animations/Stand/Gestures/Confused_1",
+        "animations/Stand/Gestures/Confused_2",
+        "animations/Stand/Gestures/CountFive_1",
+        "animations/Stand/Gestures/CountFour_1",
+        "animations/Stand/Gestures/CountMore_1",
+        "animations/Stand/Gestures/CountOne_1",
+        "animations/Stand/Gestures/CountThree_1",
+        "animations/Stand/Gestures/CountTwo_1",
+        "animations/Stand/Gestures/Desperate_1",
+        "animations/Stand/Gestures/Desperate_2",
+        "animations/Stand/Gestures/Desperate_3",
+        "animations/Stand/Gestures/Desperate_4",
+        "animations/Stand/Gestures/Desperate_5",
+        "animations/Stand/Gestures/DontUnderstand_1",
+        "animations/Stand/Gestures/Enthusiastic_3",
+        "animations/Stand/Gestures/Enthusiastic_4",
+        "animations/Stand/Gestures/Enthusiastic_5",
+        "animations/Stand/Gestures/Everything_1",
+        "animations/Stand/Gestures/Everything_2",
+        "animations/Stand/Gestures/Everything_3",
+        "animations/Stand/Gestures/Everything_4",
+        "animations/Stand/Gestures/Everything_6",
+        "animations/Stand/Gestures/Excited_1",
+        "animations/Stand/Gestures/Explain_1",
+        "animations/Stand/Gestures/Explain_10",
+        "animations/Stand/Gestures/Explain_11",
+        "animations/Stand/Gestures/Explain_2",
+        "animations/Stand/Gestures/Explain_3",
+        "animations/Stand/Gestures/Explain_4",
+        "animations/Stand/Gestures/Explain_5",
+        "animations/Stand/Gestures/Explain_6",
+        "animations/Stand/Gestures/Explain_7",
+        "animations/Stand/Gestures/Explain_8",
+        "animations/Stand/Gestures/Far_1",
+        "animations/Stand/Gestures/Far_2",
+        "animations/Stand/Gestures/Far_3",
+        "animations/Stand/Gestures/Follow_1",
+        "animations/Stand/Gestures/Give_1",
+        "animations/Stand/Gestures/Give_2",
+        "animations/Stand/Gestures/Give_3",
+        "animations/Stand/Gestures/Give_4",
+        "animations/Stand/Gestures/Give_5",
+        "animations/Stand/Gestures/Give_6",
+        "animations/Stand/Gestures/Great_1",
+        "animations/Stand/Gestures/HeSays_1",
+        "animations/Stand/Gestures/HeSays_2",
+        "animations/Stand/Gestures/HeSays_3",
+        "animations/Stand/Gestures/Hey_1",
+        "animations/Stand/Gestures/Hey_10",
+        "animations/Stand/Gestures/Hey_2",
+        "animations/Stand/Gestures/Hey_3",
+        "animations/Stand/Gestures/Hey_4",
+        "animations/Stand/Gestures/Hey_6",
+        "animations/Stand/Gestures/Hey_7",
+        "animations/Stand/Gestures/Hey_8",
+        "animations/Stand/Gestures/Hey_9",
+        "animations/Stand/Gestures/Hide_1",
+        "animations/Stand/Gestures/Hot_1",
+        "animations/Stand/Gestures/Hot_2",
+        "animations/Stand/Gestures/IDontKnow_1",
+        "animations/Stand/Gestures/IDontKnow_2",
+        "animations/Stand/Gestures/IDontKnow_3",
+        "animations/Stand/Gestures/IDontKnow_4",
+        "animations/Stand/Gestures/IDontKnow_5",
+        "animations/Stand/Gestures/IDontKnow_6",
+        "animations/Stand/Gestures/Joy_1",
+        "animations/Stand/Gestures/Kisses_1",
+        "animations/Stand/Gestures/Look_1",
+        "animations/Stand/Gestures/Look_2",
+        "animations/Stand/Gestures/Maybe_1",
+        "animations/Stand/Gestures/Me_1",
+        "animations/Stand/Gestures/Me_2",
+        "animations/Stand/Gestures/Me_4",
+        "animations/Stand/Gestures/Me_7",
+        "animations/Stand/Gestures/Me_8",
+        "animations/Stand/Gestures/Mime_1",
+        "animations/Stand/Gestures/Mime_2",
+        "animations/Stand/Gestures/Next_1",
+        "animations/Stand/Gestures/No_1",
+        "animations/Stand/Gestures/No_2",
+        "animations/Stand/Gestures/No_3",
+        "animations/Stand/Gestures/No_4",
+        "animations/Stand/Gestures/No_5",
+        "animations/Stand/Gestures/No_6",
+        "animations/Stand/Gestures/No_7",
+        "animations/Stand/Gestures/No_8",
+        "animations/Stand/Gestures/No_9",
+        "animations/Stand/Gestures/Nothing_1",
+        "animations/Stand/Gestures/Nothing_2",
+        "animations/Stand/Gestures/OnTheEvening_1",
+        "animations/Stand/Gestures/OnTheEvening_2",
+        "animations/Stand/Gestures/OnTheEvening_3",
+        "animations/Stand/Gestures/OnTheEvening_4",
+        "animations/Stand/Gestures/OnTheEvening_5",
+        "animations/Stand/Gestures/Please_1",
+        "animations/Stand/Gestures/Please_2",
+        "animations/Stand/Gestures/Please_3",
+        "animations/Stand/Gestures/Reject_1",
+        "animations/Stand/Gestures/Reject_2",
+        "animations/Stand/Gestures/Reject_3",
+        "animations/Stand/Gestures/Reject_4",
+        "animations/Stand/Gestures/Reject_5",
+        "animations/Stand/Gestures/Reject_6",
+        "animations/Stand/Gestures/Salute_1",
+        "animations/Stand/Gestures/Salute_2",
+        "animations/Stand/Gestures/Salute_3",
+        "animations/Stand/Gestures/ShowFloor_1",
+        "animations/Stand/Gestures/ShowFloor_2",
+        "animations/Stand/Gestures/ShowFloor_3",
+        "animations/Stand/Gestures/ShowFloor_4",
+        "animations/Stand/Gestures/ShowFloor_5",
+        "animations/Stand/Gestures/ShowSky_1",
+        "animations/Stand/Gestures/ShowSky_10",
+        "animations/Stand/Gestures/ShowSky_11",
+        "animations/Stand/Gestures/ShowSky_12",
+        "animations/Stand/Gestures/ShowSky_2",
+        "animations/Stand/Gestures/ShowSky_3",
+        "animations/Stand/Gestures/ShowSky_4",
+        "animations/Stand/Gestures/ShowSky_5",
+        "animations/Stand/Gestures/ShowSky_6",
+        "animations/Stand/Gestures/ShowSky_7",
+        "animations/Stand/Gestures/ShowSky_8",
+        "animations/Stand/Gestures/ShowSky_9",
+        "animations/Stand/Gestures/ShowTablet_1",
+        "animations/Stand/Gestures/ShowTablet_2",
+        "animations/Stand/Gestures/ShowTablet_3",
+        "animations/Stand/Gestures/Shy_1",
+        "animations/Stand/Gestures/Stretch_1",
+        "animations/Stand/Gestures/Stretch_2",
+        "animations/Stand/Gestures/Surprised_1",
+        "animations/Stand/Gestures/TakePlace_1",
+        "animations/Stand/Gestures/TakePlace_2",
+        "animations/Stand/Gestures/Take_1",
+        "animations/Stand/Gestures/Thinking_1",
+        "animations/Stand/Gestures/Thinking_2",
+        "animations/Stand/Gestures/Thinking_3",
+        "animations/Stand/Gestures/Thinking_4",
+        "animations/Stand/Gestures/Thinking_5",
+        "animations/Stand/Gestures/Thinking_6",
+        "animations/Stand/Gestures/Thinking_7",
+        "animations/Stand/Gestures/Thinking_8",
+        "animations/Stand/Gestures/This_1",
+        "animations/Stand/Gestures/This_10",
+        "animations/Stand/Gestures/This_11",
+        "animations/Stand/Gestures/This_12",
+        "animations/Stand/Gestures/This_13",
+        "animations/Stand/Gestures/This_14",
+        "animations/Stand/Gestures/This_15",
+        "animations/Stand/Gestures/This_2",
+        "animations/Stand/Gestures/This_3",
+        "animations/Stand/Gestures/This_4",
+        "animations/Stand/Gestures/This_5",
+        "animations/Stand/Gestures/This_6",
+        "animations/Stand/Gestures/This_7",
+        "animations/Stand/Gestures/This_8",
+        "animations/Stand/Gestures/This_9",
+        "animations/Stand/Gestures/WhatSThis_1",
+        "animations/Stand/Gestures/WhatSThis_10",
+        "animations/Stand/Gestures/WhatSThis_11",
+        "animations/Stand/Gestures/WhatSThis_12",
+        "animations/Stand/Gestures/WhatSThis_13",
+        "animations/Stand/Gestures/WhatSThis_14",
+        "animations/Stand/Gestures/WhatSThis_15",
+        "animations/Stand/Gestures/WhatSThis_16",
+        "animations/Stand/Gestures/WhatSThis_2",
+        "animations/Stand/Gestures/WhatSThis_3",
+        "animations/Stand/Gestures/WhatSThis_4",
+        "animations/Stand/Gestures/WhatSThis_5",
+        "animations/Stand/Gestures/WhatSThis_6",
+        "animations/Stand/Gestures/WhatSThis_7",
+        "animations/Stand/Gestures/WhatSThis_8",
+        "animations/Stand/Gestures/WhatSThis_9",
+        "animations/Stand/Gestures/Whisper_1",
+        "animations/Stand/Gestures/Wings_1",
+        "animations/Stand/Gestures/Wings_2",
+        "animations/Stand/Gestures/Wings_3",
+        "animations/Stand/Gestures/Wings_4",
+        "animations/Stand/Gestures/Wings_5",
+        "animations/Stand/Gestures/Yes_1",
+        "animations/Stand/Gestures/Yes_2",
+        "animations/Stand/Gestures/Yes_3",
+        "animations/Stand/Gestures/YouKnowWhat_1",
+        "animations/Stand/Gestures/YouKnowWhat_2",
+        "animations/Stand/Gestures/YouKnowWhat_3",
+        "animations/Stand/Gestures/YouKnowWhat_4",
+        "animations/Stand/Gestures/YouKnowWhat_5",
+        "animations/Stand/Gestures/YouKnowWhat_6",
+        "animations/Stand/Gestures/You_1",
+        "animations/Stand/Gestures/You_2",
+        "animations/Stand/Gestures/You_3",
+        "animations/Stand/Gestures/You_4",
+        "animations/Stand/Gestures/You_5",
+        "animations/Stand/Gestures/Yum_1",
+        "animations/Stand/Reactions/EthernetOff_1",
+        "animations/Stand/Reactions/EthernetOn_1",
+        "animations/Stand/Reactions/Heat_1",
+        "animations/Stand/Reactions/Heat_2",
+        "animations/Stand/Reactions/LightShine_1",
+        "animations/Stand/Reactions/LightShine_2",
+        "animations/Stand/Reactions/LightShine_3",
+        "animations/Stand/Reactions/LightShine_4",
+        "animations/Stand/Reactions/SeeColor_1",
+        "animations/Stand/Reactions/SeeColor_2",
+        "animations/Stand/Reactions/SeeColor_3",
+        "animations/Stand/Reactions/SeeSomething_1",
+        "animations/Stand/Reactions/SeeSomething_3",
+        "animations/Stand/Reactions/SeeSomething_4",
+        "animations/Stand/Reactions/SeeSomething_5",
+        "animations/Stand/Reactions/SeeSomething_6",
+        "animations/Stand/Reactions/SeeSomething_7",
+        "animations/Stand/Reactions/SeeSomething_8",
+        "animations/Stand/Reactions/ShakeBody_1",
+        "animations/Stand/Reactions/ShakeBody_2",
+        "animations/Stand/Reactions/ShakeBody_3",
+        "animations/Stand/Reactions/TouchHead_1",
+        "animations/Stand/Reactions/TouchHead_2",
+        "animations/Stand/Reactions/TouchHead_3",
+        "animations/Stand/Reactions/TouchHead_4",
+        "animations/Stand/Waiting/AirGuitar_1",
+        "animations/Stand/Waiting/BackRubs_1",
+        "animations/Stand/Waiting/Bandmaster_1",
+        "animations/Stand/Waiting/Binoculars_1",
+        "animations/Stand/Waiting/BreathLoop_1",
+        "animations/Stand/Waiting/BreathLoop_2",
+        "animations/Stand/Waiting/BreathLoop_3",
+        "animations/Stand/Waiting/CallSomeone_1",
+        "animations/Stand/Waiting/Drink_1",
+        "animations/Stand/Waiting/DriveCar_1",
+        "animations/Stand/Waiting/Fitness_1",
+        "animations/Stand/Waiting/Fitness_2",
+        "animations/Stand/Waiting/Fitness_3",
+        "animations/Stand/Waiting/FunnyDancer_1",
+        "animations/Stand/Waiting/HappyBirthday_1",
+        "animations/Stand/Waiting/Helicopter_1",
+        "animations/Stand/Waiting/HideEyes_1",
+        "animations/Stand/Waiting/HideHands_1",
+        "animations/Stand/Waiting/Innocent_1",
+        "animations/Stand/Waiting/Knight_1",
+        "animations/Stand/Waiting/KnockEye_1",
+        "animations/Stand/Waiting/KungFu_1",
+        "animations/Stand/Waiting/LookHand_1",
+        "animations/Stand/Waiting/LookHand_2",
+        "animations/Stand/Waiting/LoveYou_1",
+        "animations/Stand/Waiting/Monster_1",
+        "animations/Stand/Waiting/MysticalPower_1",
+        "animations/Stand/Waiting/PlayHands_1",
+        "animations/Stand/Waiting/PlayHands_2",
+        "animations/Stand/Waiting/PlayHands_3",
+        "animations/Stand/Waiting/Relaxation_1",
+        "animations/Stand/Waiting/Relaxation_2",
+        "animations/Stand/Waiting/Relaxation_3",
+        "animations/Stand/Waiting/Relaxation_4",
+        "animations/Stand/Waiting/Rest_1",
+        "animations/Stand/Waiting/Robot_1",
+        "animations/Stand/Waiting/ScratchBack_1",
+        "animations/Stand/Waiting/ScratchBottom_1",
+        "animations/Stand/Waiting/ScratchEye_1",
+        "animations/Stand/Waiting/ScratchHand_1",
+        "animations/Stand/Waiting/ScratchHead_1",
+        "animations/Stand/Waiting/ScratchLeg_1",
+        "animations/Stand/Waiting/ScratchTorso_1",
+        "animations/Stand/Waiting/ShowMuscles_1",
+        "animations/Stand/Waiting/ShowMuscles_2",
+        "animations/Stand/Waiting/ShowMuscles_3",
+        "animations/Stand/Waiting/ShowMuscles_4",
+        "animations/Stand/Waiting/ShowMuscles_5",
+        "animations/Stand/Waiting/ShowSky_1",
+        "animations/Stand/Waiting/ShowSky_2",
+        "animations/Stand/Waiting/SpaceShuttle_1",
+        "animations/Stand/Waiting/Stretch_1",
+        "animations/Stand/Waiting/Stretch_2",
+        "animations/Stand/Waiting/TakePicture_1",
+        "animations/Stand/Waiting/Taxi_1",
+        "animations/Stand/Waiting/Think_1",
+        "animations/Stand/Waiting/Think_2",
+        "animations/Stand/Waiting/Think_3",
+        "animations/Stand/Waiting/Think_4",
+        "animations/Stand/Waiting/Waddle_1",
+        "animations/Stand/Waiting/Waddle_2",
+        "animations/Stand/Waiting/WakeUp_1",
+        "animations/Stand/Waiting/Zombie_1"]
+ 
+ 
+/**
+ * Returns a gesture value editor component.
+ * @returns JSX.Element
+ */
+export default function GestureValueEditor({
+  value,
+  setValue,
+  setType,
+  placeholder = "Gesture name",
+}: GestureValueEditorProps) {
+ 
+  /** Input mode: semantic tag vs concrete animation path */
+  const [mode, setMode] = useState<"single" | "tag">("tag");
+ 
+  /** Raw text value for single-gesture input */
+  const [customValue, setCustomValue] = useState("");
+ 
+  /** Autocomplete dropdown state */
+  const [showSuggestions, setShowSuggestions] = useState(true);
+  const [filteredSuggestions, setFilteredSuggestions] = useState<string[]>([]);
+ 
+  /** Reserved for future click-outside / positioning logic */
+  const containerRef = useRef<HTMLDivElement>(null);
+ 
+  /** Switch between tag and single input modes */
+  const handleModeChange = (newMode: "single" | "tag") => {
+    setMode(newMode);
+ 
+    if (newMode === "single") {
+      setValue(customValue || value);
+      setType(false);
+      setFilteredSuggestions(GESTURE_SINGLES);
+      setShowSuggestions(true);
+    } else {
+      // Clear value if it does not match a valid tag
+      setType(true);
+      const isValidTag = GESTURE_TAGS.some(
+        tag => tag.toLowerCase() === value.toLowerCase()
+      );
+      if (!isValidTag) setValue("");
+      setShowSuggestions(false);
+    }
+  };
+ 
+  /** Select a semantic gesture tag */
+  const handleTagSelect = (tag: string) => {
+    setValue(tag);
+  };
+ 
+  /** Update single-gesture input and filter suggestions */
+  const handleCustomChange = (newValue: string) => {
+    setCustomValue(newValue);
+    setValue(newValue);
+ 
+    if (newValue.trim() === "") {
+      setFilteredSuggestions(GESTURE_SINGLES);
+      setShowSuggestions(true);
+    } else {
+      const filtered = GESTURE_SINGLES.filter(single =>
+        single.toLowerCase().includes(newValue.toLowerCase())
+      );
+      setFilteredSuggestions(filtered);
+      setShowSuggestions(filtered.length > 0);
+    }
+  };
+ 
+  /** Commit autocomplete selection */
+  const handleSuggestionSelect = (suggestion: string) => {
+    setCustomValue(suggestion);
+    setValue(suggestion);
+    setShowSuggestions(false);
+  };
+ 
+  /** Refresh suggestions on refocus */
+  const handleInputFocus = () => {
+    if (!customValue.trim()) return;
+ 
+    const filtered = GESTURE_SINGLES.filter(single =>
+      single.toLowerCase().includes(customValue.toLowerCase())
+    );
+    setFilteredSuggestions(filtered);
+    setShowSuggestions(filtered.length > 0);
+  };
+ 
+  /** Exists to allow delayed blur handling if needed */
+  const handleInputBlur = (_e: React.FocusEvent) => {};
+ 
+ 
+  /** Build the JSX component */
+  return (
+    <div className={styles.gestureEditor} ref={containerRef}>
+      {/* Mode toggle */}
+      <div className={styles.modeSelector}>
+        <label className={styles.modeLabel}>Input Mode:</label>
+        <div className={styles.toggleContainer}>
+          <button
+            type="button"
+            className={`${styles.toggleButton} ${mode === "single" ? styles.active : ""}`}
+            onClick={() => handleModeChange("single")}
+          >
+            Single
+          </button>
+          <button
+            type="button"
+            className={`${styles.toggleButton} ${mode === "tag" ? styles.active : ""}`}
+            onClick={() => handleModeChange("tag")}
+          >
+            Tag
+          </button>
+        </div>
+      </div>
+ 
+      <div className={styles.valueEditor} data-testid={"valueEditorTestID"}>
+        {mode === "single" ? (
+          <div className={styles.autocompleteContainer}>
+            {showSuggestions && (
+              <div className={styles.suggestionsDropdownLeft}>
+                {filteredSuggestions.map((suggestion) => (
+                  <div
+                    key={suggestion}
+                    className={styles.suggestionItem}
+                    onClick={() => handleSuggestionSelect(suggestion)}
+                    onMouseDown={(e) => e.preventDefault()} // prevent blur before click
+                  >
+                    {suggestion}
+                  </div>
+                ))}
+              </div>
+            )}
+            <input
+              type="text"
+              value={customValue}
+              onChange={(e) => handleCustomChange(e.target.value)}
+              onFocus={handleInputFocus}
+              onBlur={handleInputBlur}
+              placeholder={placeholder}
+              className={`${styles.textInput} ${showSuggestions ? styles.textInputWithSuggestions : ''}`}
+              autoComplete="off"
+            />
+          </div>
+        ) : (
+          <div className={styles.tagSelector}>
+            <select
+              value={value}
+              onChange={(e) => handleTagSelect(e.target.value)}
+              className={styles.tagSelect}
+              data-testid={"tagSelectorTestID"}
+            >
+              <option value="" >Select a gesture tag...</option>
+              {GESTURE_TAGS.map((tag) => (
+                <option key={tag} value={tag}>{tag}</option>
+              ))}
+            </select>
+ 
+            <div className={styles.tagList}>
+              {GESTURE_TAGS.map((tag) => (
+                <button
+                  key={tag}
+                  type="button"
+                  className={`${styles.tagButton} ${value === tag ? styles.selected : ""}`}
+                  onClick={() => handleTagSelect(tag)}
+                >
+                  {tag}
+                </button>
+              ))}
+            </div>
+          </div>
+        )}
+      </div>
+    </div>
+  );
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/NodeComponents.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/NodeComponents.tsx.html new file mode 100644 index 0000000..2660e63 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/NodeComponents.tsx.html @@ -0,0 +1,451 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/components/NodeComponents.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/components NodeComponents.tsx

+
+ +
+ 0% + Statements + 0/21 +
+ + +
+ 0% + Branches + 0/8 +
+ + +
+ 0% + Functions + 0/9 +
+ + +
+ 0% + Lines + 0/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {NodeToolbar} from '@xyflow/react';
+import '@xyflow/react/dist/style.css';
+import {type JSX, useState} from "react";
+import {createPortal} from "react-dom";
+import styles from "../../VisProg.module.css";
+import {NodeTooltips} from "../NodeRegistry.ts";
+import useFlowStore from "../VisProgStores.tsx";
+ 
+ 
+/**
+ * Props for the Toolbar component.
+ *
+ * @property nodeId - The ID of the node this toolbar is attached to.
+ * @property allowDelete - If `true`, the delete button is enabled; otherwise disabled.
+ */
+type ToolbarProps = {
+  nodeId: string;
+  allowDelete: boolean;
+};
+ 
+/**
+ * Node Toolbar definition:
+ * Handles: node deleting functionality
+ * Can be integrated to any custom node component as a React component
+ *
+ * @param {string} nodeId - The ID of the node for which the toolbar is rendered.
+ * @param {boolean} allowDelete - Enables or disables the delete functionality.
+ * @returns {React.JSX.Element} A JSX element representing the toolbar.
+ * @constructor
+ */
+export function Toolbar({nodeId, allowDelete}: ToolbarProps) {
+  const {nodes, deleteNode} = useFlowStore();
+ 
+ 
+  const deleteParentNode = () => {
+    deleteNode(nodeId);
+  };
+ 
+  const nodeType = nodes.find((node) => node.id === nodeId)?.type as keyof typeof NodeTooltips;
+  return (
+    <NodeToolbar className={"flex-row align-center"}>
+      <button className="Node-toolbar__deletebutton" onClick={deleteParentNode} disabled={!allowDelete}>delete</button>
+      <Tooltip nodeType={nodeType}>
+        <div className={styles.nodeToolbarTooltip}>i</div>
+      </Tooltip>
+    </NodeToolbar>);
+}
+ 
+ 
+type TooltipProps = {
+  nodeType?: keyof typeof NodeTooltips;
+  children: JSX.Element;
+};
+ 
+ 
+/**
+ * A general tooltip component, that can be used as a wrapper for any component
+ * that has a nodeType and a corresponding nodeTooltip.
+ *
+ * currently used to show tooltips for draggable-nodes and nodes inside the editor
+ *
+ * @param {"start" | "end" | "phase" | "norm" | "goal" | "trigger" | "basic_belief" | undefined} nodeType
+ * @param {React.JSX.Element} children
+ * @returns {React.JSX.Element}
+ * @constructor
+ */
+export function Tooltip({ nodeType, children }: TooltipProps) {
+  const [showTooltip, setShowTooltip] = useState(false);
+  const [disabled , setDisabled] = useState(false);
+  const [coords, setCoords] = useState({ top: 0, left: 0 });
+ 
+  const updateTooltipPos = () => {
+    const rect = document.getElementById("draggable-sidebar")!.getBoundingClientRect();
+    setCoords({
+      // Position exactly below the bottom edge of the draggable sidebar (plus a small gap)
+      top: rect.bottom + 10,
+      left: rect.left + rect.width / 2, // Keep it horizontally centered
+    });
+  };
+ 
+  return nodeType ?
+    (<div>
+      <div
+        onMouseDown={() => {
+          updateTooltipPos();
+          setShowTooltip(false);
+          setDisabled(true);
+        }}
+        onMouseUp={() => {
+          setDisabled(false);
+        }}
+        onMouseOver={() => {
+          if (!disabled) {
+            updateTooltipPos();
+            setShowTooltip(true);
+          }
+        }}
+        onMouseLeave={ () => setShowTooltip(false)}
+      >
+        {children}
+      </div>
+      {showTooltip && createPortal(
+        <div
+          className={"flex-row"}
+          style={{
+            pointerEvents: 'none',
+            position: 'fixed',
+            top: `${coords.top}px`,
+            left: `${coords.left}px`,
+            transform: 'translateX(-50%)', // Center based on the midpoint
+          }}
+        >
+          <span className={styles.customTooltipHeader}>{nodeType}</span>
+          <span className={styles.customTooltip}>
+            {NodeTooltips[nodeType] || "Available for drag"}
+          </span>
+        </div>,
+        document.body
+      )}
+    </div>
+  ) : children
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/Plan.default.ts.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/Plan.default.ts.html new file mode 100644 index 0000000..b2ece45 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/Plan.default.ts.html @@ -0,0 +1,103 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/components/Plan.default.ts + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/components Plan.default.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7  +  +  +  +  +  + 
import type { Plan, PlanElement } from "./Plan";
+ 
+export const defaultPlan: Plan = {
+    name: "Default Plan",
+    id: "-1",
+    steps: [] as PlanElement[],
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/Plan.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/Plan.tsx.html new file mode 100644 index 0000000..5dce85a --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/Plan.tsx.html @@ -0,0 +1,454 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/components/Plan.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/components Plan.tsx

+
+ +
+ 0% + Statements + 0/37 +
+ + +
+ 0% + Branches + 0/27 +
+ + +
+ 0% + Functions + 0/14 +
+ + +
+ 0% + Lines + 0/29 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { type Node } from "@xyflow/react"
+import { GoalReduce } from "../nodes/GoalNode"
+ 
+ 
+export type Plan = {
+    name: string,
+    id: string,
+    steps: PlanElement[],
+}
+ 
+export type PlanElement = Goal | Action
+ 
+export type Goal = {
+    id: string // we let the reducer figure out the rest dynamically
+    type: "goal"
+}
+ 
+// Actions
+export type Action = SpeechAction | GestureAction | LLMAction
+export type SpeechAction = { id: string, text: string, type:"speech" }
+export type GestureAction = { id: string, gesture: string, isTag: boolean, type:"gesture" }
+export type LLMAction = { id: string, goal: string, type:"llm" }
+export type ActionTypes = "speech" | "gesture" | "llm";
+ 
+ 
+// Extract the wanted information from a plan within the reducing of nodes
+export function PlanReduce(_nodes: Node[], plan?: Plan, ) {
+    if (!plan) return ""
+    return {
+        id: plan.id,
+        steps: plan.steps.map((x) => StepReduce(x, _nodes))
+    }
+}
+ 
+ 
+// Extract the wanted information from a plan element.
+function StepReduce(planElement: PlanElement, _nodes: Node[]) : Record<string, unknown> {
+    // We have different types of plan elements, requiring differnt types of output
+    const nodes = _nodes
+    const thisNode = _nodes.find((x) => x.id === planElement.id)
+    switch (planElement.type) {
+        case ("speech"):
+            return {
+                id: planElement.id,
+                text: planElement.text,
+            }
+        case ("gesture"):
+            return {
+                id: planElement.id,
+                gesture: {
+                    type: planElement.isTag ? "tag" : "single",
+                    name: planElement.gesture 
+                },
+            }
+        case ("llm"):
+            return {
+                id: planElement.id,
+                goal: planElement.goal,
+            }
+        case ("goal"):
+            return thisNode ? GoalReduce(thisNode, nodes) : {}
+    }
+}
+ 
+/**
+ * Finds out whether the plan can iterate multiple times, or always stops after one action.
+ * This comes down to checking if the plan only has speech/ gesture actions, or others as well.
+ * @param plan: the plan to check
+ * @returns: a boolean 
+ */
+export function DoesPlanIterate( _nodes: Node[], plan?: Plan,) : boolean {
+    // TODO: should recursively check plans that have goals (and thus more plans) in them.
+    if (!plan) return false
+    return plan.steps.filter((step) => step.type == "llm").length > 0 || 
+     (
+        // Find the goal node of this step
+        plan.steps.filter((step) => step.type == "goal").map((goalStep) => {
+        const goalId = goalStep.id;
+        const goalNode = _nodes.find((x) => x.id === goalId);
+        // In case we don't find any valid plan, this node doesn't iterate
+        if (!goalNode || !goalNode.data.plan) return false;
+        // Otherwise, check if this node can fail - if so, we should have the option to iterate
+        return (goalNode && goalNode.data.plan && goalNode.data.can_fail)
+        })
+    ).includes(true);
+}
+ 
+/**
+ * Checks if any of the plan's goal steps has its can_fail value set to true.
+ * @param plan: plan to check
+ * @param _nodes: nodes in flow store.
+ */
+export function HasCheckingSubGoal(plan: Plan, _nodes: Node[]) {
+    const goalSteps = plan.steps.filter((x) => x.type == "goal");
+    return goalSteps.map((goalStep) => {
+        // Find the goal node and check its can_fail data boolean.
+        const goalId = goalStep.id;
+        const goalNode = _nodes.find((x) => x.id === goalId);
+        return (goalNode && goalNode.data.can_fail)
+    }).includes(true);
+}
+ 
+/**
+ * Returns the value of the action.
+ * Since typescript can't polymorphicly access the value field,
+ * we need to switch over the types and return the correct field.
+ * @param action: action to retrieve the value from 
+ * @returns string | undefined
+ */
+export function GetActionValue(action: Action) {
+    let returnAction;
+    switch (action.type) {
+        case "gesture":
+            returnAction = action as GestureAction
+            return returnAction.gesture;
+        case "speech":
+            returnAction = action as SpeechAction
+            return returnAction.text;
+        case "llm":
+            returnAction = action as LLMAction
+            return returnAction.goal;
+        default:
+    }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/PlanEditingFunctions.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/PlanEditingFunctions.tsx.html new file mode 100644 index 0000000..85be40d --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/PlanEditingFunctions.tsx.html @@ -0,0 +1,187 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/components/PlanEditingFunctions.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/components PlanEditingFunctions.tsx

+
+ +
+ 0% + Statements + 0/5 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
// This file is to avoid sharing both functions and components which eslint dislikes. :)
+import type { GoalNode } from "../nodes/GoalNode"
+import type { Goal, Plan } from "./Plan"
+ 
+/**
+ * Inserts a goal into a plan
+ * @param plan: plan to insert goal into
+ * @param goalNode: the goal node to insert into the plan.
+ * @returns: a new plan with the goal inside.
+ */
+export function insertGoalInPlan(plan: Plan, goalNode: GoalNode): Plan {
+    const planElement : Goal = {
+        id: goalNode.id,
+        type: "goal",
+    }
+ 
+    return {
+        ...plan,
+        steps: [...plan.steps, planElement],
+    }
+}
+ 
+ 
+/**
+ * Deletes a goal from  a plan
+ * @param plan: plan to delete goal from
+ * @param goalID: the goal node to delete.
+ * @returns: a new plan with the goal removed.
+ */
+export function deleteGoalInPlanByID(plan: Plan, goalID: string) {
+    const updatedPlan = {...plan,
+        steps: plan.steps.filter((x) => x.id !== goalID)
+    }
+    return updatedPlan.steps.length == 0 ? undefined : updatedPlan
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/PlanEditor.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/PlanEditor.tsx.html new file mode 100644 index 0000000..9c81bce --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/PlanEditor.tsx.html @@ -0,0 +1,832 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/components/PlanEditor.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/components PlanEditor.tsx

+
+ +
+ 0% + Statements + 0/59 +
+ + +
+ 0% + Branches + 0/44 +
+ + +
+ 0% + Functions + 0/18 +
+ + +
+ 0% + Lines + 0/56 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {useRef, useState} from "react";
+import useFlowStore from "../VisProgStores.tsx";
+import styles from './PlanEditor.module.css';
+import { GetActionValue, type Action, type ActionTypes, type Plan } from "../components/Plan";
+import { defaultPlan } from "../components/Plan.default";
+import { TextField } from "../../../../components/TextField";
+import GestureValueEditor from "./GestureValueEditor"; 
+ 
+type PlanEditorDialogProps = {
+  plan?: Plan;
+  onSave: (plan: Plan | undefined) => void;
+  description? : string;
+};
+ 
+export default function PlanEditorDialog({
+  plan,
+  onSave,
+  description,
+}: PlanEditorDialogProps) {
+  // UseStates and references
+  const dialogRef = useRef<HTMLDialogElement | null>(null);
+  const [draftPlan, setDraftPlan] = useState<Plan | null>(null);
+  const [newActionType, setNewActionType] = useState<ActionTypes>("speech");
+  const [newActionGestureType, setNewActionGestureType] = useState<boolean>(true);
+  const [newActionValue, setNewActionValue] = useState("");
+  const [hasInteractedWithPlan, setHasInteractedWithPlan] = useState<boolean>(false)
+  const { setScrollable } = useFlowStore();
+  const nodes = useFlowStore().nodes;
+ 
+  //Button Actions
+  const openCreate = () => {
+    setScrollable(false);
+    setDraftPlan({...structuredClone(defaultPlan), id: crypto.randomUUID()});
+    dialogRef.current?.showModal();
+  };
+ 
+  const openCreateWithDescription = () => {
+    setScrollable(false);
+    setDraftPlan({...structuredClone(defaultPlan), id: crypto.randomUUID(), name: description!});
+    setNewActionType("llm")
+    setNewActionValue(description!)
+    dialogRef.current?.showModal();
+  }
+ 
+  const openEdit = () => {
+    setScrollable(false);
+    if (!plan) return;
+    setDraftPlan(structuredClone(plan));
+    dialogRef.current?.showModal();
+  };
+ 
+  const close = () => {
+    setScrollable(true);
+    dialogRef.current?.close();
+    setDraftPlan(null);
+  };
+ 
+  const buildAction = (): Action => {
+    const id = crypto.randomUUID();
+    setHasInteractedWithPlan(true)
+    switch (newActionType) {
+    case "speech":
+     return { id, text: newActionValue, type: "speech" };
+    case "gesture":
+        return { id, gesture: newActionValue, isTag: newActionGestureType, type: "gesture" };
+    case "llm":
+        return { id, goal: newActionValue, type: "llm" };
+    }
+  };
+ 
+  return (<>
+      {/* Create and edit buttons */}
+      {!plan && (
+          <button className={styles.nodeButton} onClick={description ? openCreateWithDescription : openCreate}>
+          Create Plan
+          </button>
+      )}
+      {plan && (
+          <button className={styles.nodeButton} onClick={openEdit}>
+          Edit Plan
+          </button>
+      )}
+ 
+      {/* Start of dialog (plan editor) */}
+      <dialog
+        ref={dialogRef}
+        className={`${styles.planDialog}`}
+        //onWheel={(e) => e.stopPropagation()}
+        data-testid={"PlanEditorDialogTestID"}
+      >
+      <form method="dialog" className="flex-col gap-md">
+          <h3> {draftPlan?.id === plan?.id ? "Edit Plan" : "Create Plan"} </h3>
+          {/* Plan name text field */}
+          {draftPlan && (
+              <TextField
+                  value={draftPlan.name}
+                  setValue={(name) =>
+                  setDraftPlan({ ...draftPlan, name })}
+              placeholder="Plan name"
+              data-testid="name_text_field"/>
+          )}
+ 
+          {/* Entire "bottom" part (adder and steps) without cancel, confirm and reset */}
+          {draftPlan && (<div className={styles.planEditor}>
+              <div className={styles.planEditorLeft}>
+              {/* Left Side (Action Adder) */}
+                  <h4>Add Action</h4>
+                  {(!plan && description && draftPlan.steps.length === 0 && !hasInteractedWithPlan) && (<div className={styles.stepSuggestion}>
+                      <label> Filled in as a suggestion! </label>
+                      <label> Feel free to change! </label>
+                  </div>)}
+                  <label>
+                      Action Type <wbr />
+                      {/* Type selection */}
+                      <select
+                          value={newActionType}
+                          onChange={(e) => {
+                              setNewActionType(e.target.value as ActionTypes);
+                              // Reset value when action type changes
+                              setNewActionValue("");
+                          }}>
+                      <option value="speech">Speech Action</option>
+                      <option value="gesture">Gesture Action</option>
+                      <option value="llm">LLM Action</option>
+                      </select>
+                  </label>
+ 
+                  {/* Action value editor*/}
+                  {newActionType === "gesture" ? (
+                      // Gesture get their own editor component
+                      <GestureValueEditor
+                        value={newActionValue}
+                        setValue={setNewActionValue}
+                        setType={setNewActionGestureType}
+                        placeholder="Gesture name"
+                      />
+                  ) : (
+                      <TextField
+                          value={newActionValue}
+                          setValue={setNewActionValue}
+                          placeholder={
+                              newActionType === "speech" ? "Speech text"
+                              : "LLM goal"
+                          }
+                      />
+                  )}
+ 
+                  {/* Adding steps */}
+                  <button
+                      type="button"
+                      disabled={!newActionValue}
+                      onClick={() => {
+                          if (!draftPlan) return;
+                          // Add action to steps
+                          const action = buildAction();
+                          setDraftPlan({
+                              ...draftPlan,
+                              steps: [...draftPlan.steps, action],});
+ 
+                          // Reset current action building
+                          setNewActionValue("");
+                          setNewActionType("speech");
+                      }}>
+                  Add Step
+                </button>
+              </div>
+ 
+              {/* Right Side (Steps shown) */}
+              <div className={styles.planEditorRight}>
+                  <h4>Steps</h4>
+ 
+                  {/* Show if there are no steps yet */}
+                  {draftPlan.steps.length === 0 && (
+                      <div className={styles.emptySteps}>
+                      No steps yet
+                      </div>
+                  )}
+ 
+ 
+                  {/* Map over all steps */}
+                  {draftPlan.steps.map((step, index) => (
+                      <div
+                      role="button"
+                      tabIndex={0}
+                      key={step.id}
+                      className={styles.planStep}
+                      // Extra logic for screen readers to access using keyboard
+                      onKeyDown={(e) => {
+                          if (e.key === "Enter" || e.key === " ") {
+                          setDraftPlan({
+                          ...draftPlan,
+                          steps: draftPlan.steps.filter((s) => s.id !== step.id),});
+                          }}}
+                      onClick={() => {
+                          setDraftPlan({
+                          ...draftPlan,
+                          steps: draftPlan.steps.filter((s) => s.id !== step.id),});
+                      }}>
+ 
+                      <span className={styles.stepIndex}>{index + 1}.</span>
+                      <span className={styles.stepType}>{step.type}:</span>
+                      <span className={styles.stepName}>
+                        {
+                        // This just tries to find the goals name, i know it looks ugly:(
+                        step.type === "goal"
+                        ? ((nodes.find(x => x.id === step.id)?.data.name as string) == "" ? 
+                        "unnamed goal": (nodes.find(x => x.id === step.id)?.data.name as string))
+                        : (GetActionValue(step) ?? "")}
+                      </span>
+                  </div>
+                ))}
+              </div>
+            </div>
+          )}
+ 
+          {/* Buttons */}
+          <div className="flex-row gap-md">
+              {/* Close button */}
+              <button type="button" onClick={close}>
+              Cancel
+              </button>
+ 
+              {/* Confirm/ Create button */}
+              <button
+              type="button"
+              disabled={!draftPlan}
+              onClick={() => {
+                  if (!draftPlan) return;
+                  onSave(draftPlan);
+                  close();
+              }}>
+              {draftPlan?.id === plan?.id ? "Confirm" : "Create"}
+              </button>
+ 
+              {/* Reset button */}
+              <button
+              type="button"
+              disabled={!draftPlan}
+              onClick={() => {
+                  onSave(undefined);
+                  close();
+              }}>
+              Reset
+              </button>
+        </div>
+      </form>
+    </dialog>
+  </>
+);
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/RuleBasedHandle.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/RuleBasedHandle.tsx.html new file mode 100644 index 0000000..37975a7 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/RuleBasedHandle.tsx.html @@ -0,0 +1,349 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/components/RuleBasedHandle.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/components RuleBasedHandle.tsx

+
+ +
+ 0% + Statements + 0/18 +
+ + +
+ 0% + Branches + 0/10 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 0% + Lines + 0/18 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  Handle,
+  type HandleProps,
+  type Connection,
+  useNodeId, useNodeConnections
+} from '@xyflow/react';
+import {useState} from 'react';
+import { type HandleRule, useHandleRules} from "../HandleRuleLogic.ts";
+import "./RuleBasedHandle.module.css";
+ 
+ 
+ 
+export function MultiConnectionHandle({
+  id,
+  type,
+  rules = [],
+  ...otherProps
+} : HandleProps & { rules?: HandleRule[]}) {
+  let nodeId = useNodeId();
+  // this check is used to make sure that the handle code doesn't break when used inside a test,
+  // since useNodeId would be undefined if the handle is not used inside a node
+  nodeId = nodeId ? nodeId : "mockId";
+  const validate = useHandleRules(nodeId, id!, type!, rules);
+ 
+ 
+  const connections = useNodeConnections({
+    id: nodeId,
+    handleType: type,
+    handleId: id!
+  })
+ 
+  // initialise the handles state with { isValid: true } to show that connections are possible
+  const [handleState, setHandleState] = useState<{ isSatisfied: boolean, message?: string }>({ isSatisfied: true });
+ 
+  return (
+    <Handle
+      {...otherProps}
+      id={id}
+      type={type}
+      className={"multiConnectionHandle" + (connections.length === 0 ? " unconnected" : " connected")}
+      isValidConnection={(connection) => {
+        const result = validate(connection as Connection);
+        setHandleState(result);
+        return result.isSatisfied;
+      }}
+      title={handleState.message}
+    />
+  );
+}
+ 
+export function SingleConnectionHandle({
+  id,
+  type,
+  rules = [],
+  ...otherProps
+} : HandleProps & { rules?: HandleRule[]}) {
+  let nodeId = useNodeId();
+  // this check is used to make sure that the handle code doesn't break when used inside a test,
+  // since useNodeId would be undefined if the handle is not used inside a node
+  nodeId = nodeId ? nodeId : "mockId";
+  const validate = useHandleRules(nodeId, id!, type!, rules);
+ 
+  const connections = useNodeConnections({
+    id: nodeId,
+    handleType: type,
+    handleId: id!
+  })
+ 
+  // initialise the handles state with { isValid: true } to show that connections are possible
+  const [handleState, setHandleState] = useState<{ isSatisfied: boolean, message?: string }>({ isSatisfied: true });
+ 
+  return (
+    <Handle
+      {...otherProps}
+      id={id}
+      type={type}
+      className={"singleConnectionHandle" + (connections.length === 0 ? " unconnected" : " connected")}
+      isConnectable={connections.length === 0}
+      isValidConnection={(connection) => {
+        const result = validate(connection as Connection);
+        setHandleState(result);
+        return result.isSatisfied;
+      }}
+      title={handleState.message}
+    />
+  );
+}
+ 
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/SaveLoadPanel.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/SaveLoadPanel.tsx.html new file mode 100644 index 0000000..3d7af11 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/SaveLoadPanel.tsx.html @@ -0,0 +1,292 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/components/SaveLoadPanel.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/components SaveLoadPanel.tsx

+
+ +
+ 0% + Statements + 0/32 +
+ + +
+ 0% + Branches + 0/11 +
+ + +
+ 0% + Functions + 0/8 +
+ + +
+ 0% + Lines + 0/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {type ChangeEvent, useRef, useState} from "react";
+import useFlowStore from "../VisProgStores";
+import visProgStyles from "../../VisProg.module.css";
+import styles from "./SaveLoadPanel.module.css";
+import { makeProjectBlob, type SavedProject } from "../../../../utils/SaveLoad";
+ 
+export default function SaveLoadPanel() {
+  const nodes = useFlowStore((s) => s.nodes);
+  const edges = useFlowStore((s) => s.edges);
+  const setNodes = useFlowStore((s) => s.setNodes);
+  const setEdges = useFlowStore((s) => s.setEdges);
+ 
+  const [saveUrl, setSaveUrl] = useState<string | null>(null);
+ 
+  // ref to the file input
+  const inputRef = useRef<HTMLInputElement | null>(null);
+ 
+  const onSave = async (nameGuess = "visual-program") => {
+    const blob = makeProjectBlob(nameGuess, nodes, edges);
+    const url = URL.createObjectURL(blob);
+    setSaveUrl(url);
+  };
+ 
+  // input change handler updates the graph with a parsed JSON file
+  const handleFileChange = async (e: ChangeEvent<HTMLInputElement>) => {
+    const file = e.target.files?.[0];
+    if (!file) return;
+    try {
+      const text = await file.text();
+      const parsed = JSON.parse(text) as SavedProject;
+      if (!parsed.nodes || !parsed.edges) throw new Error("Invalid file format");
+      setNodes(parsed.nodes);
+      setEdges(parsed.edges);
+    } catch (e) {
+      console.error(e);
+      alert("Loading failed. See console.");
+    } finally {
+      // allow re-selecting same file next time
+      if (inputRef.current) inputRef.current.value = "";
+    }
+  };
+ 
+  const defaultName = "visual-program";
+  return (
+    <div className={`flex-col gap-lg padding-md border-lg ${styles.saveLoadPanel}`}>
+      <div className="description">You can save and load your graph here.</div>
+      <div className={`flex-row gap-lg justify-center`}>
+        <a
+          href={saveUrl ?? "#"}
+          onClick={() => onSave(defaultName)}
+          download={`${defaultName}.json`}
+          className={`${visProgStyles.draggableNode} ${styles.saveButton}`}
+        >
+          Save Graph
+        </a>
+ 
+        <label className={`${visProgStyles.draggableNode} ${styles.fileInputButton}`}>
+          <input
+            ref={inputRef}
+            type="file"
+            accept=".visprog.json,.json,.txt,application/json,text/plain"
+            onChange={handleFileChange}
+          />
+          Load Graph
+        </label>
+      </div>
+    </div>
+  );
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/index.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/index.html new file mode 100644 index 0000000..26e7a43 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/components/index.html @@ -0,0 +1,236 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/components + + + + + + + + + +
+
+

All files src/pages/VisProgPage/visualProgrammingUI/components

+
+ +
+ 0% + Statements + 0/253 +
+ + +
+ 0% + Branches + 0/134 +
+ + +
+ 0% + Functions + 0/85 +
+ + +
+ 0% + Lines + 0/232 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
DragDropSidebar.tsx +
+
0%0/250%0/90%0/90%0/25
GestureValueEditor.tsx +
+
0%0/550%0/230%0/200%0/53
NodeComponents.tsx +
+
0%0/210%0/80%0/90%0/20
Plan.default.ts +
+
0%0/1100%0/0100%0/00%0/1
Plan.tsx +
+
0%0/370%0/270%0/140%0/29
PlanEditingFunctions.tsx +
+
0%0/50%0/20%0/30%0/5
PlanEditor.tsx +
+
0%0/590%0/440%0/180%0/56
RuleBasedHandle.tsx +
+
0%0/180%0/100%0/40%0/18
SaveLoadPanel.tsx +
+
0%0/320%0/110%0/80%0/25
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/index.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/index.html new file mode 100644 index 0000000..5b04a12 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/index.html @@ -0,0 +1,176 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI + + + + + + + + + +
+
+

All files src/pages/VisProgPage/visualProgrammingUI

+
+ +
+ 0% + Statements + 0/180 +
+ + +
+ 0% + Branches + 0/50 +
+ + +
+ 0% + Functions + 0/76 +
+ + +
+ 0% + Lines + 0/148 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
EditorUndoRedo.ts +
+
0%0/300%0/80%0/90%0/26
HandleRuleLogic.ts +
+
0%0/210%0/80%0/90%0/18
HandleRules.ts +
+
0%0/120%0/80%0/90%0/8
NodeRegistry.ts +
+
0%0/15100%0/00%0/70%0/15
VisProgStores.tsx +
+
0%0/1020%0/260%0/420%0/81
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/BasicBeliefNode.default.ts.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/BasicBeliefNode.default.ts.html new file mode 100644 index 0000000..3498196 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/BasicBeliefNode.default.ts.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/nodes/BasicBeliefNode.default.ts + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/nodes BasicBeliefNode.default.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12  +  +  +  +  +  +  +  +  +  +  + 
import type { BasicBeliefNodeData } from "./BasicBeliefNode.tsx";
+ 
+ 
+/**
+ * Default data for this node
+ */
+export const BasicBeliefNodeDefaults: BasicBeliefNodeData = {
+  label: "Belief",
+  droppable: true,
+  belief: {type: "keyword", id: "", value: "", label: "Keyword said:"},
+  hasReduce: true,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/BasicBeliefNode.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/BasicBeliefNode.tsx.html new file mode 100644 index 0000000..1740b6e --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/BasicBeliefNode.tsx.html @@ -0,0 +1,676 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/nodes/BasicBeliefNode.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/nodes BasicBeliefNode.tsx

+
+ +
+ 92.3% + Statements + 36/39 +
+ + +
+ 88.88% + Branches + 8/9 +
+ + +
+ 83.33% + Functions + 10/12 +
+ + +
+ 92.1% + Lines + 35/38 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +19822x +  +  +  +  +  +22x +22x +22x +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +22x +28x +28x +28x +28x +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +28x +  +  +28x +28x +28x +  +17x +17x +17x +  +5x +5x +5x +  +2x +2x +  +  +  +4x +4x +  +  +  +  +28x +  +  +  +  +  +  +  +  +  +4x +  +  +  +  +  +  +  +  +  +  +  +1x +  +  +16x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +22x + 
import {
+  Handle,
+  type NodeProps,
+  Position,
+  type Node,
+} from '@xyflow/react';
+import { Toolbar } from '../components/NodeComponents';
+import styles from '../../VisProg.module.css';
+import useFlowStore from '../VisProgStores';
+import { TextField } from '../../../../components/TextField';
+ 
+/**
+ * The default data structure for a BasicBelief node
+ *
+ * Represents configuration for a node that activates when a specific condition is met,
+ * such as keywords being spoken or emotions detected.
+ *
+ * @property label: the display label of this BasicBelief node.
+ * @property droppable: Whether this node can be dropped from the toolbar (default: true).
+ * @property BasicBeliefType - The type of BasicBelief ("keywords" or a custom string).
+ * @property BasicBeliefs - The list of keyword BasicBeliefs (if applicable).
+ * @property hasReduce - Whether this node supports reduction logic.
+ */
+export type BasicBeliefNodeData = {
+  label: string;
+  droppable: boolean;
+  belief: BasicBeliefType;
+  hasReduce: boolean;
+};
+ 
+// These are all the types a basic belief could be.
+type BasicBeliefType = Keyword | Semantic | Object | Emotion
+type Keyword = { type: "keyword", id: string, value: string, label: "Keyword said:"};
+type Semantic = { type: "semantic", id: string, value: string, label: "Detected with LLM:"};
+type Object = { type: "object", id: string, value: string, label: "Object found:"};
+type Emotion = { type: "emotion", id: string, value: string, label: "Emotion recognised:"};
+ 
+export type BasicBeliefNode = Node<BasicBeliefNodeData>
+ 
+ 
+/**
+ * This function is called whenever a connection is made with this node type as the target
+ * @param _thisNode the node of this node type which function is called
+ * @param _sourceNodeId the source of the received connection
+ */
+export function BasicBeliefConnectionTarget(_thisNode: Node, _sourceNodeId: string) {
+  // no additional connection logic exists yet
+}
+ 
+/**
+ * This function is called whenever a connection is made with this node type as the source
+ * @param _thisNode the node of this node type which function is called
+ * @param _targetNodeId the target of the created connection
+ */
+export function BasicBeliefConnectionSource(_thisNode: Node, _targetNodeId: string) {
+  // no additional connection logic exists yet
+}
+ 
+/**
+ * This function is called whenever a connection is disconnected with this node type as the target
+ * @param _thisNode the node of this node type which function is called
+ * @param _sourceNodeId the source of the disconnected connection
+ */
+export function BasicBeliefDisconnectionTarget(_thisNode: Node, _sourceNodeId: string) {
+  // no additional connection logic exists yet
+}
+ 
+/**
+ * This function is called whenever a connection is disconnected with this node type as the source
+ * @param _thisNode the node of this node type which function is called
+ * @param _targetNodeId the target of the diconnected connection
+ */
+export function BasicBeliefDisconnectionSource(_thisNode: Node, _targetNodeId: string) {
+  // no additional connection logic exists yet
+}
+ 
+/**
+ * Defines how a BasicBelief node should be rendered
+ * @param props - Node properties provided by React Flow, including `id` and `data`.
+ * @returns The rendered BasicBeliefNode React element (React.JSX.Element).
+ */
+export default function BasicBeliefNode(props: NodeProps<BasicBeliefNode>) {
+  const data = props.data;
+  const {updateNodeData} = useFlowStore();
+  const updateValue = (value: string) => updateNodeData(props.id, {...data, belief: {...data.belief, value: value}});
+  const label_input_id = `basic_belief_${props.id}_label_input`;
+ 
+  type BeliefString = BasicBeliefType["type"];
+ 
+  function updateBeliefType(newType: BeliefString) {
+    updateNodeData(props.id, {
+      ...data,
+      belief: {
+        ...data.belief,
+        type: newType,
+      },
+    });
+  }
+ 
+ 
+  // Use this
+  const emotionOptions = ["Happy", "Angry", "Sad", "Cheerful"]
+ 
+ 
+  let placeholder = ""
+  let wrapping = ""
+  switch (props.data.belief.type) {
+    case ("keyword"):
+      placeholder = "keyword..."
+      wrapping = '"'
+      break; 
+    case ("semantic"):
+      placeholder = "word..."
+      wrapping = '"'
+      break; 
+    case ("object"):
+      placeholder = "object..."
+      break; 
+    case ("emotion"):
+      // TODO: emotion should probably be a drop-down menu rather than a string
+      // So this placeholder won't hold for always
+      placeholder = "emotion..."
+      break;
+    default:
+      break;
+  }
+ 
+  return (
+    <>
+      <Toolbar nodeId={props.id} allowDelete={true}/>
+      <div className={`${styles.defaultNode} ${styles.nodeBasicBelief /*TODO: Change this*/}`}>
+        <div className={"flex-center-x gap-sm"}>
+          <label htmlFor={label_input_id}>Belief:</label>
+        </div>
+        <div className={"flex-row gap-sm"}>
+          <select
+            value={data.belief.type}
+            onChange={(e) => updateBeliefType(e.target.value as BeliefString)}
+            >
+            <option value="keyword">Keyword said:</option>
+            <option value="semantic">Detected with LLM:</option>
+            <option value="object">Object found:</option>
+            <option value="emotion">Emotion recognised:</option>
+          </select>
+          {wrapping}
+ 
+          {data.belief.type === "emotion" && (
+            <select
+              value={data.belief.value}
+              onChange={(e) => updateValue(e.target.value)}
+            >
+              {emotionOptions.map((emotion) => (
+                <option key={emotion} value={emotion.toLowerCase()}>
+                  {emotion}
+                </option>
+              ))}
+            </select>
+          )}
+ 
+ 
+          {data.belief.type !== "emotion" && 
+          (<TextField
+            id={label_input_id}
+            value={data.belief.value}
+            setValue={updateValue}
+            placeholder={placeholder}
+          />)}
+          {wrapping}
+        </div>
+        <Handle type="source" position={Position.Right} id="source"/>
+      </div>
+    </>
+  );
+};
+ 
+/**
+ * Reduces each BasicBelief, including its children down into its core data.
+ * @param node - The BasicBelief node to reduce.
+ * @param _nodes - The list of all nodes in the current flow graph.
+ * @returns A simplified object containing the node label and its list of BasicBeliefs.
+ */
+export function BasicBeliefReduce(node: Node, _nodes: Node[]) {
+  const data = node.data as BasicBeliefNodeData;
+  return {
+    id: node.id,
+    type: data.belief.type,
+    value: data.belief.value
+  }
+}
+ 
+/**
+ * This function is called whenever a connection is made with this node type (BasicBelief)
+ * @param _thisNode the node of this node type which function is called
+ * @param _otherNode the other node which was part of the connection
+ * @param _isThisSource whether this instance of the node was the source in the connection, true = yes.
+ */
+export function BasicBeliefConnects(_thisNode: Node, _otherNode: Node, _isThisSource: boolean) {
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/BeliefGlobals.ts.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/BeliefGlobals.ts.html new file mode 100644 index 0000000..ca39a9e --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/BeliefGlobals.ts.html @@ -0,0 +1,271 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/nodes/BeliefGlobals.ts + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/nodes BeliefGlobals.ts

+
+ +
+ 0% + Statements + 0/26 +
+ + +
+ 0% + Branches + 0/18 +
+ + +
+ 0% + Functions + 0/9 +
+ + +
+ 0% + Lines + 0/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {getOutgoers, type Node} from '@xyflow/react';
+import {type HandleRule, type RuleResult, ruleResult} from "../HandleRuleLogic.ts";
+import useFlowStore from "../VisProgStores.tsx";
+import {BasicBeliefReduce} from "./BasicBeliefNode.tsx";
+import {type InferredBeliefNodeData, InferredBeliefReduce} from "./InferredBeliefNode.tsx";
+ 
+export function BeliefGlobalReduce(beliefNode: Node, nodes: Node[]) {
+  switch (beliefNode.type) {
+    case 'basic_belief':
+      return BasicBeliefReduce(beliefNode, nodes);
+    case 'inferred_belief':
+      return InferredBeliefReduce(beliefNode, nodes);
+  }
+}
+ 
+export const noMatchingLeftRightBelief : HandleRule = (connection, _)=> {
+  const { nodes } = useFlowStore.getState();
+  const thisNode = nodes.find(node => node.id === connection.target && node.type === 'inferred_belief');
+  if (!thisNode) return ruleResult.satisfied;
+ 
+  const iBelief = (thisNode.data as InferredBeliefNodeData).inferredBelief;
+  return (iBelief.left === connection.source || iBelief.right === connection.source)
+    ? ruleResult.notSatisfied("Connecting one belief to both input handles of an inferred belief node is not allowed")
+    : ruleResult.satisfied;
+}
+/**
+ * makes it impossible to connect Inferred belief nodes
+ * if the connection would create a cyclical connection between inferred beliefs
+ */
+export const noBeliefCycles: HandleRule = (connection, _): RuleResult => {
+  const {nodes, edges} = useFlowStore.getState();
+  const defaultErrorMessage = "Cyclical connection exists between inferred beliefs";
+ 
+  /**
+   * recursively checks for cyclical connections between InferredBelief nodes
+   *
+   * to check for a cycle provide the source of an attempted connection as the targetNode for the cycle check,
+   * the currentNodeId should be initialised with the id of the targetNode of the attempted connection.
+   *
+   * @param {string} targetNodeId - the id of the node we are looking for as the endpoint of a cyclical connection
+   * @param {string} currentNodeId - the id of the node we are checking for outgoing connections to the provided target node
+   * @returns {RuleResult}
+   */
+  function checkForCycle(targetNodeId: string, currentNodeId: string): RuleResult {
+    const outgoingBeliefs = getOutgoers({id: currentNodeId}, nodes, edges)
+      .filter(node => node.type === 'inferred_belief');
+ 
+    if (outgoingBeliefs.length === 0) return ruleResult.satisfied;
+    if (outgoingBeliefs.some(node => node.id === targetNodeId)) return ruleResult
+      .notSatisfied(defaultErrorMessage);
+ 
+    const next = outgoingBeliefs.map(node => checkForCycle(targetNodeId, node.id))
+      .find(result => !result.isSatisfied);
+ 
+    return next
+      ? next
+      : ruleResult.satisfied;
+  }
+ 
+  return connection.source === connection.target
+    ? ruleResult.notSatisfied(defaultErrorMessage)
+    : checkForCycle(connection.source, connection.target);
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/EndNode.default.ts.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/EndNode.default.ts.html new file mode 100644 index 0000000..66c012c --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/EndNode.default.ts.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/nodes/EndNode.default.ts + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/nodes EndNode.default.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10  +  +  +  +  +  +  +  +  + 
import type { EndNodeData } from "./EndNode";
+ 
+/**
+ * Default data for this node.
+ */
+export const EndNodeDefaults: EndNodeData = {
+  label: "End Node",
+  droppable: false,
+  hasReduce: true
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/EndNode.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/EndNode.tsx.html new file mode 100644 index 0000000..4e480b5 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/EndNode.tsx.html @@ -0,0 +1,370 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/nodes/EndNode.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/nodes EndNode.tsx

+
+ +
+ 0% + Statements + 0/3 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/6 +
+ + +
+ 0% + Lines + 0/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  type NodeProps,
+  Position,
+  type Node,
+} from '@xyflow/react';
+import { Toolbar } from '../components/NodeComponents';
+import styles from '../../VisProg.module.css';
+import {SingleConnectionHandle} from "../components/RuleBasedHandle.tsx";
+import {allowOnlyConnectionsFromType} from "../HandleRules.ts";
+ 
+ 
+ 
+/**
+ * The typing of this node's data
+ */
+export type EndNodeData = {
+  label: string;
+  droppable: boolean;
+  hasReduce: boolean;
+};
+ 
+export type EndNode = Node<EndNodeData>
+ 
+/**
+ * Default function to render an end node given its properties
+ * @param props the node's properties
+ * @returns React.JSX.Element
+ */
+export default function EndNode(props: NodeProps<EndNode>) {
+  return (
+    <>
+      <Toolbar nodeId={props.id} allowDelete={false}/>
+      <div className={`${styles.defaultNode} ${styles.nodeEnd}`}>
+        <div className={"flex-row gap-sm"}>
+        End
+        </div>
+        <SingleConnectionHandle type="target" position={Position.Left} id="target" rules={[
+          allowOnlyConnectionsFromType(["phase"])
+        ]}/>
+      </div>
+    </>
+  );
+}
+ 
+/**
+ * Functionality for reducing this node into its more compact json program
+ * @param node the node to reduce
+ * @param _nodes all nodes present
+ * @returns Dictionary, {id: node.id}
+ */
+export function EndReduce(node: Node, _nodes: Node[]) {
+  // Replace this for nodes functionality
+  return {
+    id: node.id
+  }
+}
+ 
+export const EndTooltip = `
+  The end node signifies the endpoint of your program; 
+  the output of the final phase of your program should connect to the end node`;
+ 
+/**
+ * This function is called whenever a connection is made with this node type as the target
+ * @param _thisNode the node of this node type which function is called
+ * @param _sourceNodeId the source of the received connection
+ */
+export function EndConnectionTarget(_thisNode: Node, _sourceNodeId: string) {
+  // no additional connection logic exists yet
+}
+ 
+/**
+ * This function is called whenever a connection is made with this node type as the source
+ * @param _thisNode the node of this node type which function is called
+ * @param _targetNodeId the target of the created connection
+ */
+export function EndConnectionSource(_thisNode: Node, _targetNodeId: string) {
+  // no additional connection logic exists yet
+}
+ 
+/**
+ * This function is called whenever a connection is disconnected with this node type as the target
+ * @param _thisNode the node of this node type which function is called
+ * @param _sourceNodeId the source of the disconnected connection
+ */
+export function EndDisconnectionTarget(_thisNode: Node, _sourceNodeId: string) {
+  // no additional connection logic exists yet
+}
+ 
+/**
+ * This function is called whenever a connection is disconnected with this node type as the source
+ * @param _thisNode the node of this node type which function is called
+ * @param _targetNodeId the target of the diconnected connection
+ */
+export function EndDisconnectionSource(_thisNode: Node, _targetNodeId: string) {
+  // no additional connection logic exists yet
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/GoalNode.default.ts.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/GoalNode.default.ts.html new file mode 100644 index 0000000..83aa2cd --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/GoalNode.default.ts.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/nodes/GoalNode.default.ts + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/nodes GoalNode.default.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14  +  +  +  +  +  +  +  +  +  +  +  +  + 
import type { GoalNodeData } from "./GoalNode";
+ 
+/**
+ * Default data for this node
+ */
+export const GoalNodeDefaults: GoalNodeData = {
+  label: "Goal Node",
+  name: "",
+  droppable: true,
+  description: "",
+  achieved: false,
+  hasReduce: true,
+  can_fail: false,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/GoalNode.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/GoalNode.tsx.html new file mode 100644 index 0000000..040c02b --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/GoalNode.tsx.html @@ -0,0 +1,691 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/nodes/GoalNode.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/nodes GoalNode.tsx

+
+ +
+ 0% + Statements + 0/30 +
+ + +
+ 0% + Branches + 0/35 +
+ + +
+ 0% + Functions + 0/13 +
+ + +
+ 0% + Lines + 0/28 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  type NodeProps,
+  Position,
+  type Node,
+} from '@xyflow/react';
+import { Toolbar } from '../components/NodeComponents';
+import styles from '../../VisProg.module.css';
+import { TextField } from '../../../../components/TextField';
+import {MultiConnectionHandle} from "../components/RuleBasedHandle.tsx";
+import {allowOnlyConnectionsFromHandle, allowOnlyConnectionsFromType} from "../HandleRules.ts";
+import useFlowStore from '../VisProgStores';
+import {DoesPlanIterate, HasCheckingSubGoal, PlanReduce, type Plan } from '../components/Plan';
+import PlanEditorDialog from '../components/PlanEditor';
+import { MultilineTextField } from '../../../../components/MultilineTextField';
+import { defaultPlan } from '../components/Plan.default.ts';
+import { deleteGoalInPlanByID, insertGoalInPlan } from '../components/PlanEditingFunctions.tsx';
+ 
+/**
+ * The default data dot a phase node
+ * @param label: the label of this phase
+ * @param droppable: whether this node is droppable from the drop bar (initialized as true)
+ * @param desciption: description of the goal - this will be checked for completion
+ * @param hasReduce: whether this node has reducing functionality (true by default)
+ * @param can_fail: whether this plan should be checked- this plan could possible fail
+ * @param plan: The (possible) attached plan to this goal
+ */
+export type GoalNodeData = {
+  label: string;
+  name: string;
+  description: string;
+  droppable: boolean;
+  achieved: boolean;
+  hasReduce: boolean;
+  can_fail: boolean;
+  plan?: Plan;
+};
+ 
+export type GoalNode = Node<GoalNodeData>
+ 
+ 
+/**
+ * Defines how a Goal node should be rendered
+ * @param props NodeProps, like id, label, children
+ * @returns React.JSX.Element
+ */
+export default function GoalNode({id, data}: NodeProps<GoalNode>) {
+  const {updateNodeData} = useFlowStore();
+  const _nodes = useFlowStore().nodes;
+ 
+  const text_input_id = `goal_${id}_text_input`;
+  const checkbox_id = `goal_${id}_checkbox`;
+  const planIterate = DoesPlanIterate(_nodes, data.plan);
+  const hasCheckSubGoal = data.plan !== undefined && HasCheckingSubGoal(data.plan, _nodes)
+ 
+  const setDescription = (value: string) => {
+    updateNodeData(id, {...data, description: value});
+  }
+ 
+  const setName= (value: string) => {
+    updateNodeData(id, {...data, name: value})
+  }
+ 
+  const setFailable = (value: boolean) => {
+    updateNodeData(id, {...data, can_fail: value});
+  }
+ 
+  return <>
+    <Toolbar nodeId={id} allowDelete={true}/>
+    <div className={`${styles.defaultNode} ${styles.nodeGoal} flex-col gap-sm`}>
+      <div className={"flex-row gap-md"}>
+        <label htmlFor={text_input_id}>Goal:</label>
+        <TextField
+          id={text_input_id}
+          value={data.name}
+          setValue={(val) => setName(val)}
+          placeholder={"To ..."}
+        />
+      </div>
+      
+      {(data.can_fail || hasCheckSubGoal) && (<div>
+        <label htmlFor={text_input_id}>Description/ Condition of goal:</label>
+        <div className={"flex-wrap"}>
+          <MultilineTextField
+            id={text_input_id}
+            value={data.description}
+            setValue={setDescription}
+            placeholder={"Describe the condition of this goal..."}
+          />
+        </div>
+      </div>)}
+      <div>
+        <label> {!data.plan ? "No plan set to execute while goal is not reached. 🔴" : "Will follow plan '" + data.plan.name + "' until all steps complete. 🟢"} </label>
+      </div>
+      {data.plan && (<div className={"flex-row gap-md align-center " + (planIterate ? "" : styles.planNoIterate)}>
+        {planIterate ? "" : <s></s>}
+        <label htmlFor={checkbox_id}>{!planIterate ? "This plan always succeeds!" : "Check if this plan fails"}:</label>
+        <input
+          id={checkbox_id}
+          type={"checkbox"}
+          disabled={!planIterate || (data.plan && HasCheckingSubGoal(data.plan, _nodes))}
+          checked={!planIterate || data.can_fail || (data.plan && HasCheckingSubGoal(data.plan, _nodes))}
+          onChange={(e) => planIterate ? setFailable(e.target.checked) : setFailable(false)}
+        />
+      </div>
+)}
+ 
+      <div>
+        <PlanEditorDialog
+                  plan={data.plan}
+                  onSave={(plan) => {
+                    updateNodeData(id, {
+                      ...data,
+                      plan,
+                    });
+                  }} 
+                  description={data.name}
+        />
+      </div>
+      <MultiConnectionHandle type="source" position={Position.Right} id="GoalSource" rules={[
+        allowOnlyConnectionsFromHandle([{nodeType:"phase",handleId:"data"}]),
+      ]}/>
+ 
+      <MultiConnectionHandle type="target" position={Position.Bottom} id="GoalTarget" rules={[allowOnlyConnectionsFromType(["goal"])]}/>
+ 
+ 
+    </div>
+  </>;
+}
+ 
+ 
+/**
+ * Reduces each Goal, including its children down into its relevant data.
+ * @param node The Node Properties of this node.
+ * @param _nodes all the nodes in the graph
+ */
+export function GoalReduce(node: Node, _nodes: Node[]) {
+  const data = node.data as GoalNodeData;
+    return {  
+      id: node.id,
+      name: data.name,
+      description: data.description,
+      can_fail: data.can_fail || (data.plan && HasCheckingSubGoal(data.plan, _nodes)),  
+      plan: data.plan ? PlanReduce(_nodes, data.plan) : "",
+    }
+}
+ 
+ 
+export const GoalTooltip = `
+  The goal node allows you to set goals that Pepper has to achieve
+  before moving to the next phase of your program`;
+ 
+/**
+ * This function is called whenever a connection is made with this node type as the target
+ * @param _thisNode the node of this node type which function is called
+ * @param _sourceNodeId the source of the received connection
+ */
+export function GoalConnectionTarget(_thisNode: Node, _sourceNodeId: string) {
+  // Goals should only be targeted by other goals, for them to be part of our plan.
+  const nodes = useFlowStore.getState().nodes;
+  const otherNode = nodes.find((x) => x.id === _sourceNodeId)
+  if (!otherNode || otherNode.type !== "goal") return;
+ 
+  const data = _thisNode.data as GoalNodeData 
+ 
+  // First, let's see if we have a plan currently. If not, let's create a default plan with this goal inside.:)
+  if (!data.plan) {
+    data.plan = insertGoalInPlan({...structuredClone(defaultPlan), id: crypto.randomUUID()} as Plan, otherNode as GoalNode)
+  }
+  
+  // Else, lets just insert this goal into our current plan.
+  else {
+    data.plan = insertGoalInPlan(structuredClone(data.plan), otherNode as GoalNode)
+  }
+}
+ 
+/**
+ * This function is called whenever a connection is made with this node type as the source
+ * @param _thisNode the node of this node type which function is called
+ * @param _targetNodeId the target of the created connection
+ */
+export function GoalConnectionSource(_thisNode: Node, _targetNodeId: string) {
+  // no additional connection logic exists yet
+}
+ 
+/**
+ * This function is called whenever a connection is disconnected with this node type as the target
+ * @param _thisNode the node of this node type which function is called
+ * @param _sourceNodeId the source of the disconnected connection
+ */
+export function GoalDisconnectionTarget(_thisNode: Node, _sourceNodeId: string) {
+  // We should probably check if our disconnection was by a goal, since it would mean we have to remove it from our plan list.
+  const data = _thisNode.data as GoalNodeData 
+  data.plan = deleteGoalInPlanByID(structuredClone(data.plan) as Plan, _sourceNodeId)
+}
+ 
+/**
+ * This function is called whenever a connection is disconnected with this node type as the source
+ * @param _thisNode the node of this node type which function is called
+ * @param _targetNodeId the target of the diconnected connection
+ */
+export function GoalDisconnectionSource(_thisNode: Node, _targetNodeId: string) {
+  // no additional connection logic exists yet
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/InferredBeliefNode.default.ts.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/InferredBeliefNode.default.ts.html new file mode 100644 index 0000000..beabe71 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/InferredBeliefNode.default.ts.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/nodes/InferredBeliefNode.default.ts + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/nodes InferredBeliefNode.default.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import type { InferredBeliefNodeData } from "./InferredBeliefNode.tsx";
+ 
+ 
+/**
+ * Default data for this node
+ */
+export const InferredBeliefNodeDefaults: InferredBeliefNodeData = {
+  label: "Inferred Belief",
+  droppable: true,
+  inferredBelief: {
+    left: undefined,
+    operator: true,
+    right: undefined
+  },
+  hasReduce: true,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/InferredBeliefNode.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/InferredBeliefNode.tsx.html new file mode 100644 index 0000000..5867be7 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/InferredBeliefNode.tsx.html @@ -0,0 +1,610 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/nodes/InferredBeliefNode.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/nodes InferredBeliefNode.tsx

+
+ +
+ 0% + Statements + 0/34 +
+ + +
+ 0% + Branches + 0/16 +
+ + +
+ 0% + Functions + 0/11 +
+ + +
+ 0% + Lines + 0/24 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {getConnectedEdges, type Node, type NodeProps, Position} from '@xyflow/react';
+import {useState} from "react";
+import styles from '../../VisProg.module.css';
+import {Toolbar} from '../components/NodeComponents.tsx';
+import {MultiConnectionHandle, SingleConnectionHandle} from "../components/RuleBasedHandle.tsx";
+import {allowOnlyConnectionsFromType} from "../HandleRules.ts";
+import useFlowStore from "../VisProgStores.tsx";
+import {BeliefGlobalReduce, noBeliefCycles, noMatchingLeftRightBelief} from "./BeliefGlobals.ts";
+import switchStyles from './InferredBeliefNode.module.css';
+ 
+ 
+/**
+ * The default data structure for an InferredBelief node
+ */
+export type InferredBeliefNodeData = {
+  label: string;
+  droppable: boolean;
+  inferredBelief: InferredBelief;
+  hasReduce: boolean;
+};
+ 
+/**
+ * stores a boolean to represent the operator
+ * and a left and right BeliefNode (can be both an inferred and a basic belief)
+ * in the form of their corresponding id's
+ */
+export type InferredBelief = {
+  left: string | undefined,
+  operator: boolean,
+  right: string | undefined,
+}
+ 
+export type InferredBeliefNode = Node<InferredBeliefNodeData>;
+ 
+/**
+ * This function is called whenever a connection is made with this node type as the target
+ * @param _thisNode the node of this node type which function is called
+ * @param _sourceNodeId the source of the received connection
+ */
+export function InferredBeliefConnectionTarget(_thisNode: Node, _sourceNodeId: string) {
+  const data = _thisNode.data as InferredBeliefNodeData;
+ 
+  if ((useFlowStore.getState().nodes.find((node) => node.id === _sourceNodeId
+    && ['basic_belief', 'inferred_belief'].includes(node.type!)))
+  ) {
+    const connectedEdges = getConnectedEdges([_thisNode], useFlowStore.getState().edges);
+    switch(connectedEdges.find(edge => edge.source === _sourceNodeId)?.targetHandle){
+      case 'beliefLeft': data.inferredBelief.left = _sourceNodeId; break;
+      case 'beliefRight': data.inferredBelief.right = _sourceNodeId; break;
+    }
+  }
+}
+ 
+/**
+ * This function is called whenever a connection is made with this node type as the source
+ * @param _thisNode the node of this node type which function is called
+ * @param _targetNodeId the target of the created connection
+ */
+export function InferredBeliefConnectionSource(_thisNode: Node, _targetNodeId: string) {
+  // no additional connection logic exists yet
+}
+ 
+/**
+ * This function is called whenever a connection is disconnected with this node type as the target
+ * @param _thisNode the node of this node type which function is called
+ * @param _sourceNodeId the source of the disconnected connection
+ */
+export function InferredBeliefDisconnectionTarget(_thisNode: Node, _sourceNodeId: string) {
+  const data = _thisNode.data as InferredBeliefNodeData;
+ 
+  if (_sourceNodeId === data.inferredBelief.left) data.inferredBelief.left = undefined;
+  if (_sourceNodeId === data.inferredBelief.right) data.inferredBelief.right = undefined;
+}
+ 
+/**
+ * This function is called whenever a connection is disconnected with this node type as the source
+ * @param _thisNode the node of this node type which function is called
+ * @param _targetNodeId the target of the diconnected connection
+ */
+export function InferredBeliefDisconnectionSource(_thisNode: Node, _targetNodeId: string) {
+  // no additional connection logic exists yet
+}
+ 
+export const InferredBeliefTooltip = `
+  Combines two beliefs into a single belief using logical inference, 
+  the node can be toggled between using "AND" and "OR" mode for inference`;
+/**
+ * Defines how an InferredBelief node should be rendered
+ * @param {NodeProps<InferredBeliefNode>} props - Node properties provided by React Flow, including `id` and `data`.
+ * @returns The rendered InferredBeliefNode React element. (React.JSX.Element)
+ */
+export default function InferredBeliefNode(props: NodeProps<InferredBeliefNode>) {
+  const data = props.data;
+  const { updateNodeData } = useFlowStore();
+  // start of as an AND operator, true: "AND", false: "OR"
+  const [enforceAllBeliefs, setEnforceAllBeliefs] = useState(true);
+ 
+  // used to toggle operator
+  function onToggle() {
+    const newOperator = !enforceAllBeliefs; // compute the new value
+    setEnforceAllBeliefs(newOperator);
+ 
+    updateNodeData(props.id, {
+      ...data,
+      inferredBelief: {
+        ...data.inferredBelief,
+        operator: enforceAllBeliefs,
+      }
+    });
+  }
+ 
+  return (
+    <>
+      <Toolbar nodeId={props.id} allowDelete={true}/>
+      <div className={`${styles.defaultNode} ${styles.nodeInferredBelief}`}>
+        {/* The checkbox used to toggle the operator between 'AND' and 'OR' */}
+        <label className={switchStyles.operatorSwitch}>
+          <input
+            type="checkbox"
+            checked={data.inferredBelief.operator}
+            onChange={onToggle}
+          />
+          <div className={switchStyles.switchVisual}></div>
+          <div className={switchStyles.switchLabels}>
+            <span title={"Belief is fulfilled if either of the supplied beliefs is true"}>OR</span>
+            <span title={"Belief is fulfilled if all of the supplied beliefs are true"}>AND</span>
+          </div>
+        </label>
+ 
+ 
+        {/* outgoing connections */}
+        <MultiConnectionHandle type="source" position={Position.Right} id="source" rules={[
+          allowOnlyConnectionsFromType(["norm", "trigger"]),
+          noBeliefCycles,
+          noMatchingLeftRightBelief
+        ]}/>
+ 
+        {/* incoming connections */}
+        <SingleConnectionHandle type="target" position={Position.Left} style={{top: '30%'}} id="beliefLeft" rules={[
+          allowOnlyConnectionsFromType(["basic_belief", "inferred_belief"]),
+          noBeliefCycles,
+          noMatchingLeftRightBelief
+        ]}/>
+        <SingleConnectionHandle type="target" position={Position.Left} style={{top: '70%'}} id="beliefRight" rules={[
+          allowOnlyConnectionsFromType(["basic_belief", "inferred_belief"]),
+          noBeliefCycles,
+          noMatchingLeftRightBelief
+        ]}/>
+      </div>
+    </>
+  );
+};
+ 
+/**
+ * Reduces each BasicBelief, including its children down into its core data.
+ * @param {Node} node - The BasicBelief node to reduce.
+ * @param {Node[]} nodes - The list of all nodes in the current flow graph.
+ * @returns A simplified object containing the node label and its list of BasicBeliefs.
+ */
+export function InferredBeliefReduce(node: Node, nodes: Node[]) {
+  const data = node.data as InferredBeliefNodeData;
+  const leftBelief = nodes.find((node) => node.id === data.inferredBelief.left);
+  const rightBelief = nodes.find((node) => node.id === data.inferredBelief.right);
+ 
+  if (!leftBelief) { throw new Error("No Left belief found")}
+  if (!rightBelief) { throw new Error("No Right Belief found")}
+ 
+  const result: Record<string, unknown> = {
+    id: node.id,
+    left: BeliefGlobalReduce(leftBelief, nodes),
+    operator: data.inferredBelief.operator ? "AND" : "OR",
+    right: BeliefGlobalReduce(rightBelief, nodes),
+  };
+ 
+  return result
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/NormNode.default.ts.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/NormNode.default.ts.html new file mode 100644 index 0000000..94b3119 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/NormNode.default.ts.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/nodes/NormNode.default.ts + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/nodes NormNode.default.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13  +  +  +  +  +  +  +  +  +  +  +  + 
import type { NormNodeData } from "./NormNode";
+ 
+/**
+ * Default data for this node
+ */
+export const NormNodeDefaults: NormNodeData = {
+  label: "Norm Node",
+  droppable: true,
+  condition: undefined,
+  norm: "",
+  hasReduce: true,
+  critical: false,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/NormNode.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/NormNode.tsx.html new file mode 100644 index 0000000..6fdb898 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/NormNode.tsx.html @@ -0,0 +1,562 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/nodes/NormNode.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/nodes NormNode.tsx

+
+ +
+ 0% + Statements + 0/28 +
+ + +
+ 0% + Branches + 0/14 +
+ + +
+ 0% + Functions + 0/12 +
+ + +
+ 0% + Lines + 0/24 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  type NodeProps,
+  Position,
+  type Node,
+} from '@xyflow/react';
+import { Toolbar } from '../components/NodeComponents';
+import styles from '../../VisProg.module.css';
+import { TextField } from '../../../../components/TextField';
+import {MultiConnectionHandle, SingleConnectionHandle} from "../components/RuleBasedHandle.tsx";
+import {allowOnlyConnectionsFromHandle, allowOnlyConnectionsFromType} from "../HandleRules.ts";
+import useFlowStore from '../VisProgStores';
+import {BeliefGlobalReduce} from "./BeliefGlobals.ts";
+ 
+/**
+ * The default data dot a phase node
+ * @param label: the label of this phase
+ * @param droppable: whether this node is droppable from the drop bar (initialized as true)
+ * @param norm: list of strings of norms for this node
+ * @param hasReduce: whether this node has reducing functionality (true by default)
+ */
+export type NormNodeData = {
+  label: string;
+  droppable: boolean;
+  condition?: string; // id of this node's belief.
+  norm: string;
+  hasReduce: boolean;
+  critical: boolean;
+};
+ 
+export type NormNode = Node<NormNodeData>
+ 
+/**
+ * Defines how a Norm node should be rendered
+ * @param props NodeProps, like id, label, children
+ * @returns React.JSX.Element
+ */
+export default function NormNode(props: NodeProps<NormNode>) {
+  const data = props.data;
+  const {updateNodeData} = useFlowStore();
+ 
+  const text_input_id = `norm_${props.id}_text_input`;
+  const checkbox_id = `goal_${props.id}_checkbox`;
+ 
+  const setValue = (value: string) => {
+    updateNodeData(props.id, {norm: value});
+  }
+ 
+  const setCritical = (value: boolean) => {
+    updateNodeData(props.id, {...data, critical: value});
+  }
+ 
+  return <>
+    <Toolbar nodeId={props.id} allowDelete={true}/>
+    <div className={`${styles.defaultNode} ${styles.nodeNorm}`}>
+      <div className={"flex-row gap-sm"}>
+        <label htmlFor={text_input_id}>Norm :</label>
+        <TextField
+          id={text_input_id}
+          value={data.norm}
+          setValue={(val) => setValue(val)}
+          placeholder={"Pepper should ..."}
+        />
+      </div>
+      <div className={"flex-row gap-md align-center"}>
+        <label htmlFor={checkbox_id}>Critical:</label>
+        <input
+          id={checkbox_id}
+          type={"checkbox"}
+          checked={data.critical || false}
+          onChange={(e) => setCritical(e.target.checked)}
+        />
+      </div>
+ 
+ 
+      {data.condition && (<div className={"flex-row gap-md align-center"} data-testid="norm-condition-information">
+        <label htmlFor={checkbox_id}>Condition/ Belief attached.</label>
+      </div>)}
+ 
+ 
+      <MultiConnectionHandle type="source" position={Position.Right} id="norms" rules={[
+        allowOnlyConnectionsFromHandle([{nodeType:"phase",handleId:"data"}])
+      ]}/>
+      <SingleConnectionHandle type="target" position={Position.Bottom} id="NormBeliefs" rules={[
+        allowOnlyConnectionsFromType(["basic_belief", "inferred_belief"])
+      ]}/>
+    </div>
+  </>;
+};
+ 
+ 
+/**
+ * Reduces each Norm, including its children down into its relevant data.
+ * @param node The Node Properties of this node.
+ * @param nodes all the nodes in the graph
+ */
+export function NormReduce(node: Node, nodes: Node[]) {
+  const data = node.data as NormNodeData;
+ 
+  // conditions nodes - make sure to check for empty arrays
+  const result: Record<string, unknown> = {
+    id: node.id,
+    label: data.label,
+    norm: data.norm,
+    critical: data.critical,
+  };
+ 
+  if (data.condition) {
+    const conditionNode = nodes.find((node) => node.id === data.condition);
+    // In case something went wrong, and our condition doesn't actually exist;
+    if (conditionNode == undefined) return result;
+    result["condition"] = BeliefGlobalReduce(conditionNode, nodes)
+  }
+  return result
+}
+ 
+export const NormTooltip = `
+  A norm describes a behavioral rule Pepper must follow during the connected phase(-s),
+  for example: "respond using formal language"`;
+ 
+/**
+ * This function is called whenever a connection is made with this node type as the target
+ * @param _thisNode the node of this node type which function is called
+ * @param _sourceNodeId the source of the received connection
+ */
+export function NormConnectionTarget(_thisNode: Node, _sourceNodeId: string) {
+  const data = _thisNode.data as NormNodeData;
+  // If we got a belief connected, this is the condition for the norm.
+  if ((useFlowStore.getState().nodes.find((node) => node.id === _sourceNodeId && ['basic_belief', 'inferred_belief'].includes(node.type!)))) {
+      data.condition = _sourceNodeId;
+    }
+}
+ 
+/**
+ * This function is called whenever a connection is made with this node type as the source
+ * @param _thisNode the node of this node type which function is called
+ * @param _targetNodeId the target of the created connection
+ */
+export function NormConnectionSource(_thisNode: Node, _targetNodeId: string) {
+  // no additional connection logic exists yet
+}
+ 
+/**
+ * This function is called whenever a connection is disconnected with this node type as the target
+ * @param _thisNode the node of this node type which function is called
+ * @param _sourceNodeId the source of the disconnected connection
+ */
+export function NormDisconnectionTarget(_thisNode: Node, _sourceNodeId: string) {
+  const data = _thisNode.data as NormNodeData;
+  // remove if the target of disconnection was our condition
+  if (_sourceNodeId == data.condition) data.condition = undefined
+}
+ 
+/**
+ * This function is called whenever a connection is disconnected with this node type as the source
+ * @param _thisNode the node of this node type which function is called
+ * @param _targetNodeId the target of the diconnected connection
+ */
+export function NormDisconnectionSource(_thisNode: Node, _targetNodeId: string) {
+  // no additional connection logic exists yet
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/PhaseNode.default.ts.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/PhaseNode.default.ts.html new file mode 100644 index 0000000..5216208 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/PhaseNode.default.ts.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/nodes/PhaseNode.default.ts + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/nodes PhaseNode.default.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13  +  +  +  +  +  +  +  +  +  +  +  + 
import type { PhaseNodeData } from "./PhaseNode";
+ 
+/**
+ * Default data for this node
+ */
+export const PhaseNodeDefaults: PhaseNodeData = {
+  label: "Phase Node",
+  droppable: true,
+  children: [],
+  hasReduce: true,
+  nextPhaseId: null,
+  isFirstPhase: false,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/PhaseNode.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/PhaseNode.tsx.html new file mode 100644 index 0000000..7cb7ab4 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/PhaseNode.tsx.html @@ -0,0 +1,700 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/nodes/PhaseNode.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/nodes PhaseNode.tsx

+
+ +
+ 0% + Statements + 0/71 +
+ + +
+ 0% + Branches + 0/23 +
+ + +
+ 0% + Functions + 0/19 +
+ + +
+ 0% + Lines + 0/56 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  type NodeProps,
+  Position,
+  type Node
+} from '@xyflow/react';
+import { Toolbar } from '../components/NodeComponents';
+import styles from '../../VisProg.module.css';
+import {SingleConnectionHandle, MultiConnectionHandle} from "../components/RuleBasedHandle.tsx";
+import {allowOnlyConnectionsFromType, noSelfConnections} from "../HandleRules.ts";
+import { NodeReduces, NodesInPhase, NodeTypes} from '../NodeRegistry';
+import useFlowStore from '../VisProgStores';
+import { TextField } from '../../../../components/TextField';
+ 
+/**
+ * The default data dot a phase node
+ * @param label: the label of this phase
+ * @param droppable: whether this node is droppable from the drop bar (initialized as true)
+ * @param children: ID's of children of this node
+ * @param hasReduce: whether this node has reducing functionality (true by default)
+ * @param nextPhaseId:
+ */
+export type PhaseNodeData = {
+  label: string;
+  droppable: boolean;
+  children: string[];
+  hasReduce: boolean;
+  nextPhaseId: string | "end" | null;
+  isFirstPhase: boolean;
+};
+ 
+export type PhaseNode = Node<PhaseNodeData>
+ 
+/**
+ * Defines how a phase node should be rendered
+ * @param props NodeProps, like id, label, children
+ * @returns React.JSX.Element
+ */
+export default function PhaseNode(props: NodeProps<PhaseNode>) {
+  const data = props.data;
+  const {updateNodeData} = useFlowStore();
+  const updateLabel = (value: string) => updateNodeData(props.id, {...data, label: value});
+  const label_input_id = `phase_${props.id}_label_input`;
+ 
+  return (
+    <>
+      <Toolbar nodeId={props.id} allowDelete={true}/>
+      <div className={`${styles.defaultNode} ${styles.nodePhase}`}>
+        <div className={"flex-row gap-sm"}>
+          <label htmlFor={label_input_id}>Name:</label>
+          <TextField
+            id={label_input_id}
+            value={data.label}
+            setValue={updateLabel}
+            placeholder={"Phase ..."}
+          />
+        </div>
+        <SingleConnectionHandle type="target" position={Position.Left} id="target" rules={[
+          noSelfConnections,
+          allowOnlyConnectionsFromType(["phase", "start"]),
+        ]}/>
+        <MultiConnectionHandle type="target" position={Position.Bottom} id="data" rules={[
+          allowOnlyConnectionsFromType(["norm", "goal", "trigger"])
+        ]}/>
+        <SingleConnectionHandle type="source" position={Position.Right} id="source" rules={[
+          noSelfConnections,
+          allowOnlyConnectionsFromType(["phase", "end"]),
+        ]}/>
+      </div>
+    </>
+  );
+};
+ 
+/**
+ * Reduces each phase, including its children down into its relevant data.
+ * @param node the node which is being reduced
+ * @param nodes all the nodes currently in the flow.
+ * @returns A collection of all reduced nodes in this phase, starting with this phases' reduced data.  
+ */
+export function PhaseReduce(node: Node, nodes: Node[]) {
+    const thisNode = node as PhaseNode;
+    const data = thisNode.data as PhaseNodeData;
+ 
+    // node typings that are not in phase
+    const nodesNotInPhase: string[] = Object.entries(NodesInPhase)
+        .filter(([, f]) => !f())
+        .map(([t]) => t);
+ 
+    // node typings that then are in phase
+    const nodesInPhase: string[] = Object.entries(NodeTypes)
+        .filter(([t]) => !nodesNotInPhase.includes(t))
+        .map(([t]) => t);
+ 
+    // children nodes - make sure to check for empty arrays
+    let childrenNodes: Node[] = [];
+    if (data.children) 
+      childrenNodes = nodes.filter((node) => data.children.includes(node.id));
+ 
+    // Build the result object
+    const result: Record<string, unknown> = {
+        id: thisNode.id,
+        name: data.label,
+    };
+ 
+    nodesInPhase.forEach((type) => {
+        const typedChildren = childrenNodes.filter((child) => child.type == type);
+        const reducer = NodeReduces[type as keyof typeof NodeReduces];
+        if (!reducer) {
+            console.warn(`No reducer found for node type ${type}`);
+            result[type + "s"] = [];
+        } else {
+            result[type + "s"] = [];
+            for (const typedChild of typedChildren) {
+              (result[type + "s"] as object[]).push(reducer(typedChild, nodes))
+            }
+        }
+    });
+ 
+    return result;
+}
+ 
+export const PhaseTooltip = `
+  A phase is a single stage of the program, during a phase Pepper will behave
+  in accordance with any connected norms, goals and triggers`;
+ 
+/**
+ * This function is called whenever a connection is made with this node type as the target (phase)
+ * @param _thisNode the node of this node type which function is called
+ * @param _sourceNodeId the source of the received connection
+ */
+export function PhaseConnectionTarget(_thisNode: Node, _sourceNodeId: string) {
+  const data = _thisNode.data as PhaseNodeData
+ 
+  const nodes = useFlowStore.getState().nodes;
+  const sourceNode = nodes.find((node) => node.id === _sourceNodeId)!
+  switch (sourceNode.type) {
+    case "phase": break;
+    case "start": data.isFirstPhase = true; break;
+    // we only add none phase or start nodes to the children
+    // endNodes cannot be the source of an outgoing connection
+    // so we don't need to cover them with a special case
+    // before handling the default behavior
+    default: data.children.push(_sourceNodeId); break;
+  }
+}
+ 
+/**
+ * This function is called whenever a connection is made with this node type as the source (phase)
+ * @param _thisNode the node of this node type which function is called
+ * @param _targetNodeId the target of the created connection
+ */
+export function PhaseConnectionSource(_thisNode: Node, _targetNodeId: string) {
+  const data = _thisNode.data as PhaseNodeData
+  const nodes = useFlowStore.getState().nodes;
+ 
+  const targetNode = nodes.find((node) => node.id === _targetNodeId)
+  if (!targetNode) {throw new Error("Source node not found")}
+ 
+  // we set the nextPhaseId to the next target's id if the target is a phaseNode,
+  // or "end" if the target node is the end node
+  switch (targetNode.type) {
+    case 'phase': data.nextPhaseId = _targetNodeId; break;
+    case 'end': data.nextPhaseId = "end"; break;
+    default: break;
+  }
+}
+ 
+/**
+ * This function is called whenever a connection is disconnected with this node type as the target (phase)
+ * @param _thisNode the node of this node type which function is called
+ * @param _sourceNodeId the source of the disconnected connection
+ */
+export function PhaseDisconnectionTarget(_thisNode: Node, _sourceNodeId: string) {
+  const data = _thisNode.data as PhaseNodeData
+ 
+  const nodes = useFlowStore.getState().nodes;
+  const sourceNode = nodes.find((node) => node.id === _sourceNodeId)
+  const sourceType = sourceNode ? sourceNode.type : "deleted";
+  switch (sourceType) {
+    case "phase": break;
+    case "start": data.isFirstPhase = false; break;
+    // we only add none phase or start nodes to the children
+    // endNodes cannot be the source of an outgoing connection
+    // so we don't need to cover them with a special case
+    // before handling the default behavior
+    default:
+      data.children = data.children.filter((child) => { if (child != _sourceNodeId) return child; });
+      break;
+  }
+ 
+}
+ 
+/**
+ * This function is called whenever a connection is disconnected with this node type as the source (phase)
+ * @param _thisNode the node of this node type which function is called
+ * @param _targetNodeId the target of the diconnected connection
+ */
+export function PhaseDisconnectionSource(_thisNode: Node, _targetNodeId: string) {
+  const data = _thisNode.data as PhaseNodeData
+  const nodes = useFlowStore.getState().nodes;
+ 
+  // if the target is a phase or end node set the nextPhaseId to null,
+  // as we are no longer connected to a subsequent phaseNode or to the endNode
+  if (nodes.some((node) => node.id === _targetNodeId && ['phase', 'end'].includes(node.type!))){
+    data.nextPhaseId = null;
+  }
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/StartNode.default.ts.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/StartNode.default.ts.html new file mode 100644 index 0000000..7f33028 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/StartNode.default.ts.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/nodes/StartNode.default.ts + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/nodes StartNode.default.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10  +  +  +  +  +  +  +  +  + 
import type { StartNodeData } from "./StartNode";
+ 
+/**
+ * Default data for this node.
+ */
+export const StartNodeDefaults: StartNodeData = {
+  label: "Start Node",
+  droppable: false,
+  hasReduce: true
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/StartNode.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/StartNode.tsx.html new file mode 100644 index 0000000..8121214 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/StartNode.tsx.html @@ -0,0 +1,364 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/nodes/StartNode.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/nodes StartNode.tsx

+
+ +
+ 0% + Statements + 0/3 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/6 +
+ + +
+ 0% + Lines + 0/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  type NodeProps,
+  Position,
+  type Node,
+} from '@xyflow/react';
+import { Toolbar } from '../components/NodeComponents';
+import styles from '../../VisProg.module.css';
+import {SingleConnectionHandle} from "../components/RuleBasedHandle.tsx";
+import {allowOnlyConnectionsFromHandle} from "../HandleRules.ts";
+ 
+ 
+export type StartNodeData = {
+  label: string;
+  droppable: boolean;
+  hasReduce: boolean;
+};
+ 
+ 
+export type StartNode = Node<StartNodeData>
+ 
+ 
+/**
+ * Defines how a Norm node should be rendered
+ * @param props NodeProps, like id, label, children
+ * @returns React.JSX.Element
+ */
+export default function StartNode(props: NodeProps<StartNode>) {
+  return (
+    <>
+      <Toolbar nodeId={props.id} allowDelete={false}/>
+      <div className={`${styles.defaultNode} ${styles.nodeStart}`}>
+        <div className={"flex-row gap-sm"}>
+          Start
+        </div>
+        <SingleConnectionHandle type="source" position={Position.Right} id="source" rules={[
+          allowOnlyConnectionsFromHandle([{nodeType:"phase",handleId:"target"}])
+        ]}/>
+      </div>
+    </>
+  );
+}
+ 
+/**
+ * The reduce function for this node type.
+ * @param node this node
+ * @param _nodes all the nodes in the graph
+ * @returns a reduced structure of this node
+ */
+export function StartReduce(node: Node, _nodes: Node[]) {
+  // Replace this for nodes functionality
+  return {
+    id: node.id
+  }
+}
+ 
+export const StartTooltip = `
+  The start node acts as the starting point for a program, 
+  it should be connected to the left handle of the first phase of your program`;
+ 
+/**
+ * This function is called whenever a connection is made with this node type as the target
+ * @param _thisNode the node of this node type which function is called
+ * @param _sourceNodeId the source of the received connection
+ */
+export function StartConnectionTarget(_thisNode: Node, _sourceNodeId: string) {
+  // no additional connection logic exists yet
+}
+ 
+/**
+ * This function is called whenever a connection is made with this node type as the source
+ * @param _thisNode the node of this node type which function is called
+ * @param _targetNodeId the target of the created connection
+ */
+export function StartConnectionSource(_thisNode: Node, _targetNodeId: string) {
+  // no additional connection logic exists yet
+}
+ 
+/**
+ * This function is called whenever a connection is disconnected with this node type as the target
+ * @param _thisNode the node of this node type which function is called
+ * @param _sourceNodeId the source of the disconnected connection
+ */
+export function StartDisconnectionTarget(_thisNode: Node, _sourceNodeId: string) {
+  // no additional connection logic exists yet
+}
+ 
+/**
+ * This function is called whenever a connection is disconnected with this node type as the source
+ * @param _thisNode the node of this node type which function is called
+ * @param _targetNodeId the target of the diconnected connection
+ */
+export function StartDisconnectionSource(_thisNode: Node, _targetNodeId: string) {
+  // no additional connection logic exists yet
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/TriggerNode.default.ts.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/TriggerNode.default.ts.html new file mode 100644 index 0000000..697aae4 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/TriggerNode.default.ts.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/nodes/TriggerNode.default.ts + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/nodes TriggerNode.default.ts

+
+ +
+ 0% + Statements + 0/1 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 0% + Lines + 0/1 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11  +  +  +  +  +  +  +  +  +  + 
import type { TriggerNodeData } from "./TriggerNode";
+ 
+/**
+ * Default data for this node
+ */
+export const TriggerNodeDefaults: TriggerNodeData = {
+  label: "Trigger Node",
+  name: "",
+  droppable: true,
+  hasReduce: true,
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/TriggerNode.tsx.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/TriggerNode.tsx.html new file mode 100644 index 0000000..6652f67 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/TriggerNode.tsx.html @@ -0,0 +1,700 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/nodes/TriggerNode.tsx + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/nodes TriggerNode.tsx

+
+ +
+ 0% + Statements + 0/29 +
+ + +
+ 0% + Branches + 0/28 +
+ + +
+ 0% + Functions + 0/11 +
+ + +
+ 0% + Lines + 0/25 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {
+  type NodeProps,
+  Position,
+  type Node,
+} from '@xyflow/react';
+import { Toolbar } from '../components/NodeComponents';
+import styles from '../../VisProg.module.css';
+import {MultiConnectionHandle, SingleConnectionHandle} from "../components/RuleBasedHandle.tsx";
+import {allowOnlyConnectionsFromHandle, allowOnlyConnectionsFromType} from "../HandleRules.ts";
+import useFlowStore from '../VisProgStores';
+import {PlanReduce, type Plan } from '../components/Plan';
+import PlanEditorDialog from '../components/PlanEditor';
+import {BeliefGlobalReduce} from "./BeliefGlobals.ts";
+import type { GoalNode } from './GoalNode.tsx';
+import { defaultPlan } from '../components/Plan.default.ts';
+import { deleteGoalInPlanByID, insertGoalInPlan } from '../components/PlanEditingFunctions.tsx';
+import { TextField } from '../../../../components/TextField.tsx';
+ 
+/**
+ * The default data structure for a Trigger node
+ *
+ * Represents configuration for a node that activates when a specific condition is met,
+ * such as keywords being spoken or emotions detected.
+ *
+ * @property label: the display label of this Trigger node.
+ * @property droppable: Whether this node can be dropped from the toolbar (default: true).
+ * @property hasReduce - Whether this node supports reduction logic.
+ */
+export type TriggerNodeData = {
+  label: string;
+  name: string;
+  droppable: boolean;
+  condition?: string; // id of the belief
+  plan?: Plan;
+  hasReduce: boolean;
+};
+ 
+ 
+export type TriggerNode = Node<TriggerNodeData>
+ 
+/**
+ * Defines how a Trigger node should be rendered
+ * @param props - Node properties provided by React Flow, including `id` and `data`.
+ * @returns The rendered TriggerNode React element (React.JSX.Element).
+ */
+export default function TriggerNode(props: NodeProps<TriggerNode>) {
+  const data = props.data;
+  const {updateNodeData} = useFlowStore();
+ 
+  const setName= (value: string) => {
+    updateNodeData(props.id, {...data, name: value})
+  }
+  
+  return <>
+  
+    <Toolbar nodeId={props.id} allowDelete={true}/>
+    <div className={`${styles.defaultNode} ${styles.nodeTrigger} flex-col gap-sm`}>
+      <TextField
+                value={props.data.name}
+                setValue={(val) => setName(val)}
+                placeholder={"Name of this trigger..."}
+      />
+      <div className={"flex-row gap-md"}>Triggers when the condition is met.</div>
+      <div className={"flex-row gap-md"}>Condition/ Belief is currently {data.condition ? "" : "not"} set. {data.condition ? "🟢" : "🔴"}</div>
+      <div className={"flex-row gap-md"}>Plan{data.plan ? (": " + data.plan.name) : ""} is currently {data.plan ? "" : "not"} set. {data.plan ? "🟢" : "🔴"}</div>
+      <MultiConnectionHandle type="source" position={Position.Right} id="TriggerSource" rules={[
+        allowOnlyConnectionsFromHandle([{nodeType:"phase",handleId:"data"}]),
+      ]}/>
+      <SingleConnectionHandle
+        type="target"
+        position={Position.Bottom}
+        id="TriggerBeliefs"
+        style={{ left: '40%' }} 
+        rules={[
+          allowOnlyConnectionsFromType(['basic_belief', "inferred_belief"]),
+        ]}
+      />
+      
+      <MultiConnectionHandle
+        type="target"
+        position={Position.Bottom}
+        id="GoalTarget"
+        style={{ left: '60%' }}
+        rules={[
+          allowOnlyConnectionsFromType(['goal']),
+        ]}
+      />
+ 
+      <PlanEditorDialog
+          plan={data.plan}
+          onSave={(plan) => {
+            updateNodeData(props.id, {
+              ...data,
+              plan,
+            });
+          }}
+      />
+    </div>
+  </>;
+}
+ 
+/**
+ * Reduces each Trigger, including its children down into its core data.
+ * @param node - The Trigger node to reduce.
+ * @param nodes - The list of all nodes in the current flow graph.
+ * @returns A simplified object containing the node label and its list of triggers.
+ */
+export function TriggerReduce(node: Node, nodes: Node[]) {
+  const data = node.data as TriggerNodeData;
+  const conditionNode = data.condition ? nodes.find((n)=>n.id===data.condition) : undefined
+  const conditionData = conditionNode ? BeliefGlobalReduce(conditionNode, nodes) : ""
+  return {
+    id: node.id,
+    name: node.data.name,
+    condition: conditionData, // Make sure we have a condition before reducing, or default to ""
+    plan: !data.plan ? "" : PlanReduce(nodes, data.plan), // Make sure we have a plan when reducing, or default to ""
+  }
+  
+}
+ 
+ 
+export const TriggerTooltip = `
+  A trigger node is used to make Pepper execute a predefined plan -
+  consisting of one or more actions - when the connected beliefs are met`;
+ 
+/**
+ * This function is called whenever a connection is made with this node type as the target
+ * @param _thisNode the node of this node type which function is called
+ * @param _sourceNodeId the source of the received connection
+ */
+export function TriggerConnectionTarget(_thisNode: Node, _sourceNodeId: string) {
+  // no additional connection logic exists yet
+  const data = _thisNode.data as TriggerNodeData;
+  // If we got a belief connected, this is the condition for the norm.
+  const nodes = useFlowStore.getState().nodes;
+  const otherNode = nodes.find((x) => x.id === _sourceNodeId)
+  if (!otherNode) return;
+ 
+  if (otherNode.type === 'basic_belief'||'inferred_belief') {
+      data.condition = _sourceNodeId;
+  }
+ 
+  else if (otherNode.type === 'goal') {
+      // First, let's see if we have a plan currently. If not, let's create a default plan with this goal inside.:)
+    if (!data.plan) {
+      data.plan = insertGoalInPlan({...structuredClone(defaultPlan), id: crypto.randomUUID()} as Plan, otherNode as GoalNode)
+    }
+ 
+    // Else, lets just insert this goal into our current plan.
+    else {
+      data.plan = insertGoalInPlan(structuredClone(data.plan), otherNode as GoalNode)
+    }
+  }
+}
+ 
+/**
+ * This function is called whenever a connection is made with this node type as the source
+ * @param _thisNode the node of this node type which function is called
+ * @param _targetNodeId the target of the created connection
+ */
+export function TriggerConnectionSource(_thisNode: Node, _targetNodeId: string) {
+  // no additional connection logic exists yet
+}
+ 
+/**
+ * This function is called whenever a connection is disconnected with this node type as the target
+ * @param _thisNode the node of this node type which function is called
+ * @param _sourceNodeId the source of the disconnected connection
+ */
+export function TriggerDisconnectionTarget(_thisNode: Node, _sourceNodeId: string) {
+  // no additional connection logic exists yet
+  const data = _thisNode.data as TriggerNodeData;
+    // remove if the target of disconnection was our condition
+    if (_sourceNodeId == data.condition) data.condition = undefined
+    
+  data.plan = deleteGoalInPlanByID(structuredClone(data.plan) as Plan, _sourceNodeId)
+}
+ 
+/**
+ * This function is called whenever a connection is disconnected with this node type as the source
+ * @param _thisNode the node of this node type which function is called
+ * @param _targetNodeId the target of the diconnected connection
+ */
+export function TriggerDisconnectionSource(_thisNode: Node, _targetNodeId: string) {
+  // no additional connection logic exists yet
+}
+ 
+// Definitions for the possible triggers, being keywords and emotions
+ 
+/** Represents a single keyword trigger entry. */
+type Keyword = { id: string, keyword: string };
+ 
+/** Properties for an emotion-type trigger node. */
+export type EmotionTriggerNodeProps = {
+  type: "emotion";
+  value: string;
+}
+ 
+/** Props for a keyword-type trigger node. */
+export type KeywordTriggerNodeProps = {
+  type: "keywords";
+  value: Keyword[];
+}
+ 
+/** Union type for all possible Trigger node configurations. */
+export type TriggerNodeProps = EmotionTriggerNodeProps | KeywordTriggerNodeProps;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/index.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/index.html new file mode 100644 index 0000000..8863732 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/nodes/index.html @@ -0,0 +1,341 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/nodes + + + + + + + + + +
+
+

All files src/pages/VisProgPage/visualProgrammingUI/nodes

+
+ +
+ 0% + Statements + 0/232 +
+ + +
+ 0% + Branches + 0/134 +
+ + +
+ 0% + Functions + 0/87 +
+ + +
+ 0% + Lines + 0/191 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
BasicBeliefNode.default.ts +
+
0%0/1100%0/0100%0/00%0/1
BeliefGlobals.ts +
+
0%0/260%0/180%0/90%0/20
EndNode.default.ts +
+
0%0/1100%0/0100%0/00%0/1
EndNode.tsx +
+
0%0/3100%0/00%0/60%0/3
GoalNode.default.ts +
+
0%0/1100%0/0100%0/00%0/1
GoalNode.tsx +
+
0%0/300%0/350%0/130%0/28
InferredBeliefNode.default.ts +
+
0%0/1100%0/0100%0/00%0/1
InferredBeliefNode.tsx +
+
0%0/340%0/160%0/110%0/24
NormNode.default.ts +
+
0%0/1100%0/0100%0/00%0/1
NormNode.tsx +
+
0%0/280%0/140%0/120%0/24
PhaseNode.default.ts +
+
0%0/1100%0/0100%0/00%0/1
PhaseNode.tsx +
+
0%0/710%0/230%0/190%0/56
StartNode.default.ts +
+
0%0/1100%0/0100%0/00%0/1
StartNode.tsx +
+
0%0/3100%0/00%0/60%0/3
TriggerNode.default.ts +
+
0%0/1100%0/0100%0/00%0/1
TriggerNode.tsx +
+
0%0/290%0/280%0/110%0/25
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/utils/AddNode.ts.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/utils/AddNode.ts.html new file mode 100644 index 0000000..63a958b --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/utils/AddNode.ts.html @@ -0,0 +1,199 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/utils/AddNode.ts + + + + + + + + + +
+
+

All files / src/pages/VisProgPage/visualProgrammingUI/utils AddNode.ts

+
+ +
+ 100% + Statements + 15/15 +
+ + +
+ 66.66% + Branches + 4/6 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 14/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39  +2x +2x +  +  +  +  +  +  +2x +6x +  +  +6x +  +  +10x +  +6x +  +2x +2x +2x +2x +  +  +6x +  +  +6x +  +  +  +  +  +  +  +6x + 
import type { XYPosition } from "@xyflow/react";
+import { NodeDefaults, type NodeTypes } from "../NodeRegistry";
+import useFlowStore from "../VisProgStores";
+ 
+ 
+/**
+ * addNode — adds a new node to the flow using the unified class-based system.
+ * Keeps numbering logic for phase/norm nodes.
+ */
+export default function addNode(nodeType: keyof typeof NodeTypes, position: XYPosition) {
+  const { nodes, setNodes } = useFlowStore.getState();
+ 
+  // Find out if there's any default data about our ndoe
+  const defaultData = NodeDefaults[nodeType] ?? {}
+ 
+  // Currently, we find out what the Id is by checking the last node and adding one
+  const sameTypeNodes = nodes.filter((node) => node.type === nodeType);
+  const nextNumber =
+    sameTypeNodes.length > 0
+      ? (() => {
+          const lastNode = sameTypeNodes[sameTypeNodes.length - 1];
+          const parts = lastNode.id.split('-');
+          const lastNum = Number(parts[1]);
+          return Number.isNaN(lastNum) ? sameTypeNodes.length + 1 : lastNum + 1;
+        })()
+      : 1;
+  const id = `${nodeType}-${nextNumber}`;
+  
+  // Create new node
+  const newNode = {
+    id: id,
+    type: nodeType,
+    position,
+    // Deep copy using JSON because thats how things work:
+    // Ref: https://developer.mozilla.org/en-US/docs/Glossary/Deep_copy
+    data: JSON.parse(JSON.stringify(defaultData))
+  }
+  setNodes([...nodes, newNode]);
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/utils/index.html b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/utils/index.html new file mode 100644 index 0000000..70d1a34 --- /dev/null +++ b/coverage/lcov-report/src/pages/VisProgPage/visualProgrammingUI/utils/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/pages/VisProgPage/visualProgrammingUI/utils + + + + + + + + + +
+
+

All files src/pages/VisProgPage/visualProgrammingUI/utils

+
+ +
+ 100% + Statements + 15/15 +
+ + +
+ 66.66% + Branches + 4/6 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 14/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
AddNode.ts +
+
100%15/1566.66%4/6100%3/3100%14/14
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/utils/SaveLoad.ts.html b/coverage/lcov-report/src/utils/SaveLoad.ts.html new file mode 100644 index 0000000..c574ffd --- /dev/null +++ b/coverage/lcov-report/src/utils/SaveLoad.ts.html @@ -0,0 +1,139 @@ + + + + + + Code coverage report for src/utils/SaveLoad.ts + + + + + + + + + +
+
+

All files / src/utils SaveLoad.ts

+
+ +
+ 0% + Statements + 0/2 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/2 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {type Edge, type Node } from "@xyflow/react";
+ 
+export type SavedProject = {
+  name: string;
+  savedASavedProject: string; // ISO timestamp
+  nodes: Node[];
+  edges: Edge[];
+};
+ 
+// Creates a JSON Blob containing the current visual program (nodes + edges)
+export function makeProjectBlob(name: string, nodes: Node[], edges: Edge[]): Blob {
+  const payload = {
+    name,
+    savedAt: new Date().toISOString(),
+    nodes,
+    edges,
+  };
+  return new Blob([JSON.stringify(payload, null, 2)], { type: "application/json" });
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/utils/cellStore.ts.html b/coverage/lcov-report/src/utils/cellStore.ts.html new file mode 100644 index 0000000..ac5972f --- /dev/null +++ b/coverage/lcov-report/src/utils/cellStore.ts.html @@ -0,0 +1,373 @@ + + + + + + Code coverage report for src/utils/cellStore.ts + + + + + + + + + +
+
+

All files / src/utils cellStore.ts

+
+ +
+ 0% + Statements + 0/11 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/6 +
+ + +
+ 0% + Lines + 0/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {useSyncExternalStore} from "react";
+ 
+type Unsub = () => void;
+ 
+ 
+/**
+ * A simple reactive state container that holds a value of type `T` that provides methods to get, set, and subscribe.
+ */
+export type Cell<T> = {
+  /**
+   * Returns the current value stored in the cell.
+   */
+  get: () => T;
+  /**
+   * Updates the cell's value, pass either a direct value or an updater function.
+   *
+   * @example
+   * ```ts
+   * count.set(5);
+   * count.set(prev => prev + 1);
+   * ```
+   */
+  set: (next: T | ((prev: T) => T)) => void;
+ 
+  /**
+   * Subscribe to changes in the cell's value, meaning the provided callback is called whenever the value changes.
+   * Returns an unsubscribe function.
+   *
+   * @example
+   * ```ts
+   * const unsubscribe = count.subscribe(() => console.log(count.get()));
+   * // later:
+   * unsubscribe();
+   * ```
+   */
+  subscribe: (callback: () => void) => Unsub;
+};
+ 
+/**
+ * Creates a new reactive state container (`Cell`) with an initial value.
+ *
+ * This function allows you to store and mutate state outside of React,
+ * while still supporting subscriptions for reactivity.
+ *
+ * @param initial - The initial value for the cell.
+ * @returns A Cell object with `get`, `set`, and `subscribe` methods.
+ *
+ * @example
+ * ```ts
+ * const count = cell(0);
+ * count.set(10);
+ * console.log(count.get()); // 10
+ * ```
+ */
+export function cell<T>(initial: T): Cell<T> {
+  let value = initial;
+  const listeners = new Set<() => void>();
+  return {
+    get: () => value,
+    set: (next) => {
+      value = typeof next === "function" ? (next as (v: T) => T)(value) : next;
+      for (const l of listeners) l();
+    },
+    subscribe: (callback) => {
+      listeners.add(callback);
+      return () => listeners.delete(callback);
+    },
+  };
+}
+ 
+/**
+ * React hook that subscribes a component to a Cell.
+ *
+ * Automatically re-renders the component whenever the Cell's value changes.
+ * Uses React’s built-in `useSyncExternalStore` for correct subscription behavior.
+ *
+ * @param c - The cell to subscribe to.
+ * @returns The current value of the cell.
+ *
+ * @example
+ * ```tsx
+ * const count = cell(0);
+ *
+ * function Counter() {
+ *   const value = useCell(count);
+ *   return (
+ *     <button onClick={() => count.set(v => v + 1)}>
+ *       Count: {value}
+ *     </button>
+ *   );
+ * }
+ * ```
+ */
+export function useCell<T>(c: Cell<T>) {
+  return useSyncExternalStore(c.subscribe, c.get, c.get);
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/utils/duplicateIndices.ts.html b/coverage/lcov-report/src/utils/duplicateIndices.ts.html new file mode 100644 index 0000000..3577dc8 --- /dev/null +++ b/coverage/lcov-report/src/utils/duplicateIndices.ts.html @@ -0,0 +1,142 @@ + + + + + + Code coverage report for src/utils/duplicateIndices.ts + + + + + + + + + +
+
+

All files / src/utils duplicateIndices.ts

+
+ +
+ 0% + Statements + 0/7 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Find the indices of all elements that occur more than once.
+ *
+ * @param array The array to search for duplicates.
+ * @returns An array of indices where an element occurs more than once, in no particular order.
+ */
+export default function duplicateIndices<T>(array: T[]): number[] {
+  const positions = new Map<T, number[]>();
+ 
+  array.forEach((value, i) => {
+    if (!positions.has(value)) positions.set(value, []);
+    positions.get(value)!.push(i);
+  });
+ 
+  // flatten all index lists with more than one element
+  return Array.from(positions.values())
+    .filter(idxs => idxs.length > 1)
+    .flat();
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/utils/formatDuration.ts.html b/coverage/lcov-report/src/utils/formatDuration.ts.html new file mode 100644 index 0000000..5c59e89 --- /dev/null +++ b/coverage/lcov-report/src/utils/formatDuration.ts.html @@ -0,0 +1,148 @@ + + + + + + Code coverage report for src/utils/formatDuration.ts + + + + + + + + + +
+
+

All files / src/utils formatDuration.ts

+
+ +
+ 0% + Statements + 0/8 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/7 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
/**
+ * Format a time duration like `HH:MM:SS.mmm`.
+ *
+ * @param durationMs time duration in milliseconds.
+ * @return formatted time string.
+ */
+export default function formatDuration(durationMs: number): string {
+  const isNegative = durationMs < 0;
+  if (isNegative) durationMs = -durationMs;
+ 
+  const hours = Math.floor(durationMs / 3600000);
+  const minutes = Math.floor((durationMs % 3600000) / 60000);
+  const seconds = Math.floor((durationMs % 60000) / 1000);
+  const milliseconds = Math.floor(durationMs % 1000);
+ 
+  return (isNegative ? '-' : '') +
+    `${hours.toString().padStart(2, '0')}:` +
+    `${minutes.toString().padStart(2, '0')}:` +
+    `${seconds.toString().padStart(2, '0')}.` +
+    `${milliseconds.toString().padStart(3, '0')}`;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/utils/index.html b/coverage/lcov-report/src/utils/index.html new file mode 100644 index 0000000..92d4ba1 --- /dev/null +++ b/coverage/lcov-report/src/utils/index.html @@ -0,0 +1,206 @@ + + + + + + Code coverage report for src/utils + + + + + + + + + +
+
+

All files src/utils

+
+ +
+ 0% + Statements + 0/84 +
+ + +
+ 0% + Branches + 0/30 +
+ + +
+ 0% + Functions + 0/28 +
+ + +
+ 0% + Lines + 0/69 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
SaveLoad.ts +
+
0%0/2100%0/00%0/10%0/2
cellStore.ts +
+
0%0/110%0/20%0/60%0/9
duplicateIndices.ts +
+
0%0/70%0/20%0/30%0/6
formatDuration.ts +
+
0%0/80%0/40%0/10%0/7
orderPhaseNodes.ts +
+
0%0/180%0/80%0/30%0/15
priorityFiltering.ts +
+
0%0/120%0/80%0/10%0/10
programStore.ts +
+
0%0/260%0/60%0/130%0/20
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/utils/orderPhaseNodes.ts.html b/coverage/lcov-report/src/utils/orderPhaseNodes.ts.html new file mode 100644 index 0000000..fb6632c --- /dev/null +++ b/coverage/lcov-report/src/utils/orderPhaseNodes.ts.html @@ -0,0 +1,202 @@ + + + + + + Code coverage report for src/utils/orderPhaseNodes.ts + + + + + + + + + +
+
+

All files / src/utils orderPhaseNodes.ts

+
+ +
+ 0% + Statements + 0/18 +
+ + +
+ 0% + Branches + 0/8 +
+ + +
+ 0% + Functions + 0/3 +
+ + +
+ 0% + Lines + 0/15 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import type {PhaseNode} from "../pages/VisProgPage/visualProgrammingUI/nodes/PhaseNode.tsx";
+ 
+/**
+ * takes an array of phaseNodes and orders them according to their nextPhaseId attributes,
+ * starting with the phase that has isFirstPhase = true
+ *
+ * @param {PhaseNode[]} nodes an unordered phaseNode array
+ * @returns {PhaseNode[]} the ordered phaseNode array
+ */
+export default function orderPhaseNodeArray(nodes: PhaseNode[]) : PhaseNode[] {
+  // find the first phaseNode of the sequence
+  const start = nodes.find(node => node.data.isFirstPhase);
+  if (!start) {
+    throw new Error('No phaseNode with isFirstObject = true found');
+  }
+ 
+  // prepare for ordering of phaseNodes
+  const orderedPhaseNodes: PhaseNode[] = [];
+  const IdMap = new Map(nodes.map(node => [node.id, node]));
+  let currentNode: PhaseNode | undefined = start;
+ 
+  // populate orderedPhaseNodes array with the phaseNodes in the correct order
+  while (currentNode) {
+    orderedPhaseNodes.push(currentNode);
+ 
+    if (!currentNode.data.nextPhaseId) {
+      throw new Error("Incomplete phase sequence, program does not reach the end node");
+    }
+ 
+    if (currentNode.data.nextPhaseId === "end") break;
+ 
+    currentNode = IdMap.get(currentNode.data.nextPhaseId);
+ 
+    if (!currentNode) {
+      throw new Error(`Incomplete phase sequence, phaseNode with id "${orderedPhaseNodes.at(-1)?.data.nextPhaseId}" not found`);
+    }
+  }
+ 
+  return orderedPhaseNodes;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/utils/priorityFiltering.ts.html b/coverage/lcov-report/src/utils/priorityFiltering.ts.html new file mode 100644 index 0000000..b93c834 --- /dev/null +++ b/coverage/lcov-report/src/utils/priorityFiltering.ts.html @@ -0,0 +1,157 @@ + + + + + + Code coverage report for src/utils/priorityFiltering.ts + + + + + + + + + +
+
+

All files / src/utils priorityFiltering.ts

+
+ +
+ 0% + Statements + 0/12 +
+ + +
+ 0% + Branches + 0/8 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 0% + Lines + 0/10 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
export type PriorityFilterPredicate<T> = {
+  priority: number;
+  predicate: (element: T) => boolean | null; // The predicate and its priority are ignored if it returns null.
+}
+ 
+/**
+ * Applies a list of priority predicates to an element. For all predicates that don't return null, if the ones with the highest level return true, then this function returns true.
+ * @param element The element to apply the predicates to.
+ * @param predicates The list of predicates to apply.
+ */
+export function applyPriorityPredicates<T>(element: T, predicates: PriorityFilterPredicate<T>[]): boolean {
+  let highestPriority = -1;
+  let highestKeep = true;
+  for (const predicate of predicates) {
+    if (predicate.priority >= highestPriority) {
+      const predicateKeep = predicate.predicate(element);
+      if (predicateKeep === null) continue; // This predicate doesn't care about the element, so skip it
+      if (predicate.priority > highestPriority) highestKeep = true;
+      highestPriority = predicate.priority;
+      highestKeep = highestKeep && predicateKeep;
+    }
+  }
+  return highestKeep;
+}
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/utils/programStore.ts.html b/coverage/lcov-report/src/utils/programStore.ts.html new file mode 100644 index 0000000..b8000b7 --- /dev/null +++ b/coverage/lcov-report/src/utils/programStore.ts.html @@ -0,0 +1,340 @@ + + + + + + Code coverage report for src/utils/programStore.ts + + + + + + + + + +
+
+

All files / src/utils programStore.ts

+
+ +
+ 0% + Statements + 0/26 +
+ + +
+ 0% + Branches + 0/6 +
+ + +
+ 0% + Functions + 0/13 +
+ + +
+ 0% + Lines + 0/20 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import {create} from "zustand";
+ 
+// the type of a reduced program
+export type ReducedProgram = { phases: Record<string, unknown>[] };
+ 
+/**
+ * the type definition of the programStore
+ */
+export type ProgramState = {
+  // Basic store functionality:
+  currentProgram: ReducedProgram;
+  setProgramState: (state: ReducedProgram) => void;
+  getProgramState: () => ReducedProgram;
+ 
+  // Utility functions:
+  // to avoid having to manually go through the entire state for every instance where data is required
+  getPhaseIds: () => string[];
+  getPhaseNames: () => string[];
+  getNormsInPhase: (currentPhaseId: string) => Record<string, unknown>[];
+  getGoalsInPhase: (currentPhaseId: string) => Record<string, unknown>[];
+  getTriggersInPhase: (currentPhaseId: string) => Record<string, unknown>[];
+  // if more specific utility functions are needed they can be added here:
+}
+ 
+/**
+ * the ProgramStore can be used to access all information of the most recently sent program,
+ * it contains basic functions to set and get the current program.
+ * And it contains some utility functions that allow you to easily gain access
+ * to the norms, triggers and goals of a specific phase.
+ */
+const useProgramStore = create<ProgramState>((set, get) => ({
+  currentProgram: { phases: [] as Record<string, unknown>[]},
+  /**
+   * sets the current program by cloning the provided program using a structuredClone
+   */
+  setProgramState: (program: ReducedProgram) => set({currentProgram: structuredClone(program)}),
+  /**
+   * gets the current program
+   */
+  getProgramState: () => get().currentProgram,
+ 
+  // utility functions:
+  /**
+   * gets the ids of all phases in the program
+   */
+  getPhaseIds: () => get().currentProgram.phases.map(entry => entry["id"] as string),
+   /**
+   * gets the names of all phases in the program
+   */
+  getPhaseNames: () => get().currentProgram.phases.map((entry) => (entry["name"] as string)),
+  /**
+   * gets the norms for the provided phase
+   */
+  getNormsInPhase: (currentPhaseId) => {
+    const program = get().currentProgram;
+    const phase = program.phases.find(val => val["id"] === currentPhaseId);
+    if (phase) {
+      return phase["norms"] as Record<string, unknown>[];
+    }
+    throw new Error(`phase with id:"${currentPhaseId}" not found`)
+  },
+  /**
+   * gets the goals for the provided phase
+   */
+  getGoalsInPhase: (currentPhaseId) => {
+    const program = get().currentProgram;
+    const phase = program.phases.find(val => val["id"] === currentPhaseId);
+    if (phase) {
+      return phase["goals"] as Record<string, unknown>[];
+    }
+    throw new Error(`phase with id:"${currentPhaseId}" not found`)
+  },
+  /**
+   * gets the triggers for the provided phase
+   */
+  getTriggersInPhase: (currentPhaseId) => {
+    const program = get().currentProgram;
+    const phase = program.phases.find(val => val["id"] === currentPhaseId);
+    if (phase) {
+      return phase["triggers"] as Record<string, unknown>[];
+    }
+    throw new Error(`phase with id:"${currentPhaseId}" not found`)
+  }
+}));
+ 
+export default useProgramStore;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov.info b/coverage/lcov.info new file mode 100644 index 0000000..7adce76 --- /dev/null +++ b/coverage/lcov.info @@ -0,0 +1,2896 @@ +TN: +SF:src\App.tsx +FN:12,App +FN:19,(anonymous_1) +FNF:2 +FNH:0 +FNDA:0,App +FNDA:0,(anonymous_1) +DA:13,0 +DA:15,0 +DA:19,0 +LF:3 +LH:0 +BRDA:31,0,0,0 +BRDA:31,0,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:src\main.tsx +FNF:0 +FNH:0 +DA:7,0 +LF:1 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\MultilineTextField.tsx +FN:4,MultilineTextField +FN:27,(anonymous_1) +FN:32,(anonymous_2) +FN:40,(anonymous_3) +FN:45,(anonymous_4) +FN:58,(anonymous_5) +FN:59,(anonymous_6) +FNF:7 +FNH:0 +FNDA:0,MultilineTextField +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +DA:23,0 +DA:24,0 +DA:25,0 +DA:27,0 +DA:28,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:36,0 +DA:37,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:52,0 +DA:58,0 +DA:59,0 +LF:20 +LH:0 +BRDA:5,0,0,0 +BRDA:11,1,0,0 +BRDA:12,2,0,0 +BRDA:34,3,0,0 +BRDA:34,3,1,0 +BRDA:46,4,0,0 +BRDA:46,4,1,0 +BRDA:46,5,0,0 +BRDA:46,5,1,0 +BRDA:46,5,2,0 +BRDA:66,6,0,0 +BRDA:66,6,1,0 +BRDA:70,7,0,0 +BRDA:70,7,1,0 +BRDA:71,8,0,0 +BRDA:71,8,1,0 +BRF:16 +BRH:0 +end_of_record +TN: +SF:src\components\ScrollIntoView.tsx +FN:13,ScrollIntoView +FN:17,(anonymous_1) +FNF:2 +FNH:0 +FNDA:0,ScrollIntoView +FNDA:0,(anonymous_1) +DA:15,0 +DA:17,0 +DA:18,0 +DA:21,0 +LF:4 +LH:0 +BRDA:18,0,0,0 +BRDA:18,0,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:src\components\TextField.tsx +FN:22,RealtimeTextField +FN:45,(anonymous_1) +FN:51,(anonymous_2) +FN:59,(anonymous_3) +FN:60,(anonymous_4) +FN:89,TextField +FN:108,(anonymous_6) +FN:112,(anonymous_7) +FNF:8 +FNH:0 +FNDA:0,RealtimeTextField +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,TextField +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +DA:42,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:55,0 +DA:59,0 +DA:60,0 +DA:106,0 +DA:108,0 +DA:109,0 +DA:112,0 +DA:114,0 +LF:15 +LH:0 +BRDA:23,0,0,0 +BRDA:30,1,0,0 +BRDA:52,2,0,0 +BRDA:52,2,1,0 +BRDA:66,3,0,0 +BRDA:66,3,1,0 +BRDA:66,4,0,0 +BRDA:66,4,1,0 +BRDA:90,5,0,0 +BRDA:96,6,0,0 +BRF:10 +BRH:0 +end_of_record +TN: +SF:src\components\components.tsx +FN:10,Counter +FN:16,(anonymous_1) +FN:16,(anonymous_2) +FN:19,(anonymous_3) +FNF:4 +FNH:0 +FNDA:0,Counter +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +DA:12,0 +DA:14,0 +DA:16,0 +DA:19,0 +LF:4 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\components\Logging\Filters.tsx +FN:38,LevelPredicateElement +FN:67,(anonymous_1) +FN:69,(anonymous_2) +FN:89,GlobalLevelFilter +FN:97,(anonymous_4) +FN:100,(anonymous_5) +FN:103,(anonymous_6) +FN:112,(anonymous_7) +FN:140,AgentLevelFilters +FN:153,(anonymous_9) +FN:155,(anonymous_10) +FN:158,(anonymous_11) +FN:165,(anonymous_12) +FN:172,(anonymous_13) +FN:182,(anonymous_14) +FN:184,(anonymous_15) +FN:187,(anonymous_16) +FN:202,(anonymous_17) +FN:203,(anonymous_18) +FN:213,(anonymous_19) +FN:220,(anonymous_20) +FN:221,(anonymous_21) +FN:229,(anonymous_22) +FN:231,(anonymous_23) +FN:250,Filters +FNF:25 +FNH:0 +FNDA:0,LevelPredicateElement +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,GlobalLevelFilter +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,AgentLevelFilters +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:0,(anonymous_18) +FNDA:0,(anonymous_19) +FNDA:0,(anonymous_20) +FNDA:0,(anonymous_21) +FNDA:0,(anonymous_22) +FNDA:0,(anonymous_23) +FNDA:0,Filters +DA:16,0 +DA:49,0 +DA:51,0 +DA:67,0 +DA:70,0 +DA:77,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:107,0 +DA:112,0 +DA:113,0 +DA:114,0 +DA:118,0 +DA:126,0 +DA:149,0 +DA:150,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:172,0 +DA:173,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:185,0 +DA:186,0 +DA:187,0 +DA:193,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:212,0 +DA:214,0 +DA:216,0 +DA:220,0 +DA:221,0 +DA:229,0 +DA:232,0 +DA:259,0 +LF:58 +LH:0 +BRDA:49,0,0,0 +BRDA:49,0,1,0 +BRDA:56,1,0,0 +BRDA:56,1,1,0 +BRDA:96,2,0,0 +BRDA:96,2,1,0 +BRDA:98,3,0,0 +BRDA:98,3,1,0 +BRDA:98,4,0,0 +BRDA:98,4,1,0 +BRDA:113,5,0,0 +BRDA:113,5,1,0 +BRDA:154,6,0,0 +BRDA:154,6,1,0 +BRDA:156,7,0,0 +BRDA:156,7,1,0 +BRDA:159,8,0,0 +BRDA:159,8,1,0 +BRDA:183,9,0,0 +BRDA:183,9,1,0 +BRDA:183,9,2,0 +BRDA:187,10,0,0 +BRDA:187,10,1,0 +BRDA:205,11,0,0 +BRDA:205,11,1,0 +BRDA:229,12,0,0 +BRDA:229,12,1,0 +BRF:27 +BRH:0 +end_of_record +TN: +SF:src\components\Logging\Logging.tsx +FN:31,(anonymous_0) +FN:33,(anonymous_1) +FN:35,(anonymous_2) +FN:48,LogMessage +FN:62,(anonymous_4) +FN:73,(anonymous_5) +FN:81,(anonymous_6) +FN:105,LogMessages +FN:111,(anonymous_8) +FN:115,(anonymous_9) +FN:120,(anonymous_10) +FN:132,scrollLastElementIntoView +FN:139,(anonymous_12) +FN:148,(anonymous_13) +FN:171,Logging +FNF:15 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,LogMessage +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,LogMessages +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,scrollLastElementIntoView +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,Logging +DA:31,0 +DA:33,0 +DA:35,0 +DA:55,0 +DA:56,0 +DA:62,0 +DA:64,0 +DA:66,0 +DA:70,0 +DA:73,0 +DA:74,0 +DA:77,0 +DA:81,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:115,0 +DA:117,0 +DA:118,0 +DA:120,0 +DA:121,0 +DA:122,0 +DA:133,0 +DA:134,0 +DA:137,0 +DA:140,0 +DA:149,0 +DA:150,0 +DA:172,0 +DA:173,0 +DA:175,0 +LF:34 +LH:0 +BRDA:64,0,0,0 +BRDA:64,0,1,0 +BRDA:70,1,0,0 +BRDA:70,1,1,0 +BRDA:74,2,0,0 +BRDA:74,2,1,0 +BRDA:82,3,0,0 +BRDA:82,3,1,0 +BRDA:112,4,0,0 +BRDA:112,4,1,0 +BRDA:132,5,0,0 +BRDA:133,6,0,0 +BRDA:133,6,1,0 +BRDA:133,7,0,0 +BRDA:133,7,1,0 +BRDA:133,7,2,0 +BRDA:146,8,0,0 +BRDA:146,8,1,0 +BRF:18 +BRH:0 +end_of_record +TN: +SF:src\components\Logging\useLogs.ts +FN:63,useLogs +FN:84,(anonymous_1) +FN:93,(anonymous_2) +FN:109,(anonymous_3) +FN:132,(anonymous_4) +FN:143,(anonymous_5) +FN:148,(anonymous_6) +FN:167,(anonymous_7) +FN:181,(anonymous_8) +FN:193,(anonymous_9) +FN:200,(anonymous_10) +FN:205,(anonymous_11) +FNF:12 +FNH:0 +FNDA:0,useLogs +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +DA:65,0 +DA:67,0 +DA:70,0 +DA:72,0 +DA:74,0 +DA:77,0 +DA:84,0 +DA:85,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:97,0 +DA:98,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:109,0 +DA:115,0 +DA:118,0 +DA:123,0 +DA:124,0 +DA:128,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:143,0 +DA:145,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:156,0 +DA:163,0 +DA:164,0 +DA:165,0 +DA:167,0 +DA:173,0 +DA:175,0 +DA:180,0 +DA:181,0 +DA:193,0 +DA:195,0 +DA:197,0 +DA:198,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:211,0 +LF:52 +LH:0 +BRDA:105,0,0,0 +BRDA:105,0,1,0 +BRDA:107,1,0,0 +BRDA:107,1,1,0 +BRDA:111,2,0,0 +BRDA:111,2,1,0 +BRDA:112,3,0,0 +BRDA:112,3,1,0 +BRDA:123,4,0,0 +BRDA:123,4,1,0 +BRDA:149,5,0,0 +BRDA:149,5,1,0 +BRDA:163,6,0,0 +BRDA:163,6,1,0 +BRDA:165,7,0,0 +BRDA:165,7,1,0 +BRDA:169,8,0,0 +BRDA:169,8,1,0 +BRDA:170,9,0,0 +BRDA:170,9,1,0 +BRDA:180,10,0,0 +BRDA:180,10,1,0 +BRDA:195,11,0,0 +BRDA:195,11,1,0 +BRF:24 +BRH:0 +end_of_record +TN: +SF:src\pages\ConnectedRobots\ConnectedRobots.tsx +FN:12,ConnectedRobots +FN:22,(anonymous_1) +FN:26,(anonymous_2) +FN:46,(anonymous_3) +FNF:4 +FNH:0 +FNDA:0,ConnectedRobots +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +DA:20,0 +DA:22,0 +DA:25,0 +DA:26,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:33,0 +DA:34,0 +DA:37,0 +DA:41,0 +DA:46,0 +DA:49,0 +LF:13 +LH:0 +BRDA:53,0,0,0 +BRDA:53,0,1,0 +BRDA:53,1,0,0 +BRDA:53,1,1,0 +BRDA:55,2,0,0 +BRDA:55,2,1,0 +BRF:6 +BRH:0 +end_of_record +TN: +SF:src\pages\Home\Home.tsx +FN:13,Home +FNF:1 +FNH:0 +FNDA:0,Home +DA:14,0 +LF:1 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\pages\MonitoringPage\MonitoringPageComponents.tsx +FN:6,(anonymous_0) +FN:27,(anonymous_1) +FN:29,(anonymous_2) +FN:31,(anonymous_3) +FN:40,(anonymous_4) +FN:51,(anonymous_5) +FN:55,(anonymous_6) +FN:67,(anonymous_7) +FN:70,(anonymous_8) +FN:83,(anonymous_9) +FN:85,(anonymous_10) +FN:113,(anonymous_11) +FN:125,(anonymous_12) +FN:134,(anonymous_13) +FN:143,(anonymous_14) +FN:184,(anonymous_15) +FN:194,(anonymous_16) +FN:198,(anonymous_17) +FN:219,(anonymous_18) +FNF:19 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:0,(anonymous_18) +DA:6,0 +DA:7,0 +DA:9,0 +DA:21,0 +DA:27,0 +DA:29,0 +DA:31,0 +DA:40,0 +DA:41,0 +DA:47,0 +DA:52,0 +DA:55,0 +DA:67,0 +DA:68,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:76,0 +DA:83,0 +DA:85,0 +DA:113,0 +DA:121,0 +DA:126,0 +DA:127,0 +DA:128,0 +DA:129,0 +DA:130,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:138,0 +DA:141,0 +DA:142,0 +DA:143,0 +DA:145,0 +DA:149,0 +DA:184,0 +DA:192,0 +DA:194,0 +DA:197,0 +DA:198,0 +DA:203,0 +DA:204,0 +DA:206,0 +DA:207,0 +DA:210,0 +DA:214,0 +DA:219,0 +DA:222,0 +LF:50 +LH:0 +BRDA:71,0,0,0 +BRDA:71,0,1,0 +BRDA:85,1,0,0 +BRDA:85,1,1,0 +BRDA:126,2,0,0 +BRDA:126,2,1,0 +BRDA:129,3,0,0 +BRDA:129,3,1,0 +BRDA:130,4,0,0 +BRDA:130,4,1,0 +BRDA:130,4,2,0 +BRDA:130,4,3,0 +BRDA:135,5,0,0 +BRDA:135,5,1,0 +BRDA:136,6,0,0 +BRDA:136,6,1,0 +BRDA:136,7,0,0 +BRDA:136,7,1,0 +BRDA:141,8,0,0 +BRDA:141,8,1,0 +BRDA:142,9,0,0 +BRDA:142,9,1,0 +BRDA:151,10,0,0 +BRDA:151,10,1,0 +BRDA:153,11,0,0 +BRDA:153,11,1,0 +BRDA:153,12,0,0 +BRDA:153,12,1,0 +BRDA:156,13,0,0 +BRDA:156,13,1,0 +BRDA:163,14,0,0 +BRDA:163,14,1,0 +BRDA:164,15,0,0 +BRDA:164,15,1,0 +BRDA:165,16,0,0 +BRDA:165,16,1,0 +BRDA:166,17,0,0 +BRDA:166,17,1,0 +BRDA:167,18,0,0 +BRDA:167,18,1,0 +BRDA:171,19,0,0 +BRDA:171,19,1,0 +BRDA:172,20,0,0 +BRDA:172,20,1,0 +BRDA:150,21,0,0 +BRDA:150,21,1,0 +BRDA:225,22,0,0 +BRDA:225,22,1,0 +BRDA:225,23,0,0 +BRDA:225,23,1,0 +BRF:50 +BRH:0 +end_of_record +TN: +SF:src\pages\Robot\Robot.tsx +FN:9,Robot +FN:32,(anonymous_1) +FN:59,(anonymous_2) +FN:62,(anonymous_3) +FN:66,(anonymous_4) +FN:67,(anonymous_5) +FN:73,(anonymous_6) +FN:82,(anonymous_7) +FN:95,(anonymous_8) +FN:96,(anonymous_9) +FN:96,(anonymous_10) +FN:105,(anonymous_11) +FN:118,(anonymous_12) +FN:119,(anonymous_13) +FN:122,(anonymous_14) +FN:123,(anonymous_15) +FNF:16 +FNH:0 +FNDA:0,Robot +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +DA:11,0 +DA:14,0 +DA:16,0 +DA:19,0 +DA:24,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:41,0 +DA:42,0 +DA:44,0 +DA:59,0 +DA:60,0 +DA:62,0 +DA:63,0 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:69,0 +DA:73,0 +DA:74,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:87,0 +DA:95,0 +DA:96,0 +DA:106,0 +DA:119,0 +DA:120,0 +DA:123,0 +DA:124,0 +LF:33 +LH:0 +BRDA:65,0,0,0 +BRDA:65,0,1,0 +BRDA:66,1,0,0 +BRDA:66,1,1,0 +BRDA:67,2,0,0 +BRDA:67,2,1,0 +BRDA:83,3,0,0 +BRDA:83,3,1,0 +BRDA:83,4,0,0 +BRDA:83,4,1,0 +BRDA:96,5,0,0 +BRDA:96,5,1,0 +BRDA:103,6,0,0 +BRDA:103,6,1,0 +BRDA:108,7,0,0 +BRDA:108,7,1,0 +BRDA:123,8,0,0 +BRDA:123,8,1,0 +BRDA:125,9,0,0 +BRDA:125,9,1,0 +BRF:20 +BRH:0 +end_of_record +TN: +SF:src\pages\SimpleProgram\SimpleProgram.tsx +FN:13,(anonymous_0) +FN:24,(anonymous_1) +FN:31,(anonymous_2) +FN:58,(anonymous_3) +FN:65,(anonymous_4) +FN:85,(anonymous_5) +FN:92,(anonymous_6) +FN:113,(anonymous_7) +FN:142,(anonymous_8) +FN:143,(anonymous_9) +FN:144,(anonymous_10) +FN:145,(anonymous_11) +FN:146,(anonymous_12) +FN:167,(anonymous_13) +FN:167,(anonymous_14) +FN:174,(anonymous_15) +FN:174,(anonymous_16) +FNF:17 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +DA:13,0 +DA:14,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:29,0 +DA:32,0 +DA:38,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:63,0 +DA:66,0 +DA:71,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:90,0 +DA:93,0 +DA:98,0 +DA:113,0 +DA:118,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:146,0 +DA:148,0 +DA:149,0 +DA:151,0 +DA:152,0 +DA:155,0 +DA:157,0 +DA:167,0 +DA:174,0 +LF:35 +LH:0 +BRDA:25,0,0,0 +BRDA:25,0,1,0 +BRDA:42,1,0,0 +BRDA:42,1,1,0 +BRDA:45,2,0,0 +BRDA:45,2,1,0 +BRDA:47,3,0,0 +BRDA:47,3,1,0 +BRDA:39,4,0,0 +BRDA:39,4,1,0 +BRDA:59,5,0,0 +BRDA:59,5,1,0 +BRDA:74,6,0,0 +BRDA:74,6,1,0 +BRDA:72,7,0,0 +BRDA:72,7,1,0 +BRDA:86,8,0,0 +BRDA:86,8,1,0 +BRDA:98,9,0,0 +BRDA:98,9,1,0 +BRDA:98,10,0,0 +BRDA:98,10,1,0 +BRDA:151,11,0,0 +BRDA:151,11,1,0 +BRF:24 +BRH:0 +end_of_record +TN: +SF:src\pages\TemplatePage\Template.tsx +FN:3,TemplatePage +FNF:1 +FNH:0 +FNDA:0,TemplatePage +DA:4,0 +LF:1 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\VisProg.tsx +FN:42,(anonymous_0) +FN:67,(anonymous_1) +FN:85,(anonymous_2) +FN:86,(anonymous_3) +FN:91,(anonymous_4) +FN:111,(anonymous_5) +FN:123,(anonymous_6) +FN:124,(anonymous_7) +FN:140,VisualProgrammingUI +FN:149,runProgramm +FN:160,(anonymous_10) +FN:167,(anonymous_11) +FN:174,graphReducer +FN:176,(anonymous_13) +FN:177,(anonymous_14) +FN:190,VisProgPage +FN:192,(anonymous_16) +FN:194,(anonymous_17) +FN:204,(anonymous_18) +FNF:19 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,VisualProgrammingUI +FNDA:0,runProgramm +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,graphReducer +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,VisProgPage +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:0,(anonymous_18) +DA:29,0 +DA:42,0 +DA:67,0 +DA:82,0 +DA:83,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:90,0 +DA:91,0 +DA:94,0 +DA:111,0 +DA:123,0 +DA:124,0 +DA:141,0 +DA:150,0 +DA:151,0 +DA:152,0 +DA:153,0 +DA:161,0 +DA:162,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:175,0 +DA:176,0 +DA:178,0 +DA:179,0 +DA:191,0 +DA:192,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:201,0 +DA:202,0 +DA:204,0 +DA:212,0 +LF:40 +LH:0 +BRDA:87,0,0,0 +BRDA:87,0,1,0 +BRDA:87,1,0,0 +BRDA:87,1,1,0 +BRDA:88,2,0,0 +BRDA:88,2,1,0 +BRDA:88,3,0,0 +BRDA:88,3,1,0 +BRDA:161,4,0,0 +BRDA:161,4,1,0 +BRDA:201,5,0,0 +BRDA:201,5,1,0 +BRF:12 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\EditorUndoRedo.ts +FN:28,(anonymous_0) +FN:33,(anonymous_1) +FN:42,(anonymous_2) +FN:55,(anonymous_3) +FN:71,(anonymous_4) +FN:90,(anonymous_5) +FN:112,(anonymous_6) +FN:123,(anonymous_7) +FN:124,(anonymous_8) +FNF:9 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +DA:28,0 +DA:33,0 +DA:34,0 +DA:42,0 +DA:47,0 +DA:49,0 +DA:56,0 +DA:58,0 +DA:59,0 +DA:72,0 +DA:73,0 +DA:75,0 +DA:76,0 +DA:78,0 +DA:83,0 +DA:91,0 +DA:92,0 +DA:94,0 +DA:95,0 +DA:97,0 +DA:102,0 +DA:113,0 +DA:114,0 +DA:115,0 +DA:124,0 +DA:125,0 +LF:26 +LH:0 +BRDA:58,0,0,0 +BRDA:58,0,1,0 +BRDA:73,1,0,0 +BRDA:73,1,1,0 +BRDA:92,2,0,0 +BRDA:92,2,1,0 +BRDA:115,3,0,0 +BRDA:115,3,1,0 +BRF:8 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\HandleRuleLogic.ts +FN:38,(anonymous_0) +FN:42,(anonymous_1) +FN:49,(anonymous_2) +FN:50,(anonymous_3) +FN:69,useHandleRules +FN:76,(anonymous_5) +FN:79,(anonymous_6) +FN:87,(anonymous_7) +FN:96,(anonymous_8) +FNF:9 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,useHandleRules +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +DA:35,0 +DA:38,0 +DA:42,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:52,0 +DA:75,0 +DA:76,0 +DA:79,0 +DA:80,0 +DA:87,0 +DA:90,0 +DA:94,0 +DA:96,0 +DA:100,0 +DA:105,0 +DA:108,0 +LF:18 +LH:0 +BRDA:52,0,0,0 +BRDA:52,0,1,0 +BRDA:90,1,0,0 +BRDA:90,1,1,0 +BRDA:94,2,0,0 +BRDA:94,2,1,0 +BRDA:96,3,0,0 +BRDA:96,3,1,0 +BRF:8 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\HandleRules.ts +FN:11,allowOnlyConnectionsFromType +FN:12,(anonymous_1) +FN:13,(anonymous_2) +FN:14,(anonymous_3) +FN:25,allowOnlyConnectionsFromHandle +FN:26,(anonymous_5) +FN:27,(anonymous_6) +FN:28,(anonymous_7) +FN:39,(anonymous_8) +FNF:9 +FNH:0 +FNDA:0,allowOnlyConnectionsFromType +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,allowOnlyConnectionsFromHandle +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +DA:12,0 +DA:13,0 +DA:14,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:39,0 +DA:40,0 +LF:8 +LH:0 +BRDA:14,0,0,0 +BRDA:14,0,1,0 +BRDA:28,1,0,0 +BRDA:28,1,1,0 +BRDA:28,2,0,0 +BRDA:28,2,1,0 +BRDA:40,3,0,0 +BRDA:40,3,1,0 +BRF:8 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\NodeRegistry.ts +FN:190,(anonymous_0) +FN:191,(anonymous_1) +FN:201,(anonymous_2) +FN:202,(anonymous_3) +FN:203,(anonymous_4) +FN:204,(anonymous_5) +FN:205,(anonymous_6) +FNF:7 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +DA:80,0 +DA:96,0 +DA:114,0 +DA:132,0 +DA:161,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:211,0 +LF:15 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\VisProgStores.tsx +FN:32,createNode +FN:70,(anonymous_1) +FN:82,(anonymous_2) +FN:87,(anonymous_3) +FN:89,(anonymous_4) +FN:89,(anonymous_5) +FN:91,(anonymous_6) +FN:93,(anonymous_7) +FN:96,(anonymous_8) +FN:97,(anonymous_9) +FN:106,(anonymous_10) +FN:114,(anonymous_11) +FN:121,(anonymous_12) +FN:122,(anonymous_13) +FN:131,(anonymous_14) +FN:138,(anonymous_15) +FN:139,(anonymous_16) +FN:140,(anonymous_17) +FN:141,(anonymous_18) +FN:152,(anonymous_19) +FN:164,(anonymous_20) +FN:167,(anonymous_21) +FN:172,(anonymous_22) +FN:173,(anonymous_23) +FN:185,(anonymous_24) +FN:189,(anonymous_25) +FN:190,(anonymous_26) +FN:195,(anonymous_27) +FN:196,(anonymous_28) +FN:203,(anonymous_29) +FN:208,(anonymous_30) +FN:213,(anonymous_31) +FN:216,(anonymous_32) +FN:228,(anonymous_33) +FN:251,(anonymous_34) +FN:256,(anonymous_35) +FN:275,(anonymous_36) +FN:287,(anonymous_37) +FN:288,(anonymous_38) +FN:301,(anonymous_39) +FN:302,(anonymous_40) +FN:304,(anonymous_41) +FNF:42 +FNH:0 +FNDA:0,createNode +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:0,(anonymous_18) +FNDA:0,(anonymous_19) +FNDA:0,(anonymous_20) +FNDA:0,(anonymous_21) +FNDA:0,(anonymous_22) +FNDA:0,(anonymous_23) +FNDA:0,(anonymous_24) +FNDA:0,(anonymous_25) +FNDA:0,(anonymous_26) +FNDA:0,(anonymous_27) +FNDA:0,(anonymous_28) +FNDA:0,(anonymous_29) +FNDA:0,(anonymous_30) +FNDA:0,(anonymous_31) +FNDA:0,(anonymous_32) +FNDA:0,(anonymous_33) +FNDA:0,(anonymous_34) +FNDA:0,(anonymous_35) +FNDA:0,(anonymous_36) +FNDA:0,(anonymous_37) +FNDA:0,(anonymous_38) +FNDA:0,(anonymous_39) +FNDA:0,(anonymous_40) +FNDA:0,(anonymous_41) +DA:33,0 +DA:34,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:52,0 +DA:56,0 +DA:70,0 +DA:82,0 +DA:87,0 +DA:89,0 +DA:93,0 +DA:94,0 +DA:96,0 +DA:97,0 +DA:99,0 +DA:100,0 +DA:107,0 +DA:115,0 +DA:116,0 +DA:119,0 +DA:121,0 +DA:122,0 +DA:124,0 +DA:125,0 +DA:132,0 +DA:133,0 +DA:136,0 +DA:138,0 +DA:139,0 +DA:140,0 +DA:141,0 +DA:143,0 +DA:145,0 +DA:146,0 +DA:148,0 +DA:149,0 +DA:153,0 +DA:154,0 +DA:165,0 +DA:167,0 +DA:170,0 +DA:172,0 +DA:173,0 +DA:175,0 +DA:176,0 +DA:178,0 +DA:186,0 +DA:189,0 +DA:190,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:203,0 +DA:208,0 +DA:214,0 +DA:215,0 +DA:217,0 +DA:218,0 +DA:220,0 +DA:229,0 +DA:230,0 +DA:252,0 +DA:253,0 +DA:256,0 +DA:257,0 +DA:260,0 +DA:263,0 +DA:276,0 +DA:277,0 +DA:278,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:307,0 +LF:81 +LH:0 +BRDA:99,0,0,0 +BRDA:99,0,1,0 +BRDA:100,1,0,0 +BRDA:100,1,1,0 +BRDA:124,2,0,0 +BRDA:124,2,1,0 +BRDA:125,3,0,0 +BRDA:125,3,1,0 +BRDA:143,4,0,0 +BRDA:143,4,1,0 +BRDA:143,5,0,0 +BRDA:143,5,1,0 +BRDA:165,6,0,0 +BRDA:165,6,1,0 +BRDA:193,7,0,0 +BRDA:193,7,1,0 +BRDA:193,8,0,0 +BRDA:193,8,1,0 +BRDA:196,9,0,0 +BRDA:196,9,1,0 +BRDA:217,10,0,0 +BRDA:217,10,1,0 +BRDA:263,11,0,0 +BRDA:263,11,1,0 +BRDA:305,12,0,0 +BRDA:305,12,1,0 +BRF:26 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\components\DragDropSidebar.tsx +FN:33,DraggableNode +FN:41,(anonymous_1) +FN:44,(anonymous_2) +FN:75,addNodeToFlow +FN:102,DndToolbar +FN:110,(anonymous_5) +FN:133,(anonymous_6) +FN:134,(anonymous_7) +FN:146,(anonymous_8) +FNF:9 +FNH:0 +FNDA:0,DraggableNode +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,addNodeToFlow +FNDA:0,DndToolbar +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +DA:34,0 +DA:35,0 +DA:39,0 +DA:42,0 +DA:45,0 +DA:46,0 +DA:50,0 +DA:76,0 +DA:79,0 +DA:80,0 +DA:83,0 +DA:89,0 +DA:103,0 +DA:109,0 +DA:111,0 +DA:112,0 +DA:116,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:132,0 +DA:133,0 +DA:134,0 +DA:139,0 +DA:147,0 +LF:25 +LH:0 +BRDA:79,0,0,0 +BRDA:79,0,1,0 +BRDA:116,1,0,0 +BRDA:116,1,1,0 +BRDA:116,1,2,0 +BRDA:116,1,3,0 +BRDA:116,1,4,0 +BRDA:122,2,0,0 +BRDA:122,2,1,0 +BRF:9 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\components\GestureValueEditor.tsx +FN:444,GestureValueEditor +FN:465,(anonymous_1) +FN:477,(anonymous_2) +FN:485,(anonymous_3) +FN:490,(anonymous_4) +FN:498,(anonymous_5) +FN:507,(anonymous_6) +FN:514,(anonymous_7) +FN:517,(anonymous_8) +FN:525,(anonymous_9) +FN:538,(anonymous_10) +FN:545,(anonymous_11) +FN:557,(anonymous_12) +FN:561,(anonymous_13) +FN:562,(anonymous_14) +FN:572,(anonymous_15) +FN:584,(anonymous_16) +FN:589,(anonymous_17) +FN:595,(anonymous_18) +FN:600,(anonymous_19) +FNF:20 +FNH:0 +FNDA:0,GestureValueEditor +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +FNDA:0,(anonymous_18) +FNDA:0,(anonymous_19) +DA:22,0 +DA:42,0 +DA:452,0 +DA:455,0 +DA:458,0 +DA:459,0 +DA:462,0 +DA:465,0 +DA:466,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:475,0 +DA:476,0 +DA:477,0 +DA:479,0 +DA:480,0 +DA:485,0 +DA:486,0 +DA:490,0 +DA:491,0 +DA:492,0 +DA:494,0 +DA:495,0 +DA:496,0 +DA:498,0 +DA:499,0 +DA:501,0 +DA:502,0 +DA:507,0 +DA:508,0 +DA:509,0 +DA:510,0 +DA:514,0 +DA:515,0 +DA:517,0 +DA:518,0 +DA:520,0 +DA:521,0 +DA:525,0 +DA:529,0 +DA:538,0 +DA:545,0 +DA:558,0 +DA:561,0 +DA:562,0 +DA:572,0 +DA:584,0 +DA:590,0 +DA:596,0 +DA:600,0 +LF:53 +LH:0 +BRDA:448,0,0,0 +BRDA:468,1,0,0 +BRDA:468,1,1,0 +BRDA:469,2,0,0 +BRDA:469,2,1,0 +BRDA:479,3,0,0 +BRDA:479,3,1,0 +BRDA:494,4,0,0 +BRDA:494,4,1,0 +BRDA:515,5,0,0 +BRDA:515,5,1,0 +BRDA:537,6,0,0 +BRDA:537,6,1,0 +BRDA:544,7,0,0 +BRDA:544,7,1,0 +BRDA:553,8,0,0 +BRDA:553,8,1,0 +BRDA:555,9,0,0 +BRDA:555,9,1,0 +BRDA:576,10,0,0 +BRDA:576,10,1,0 +BRDA:599,11,0,0 +BRDA:599,11,1,0 +BRF:23 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\components\NodeComponents.tsx +FN:31,Toolbar +FN:35,(anonymous_1) +FN:39,(anonymous_2) +FN:67,Tooltip +FN:72,(anonymous_4) +FN:84,(anonymous_5) +FN:89,(anonymous_6) +FN:92,(anonymous_7) +FN:98,(anonymous_8) +FNF:9 +FNH:0 +FNDA:0,Toolbar +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,Tooltip +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +DA:32,0 +DA:35,0 +DA:36,0 +DA:39,0 +DA:40,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:81,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:90,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:98,0 +LF:20 +LH:0 +BRDA:81,0,0,0 +BRDA:81,0,1,0 +BRDA:93,1,0,0 +BRDA:93,1,1,0 +BRDA:102,2,0,0 +BRDA:102,2,1,0 +BRDA:115,3,0,0 +BRDA:115,3,1,0 +BRF:8 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\components\Plan.default.ts +FNF:0 +FNH:0 +DA:3,0 +LF:1 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\components\Plan.tsx +FN:27,PlanReduce +FN:31,(anonymous_1) +FN:37,StepReduce +FN:40,(anonymous_3) +FN:71,DoesPlanIterate +FN:74,(anonymous_5) +FN:77,(anonymous_6) +FN:77,(anonymous_7) +FN:79,(anonymous_8) +FN:93,HasCheckingSubGoal +FN:94,(anonymous_10) +FN:95,(anonymous_11) +FN:98,(anonymous_12) +FN:110,GetActionValue +FNF:14 +FNH:0 +FNDA:0,PlanReduce +FNDA:0,(anonymous_1) +FNDA:0,StepReduce +FNDA:0,(anonymous_3) +FNDA:0,DoesPlanIterate +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,HasCheckingSubGoal +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,GetActionValue +DA:28,0 +DA:29,0 +DA:31,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:43,0 +DA:48,0 +DA:56,0 +DA:61,0 +DA:73,0 +DA:74,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:81,0 +DA:83,0 +DA:94,0 +DA:95,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:112,0 +DA:114,0 +DA:115,0 +DA:117,0 +DA:118,0 +DA:120,0 +DA:121,0 +LF:29 +LH:0 +BRDA:28,0,0,0 +BRDA:28,0,1,0 +BRDA:41,1,0,0 +BRDA:41,1,1,0 +BRDA:41,1,2,0 +BRDA:41,1,3,0 +BRDA:51,2,0,0 +BRDA:51,2,1,0 +BRDA:61,3,0,0 +BRDA:61,3,1,0 +BRDA:73,4,0,0 +BRDA:73,4,1,0 +BRDA:74,5,0,0 +BRDA:74,5,1,0 +BRDA:81,6,0,0 +BRDA:81,6,1,0 +BRDA:81,7,0,0 +BRDA:81,7,1,0 +BRDA:83,8,0,0 +BRDA:83,8,1,0 +BRDA:83,8,2,0 +BRDA:99,9,0,0 +BRDA:99,9,1,0 +BRDA:112,10,0,0 +BRDA:112,10,1,0 +BRDA:112,10,2,0 +BRDA:112,10,3,0 +BRF:27 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\components\PlanEditingFunctions.tsx +FN:11,insertGoalInPlan +FN:30,deleteGoalInPlanByID +FN:32,(anonymous_2) +FNF:3 +FNH:0 +FNDA:0,insertGoalInPlan +FNDA:0,deleteGoalInPlanByID +FNDA:0,(anonymous_2) +DA:12,0 +DA:17,0 +DA:31,0 +DA:32,0 +DA:34,0 +LF:5 +LH:0 +BRDA:34,0,0,0 +BRDA:34,0,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\components\PlanEditor.tsx +FN:15,PlanEditorDialog +FN:31,(anonymous_1) +FN:37,(anonymous_2) +FN:45,(anonymous_3) +FN:52,(anonymous_4) +FN:58,(anonymous_5) +FN:97,(anonymous_6) +FN:117,(anonymous_7) +FN:152,(anonymous_8) +FN:181,(anonymous_9) +FN:188,(anonymous_10) +FN:192,(anonymous_11) +FN:194,(anonymous_12) +FN:197,(anonymous_13) +FN:206,(anonymous_14) +FN:207,(anonymous_15) +FN:227,(anonymous_16) +FN:239,(anonymous_17) +FNF:18 +FNH:0 +FNDA:0,PlanEditorDialog +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,(anonymous_17) +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:63,0 +DA:65,0 +DA:67,0 +DA:71,0 +DA:98,0 +DA:118,0 +DA:120,0 +DA:153,0 +DA:155,0 +DA:156,0 +DA:161,0 +DA:162,0 +DA:182,0 +DA:189,0 +DA:190,0 +DA:192,0 +DA:195,0 +DA:197,0 +DA:206,0 +DA:207,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:240,0 +DA:241,0 +LF:56 +LH:0 +BRDA:47,0,0,0 +BRDA:47,0,1,0 +BRDA:61,1,0,0 +BRDA:61,1,1,0 +BRDA:61,1,2,0 +BRDA:73,2,0,0 +BRDA:73,2,1,0 +BRDA:74,3,0,0 +BRDA:74,3,1,0 +BRDA:78,4,0,0 +BRDA:78,4,1,0 +BRDA:92,5,0,0 +BRDA:92,5,1,0 +BRDA:94,6,0,0 +BRDA:94,6,1,0 +BRDA:104,7,0,0 +BRDA:104,7,1,0 +BRDA:108,8,0,0 +BRDA:108,8,1,0 +BRDA:108,8,2,0 +BRDA:108,8,3,0 +BRDA:108,8,4,0 +BRDA:129,9,0,0 +BRDA:129,9,1,0 +BRDA:142,10,0,0 +BRDA:142,10,1,0 +BRDA:153,11,0,0 +BRDA:153,11,1,0 +BRDA:173,12,0,0 +BRDA:173,12,1,0 +BRDA:189,13,0,0 +BRDA:189,13,1,0 +BRDA:189,14,0,0 +BRDA:189,14,1,0 +BRDA:205,15,0,0 +BRDA:205,15,1,0 +BRDA:206,16,0,0 +BRDA:206,16,1,0 +BRDA:208,17,0,0 +BRDA:208,17,1,0 +BRDA:228,18,0,0 +BRDA:228,18,1,0 +BRDA:232,19,0,0 +BRDA:232,19,1,0 +BRF:44 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\components\RuleBasedHandle.tsx +FN:13,MultiConnectionHandle +FN:41,(anonymous_1) +FN:51,SingleConnectionHandle +FN:79,(anonymous_3) +FNF:4 +FNH:0 +FNDA:0,MultiConnectionHandle +FNDA:0,(anonymous_1) +FNDA:0,SingleConnectionHandle +FNDA:0,(anonymous_3) +DA:19,0 +DA:22,0 +DA:23,0 +DA:26,0 +DA:33,0 +DA:35,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:57,0 +DA:60,0 +DA:61,0 +DA:63,0 +DA:70,0 +DA:72,0 +DA:80,0 +DA:81,0 +DA:82,0 +LF:18 +LH:0 +BRDA:16,0,0,0 +BRDA:22,1,0,0 +BRDA:22,1,1,0 +BRDA:40,2,0,0 +BRDA:40,2,1,0 +BRDA:54,3,0,0 +BRDA:60,4,0,0 +BRDA:60,4,1,0 +BRDA:77,5,0,0 +BRDA:77,5,1,0 +BRF:10 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\components\SaveLoadPanel.tsx +FN:7,SaveLoadPanel +FN:8,(anonymous_1) +FN:9,(anonymous_2) +FN:10,(anonymous_3) +FN:11,(anonymous_4) +FN:18,(anonymous_5) +FN:25,(anonymous_6) +FN:50,(anonymous_7) +FNF:8 +FNH:0 +FNDA:0,SaveLoadPanel +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +DA:8,0 +DA:9,0 +DA:10,0 +DA:11,0 +DA:13,0 +DA:16,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:35,0 +DA:36,0 +DA:39,0 +DA:43,0 +DA:44,0 +DA:50,0 +LF:25 +LH:0 +BRDA:18,0,0,0 +BRDA:27,1,0,0 +BRDA:27,1,1,0 +BRDA:31,2,0,0 +BRDA:31,2,1,0 +BRDA:31,3,0,0 +BRDA:31,3,1,0 +BRDA:39,4,0,0 +BRDA:39,4,1,0 +BRDA:49,5,0,0 +BRDA:49,5,1,0 +BRF:11 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\nodes\BasicBeliefNode.default.ts +FNF:0 +FNH:0 +DA:7,0 +LF:1 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\nodes\BeliefGlobals.ts +FN:7,BeliefGlobalReduce +FN:16,(anonymous_1) +FN:18,(anonymous_2) +FN:30,(anonymous_3) +FN:44,checkForCycle +FN:46,(anonymous_5) +FN:49,(anonymous_6) +FN:52,(anonymous_7) +FN:53,(anonymous_8) +FNF:9 +FNH:0 +FNDA:0,BeliefGlobalReduce +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,checkForCycle +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +DA:8,0 +DA:10,0 +DA:12,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:21,0 +DA:22,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:45,0 +DA:46,0 +DA:48,0 +DA:49,0 +DA:52,0 +DA:53,0 +DA:55,0 +DA:60,0 +LF:20 +LH:0 +BRDA:8,0,0,0 +BRDA:8,0,1,0 +BRDA:18,1,0,0 +BRDA:18,1,1,0 +BRDA:19,2,0,0 +BRDA:19,2,1,0 +BRDA:22,3,0,0 +BRDA:22,3,1,0 +BRDA:22,4,0,0 +BRDA:22,4,1,0 +BRDA:48,5,0,0 +BRDA:48,5,1,0 +BRDA:49,6,0,0 +BRDA:49,6,1,0 +BRDA:55,7,0,0 +BRDA:55,7,1,0 +BRDA:60,8,0,0 +BRDA:60,8,1,0 +BRF:18 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\nodes\EndNode.default.ts +FNF:0 +FNH:0 +DA:6,0 +LF:1 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\nodes\EndNode.tsx +FN:29,EndNode +FN:51,EndReduce +FN:67,EndConnectionTarget +FN:76,EndConnectionSource +FN:85,EndDisconnectionTarget +FN:94,EndDisconnectionSource +FNF:6 +FNH:0 +FNDA:0,EndNode +FNDA:0,EndReduce +FNDA:0,EndConnectionTarget +FNDA:0,EndConnectionSource +FNDA:0,EndDisconnectionTarget +FNDA:0,EndDisconnectionSource +DA:30,0 +DA:53,0 +DA:58,0 +LF:3 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\nodes\GoalNode.default.ts +FNF:0 +FNH:0 +DA:6,0 +LF:1 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\nodes\GoalNode.tsx +FN:46,GoalNode +FN:55,(anonymous_1) +FN:59,(anonymous_2) +FN:63,(anonymous_3) +FN:75,(anonymous_4) +FN:102,(anonymous_5) +FN:110,(anonymous_6) +FN:136,GoalReduce +FN:157,GoalConnectionTarget +FN:160,(anonymous_9) +FN:181,GoalConnectionSource +FN:190,GoalDisconnectionTarget +FN:201,GoalDisconnectionSource +FNF:13 +FNH:0 +FNDA:0,GoalNode +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,GoalReduce +FNDA:0,GoalConnectionTarget +FNDA:0,(anonymous_9) +FNDA:0,GoalConnectionSource +FNDA:0,GoalDisconnectionTarget +FNDA:0,GoalDisconnectionSource +DA:47,0 +DA:48,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:55,0 +DA:56,0 +DA:59,0 +DA:60,0 +DA:63,0 +DA:64,0 +DA:67,0 +DA:75,0 +DA:102,0 +DA:111,0 +DA:137,0 +DA:138,0 +DA:148,0 +DA:159,0 +DA:160,0 +DA:161,0 +DA:163,0 +DA:166,0 +DA:167,0 +DA:172,0 +DA:192,0 +DA:193,0 +LF:28 +LH:0 +BRDA:53,0,0,0 +BRDA:53,0,1,0 +BRDA:80,1,0,0 +BRDA:80,1,1,0 +BRDA:80,1,2,0 +BRDA:92,2,0,0 +BRDA:92,2,1,0 +BRDA:94,3,0,0 +BRDA:94,3,1,0 +BRDA:94,4,0,0 +BRDA:94,4,1,0 +BRDA:95,5,0,0 +BRDA:95,5,1,0 +BRDA:96,6,0,0 +BRDA:96,6,1,0 +BRDA:100,7,0,0 +BRDA:100,7,1,0 +BRDA:100,7,2,0 +BRDA:101,8,0,0 +BRDA:101,8,1,0 +BRDA:101,8,2,0 +BRDA:101,8,3,0 +BRDA:102,9,0,0 +BRDA:102,9,1,0 +BRDA:142,10,0,0 +BRDA:142,10,1,0 +BRDA:142,10,2,0 +BRDA:143,11,0,0 +BRDA:143,11,1,0 +BRDA:161,12,0,0 +BRDA:161,12,1,0 +BRDA:161,13,0,0 +BRDA:161,13,1,0 +BRDA:166,14,0,0 +BRDA:166,14,1,0 +BRF:35 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\nodes\InferredBeliefNode.default.ts +FNF:0 +FNH:0 +DA:7,0 +LF:1 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\nodes\InferredBeliefNode.tsx +FN:40,InferredBeliefConnectionTarget +FN:43,(anonymous_1) +FN:47,(anonymous_2) +FN:59,InferredBeliefConnectionSource +FN:68,InferredBeliefDisconnectionTarget +FN:80,InferredBeliefDisconnectionSource +FN:92,InferredBeliefNode +FN:99,onToggle +FN:160,InferredBeliefReduce +FN:162,(anonymous_9) +FN:163,(anonymous_10) +FNF:11 +FNH:0 +FNDA:0,InferredBeliefConnectionTarget +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,InferredBeliefConnectionSource +FNDA:0,InferredBeliefDisconnectionTarget +FNDA:0,InferredBeliefDisconnectionSource +FNDA:0,InferredBeliefNode +FNDA:0,onToggle +FNDA:0,InferredBeliefReduce +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +DA:41,0 +DA:43,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:69,0 +DA:71,0 +DA:72,0 +DA:84,0 +DA:93,0 +DA:94,0 +DA:96,0 +DA:100,0 +DA:101,0 +DA:103,0 +DA:112,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:165,0 +DA:166,0 +DA:168,0 +DA:175,0 +LF:24 +LH:0 +BRDA:43,0,0,0 +BRDA:43,0,1,0 +BRDA:43,1,0,0 +BRDA:43,1,1,0 +BRDA:47,2,0,0 +BRDA:47,2,1,0 +BRDA:71,3,0,0 +BRDA:71,3,1,0 +BRDA:72,4,0,0 +BRDA:72,4,1,0 +BRDA:165,5,0,0 +BRDA:165,5,1,0 +BRDA:166,6,0,0 +BRDA:166,6,1,0 +BRDA:171,7,0,0 +BRDA:171,7,1,0 +BRF:16 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\nodes\NormNode.default.ts +FNF:0 +FNH:0 +DA:6,0 +LF:1 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\nodes\NormNode.tsx +FN:37,NormNode +FN:44,(anonymous_1) +FN:48,(anonymous_2) +FN:60,(anonymous_3) +FN:70,(anonymous_4) +FN:96,NormReduce +FN:108,(anonymous_6) +FN:125,NormConnectionTarget +FN:128,(anonymous_8) +FN:138,NormConnectionSource +FN:147,NormDisconnectionTarget +FN:158,NormDisconnectionSource +FNF:12 +FNH:0 +FNDA:0,NormNode +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,NormReduce +FNDA:0,(anonymous_6) +FNDA:0,NormConnectionTarget +FNDA:0,(anonymous_8) +FNDA:0,NormConnectionSource +FNDA:0,NormDisconnectionTarget +FNDA:0,NormDisconnectionSource +DA:38,0 +DA:39,0 +DA:41,0 +DA:42,0 +DA:44,0 +DA:45,0 +DA:48,0 +DA:49,0 +DA:52,0 +DA:60,0 +DA:70,0 +DA:97,0 +DA:100,0 +DA:107,0 +DA:108,0 +DA:110,0 +DA:111,0 +DA:113,0 +DA:116,0 +DA:126,0 +DA:128,0 +DA:129,0 +DA:148,0 +DA:150,0 +LF:24 +LH:0 +BRDA:69,0,0,0 +BRDA:69,0,1,0 +BRDA:75,1,0,0 +BRDA:75,1,1,0 +BRDA:107,2,0,0 +BRDA:107,2,1,0 +BRDA:110,3,0,0 +BRDA:110,3,1,0 +BRDA:128,4,0,0 +BRDA:128,4,1,0 +BRDA:128,5,0,0 +BRDA:128,5,1,0 +BRDA:150,6,0,0 +BRDA:150,6,1,0 +BRF:14 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\nodes\PhaseNode.default.ts +FNF:0 +FNH:0 +DA:6,0 +LF:1 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\nodes\PhaseNode.tsx +FN:38,PhaseNode +FN:41,(anonymous_1) +FN:79,PhaseReduce +FN:85,(anonymous_3) +FN:86,(anonymous_4) +FN:90,(anonymous_5) +FN:91,(anonymous_6) +FN:96,(anonymous_7) +FN:104,(anonymous_8) +FN:105,(anonymous_9) +FN:130,PhaseConnectionTarget +FN:134,(anonymous_11) +FN:151,PhaseConnectionSource +FN:155,(anonymous_13) +FN:172,PhaseDisconnectionTarget +FN:176,(anonymous_15) +FN:186,(anonymous_16) +FN:197,PhaseDisconnectionSource +FN:203,(anonymous_18) +FNF:19 +FNH:0 +FNDA:0,PhaseNode +FNDA:0,(anonymous_1) +FNDA:0,PhaseReduce +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,PhaseConnectionTarget +FNDA:0,(anonymous_11) +FNDA:0,PhaseConnectionSource +FNDA:0,(anonymous_13) +FNDA:0,PhaseDisconnectionTarget +FNDA:0,(anonymous_15) +FNDA:0,(anonymous_16) +FNDA:0,PhaseDisconnectionSource +FNDA:0,(anonymous_18) +DA:39,0 +DA:40,0 +DA:41,0 +DA:42,0 +DA:44,0 +DA:80,0 +DA:81,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:99,0 +DA:104,0 +DA:105,0 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:111,0 +DA:112,0 +DA:113,0 +DA:118,0 +DA:121,0 +DA:131,0 +DA:133,0 +DA:134,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:142,0 +DA:152,0 +DA:153,0 +DA:155,0 +DA:156,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:173,0 +DA:175,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:186,0 +DA:187,0 +DA:198,0 +DA:199,0 +DA:203,0 +DA:204,0 +LF:56 +LH:0 +BRDA:95,0,0,0 +BRDA:95,0,1,0 +BRDA:107,1,0,0 +BRDA:107,1,1,0 +BRDA:135,2,0,0 +BRDA:135,2,1,0 +BRDA:135,2,2,0 +BRDA:156,3,0,0 +BRDA:156,3,1,0 +BRDA:160,4,0,0 +BRDA:160,4,1,0 +BRDA:160,4,2,0 +BRDA:177,5,0,0 +BRDA:177,5,1,0 +BRDA:178,6,0,0 +BRDA:178,6,1,0 +BRDA:178,6,2,0 +BRDA:186,7,0,0 +BRDA:186,7,1,0 +BRDA:203,8,0,0 +BRDA:203,8,1,0 +BRDA:203,9,0,0 +BRDA:203,9,1,0 +BRF:23 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\nodes\StartNode.default.ts +FNF:0 +FNH:0 +DA:6,0 +LF:1 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\nodes\StartNode.tsx +FN:27,StartNode +FN:49,StartReduce +FN:65,StartConnectionTarget +FN:74,StartConnectionSource +FN:83,StartDisconnectionTarget +FN:92,StartDisconnectionSource +FNF:6 +FNH:0 +FNDA:0,StartNode +FNDA:0,StartReduce +FNDA:0,StartConnectionTarget +FNDA:0,StartConnectionSource +FNDA:0,StartDisconnectionTarget +FNDA:0,StartDisconnectionSource +DA:28,0 +DA:51,0 +DA:56,0 +LF:3 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\nodes\TriggerNode.default.ts +FNF:0 +FNH:0 +DA:6,0 +LF:1 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\pages\VisProgPage\visualProgrammingUI\nodes\TriggerNode.tsx +FN:46,TriggerNode +FN:50,(anonymous_1) +FN:60,(anonymous_2) +FN:91,(anonymous_3) +FN:108,TriggerReduce +FN:110,(anonymous_5) +FN:131,TriggerConnectionTarget +FN:136,(anonymous_7) +FN:161,TriggerConnectionSource +FN:170,TriggerDisconnectionTarget +FN:184,TriggerDisconnectionSource +FNF:11 +FNH:0 +FNDA:0,TriggerNode +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,TriggerReduce +FNDA:0,(anonymous_5) +FNDA:0,TriggerConnectionTarget +FNDA:0,(anonymous_7) +FNDA:0,TriggerConnectionSource +FNDA:0,TriggerDisconnectionTarget +FNDA:0,TriggerDisconnectionSource +DA:47,0 +DA:48,0 +DA:50,0 +DA:51,0 +DA:54,0 +DA:60,0 +DA:92,0 +DA:109,0 +DA:110,0 +DA:111,0 +DA:112,0 +DA:122,0 +DA:133,0 +DA:135,0 +DA:136,0 +DA:137,0 +DA:139,0 +DA:140,0 +DA:143,0 +DA:145,0 +DA:146,0 +DA:151,0 +DA:172,0 +DA:174,0 +DA:176,0 +LF:25 +LH:0 +BRDA:64,0,0,0 +BRDA:64,0,1,0 +BRDA:64,1,0,0 +BRDA:64,1,1,0 +BRDA:65,2,0,0 +BRDA:65,2,1,0 +BRDA:65,3,0,0 +BRDA:65,3,1,0 +BRDA:65,4,0,0 +BRDA:65,4,1,0 +BRDA:110,5,0,0 +BRDA:110,5,1,0 +BRDA:111,6,0,0 +BRDA:111,6,1,0 +BRDA:116,7,0,0 +BRDA:116,7,1,0 +BRDA:137,8,0,0 +BRDA:137,8,1,0 +BRDA:139,9,0,0 +BRDA:139,9,1,0 +BRDA:139,10,0,0 +BRDA:139,10,1,0 +BRDA:143,11,0,0 +BRDA:143,11,1,0 +BRDA:145,12,0,0 +BRDA:145,12,1,0 +BRDA:174,13,0,0 +BRDA:174,13,1,0 +BRF:28 +BRH:0 +end_of_record +TN: +SF:src\utils\SaveLoad.ts +FN:11,makeProjectBlob +FNF:1 +FNH:0 +FNDA:0,makeProjectBlob +DA:12,0 +DA:18,0 +LF:2 +LH:0 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src\utils\cellStore.ts +FN:55,cell +FN:59,(anonymous_1) +FN:60,(anonymous_2) +FN:64,(anonymous_3) +FN:66,(anonymous_4) +FN:94,useCell +FNF:6 +FNH:0 +FNDA:0,cell +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,useCell +DA:56,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:61,0 +DA:62,0 +DA:65,0 +DA:66,0 +DA:95,0 +LF:9 +LH:0 +BRDA:61,0,0,0 +BRDA:61,0,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:src\utils\duplicateIndices.ts +FN:7,duplicateIndices +FN:10,(anonymous_1) +FN:17,(anonymous_2) +FNF:3 +FNH:0 +FNDA:0,duplicateIndices +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +DA:8,0 +DA:10,0 +DA:11,0 +DA:12,0 +DA:16,0 +DA:17,0 +LF:6 +LH:0 +BRDA:11,0,0,0 +BRDA:11,0,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:src\utils\formatDuration.ts +FN:7,formatDuration +FNF:1 +FNH:0 +FNDA:0,formatDuration +DA:8,0 +DA:9,0 +DA:11,0 +DA:12,0 +DA:13,0 +DA:14,0 +DA:16,0 +LF:7 +LH:0 +BRDA:9,0,0,0 +BRDA:9,0,1,0 +BRDA:16,1,0,0 +BRDA:16,1,1,0 +BRF:4 +BRH:0 +end_of_record +TN: +SF:src\utils\orderPhaseNodes.ts +FN:10,orderPhaseNodeArray +FN:12,(anonymous_1) +FN:19,(anonymous_2) +FNF:3 +FNH:0 +FNDA:0,orderPhaseNodeArray +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +DA:12,0 +DA:13,0 +DA:14,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:23,0 +DA:24,0 +DA:26,0 +DA:27,0 +DA:30,0 +DA:32,0 +DA:34,0 +DA:35,0 +DA:39,0 +LF:15 +LH:0 +BRDA:13,0,0,0 +BRDA:13,0,1,0 +BRDA:26,1,0,0 +BRDA:26,1,1,0 +BRDA:30,2,0,0 +BRDA:30,2,1,0 +BRDA:34,3,0,0 +BRDA:34,3,1,0 +BRF:8 +BRH:0 +end_of_record +TN: +SF:src\utils\priorityFiltering.ts +FN:11,applyPriorityPredicates +FNF:1 +FNH:0 +FNDA:0,applyPriorityPredicates +DA:12,0 +DA:13,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:23,0 +LF:10 +LH:0 +BRDA:15,0,0,0 +BRDA:15,0,1,0 +BRDA:17,1,0,0 +BRDA:17,1,1,0 +BRDA:18,2,0,0 +BRDA:18,2,1,0 +BRDA:20,3,0,0 +BRDA:20,3,1,0 +BRF:8 +BRH:0 +end_of_record +TN: +SF:src\utils\programStore.ts +FN:31,(anonymous_0) +FN:36,(anonymous_1) +FN:40,(anonymous_2) +FN:46,(anonymous_3) +FN:46,(anonymous_4) +FN:50,(anonymous_5) +FN:50,(anonymous_6) +FN:54,(anonymous_7) +FN:56,(anonymous_8) +FN:65,(anonymous_9) +FN:67,(anonymous_10) +FN:76,(anonymous_11) +FN:78,(anonymous_12) +FNF:13 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +FNDA:0,(anonymous_5) +FNDA:0,(anonymous_6) +FNDA:0,(anonymous_7) +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,(anonymous_11) +FNDA:0,(anonymous_12) +DA:31,0 +DA:36,0 +DA:40,0 +DA:46,0 +DA:50,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:58,0 +DA:60,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:71,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:82,0 +LF:20 +LH:0 +BRDA:57,0,0,0 +BRDA:57,0,1,0 +BRDA:68,1,0,0 +BRDA:68,1,1,0 +BRDA:79,2,0,0 +BRDA:79,2,1,0 +BRF:6 +BRH:0 +end_of_record