diff --git a/application/src/main/data/json/system/widget_bundles/air_quality.json b/application/src/main/data/json/system/widget_bundles/air_quality.json new file mode 100644 index 0000000000..ff0d1aaefb --- /dev/null +++ b/application/src/main/data/json/system/widget_bundles/air_quality.json @@ -0,0 +1,71 @@ +{ + "widgetsBundle": { + "alias": "air_quality", + "title": "Air quality", + "image": "data:image/png;base64,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", + "description": "Contains widgets displaying air quality telemetry.", + "order": 12600, + "externalId": null, + "name": "Air quality" + }, + "widgetTypeFqns": [ + "air_quality_card", + "air_quality_card_with_background", + "horizontal_air_quality_card", + "horizontal_air_quality_card_with_background", + "air_quality_chart_card", + "air_quality_chart_card_with_background", + "simple_air_quality_chart_card", + "simple_air_quality_chart_card_with_background", + "humidity_card", + "humidity_card_with_background", + "horizontal_humidity_card", + "horizontal_humidity_card_with_background", + "humidity_chart_card", + "humidity_chart_card_with_background", + "simple_humidity_chart_card", + "simple_humidity_chart_card_with_background", + "humidity_progress_bar", + "humidity_progress_bar_with_background", + "co2_card", + "co2_card_with_background", + "horizontal_co2_card", + "horizontal_co2_card_with_background", + "co2_chart_card", + "co2_chart_card_with_background", + "simple_co2_chart_card", + "simple_co2_chart_card_with_background", + "pm2_5_card", + "pm2_5_card_with_background", + "horizontal_pm2_5_card", + "horizontal_pm2_5_card_with_background", + "pm2_5_chart_card", + "pm2_5_chart_card_with_background", + "simple_pm2_5_chart_card", + "simple_pm2_5_chart_card_with_background", + "pm10_card", + "pm10_card_with_background", + "horizontal_pm10_card", + "horizontal_pm10_card_with_background", + "pm10_chart_card", + "pm10_chart_card_with_background", + "simple_pm10_chart_card", + "simple_pm10_chart_card_with_background", + "radon_level_card", + "radon_level_card_with_background", + "horizontal_radon_level_card", + "horizontal_radon_level_card_with_background", + "radon_level_chart_card", + "radon_level_chart_card_with_background", + "simple_radon_level_chart_card", + "simple_radon_level_chart_card_with_background", + "volatile_organic_compounds_card", + "volatile_organic_compounds_card_with_background", + "horizontal_volatile_organic_compounds_card", + "horizontal_volatile_organic_compounds_card_with_background", + "volatile_organic_compounds_chart_card", + "volatile_organic_compounds_chart_card_with_background", + "simple_volatile_organic_compounds_chart_card", + "simple_volatile_organic_compounds_chart_card_with_background" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_bundles/alarm_widgets.json b/application/src/main/data/json/system/widget_bundles/alarm_widgets.json index 314b962089..576e8aae79 100644 --- a/application/src/main/data/json/system/widget_bundles/alarm_widgets.json +++ b/application/src/main/data/json/system/widget_bundles/alarm_widgets.json @@ -4,6 +4,7 @@ "title": "Alarm widgets", "image": "data:image/png;base64,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", "description": "Visualization of alarms for devices, assets, and other entities.", + "order": 3000, "externalId": null, "name": "Alarm widgets" }, diff --git a/application/src/main/data/json/system/widget_bundles/analogue_gauges.json b/application/src/main/data/json/system/widget_bundles/analogue_gauges.json index d7e5f4d9fc..f04547a919 100644 --- a/application/src/main/data/json/system/widget_bundles/analogue_gauges.json +++ b/application/src/main/data/json/system/widget_bundles/analogue_gauges.json @@ -4,6 +4,7 @@ "title": "Analogue gauges", "image": "data:image/png;base64,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", "description": "Display temperature, humidity, speed, pressure, direction, and other values on analog-style gauges.", + "order": 7000, "externalId": null, "name": "Analogue gauges" }, diff --git a/application/src/main/data/json/system/widget_bundles/cards.json b/application/src/main/data/json/system/widget_bundles/cards.json index c1420e6549..39996839f1 100644 --- a/application/src/main/data/json/system/widget_bundles/cards.json +++ b/application/src/main/data/json/system/widget_bundles/cards.json @@ -4,6 +4,7 @@ "title": "Cards", "image": "data:image/png;base64,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", "description": "Includes cards that display dynamic content based on data from one or more entities. It also includes static HTML cards.", + "order": 2000, "externalId": null, "name": "Cards" }, diff --git a/application/src/main/data/json/system/widget_bundles/charts.json b/application/src/main/data/json/system/widget_bundles/charts.json index 4270cede84..5119d01671 100644 --- a/application/src/main/data/json/system/widget_bundles/charts.json +++ b/application/src/main/data/json/system/widget_bundles/charts.json @@ -4,6 +4,7 @@ "title": "Charts", "image": "data:image/png;base64,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", "description": "Display time series data using customizable line and bar charts. Use various pie charts to display the latest values.", + "order": 1000, "externalId": null, "name": "Charts" }, diff --git a/application/src/main/data/json/system/widget_bundles/control_widgets.json b/application/src/main/data/json/system/widget_bundles/control_widgets.json index 59a6d6b39d..fb7c6e1ee2 100644 --- a/application/src/main/data/json/system/widget_bundles/control_widgets.json +++ b/application/src/main/data/json/system/widget_bundles/control_widgets.json @@ -4,6 +4,7 @@ "title": "Control widgets", "image": "data:image/png;base64,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", "description": "Various interactive widgets to control the behavior and state of the IoT devices.", + "order": 8000, "externalId": null, "name": "Control widgets" }, diff --git a/application/src/main/data/json/system/widget_bundles/count_widgets.json b/application/src/main/data/json/system/widget_bundles/count_widgets.json index 1ee5567770..775947de01 100644 --- a/application/src/main/data/json/system/widget_bundles/count_widgets.json +++ b/application/src/main/data/json/system/widget_bundles/count_widgets.json @@ -4,6 +4,7 @@ "title": "Count widgets", "image": "data:image/png;base64,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", "description": "Cards to display the number of alarms or entities based on the selected filter.", + "order": 5000, "externalId": null, "name": "Count widgets" }, diff --git a/application/src/main/data/json/system/widget_bundles/date.json b/application/src/main/data/json/system/widget_bundles/date.json index be52525df1..d6bf61a989 100644 --- a/application/src/main/data/json/system/widget_bundles/date.json +++ b/application/src/main/data/json/system/widget_bundles/date.json @@ -4,6 +4,7 @@ "title": "Date", "image": "data:image/png;base64,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", "description": "Contains widgets to change the data range for other widgets on the dashboard.", + "order": 20000, "externalId": null, "name": "Date" }, diff --git a/application/src/main/data/json/system/widget_bundles/digital_gauges.json b/application/src/main/data/json/system/widget_bundles/digital_gauges.json index a423877265..39140fbc9c 100644 --- a/application/src/main/data/json/system/widget_bundles/digital_gauges.json +++ b/application/src/main/data/json/system/widget_bundles/digital_gauges.json @@ -4,6 +4,7 @@ "title": "Digital gauges", "image": "data:image/png;base64,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", "description": "Display temperature, humidity, speed, pressure, and other values on digital-style gauges.", + "order": 12500, "externalId": null, "name": "Digital gauges" }, diff --git a/application/src/main/data/json/system/widget_bundles/edge_widgets.json b/application/src/main/data/json/system/widget_bundles/edge_widgets.json index e22c4fabdb..158a856eb9 100644 --- a/application/src/main/data/json/system/widget_bundles/edge_widgets.json +++ b/application/src/main/data/json/system/widget_bundles/edge_widgets.json @@ -4,6 +4,7 @@ "title": "Edge widgets", "image": "data:image/png;base64,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", "description": "Widgets to manage ThingsBoard Edge instances and navigate through their entities.", + "order": 16000, "externalId": null, "name": "Edge widgets" }, diff --git a/application/src/main/data/json/system/widget_bundles/entity_admin_widgets.json b/application/src/main/data/json/system/widget_bundles/entity_admin_widgets.json index 0d64bf85a6..fc4779c522 100644 --- a/application/src/main/data/json/system/widget_bundles/entity_admin_widgets.json +++ b/application/src/main/data/json/system/widget_bundles/entity_admin_widgets.json @@ -4,6 +4,7 @@ "title": "Entity admin widgets", "image": "data:image/png;base64,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", "description": "Templates of complex widgets that allow to list and create/update/delete devices and assets.", + "order": 13000, "externalId": null, "name": "Entity admin widgets" }, diff --git a/application/src/main/data/json/system/widget_bundles/entity_widgets.json b/application/src/main/data/json/system/widget_bundles/entity_widgets.json index 97bb12aa7d..13194d18b3 100644 --- a/application/src/main/data/json/system/widget_bundles/entity_widgets.json +++ b/application/src/main/data/json/system/widget_bundles/entity_widgets.json @@ -4,6 +4,7 @@ "title": "Entity widgets", "image": "data:image/png;base64,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", "description": "Visualize entity properties and hierarchy using table and tree widgets.", + "order": 17000, "externalId": null, "name": "Entity widgets" }, diff --git a/application/src/main/data/json/system/widget_bundles/gateway_widgets.json b/application/src/main/data/json/system/widget_bundles/gateway_widgets.json index 140d4845f9..bf48fd1c4f 100644 --- a/application/src/main/data/json/system/widget_bundles/gateway_widgets.json +++ b/application/src/main/data/json/system/widget_bundles/gateway_widgets.json @@ -4,6 +4,7 @@ "title": "Gateway widgets", "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAC7lBMVEUwVX8wVn8wVoAxV4AyV4EzWYI1WYI1WoM4XYU7X4Y8YIc+YYg/YolDZYtGaI1HR0dIaY1IaY5Ja49LbJBQcZRScpVUVFRUc5ZVVVVWVlZWdZdXV1dXdphYWFhYdphZWVlaeJpcXFxceptdXV1eXl5fX19gYGBhfp5jY2NkZGRkgKBlZWVmZmZmgqFnZ2dng6JoaGhpaWlqampqhaNqhqRra2tsbGxtbW1ubm5vb29wcHBwiqdxcXFycnJyi6hzc3N0dHR0jqp1dXV2dnZ3d3d3kKt4eHh5eXl6enp7e3t7lK58fHx9fX1+fn5/f3+AgICBgYGCgoKCmbKDg4OEhISFhYWGhoaGnLWHh4eHnbWIiIiInraJiYmJn7eKioqKoLeLi4uMjIyMobiNjY2Ojo6Pj4+QkJCQpLuRkZGRpbuSkpKSpryTk5OUlJSVlZWVqL6Vqb6WlpaWqr+Xl5eXqr+YmJiZmZmZq8Campqbm5ubrcKcnJydnZ2dr8Oenp6er8OesMSfn5+goKChoaGioqKjo6OkpKSlpaWltcimpqanp6eoqKipqamqqqqrq6urususrKytra2tvMyurq6uvc2vr6+vvc6vvs6wsLCxsbGysrKzs7O0tLS1tbW2tra3t7e4uLi5ubm6urq7u7u8vLy9vb2+vr6+yte/v7/AwMDAy9jBwcHCwsLCzdrDw8PDztrExMTFxcXFz9vGxsbG0dzHx8fIyMjI0t3JycnKysrLy8vMzMzM1eDNzc3N1uDOzs7Pz8/Q0NDR0dHR2ePS0tLT09PU1NTV1dXW1tbW3ebW3ubX19fY2NjZ2dnZ4Oja2trb29vc3Nzd3d3e3t7f39/g4ODh4eHi4uLj4+Pk5OTl5eXm5ubn5+fo6Ojp6enq6urr6+vs7Ozt7e3u7u7v7+/w8PDw8PHw8vbx8fHy8vLz8/Pz8/T09PT19fX29vb39/f3+Pn4+Pj5+fn5+vz6+vr7+/v8/Pz9/f3+/v7///9UXY26AAAAAWJLR0T5TGRX8AAAC3dJREFUeNrtnXtYW2cdx2Onzrtu3q9TN6tzF0cnXaggsWAgUmiQFI+IeDAUsWtVROqqEbU35Cq11lFoYbR0gxVrEams2SStoaClLuW6pFySnIMmMTnHxHP7/ucfCbSda0lXYJw85/s88PDw8LzJh/O+b973c35vogJPxUA4qHhKguwjUbwqzCHJOGESFRXGEGWbMAqlogFJEgWB5zkZhucFQZQkgFbRkCSR50JBlmVkF5YNhjhelKQwiMiHONmOeIkL8aIEWkVLksCxQfnOWEGWEySJVtGSKIS8cp57vSFBDIPwQVrOIHSQj4BwLCVnEIrlFkDccgZxxyAII28Q5hVA9pB68njLFFCBClRfAluFiYLcHjiLCjuxiySs8BRtbgFQFMRsDrmDnjDkHRJXIQiQAGyzAWqokRHH+3Wiek7YSOeNSIRLDf865FyUCvsx9PBxjBlhJQd2SYf3rujz5ha+LQ7SZDavgxoZByr8ulkDABwkJoHHzM1FUAMXymGczJgHAdQrClLeA/SURwdiamqKgxoZnowB3WQ+TCkjGMrPEdZ3NOklNfDi9mCCY9PU2H35a5mVB6HzTp/Jdd9a1/LMxum4dSJ2XtgrYvslNbCR2RBA09FjmeVkxZgRW0YHdmHEsMKvGwRB3eIY8aBZh47UkrS5Hn3xpmA8aSjHYDKh51P8kNSjRjjSBz6Tq1/pl1OKimaw/3+EEACwC8tNRg7Tb8y8jiggCogCooAoICsK8s9lyr9XIErXUkAUEAVEAVFAlhwkWFZYz5J5BnJ4itD3oJfIrxbBGyWgPY+cQTFJHpAHSMNTqDoLqwlImhLSHPWdqOhAx8NWXNoiTelW2Jfcjtfq3zgAwGrCXAZwvCkMkmXPR00vADxiNr/m4j5Kr/VS2UYaVhNms4GT9fVJqXnSbLojkdl9dobMwP1NTY7XGiQ6r9XsQutRWE0Q4gWUv1DfGVJz+/PL9UdPVQAJq6JrRee1RrNKNk7DagJObczZivpOtNaoBTAbxcK8vDKsJcnaVUASldda8FfCy26QhkSszigviArI8oMoN0NXHUiM3Gfng3RAvhyBq5UPQshzSrYkgS7PfC2KJHC+huqqyv0yTGVVdYMvUh0ESeQDo8NDg7LM0PBoIFKvBUkSOSbg83o9sovX6wsw3HwFXczUNK72KtP/fPGNqhvnHX+QJMyDrO6639+87qZ5V3i7pVr9xXM/WnPzKCAKiAISyd0/+OobYgLkb5//2Q/v+Phdb757zfvX3P0eGYM8+eR713zr53//yF/e9vyjv3/2C/IFueOh57/yuV//9bPPfPvrv332mV/IFuT1//j0d3/150f/9NCX//X2x3/8yY/I94q8+/vfecuHfvK1j73pm2vu/Mbjb1WmXwVEAYkxkN/dnOMu2YD890t33ozjjxEQWbu5ayydKhZOuAISpeJi46yuoAJPUR6Zh6IEqBAjiSEQ5WD+qhrsfOxMvzF0MD/ssLmQLMNFLHb4/ojABdmA3yfD+ANskBMi59lFIcTIeXwwC8fAOUbe59nnCwaEoE/e99l9QUGiVbTIs3PTcgaZnmN5kVbRIhegHHIGcVABLgzid03KGWTS5Q+DhHzOCTmDTDh9oXmQ8flf2k45vwccs58mSJIdNWRbb/dRAnZUXLsIOk8Yx2ZagAo4SeJpBMuJfVI3QZKeHqJ4GtXkrtAtP8T4VZDZBZAzlePvfArlQ1U9gLB+jt0Q5cT8kkWA3+KDw2kR/S6LG+KwA5gYwolc7wTE4Qn4XBYKQDzHZIyWAGpsdEiZjtJu7Ouo6Qa4eJHOObcDfbdeMzk++8og+Ruo8qGqIw7KVgJU9UTV1gDRuIVKb9f4tRXbq3rVzQ9iR7Nh+OgTP91fmz6rQXGjseNkYnMcgMxqL0ZLAHUoCfCx64Ggt2aPeVhKamQwE9/9KgonbwRifFFfPlRFVHYNlgENJ6Nqq3gK9pYONHdo+Vmitx5pzNpK4540SbLbyqHhdOC0Jw9DIwFCh7ZutARQs6lA5Ch8zdam0+DaktpAVakvLx0InrhvqKoH8CUDhujmsx2jON/WitqzWt5J9NZDxyR4vayWEy/YyqARNfBkh0HYWuCxmRxI66EWUD2un8aZjppuwHkEotp8AbbiJQTh7h2q6gHQnL55d5RDREfWBDNLcvl5kGBd7pbL5ix9N/3gixo05KfbIlfEVEiYsKMgqw19acYi6SVtcaa/RkOSzm1bsxvo7O1a69KAXB+ei7o1DteUDAMAJwGiECkX5q52fYEDwAkApBAALFQX88LLm1g6EHlEAVnFIE55g1yzRImNtVbMrH65gNsuZx1kd8/vRxjKMTLY39fTLbv09PUPjjgohhNpFS3xzNz0+CWrxXz2OZnlrNlivTQ+Pcfw83v2GTmPkZn5PXusgEg8I3eLEulaHCN3i8JcnX7lDHJ1+lV00O1GnOGWoJVX1EEDuXnH4M8hyd62PKIVtQyGu9GSZ3QtIh9yC3Zf/5xM1/w8UgoA2MQAgP+a8Zjdo+WXdNF4dRl/olE0tVKbAZRd5LXOTA9O1VqMmNDfvK32Rhw6iJkBCS4zi9D5OUz4KTgZzkqDt5hLAVy5kMEI1nG0Fvh56yTcASCoxbbRZdqPnGgEm0KpzeZg2cEOHZfpwanaX55btK32RjQetBgbnpjJaE3is9pT/BragM3eze0pfqKhsBQYTW15H1N8JG1wX6arsCXF9sIYMENgr2X5QIRE6oGmpkDZ/mM6d6YHp2rLLtjJ7EVA4jPTxNxdleuaunHlYkJlqlkDPUXY1JXavmSMlAL7+rGJmTBlHxmswJgpqw0AEs7Cca+4bCB9OyNdC3v68u042nKsBkhY7IqIiX5ixOs9egIDF4u9Hl6Dp7N6bEVeD58IWylQ3w0dk+hpbx40IcHX0gYAo0bUnl6uKxK/hQhQHyXJrjJdfhZ7ObV4U0AgCgjTol3rTPmItqQ+sGlrsVSw1eDXIHQPD7LI4K/O2VwKUElb72EMW5L3Ox8eycpNrGsfAlgdymwrtWdnASAY5b14LvJ1VUSHMP/+DBIXcT8hCUFAAgDNRDK7UiDLmrn+pVjkKTpI0UGKDlJ0kKKDFB2k6CBFByk6SNFBig5a4YRuu+74BjqIJO07yQILSsiCi5gi9L3oJQpqxMV0EFnqie5hm673Jm3JJeF/66t/t8Eb6CAAarBxghr+OCRO81pHXRdMnTdv60QjBvNgtwj8lQGMnRfhP8cA4KwU7KP0FStcFg72S/4poH2WPUdDvDgJj8sy50k8T3sxctnh6FziPXuJ2Qo12HWcGv44KhNoa44OxK63FNYWOT94yGyoKqYy29MlSNnHtVTcLtsHDlzMbs2Q7t3taAfApbcl0sbDZFd7cnP89IOdhztPGw58asnlQ3ZTOx4hP2HBWvLDthkD0HGgLjm1YJGOfOJ+fcFU6MDuBCcBW0ob+5S+8gE37HGVGSc1oAzYZkexXRP+28E9cFObENS1tyAZOvZwZ64TycuggwA1+nZCjfYqIV5EmaWuK6TmFr0iwN6TYpKTwIirS992yOsRYc/1ejgNKANKbTDQEZBLOzHmSgGV294CDXTs4c6iSSQuvQ4iyTE1kDqjhrjB05ViKEZdF1rqogA5nZj7gJPAkJbYz+pKiiSgxJhDa0AZMJVu3AUN3JUApIKt+mBNQdrwAsjlJON9y71nF2/ls9MiHxgnhRaMUOh6rRSWQGFrdM08aHe4tTEhH/ymYntMgCg6SNFBig5aKR0UI6cVeHZuenzY2i87ifLcc2f7rcPj8+dHJCHoc18Ztw0PDV6QWQaHhm3jVyIneihJ5Bive9oxOTEuu0xMOqbdXoYTJUpFiaIQYnxzlMs5K7s4XdScjwkJokipOEqU/zlEkRJU4N1umqLcLqcs43JTFO12C/gf9yt5MBYZj1cAAAAASUVORK5CYII=", "description": "Widgets to manage ThingsBoard IoT Gateway instances.", + "order": 15000, "externalId": null, "name": "Gateway widgets" }, diff --git a/application/src/main/data/json/system/widget_bundles/gpio_widgets.json b/application/src/main/data/json/system/widget_bundles/gpio_widgets.json index a2f0b39def..78b9c1eea6 100644 --- a/application/src/main/data/json/system/widget_bundles/gpio_widgets.json +++ b/application/src/main/data/json/system/widget_bundles/gpio_widgets.json @@ -4,6 +4,7 @@ "title": "GPIO widgets", "image": "data:image/png;base64,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", "description": "Visualization and control of the state of the GPIO devices.", + "order": 22000, "externalId": null, "name": "GPIO widgets" }, diff --git a/application/src/main/data/json/system/widget_bundles/home_page_widgets.json b/application/src/main/data/json/system/widget_bundles/home_page_widgets.json index 5248b73639..a30d6ee76f 100644 --- a/application/src/main/data/json/system/widget_bundles/home_page_widgets.json +++ b/application/src/main/data/json/system/widget_bundles/home_page_widgets.json @@ -4,6 +4,7 @@ "title": "Home page widgets", "image": "data:image/png;base64,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", "description": "Contains useful widgets to design the user's home page.", + "order": 18000, "externalId": null, "name": "Home page widgets" }, diff --git a/application/src/main/data/json/system/widget_bundles/html_widgets.json b/application/src/main/data/json/system/widget_bundles/html_widgets.json index e7f9a6d254..9293ed5fcb 100644 --- a/application/src/main/data/json/system/widget_bundles/html_widgets.json +++ b/application/src/main/data/json/system/widget_bundles/html_widgets.json @@ -4,6 +4,7 @@ "title": "HTML widgets", "image": "data:image/png;base64,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", "description": "Visualize HTML based on a configurable template or function and device attributes or time-series values.", + "order": 21000, "externalId": null, "name": "HTML widgets" }, diff --git a/application/src/main/data/json/system/widget_bundles/indoor_environment.json b/application/src/main/data/json/system/widget_bundles/indoor_environment.json index 94841e7293..f4fc3a0201 100644 --- a/application/src/main/data/json/system/widget_bundles/indoor_environment.json +++ b/application/src/main/data/json/system/widget_bundles/indoor_environment.json @@ -2,8 +2,9 @@ "widgetsBundle": { "alias": "indoor_environment", "title": "Indoor Environment", - "image": null, - "description": null, + "image": "data:image/png;base64,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", + "description": "Contains widgets displaying indoor environment telemetry.", + "order": 10000, "externalId": null, "name": "Indoor Environment" }, @@ -53,6 +54,38 @@ "noise_level_chart_card", "noise_level_chart_card_with_background", "simple_noise_level_chart_card", - "simple_noise_level_chart_card_with_background" + "simple_noise_level_chart_card_with_background", + "indoor_pm2_5_card", + "indoor_pm2_5_card_with_background", + "indoor_horizontal_pm2_5_card", + "indoor_horizontal_pm2_5_card_with_background", + "indoor_pm2_5_chart_card", + "indoor_pm2_5_chart_card_with_background", + "indoor_simple_pm2_5_chart_card", + "indoor_simple_pm2_5_chart_card_with_background", + "indoor_pm10_card", + "indoor_pm10_card_with_background", + "indoor_horizontal_pm10_card", + "indoor_horizontal_pm10_card_with_background", + "indoor_pm10_chart_card", + "indoor_pm10_chart_card_with_background", + "indoor_simple_pm10_chart_card", + "indoor_simple_pm10_chart_card_with_background", + "radon_level_card", + "radon_level_card_with_background", + "horizontal_radon_level_card", + "horizontal_radon_level_card_with_background", + "radon_level_chart_card", + "radon_level_chart_card_with_background", + "simple_radon_level_chart_card", + "simple_radon_level_chart_card_with_background", + "volatile_organic_compounds_card", + "volatile_organic_compounds_card_with_background", + "horizontal_volatile_organic_compounds_card", + "horizontal_volatile_organic_compounds_card_with_background", + "volatile_organic_compounds_chart_card", + "volatile_organic_compounds_chart_card_with_background", + "simple_volatile_organic_compounds_chart_card", + "simple_volatile_organic_compounds_chart_card_with_background" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_bundles/input_widgets.json b/application/src/main/data/json/system/widget_bundles/input_widgets.json index 5118c245c5..fe24d68960 100644 --- a/application/src/main/data/json/system/widget_bundles/input_widgets.json +++ b/application/src/main/data/json/system/widget_bundles/input_widgets.json @@ -4,6 +4,7 @@ "title": "Input widgets", "image": "data:image/png;base64,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", "description": "Various input forms to set the location, image, and other configuration parameters of the device, asset, or other entity.", + "order": 14000, "externalId": null, "name": "Input widgets" }, diff --git a/application/src/main/data/json/system/widget_bundles/liquid_level_tanks.json b/application/src/main/data/json/system/widget_bundles/liquid_level_tanks.json new file mode 100644 index 0000000000..61f7e234ec --- /dev/null +++ b/application/src/main/data/json/system/widget_bundles/liquid_level_tanks.json @@ -0,0 +1,23 @@ +{ + "widgetsBundle": { + "alias": "liquid_level_tanks", + "title": "Liquid level", + "image": "data:image/png;base64,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", + "description": "Visualize the level of liquid inside the tank. Supports various tank shapes.", + "order": 12000, + "externalId": null, + "name": "Liquid level" + }, + "widgetTypeFqns": [ + "vertical_cylinder_tank", + "rectangle_tank", + "horizontal_cylinder_tank", + "horizontal_ellipse_tank", + "horizontal_oval_tank", + "vertical_oval_tank", + "horizontal_capsule_tank", + "vertical_capsule_tank", + "horizontal_2_1_elliptical_tank", + "horizontal_dish_ends_tank" + ] +} diff --git a/application/src/main/data/json/system/widget_bundles/maps.json b/application/src/main/data/json/system/widget_bundles/maps.json index aa92068c3a..86754f0bd4 100644 --- a/application/src/main/data/json/system/widget_bundles/maps.json +++ b/application/src/main/data/json/system/widget_bundles/maps.json @@ -4,6 +4,7 @@ "title": "Maps", "image": "data:image/png;base64,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", "description": "Visualize the latest location or trip of the devices or other entities on the indoor or outdoor maps.", + "order": 6000, "externalId": null, "name": "Maps" }, diff --git a/application/src/main/data/json/system/widget_bundles/navigation_widgets.json b/application/src/main/data/json/system/widget_bundles/navigation_widgets.json index 9df7d221d9..305cded236 100644 --- a/application/src/main/data/json/system/widget_bundles/navigation_widgets.json +++ b/application/src/main/data/json/system/widget_bundles/navigation_widgets.json @@ -4,6 +4,7 @@ "title": "Navigation widgets", "image": "data:image/png;base64,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", "description": "Contains widgets that enable navigation to other dashboards and menu items. Useful to define the home page or dashboard.", + "order": 19000, "externalId": null, "name": "Navigation widgets" }, diff --git a/application/src/main/data/json/system/widget_bundles/outdoor_environment.json b/application/src/main/data/json/system/widget_bundles/outdoor_environment.json index b0480bc865..4deca7880f 100644 --- a/application/src/main/data/json/system/widget_bundles/outdoor_environment.json +++ b/application/src/main/data/json/system/widget_bundles/outdoor_environment.json @@ -2,8 +2,9 @@ "widgetsBundle": { "alias": "outdoor_environment", "title": "Outdoor Environment", - "image": "data:image/png;base64,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", + "image": "data:image/png;base64,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", "description": "Contains widgets displaying outdoor environment telemetry.", + "order": 11000, "externalId": null, "name": "Outdoor Environment" }, @@ -165,6 +166,22 @@ "simple_illuminance_chart_card", "simple_illuminance_chart_card_with_background", "illuminance_progress_bar", - "illuminance_progress_bar_with_background" + "illuminance_progress_bar_with_background", + "pm2_5_card", + "pm2_5_card_with_background", + "horizontal_pm2_5_card", + "horizontal_pm2_5_card_with_background", + "pm2_5_chart_card", + "pm2_5_chart_card_with_background", + "simple_pm2_5_chart_card", + "simple_pm2_5_chart_card_with_background", + "pm10_card", + "pm10_card_with_background", + "horizontal_pm10_card", + "horizontal_pm10_card_with_background", + "pm10_chart_card", + "pm10_chart_card_with_background", + "simple_pm10_chart_card", + "simple_pm10_chart_card_with_background" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_bundles/status_indicators.json b/application/src/main/data/json/system/widget_bundles/status_indicators.json index 429d3fe016..3c8192493b 100644 --- a/application/src/main/data/json/system/widget_bundles/status_indicators.json +++ b/application/src/main/data/json/system/widget_bundles/status_indicators.json @@ -4,6 +4,7 @@ "title": "Status indicators", "image": "data:image/png;base64,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", "description": "Contains widgets displaying battery level and signal strength.", + "order": 9000, "externalId": null, "name": "Status indicators" }, diff --git a/application/src/main/data/json/system/widget_bundles/tables.json b/application/src/main/data/json/system/widget_bundles/tables.json index ce46218178..206971f1d5 100644 --- a/application/src/main/data/json/system/widget_bundles/tables.json +++ b/application/src/main/data/json/system/widget_bundles/tables.json @@ -4,6 +4,7 @@ "title": "Tables", "image": "data:image/png;base64,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", "description": "Contains tables to display alarms, entities, and their telemetry.", + "order": 4000, "externalId": null, "name": "Tables" }, diff --git a/application/src/main/data/json/system/widget_types/air_quality_card.json b/application/src/main/data/json/system/widget_types/air_quality_card.json deleted file mode 100644 index a140e86044..0000000000 --- a/application/src/main/data/json/system/widget_types/air_quality_card.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "fqn": "air_quality_card", - "name": "Air quality card", - "deprecated": false, - "image": "data:image/png;base64,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", - "description": "Displays a latest air quality telemetry data in a box layout.", - "descriptor": { - "type": "latest", - "sizeX": 3, - "sizeY": 3, - "resources": [], - "templateHtml": "\n", - "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'air', label: 'Air Quality', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", - "settingsSchema": "", - "dataKeySettingsSchema": "", - "settingsDirective": "tb-value-card-widget-settings", - "hasBasicMode": true, - "basicModeDirective": "tb-value-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:weather-windy\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":26,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Air quality card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"US AQI\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" - }, - "externalId": null, - "tags": [ - "weather", - "environment", - "air" - ] -} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/air_quality_card_with_background.json b/application/src/main/data/json/system/widget_types/air_quality_card_with_background.json deleted file mode 100644 index bc32e31a31..0000000000 --- a/application/src/main/data/json/system/widget_types/air_quality_card_with_background.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "fqn": "air_quality_card_with_background", - "name": "Air quality card with background", - "deprecated": false, - "image": "data:image/png;base64,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", - "description": "Displays a latest air quality telemetry data in a box layout with background.", - "descriptor": { - "type": "latest", - "sizeX": 3, - "sizeY": 3, - "resources": [], - "templateHtml": "\n", - "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'air', label: 'Air Quality', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", - "settingsSchema": "", - "dataKeySettingsSchema": "", - "settingsDirective": "tb-value-card-widget-settings", - "hasBasicMode": true, - "basicModeDirective": "tb-value-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:weather-windy\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":26,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Air quality card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"US AQI\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" - }, - "externalId": null, - "tags": [ - "weather", - "environment", - "air" - ] -} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/air_quality_chart_card.json b/application/src/main/data/json/system/widget_types/air_quality_chart_card.json deleted file mode 100644 index da03d55d1a..0000000000 --- a/application/src/main/data/json/system/widget_types/air_quality_chart_card.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "fqn": "air_quality_chart_card", - "name": "Air quality chart card", - "deprecated": false, - "image": "data:image/png;base64,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", - "description": "Displays a air quality data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", - "descriptor": { - "type": "timeseries", - "sizeX": 4.5, - "sizeY": 3.5, - "resources": [], - "templateHtml": "\n\n", - "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'air', label: 'Air Quality', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'US AQI', decimals: 1 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'air', 'US AQI', 1);\n }\n };\n}\n", - "settingsSchema": "{}", - "dataKeySettingsSchema": "{}", - "latestDataKeySettingsSchema": "{}", - "settingsDirective": "tb-aggregated-value-card-widget-settings", - "dataKeySettingsDirective": "", - "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", - "hasBasicMode": true, - "basicModeDirective": "tb-aggregated-value-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"US AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"US AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 10 - 5;\\nif (value < -20) {\\n\\tvalue = -20;\\n} else if (value > 20) {\\n\\tvalue = 20;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"US AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Air Quality\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:weather-windy\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" - }, - "externalId": null, - "tags": [ - "weather", - "environment", - "air" - ] -} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/air_quality_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/air_quality_chart_card_with_background.json deleted file mode 100644 index 895b98c57e..0000000000 --- a/application/src/main/data/json/system/widget_types/air_quality_chart_card_with_background.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "fqn": "air_quality_chart_card_with_background", - "name": "Air quality chart card with background", - "deprecated": false, - "image": "data:image/png;base64,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", - "description": "Displays a air quality data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", - "descriptor": { - "type": "timeseries", - "sizeX": 4.5, - "sizeY": 3.5, - "resources": [], - "templateHtml": "\n\n", - "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'air', label: 'Air Quality', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'US AQI', decimals: 1 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'air', 'US AQI', 1);\n }\n };\n}\n", - "settingsSchema": "{}", - "dataKeySettingsSchema": "{}", - "latestDataKeySettingsSchema": "{}", - "settingsDirective": "tb-aggregated-value-card-widget-settings", - "dataKeySettingsDirective": "", - "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", - "hasBasicMode": true, - "basicModeDirective": "tb-aggregated-value-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"US AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"US AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 10 - 5;\\nif (value < -20) {\\n\\tvalue = -20;\\n} else if (value > 20) {\\n\\tvalue = 20;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"US AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Air Quality\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:weather-windy\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" - }, - "externalId": null, - "tags": [ - "weather", - "environment", - "air" - ] -} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/air_quality_index_card.json b/application/src/main/data/json/system/widget_types/air_quality_index_card.json new file mode 100644 index 0000000000..c7e8ef72fe --- /dev/null +++ b/application/src/main/data/json/system/widget_types/air_quality_index_card.json @@ -0,0 +1,32 @@ +{ + "fqn": "air_quality_card", + "name": "Air quality index card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays the latest air quality index telemetry in a scalable rectangle card.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'air', label: 'Air Quality Index', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality Index\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:weather-windy\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":26,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Air quality card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"AQI\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "weather", + "environment", + "air", + "aqi", + "pollution", + "emission", + "smog" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/air_quality_index_card_with_background.json b/application/src/main/data/json/system/widget_types/air_quality_index_card_with_background.json new file mode 100644 index 0000000000..e5d69dd012 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/air_quality_index_card_with_background.json @@ -0,0 +1,32 @@ +{ + "fqn": "air_quality_card_with_background", + "name": "Air quality index card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays the latest air quality index telemetry in a scalable rectangle card with the background image.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'air', label: 'Air Quality Index', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality Index\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:weather-windy\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":26,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Air quality card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"AQI\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "weather", + "environment", + "air", + "aqi", + "pollution", + "emission", + "smog" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/air_quality_index_chart_card.json b/application/src/main/data/json/system/widget_types/air_quality_index_chart_card.json new file mode 100644 index 0000000000..5500fddd15 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/air_quality_index_chart_card.json @@ -0,0 +1,35 @@ +{ + "fqn": "air_quality_chart_card", + "name": "Air quality index chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays air quality index data by combining the latest and aggregated values with an optional simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'air', label: 'Air Quality Index', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'AQI', decimals: 1 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'air', 'AQI', 1);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality Index\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 10 - 5;\\nif (value < -20) {\\n\\tvalue = -20;\\n} else if (value > 20) {\\n\\tvalue = 20;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Air Quality Index\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:weather-windy\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "weather", + "environment", + "air", + "aqi", + "pollution", + "emission", + "smog" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/air_quality_index_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/air_quality_index_chart_card_with_background.json new file mode 100644 index 0000000000..b86b8d060b --- /dev/null +++ b/application/src/main/data/json/system/widget_types/air_quality_index_chart_card_with_background.json @@ -0,0 +1,35 @@ +{ + "fqn": "air_quality_chart_card_with_background", + "name": "Air quality index chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays air quality index data by combining the latest and aggregated values with the background image and optional simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'air', label: 'Air Quality Index', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'AQI', decimals: 1 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'air', 'AQI', 1);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality Index\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 10 - 5;\\nif (value < -20) {\\n\\tvalue = -20;\\n} else if (value > 20) {\\n\\tvalue = 20;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"AQI\",\"decimals\":1,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Air Quality Index\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:weather-windy\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "weather", + "environment", + "air", + "aqi", + "pollution", + "emission", + "smog" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/alarm_count.json b/application/src/main/data/json/system/widget_types/alarm_count.json index d1a41be9e6..38794306a5 100644 --- a/application/src/main/data/json/system/widget_types/alarm_count.json +++ b/application/src/main/data/json/system/widget_types/alarm_count.json @@ -19,5 +19,9 @@ "basicModeDirective": "tb-alarm-count-basic-config", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"count\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = Number((prevValue + Math.random() * 4 - 2).toFixed(0));\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"],\"assignedToCurrentUser\":false,\"assigneeId\":null}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"showLabel\":true,\"label\":\"Total\",\"labelFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.54)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":20,\"iconSizeUnit\":\"px\",\"icon\":\"warning\",\"iconColor\":{\"type\":\"constant\",\"color\":\"rgba(255, 255, 255, 1)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIconBackground\":true,\"iconBackgroundSize\":36,\"iconBackgroundSizeUnit\":\"px\",\"iconBackgroundColor\":{\"type\":\"range\",\"color\":\"rgba(0, 105, 92, 1)\",\"rangeList\":[{\"from\":0,\"to\":0,\"color\":\"rgba(0, 105, 92, 1)\"},{\"from\":1,\"to\":null,\"color\":\"rgba(209, 39, 48, 1)\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":20,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"24px\"},\"valueColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showChevron\":false,\"chevronSize\":24,\"chevronSizeUnit\":\"px\",\"chevronColor\":\"rgba(0, 0, 0, 0.38)\",\"layout\":\"column\"},\"title\":\"Alarm count\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"\",\"decimals\":null,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null},\"titleColor\":\"rgba(0, 0, 0, 0.54)\"}" }, - "externalId": null + "externalId": null, + "tags": [ + "alert", + "alerts" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/alarms_table.json b/application/src/main/data/json/system/widget_types/alarms_table.json index 964f478179..5a360bcc32 100644 --- a/application/src/main/data/json/system/widget_types/alarms_table.json +++ b/application/src/main/data/json/system/widget_types/alarms_table.json @@ -20,5 +20,9 @@ "basicModeDirective": "tb-alarms-table-basic-config", "defaultConfig": "{\"timewindow\":{\"realtime\":{\"interval\":1000,\"timewindowMs\":86400000},\"aggregation\":{\"type\":\"NONE\",\"limit\":200}},\"showTitle\":true,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"4px\",\"settings\":{\"enableSelection\":true,\"enableSearch\":true,\"displayDetails\":true,\"allowAcknowledgment\":true,\"allowClear\":true,\"allowAssign\":true,\"displayActivity\":true,\"displayPagination\":true,\"defaultPageSize\":10,\"defaultSortOrder\":\"-createdTime\",\"enableSelectColumnDisplay\":true,\"enableStickyAction\":false,\"enableFilter\":true,\"entitiesTitle\":null,\"alarmsTitle\":\"Alarms\"},\"title\":\"Alarms table\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400,\"padding\":\"5px 10px 5px 10px\"},\"useDashboardTimewindow\":false,\"showLegend\":false,\"alarmSource\":{\"type\":\"function\",\"dataKeys\":[{\"name\":\"createdTime\",\"type\":\"alarm\",\"label\":\"Created time\",\"color\":\"#2196f3\",\"settings\":{\"useCellStyleFunction\":false,\"cellStyleFunction\":\"\",\"useCellContentFunction\":false,\"cellContentFunction\":\"\"},\"_hash\":0.021092237451093787},{\"name\":\"originator\",\"type\":\"alarm\",\"label\":\"Originator\",\"color\":\"#4caf50\",\"settings\":{\"useCellStyleFunction\":false,\"cellStyleFunction\":\"\",\"useCellContentFunction\":false,\"cellContentFunction\":\"\"},\"_hash\":0.2780007688856758},{\"name\":\"type\",\"type\":\"alarm\",\"label\":\"Type\",\"color\":\"#f44336\",\"settings\":{\"useCellStyleFunction\":false,\"cellStyleFunction\":\"\",\"useCellContentFunction\":false,\"cellContentFunction\":\"\"},\"_hash\":0.7323586880398418},{\"name\":\"severity\",\"type\":\"alarm\",\"label\":\"Severity\",\"color\":\"#ffc107\",\"settings\":{\"useCellStyleFunction\":false,\"useCellContentFunction\":false},\"_hash\":0.09927019860088193},{\"name\":\"status\",\"type\":\"alarm\",\"label\":\"Status\",\"color\":\"#607d8b\",\"settings\":{\"useCellStyleFunction\":false,\"cellStyleFunction\":\"\",\"useCellContentFunction\":false,\"cellContentFunction\":\"\"},\"_hash\":0.6588418951443418},{\"name\":\"assignee\",\"type\":\"alarm\",\"label\":\"Assignee\",\"color\":\"#9c27b0\",\"settings\":{},\"_hash\":0.5008441077416634}],\"entityAliasId\":null,\"name\":\"alarms\"},\"alarmSearchStatus\":\"ANY\",\"alarmsPollingInterval\":5,\"showTitleIcon\":false,\"titleIcon\":\"warning\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"displayTimewindow\":true,\"actions\":{},\"alarmStatusList\":[],\"alarmSeverityList\":[],\"alarmTypeList\":[],\"searchPropagatedAlarms\":false,\"configMode\":\"basic\",\"alarmFilterConfig\":null}" }, - "externalId": null + "externalId": null, + "tags": [ + "alert", + "alerts" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/asset_admin_table.json b/application/src/main/data/json/system/widget_types/asset_admin_table.json index 79063537ff..0a2eb2c37a 100644 --- a/application/src/main/data/json/system/widget_types/asset_admin_table.json +++ b/application/src/main/data/json/system/widget_types/asset_admin_table.json @@ -16,7 +16,15 @@ "dataKeySettingsSchema": "", "settingsDirective": "tb-entities-table-widget-settings", "dataKeySettingsDirective": "tb-entities-table-key-settings", - "defaultConfig": "{\"timewindow\":{\"realtime\":{\"interval\":1000,\"timewindowMs\":86400000},\"aggregation\":{\"type\":\"NONE\",\"limit\":200}},\"showTitle\":true,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"4px\",\"settings\":{\"enableSearch\":true,\"displayPagination\":true,\"defaultPageSize\":10,\"defaultSortOrder\":\"entityName\",\"displayEntityName\":true,\"displayEntityType\":true,\"entitiesTitle\":\"Asset admin table\",\"enableSelectColumnDisplay\":true},\"title\":\"Asset admin table\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400,\"padding\":\"5px 10px 5px 10px\"},\"useDashboardTimewindow\":false,\"showLegend\":false,\"datasources\":[{\"type\":\"function\",\"name\":\"Simulated\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#f44336\",\"settings\":{\"columnWidth\":\"0px\",\"useCellStyleFunction\":false,\"cellStyleFunction\":\"\",\"useCellContentFunction\":false,\"cellContentFunction\":\"\"},\"_hash\":0.6401141393938932,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}]}],\"showTitleIcon\":false,\"titleIcon\":\"more_horiz\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"displayTimewindow\":true,\"actions\":{\"headerButton\":[{\"name\":\"Add asset\",\"icon\":\"add\",\"type\":\"customPretty\",\"customHtml\":\"
\\n \\n

Add asset

\\n \\n \\n
\\n \\n \\n
\\n
\\n
\\n \\n Asset name\\n \\n \\n Asset name is required.\\n \\n \\n
\\n \\n \\n Label\\n \\n \\n
\\n
\\n \\n Latitude\\n \\n \\n \\n Longitude\\n \\n \\n
\\n
\\n
\\n
\\n \\n \\n \\n
\\n
\\n\",\"customCss\":\"\",\"customFunction\":\"let $injector = widgetContext.$scope.$injector;\\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\\nlet assetService = $injector.get(widgetContext.servicesMap.get('assetService'));\\nlet attributeService = $injector.get(widgetContext.servicesMap.get('attributeService'));\\n\\nopenAddAssetDialog();\\n\\nfunction openAddAssetDialog() {\\n customDialog.customDialog(htmlTemplate, AddAssetDialogController).subscribe();\\n}\\n\\nfunction AddAssetDialogController(instance) {\\n let vm = instance;\\n \\n vm.addAssetFormGroup = vm.fb.group({\\n assetName: ['', [vm.validators.required]],\\n assetType: ['', [vm.validators.required]],\\n assetLabel: [''],\\n attributes: vm.fb.group({\\n latitude: [null],\\n longitude: [null]\\n }) \\n });\\n \\n vm.cancel = function() {\\n vm.dialogRef.close(null);\\n };\\n \\n vm.save = function() {\\n vm.addAssetFormGroup.markAsPristine();\\n let asset = {\\n name: vm.addAssetFormGroup.get('assetName').value,\\n type: vm.addAssetFormGroup.get('assetType').value,\\n label: vm.addAssetFormGroup.get('assetLabel').value\\n };\\n assetService.saveAsset(asset).subscribe(\\n function (asset) {\\n saveAttributes(asset.id).subscribe(\\n function () {\\n widgetContext.updateAliases();\\n vm.dialogRef.close(null);\\n }\\n );\\n }\\n );\\n };\\n \\n function saveAttributes(entityId) {\\n let attributes = vm.addAssetFormGroup.get('attributes').value;\\n let attributesArray = [];\\n for (let key in attributes) {\\n attributesArray.push({key: key, value: attributes[key]});\\n }\\n if (attributesArray.length > 0) {\\n return attributeService.saveEntityAttributes(entityId, \\\"SERVER_SCOPE\\\", attributesArray);\\n } else {\\n return widgetContext.rxjs.of([]);\\n }\\n }\\n}\",\"customResources\":[],\"id\":\"70837a9d-c3de-a9a7-03c5-dccd14998758\"}],\"actionCellButton\":[{\"name\":\"Edit asset\",\"icon\":\"edit\",\"type\":\"customPretty\",\"customHtml\":\"
\\n \\n

Edit asset

\\n \\n \\n
\\n \\n \\n
\\n
\\n
\\n \\n Asset name\\n \\n \\n Asset name is required.\\n \\n \\n
\\n \\n \\n Label\\n \\n \\n
\\n
\\n \\n Latitude\\n \\n \\n \\n Longitude\\n \\n \\n
\\n
\\n
\\n
\\n \\n \\n \\n
\\n
\\n\",\"customCss\":\"\",\"customFunction\":\"let $injector = widgetContext.$scope.$injector;\\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\\nlet assetService = $injector.get(widgetContext.servicesMap.get('assetService'));\\nlet attributeService = $injector.get(widgetContext.servicesMap.get('attributeService'));\\n\\nopenEditAssetDialog();\\n\\nfunction openEditAssetDialog() {\\n customDialog.customDialog(htmlTemplate, EditAssetDialogController).subscribe();\\n}\\n\\nfunction EditAssetDialogController(instance) {\\n let vm = instance;\\n \\n vm.asset = null;\\n vm.attributes = {};\\n \\n vm.editAssetFormGroup = vm.fb.group({\\n assetName: ['', [vm.validators.required]],\\n assetType: ['', [vm.validators.required]],\\n assetLabel: [''],\\n attributes: vm.fb.group({\\n latitude: [null],\\n longitude: [null]\\n }) \\n });\\n \\n vm.cancel = function() {\\n vm.dialogRef.close(null);\\n };\\n \\n vm.save = function() {\\n vm.editAssetFormGroup.markAsPristine();\\n vm.asset.name = vm.editAssetFormGroup.get('assetName').value,\\n vm.asset.type = vm.editAssetFormGroup.get('assetType').value,\\n vm.asset.label = vm.editAssetFormGroup.get('assetLabel').value\\n assetService.saveAsset(vm.asset).subscribe(\\n function () {\\n saveAttributes().subscribe(\\n function () {\\n widgetContext.updateAliases();\\n vm.dialogRef.close(null);\\n }\\n );\\n }\\n );\\n };\\n \\n getEntityInfo();\\n \\n function getEntityInfo() {\\n assetService.getAsset(entityId.id).subscribe(\\n function (asset) {\\n attributeService.getEntityAttributes(entityId, 'SERVER_SCOPE',\\n ['latitude', 'longitude']).subscribe(\\n function (attributes) {\\n for (let i = 0; i < attributes.length; i++) {\\n vm.attributes[attributes[i].key] = attributes[i].value; \\n }\\n vm.asset = asset;\\n vm.editAssetFormGroup.patchValue(\\n {\\n assetName: vm.asset.name,\\n assetType: vm.asset.type,\\n assetLabel: vm.asset.label,\\n attributes: {\\n latitude: vm.attributes.latitude,\\n longitude: vm.attributes.longitude\\n }\\n }, {emitEvent: false}\\n );\\n } \\n );\\n }\\n ); \\n }\\n \\n function saveAttributes() {\\n let attributes = vm.editAssetFormGroup.get('attributes').value;\\n let attributesArray = [];\\n for (let key in attributes) {\\n attributesArray.push({key: key, value: attributes[key]});\\n }\\n if (attributesArray.length > 0) {\\n return attributeService.saveEntityAttributes(entityId, 'SERVER_SCOPE', attributesArray);\\n } else {\\n return widgetContext.rxjs.of([]);\\n }\\n }\\n}\",\"customResources\":[],\"id\":\"93931e52-5d7c-903e-67aa-b9435df44ff4\"},{\"name\":\"Delete asset\",\"icon\":\"delete\",\"type\":\"custom\",\"customFunction\":\"let $injector = widgetContext.$scope.$injector;\\nlet dialogs = $injector.get(widgetContext.servicesMap.get('dialogs'));\\nlet assetService = $injector.get(widgetContext.servicesMap.get('assetService'));\\n\\nopenDeleteAssetDialog();\\n\\nfunction openDeleteAssetDialog() {\\n let title = \\\"Are you sure you want to delete the asset \\\" + entityName + \\\"?\\\";\\n let content = \\\"Be careful, after the confirmation, the asset and all related data will become unrecoverable!\\\";\\n dialogs.confirm(title, content, 'Cancel', 'Delete').subscribe(\\n function (result) {\\n if (result) {\\n deleteAsset();\\n }\\n }\\n );\\n}\\n\\nfunction deleteAsset() {\\n assetService.deleteAsset(entityId.id).subscribe(\\n function () {\\n widgetContext.updateAliases();\\n }\\n );\\n}\\n\",\"id\":\"ec2708f6-9ff0-186b-e4fc-7635ebfa3074\"}]}}" + "hasBasicMode": true, + "basicModeDirective": "tb-entities-table-basic-config", + "defaultConfig": "{\"timewindow\":{\"realtime\":{\"interval\":1000,\"timewindowMs\":86400000},\"aggregation\":{\"type\":\"NONE\",\"limit\":200}},\"showTitle\":true,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"4px\",\"settings\":{\"entitiesTitle\":\"Asset admin table\",\"enableSearch\":true,\"enableSelectColumnDisplay\":true,\"enableStickyHeader\":true,\"enableStickyAction\":true,\"showCellActionsMenu\":true,\"reserveSpaceForHiddenAction\":\"true\",\"displayEntityName\":false,\"displayEntityLabel\":false,\"displayEntityType\":false,\"displayPagination\":true,\"defaultPageSize\":10,\"defaultSortOrder\":\"entityName\",\"useRowStyleFunction\":false},\"title\":\"Asset admin table\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400,\"padding\":\"5px 10px 5px 10px\"},\"useDashboardTimewindow\":false,\"showLegend\":false,\"datasources\":[{\"type\":\"function\",\"name\":\"Simulated\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Entity name\",\"color\":\"#4caf50\",\"settings\":{},\"_hash\":0.6985800247727296,\"funcBody\":\"return 'Simulated';\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Entity type\",\"color\":\"#f44336\",\"settings\":{},\"_hash\":0.10073938422359707,\"funcBody\":\"return 'Device';\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#f44336\",\"settings\":{\"columnWidth\":\"0px\",\"useCellStyleFunction\":false,\"cellStyleFunction\":\"\",\"useCellContentFunction\":false,\"cellContentFunction\":\"\"},\"_hash\":0.6401141393938932,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"showTitleIcon\":false,\"titleIcon\":\"more_horiz\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"displayTimewindow\":true,\"actions\":{\"headerButton\":[{\"name\":\"Add asset\",\"icon\":\"add\",\"type\":\"customPretty\",\"customHtml\":\"
\\n \\n

Add asset

\\n \\n \\n
\\n \\n \\n
\\n
\\n
\\n \\n Asset name\\n \\n \\n Asset name is required.\\n \\n \\n
\\n \\n \\n Label\\n \\n \\n
\\n
\\n \\n Latitude\\n \\n \\n \\n Longitude\\n \\n \\n
\\n
\\n
\\n
\\n \\n \\n \\n
\\n
\\n\",\"customCss\":\"\",\"customFunction\":\"let $injector = widgetContext.$scope.$injector;\\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\\nlet assetService = $injector.get(widgetContext.servicesMap.get('assetService'));\\nlet attributeService = $injector.get(widgetContext.servicesMap.get('attributeService'));\\n\\nopenAddAssetDialog();\\n\\nfunction openAddAssetDialog() {\\n customDialog.customDialog(htmlTemplate, AddAssetDialogController).subscribe();\\n}\\n\\nfunction AddAssetDialogController(instance) {\\n let vm = instance;\\n \\n vm.addAssetFormGroup = vm.fb.group({\\n assetName: ['', [vm.validators.required]],\\n assetType: ['', [vm.validators.required]],\\n assetLabel: [''],\\n attributes: vm.fb.group({\\n latitude: [null],\\n longitude: [null]\\n }) \\n });\\n \\n vm.cancel = function() {\\n vm.dialogRef.close(null);\\n };\\n \\n vm.save = function() {\\n vm.addAssetFormGroup.markAsPristine();\\n let asset = {\\n name: vm.addAssetFormGroup.get('assetName').value,\\n type: vm.addAssetFormGroup.get('assetType').value,\\n label: vm.addAssetFormGroup.get('assetLabel').value\\n };\\n assetService.saveAsset(asset).subscribe(\\n function (asset) {\\n saveAttributes(asset.id).subscribe(\\n function () {\\n widgetContext.updateAliases();\\n vm.dialogRef.close(null);\\n }\\n );\\n }\\n );\\n };\\n \\n function saveAttributes(entityId) {\\n let attributes = vm.addAssetFormGroup.get('attributes').value;\\n let attributesArray = [];\\n for (let key in attributes) {\\n attributesArray.push({key: key, value: attributes[key]});\\n }\\n if (attributesArray.length > 0) {\\n return attributeService.saveEntityAttributes(entityId, \\\"SERVER_SCOPE\\\", attributesArray);\\n } else {\\n return widgetContext.rxjs.of([]);\\n }\\n }\\n}\",\"customResources\":[],\"id\":\"70837a9d-c3de-a9a7-03c5-dccd14998758\"}],\"actionCellButton\":[{\"name\":\"Edit asset\",\"icon\":\"edit\",\"type\":\"customPretty\",\"customHtml\":\"
\\n \\n

Edit asset

\\n \\n \\n
\\n \\n \\n
\\n
\\n
\\n \\n Asset name\\n \\n \\n Asset name is required.\\n \\n \\n
\\n \\n \\n Label\\n \\n \\n
\\n
\\n \\n Latitude\\n \\n \\n \\n Longitude\\n \\n \\n
\\n
\\n
\\n
\\n \\n \\n \\n
\\n
\\n\",\"customCss\":\"\",\"customFunction\":\"let $injector = widgetContext.$scope.$injector;\\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\\nlet assetService = $injector.get(widgetContext.servicesMap.get('assetService'));\\nlet attributeService = $injector.get(widgetContext.servicesMap.get('attributeService'));\\n\\nopenEditAssetDialog();\\n\\nfunction openEditAssetDialog() {\\n customDialog.customDialog(htmlTemplate, EditAssetDialogController).subscribe();\\n}\\n\\nfunction EditAssetDialogController(instance) {\\n let vm = instance;\\n \\n vm.asset = null;\\n vm.attributes = {};\\n \\n vm.editAssetFormGroup = vm.fb.group({\\n assetName: ['', [vm.validators.required]],\\n assetType: ['', [vm.validators.required]],\\n assetLabel: [''],\\n attributes: vm.fb.group({\\n latitude: [null],\\n longitude: [null]\\n }) \\n });\\n \\n vm.cancel = function() {\\n vm.dialogRef.close(null);\\n };\\n \\n vm.save = function() {\\n vm.editAssetFormGroup.markAsPristine();\\n vm.asset.name = vm.editAssetFormGroup.get('assetName').value,\\n vm.asset.type = vm.editAssetFormGroup.get('assetType').value,\\n vm.asset.label = vm.editAssetFormGroup.get('assetLabel').value\\n assetService.saveAsset(vm.asset).subscribe(\\n function () {\\n saveAttributes().subscribe(\\n function () {\\n widgetContext.updateAliases();\\n vm.dialogRef.close(null);\\n }\\n );\\n }\\n );\\n };\\n \\n getEntityInfo();\\n \\n function getEntityInfo() {\\n assetService.getAsset(entityId.id).subscribe(\\n function (asset) {\\n attributeService.getEntityAttributes(entityId, 'SERVER_SCOPE',\\n ['latitude', 'longitude']).subscribe(\\n function (attributes) {\\n for (let i = 0; i < attributes.length; i++) {\\n vm.attributes[attributes[i].key] = attributes[i].value; \\n }\\n vm.asset = asset;\\n vm.editAssetFormGroup.patchValue(\\n {\\n assetName: vm.asset.name,\\n assetType: vm.asset.type,\\n assetLabel: vm.asset.label,\\n attributes: {\\n latitude: vm.attributes.latitude,\\n longitude: vm.attributes.longitude\\n }\\n }, {emitEvent: false}\\n );\\n } \\n );\\n }\\n ); \\n }\\n \\n function saveAttributes() {\\n let attributes = vm.editAssetFormGroup.get('attributes').value;\\n let attributesArray = [];\\n for (let key in attributes) {\\n attributesArray.push({key: key, value: attributes[key]});\\n }\\n if (attributesArray.length > 0) {\\n return attributeService.saveEntityAttributes(entityId, 'SERVER_SCOPE', attributesArray);\\n } else {\\n return widgetContext.rxjs.of([]);\\n }\\n }\\n}\",\"customResources\":[],\"id\":\"93931e52-5d7c-903e-67aa-b9435df44ff4\"},{\"name\":\"Delete asset\",\"icon\":\"delete\",\"type\":\"custom\",\"customFunction\":\"let $injector = widgetContext.$scope.$injector;\\nlet dialogs = $injector.get(widgetContext.servicesMap.get('dialogs'));\\nlet assetService = $injector.get(widgetContext.servicesMap.get('assetService'));\\n\\nopenDeleteAssetDialog();\\n\\nfunction openDeleteAssetDialog() {\\n let title = \\\"Are you sure you want to delete the asset \\\" + entityName + \\\"?\\\";\\n let content = \\\"Be careful, after the confirmation, the asset and all related data will become unrecoverable!\\\";\\n dialogs.confirm(title, content, 'Cancel', 'Delete').subscribe(\\n function (result) {\\n if (result) {\\n deleteAsset();\\n }\\n }\\n );\\n}\\n\\nfunction deleteAsset() {\\n assetService.deleteAsset(entityId.id).subscribe(\\n function () {\\n widgetContext.updateAliases();\\n }\\n );\\n}\\n\",\"id\":\"ec2708f6-9ff0-186b-e4fc-7635ebfa3074\"}]},\"configMode\":\"basic\",\"titleFont\":null,\"titleColor\":null}" }, - "externalId": null + "externalId": null, + "tags": [ + "provisioning", + "management", + "administration", + "admin" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/bars.json b/application/src/main/data/json/system/widget_types/bars.json index f2f0f1e9e4..b3c991f968 100644 --- a/application/src/main/data/json/system/widget_types/bars.json +++ b/application/src/main/data/json/system/widget_types/bars.json @@ -3,7 +3,7 @@ "name": "Bars", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAA8FBMVEUhlvNMr1Bqamp5eXl7e3t8fHx9fX1+fn5/f3+AgICCgoKDg4OEhISGhoaHh4eKioqMjIyNjY2Ojo6QkJCRkZGSkpKWlpaXl5ebm5udnZ2enp6goKChoaGkpKSnp6epqamsrKyurq6xsbGzs7O1tbW2tra3t7e4uLi7u7u9vb3BwcHCwsLDw8PGxsbKysrNzc3Ozs7R0dHS0tLT09PZ2dna2trc3Nzd3d3e3t7g4ODh4eHj4+Pk5OTm5ubn5+fo6Ojp6enu7u7w8PDz8/P0Qzb09PT29vb39/f5+fn6+vr7+/v8/Pz9/f3+/v7/wQf///+dc+aLAAAAAWJLR0RPbmZBSQAAAcFJREFUeNrt3ds2AgEYhuHsaSOZbAvZi0r2YYjCJOW7/7txZhkcDNbM6h/vdwfPmlX/ybtmEorJErGCeJLadz3rkKPpZamaLTp925DHdFvSpKelU9uQ/cLKhtcdk7YqtiHruevtojch7ZZtQ0o1dcdfRqXNqm1IbVU3OaVamm/YhvQW5zIXOknnC5JUt7qEpE5fUv/5HVePy2UHAgQIECBAgAABAgQIECBxgrwGHBAgQIAAAQIECBAgQIAAAQIECJC/QRIBN0iQ+66voDMLuRp2fQWdVUhvNun6CjqrkJ0Dx/UVdEYhzXzfcX0FnVFIrlSZ2mx/LOiMQuqHh6k972NBZ/fv13G/KeiCQkIu4358EL8UdBafSGwuOxAgQIAAAQIECJDYQB4CDggQIECAAAECBAgQIECAAAECBAgQIECA/BrSufn0DjqjkEZmLXkWaUEXEmThXMeFSAu68H4j5b1IC7rQILfZTqQFXViQ1nRTL1EWdCFBnmYuJUVZ0IUEWR1xHKcXZUEXFDLwBR2XHQgQIECAAAEC5H9ChgIOCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgxiBmv+L6Bl9pkxYph15gAAAAAElFTkSuQmCC", - "description": "Displays latest values of the attributes or timeseries data for multiple entities as separate bars.", + "description": "Displays latest values of the attributes or time-series data for multiple entities as separate bars.", "descriptor": { "type": "latest", "sizeX": 7, @@ -21,5 +21,9 @@ "settingsDirective": "tb-chart-widget-settings", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"First\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"var value = (prevValue-50) + Math.random() * 2 - 1;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value+50;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Second\",\"color\":\"#4caf50\",\"settings\":{},\"_hash\":0.545701115289893,\"funcBody\":\"var value = (prevValue-20) + Math.random() * 2 - 1;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value+20;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Third\",\"color\":\"#f44336\",\"settings\":{},\"_hash\":0.2592906835158064,\"funcBody\":\"var value = (prevValue-40) + Math.random() * 2 - 1;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value+40;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Fourth\",\"color\":\"#ffc107\",\"settings\":{},\"_hash\":0.12880275585455747,\"funcBody\":\"var value = (prevValue-50) + Math.random() * 2 - 1;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value+50;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{},\"title\":\"Bars\"}" }, - "externalId": null + "externalId": null, + "tags": [ + "bar", + "bar chart" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/basic_gpio_control.json b/application/src/main/data/json/system/widget_types/basic_gpio_control.json index 05b1f2645e..c01b86fb01 100644 --- a/application/src/main/data/json/system/widget_types/basic_gpio_control.json +++ b/application/src/main/data/json/system/widget_types/basic_gpio_control.json @@ -17,5 +17,10 @@ "settingsDirective": "tb-gpio-control-widget-settings", "defaultConfig": "{\"targetDeviceAliases\":[],\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"parseGpioStatusFunction\":\"return body[pin] === true;\",\"gpioStatusChangeRequest\":{\"method\":\"setGpioStatus\",\"paramsBody\":\"{\\n \\\"pin\\\": \\\"{$pin}\\\",\\n \\\"enabled\\\": \\\"{$enabled}\\\"\\n}\"},\"requestTimeout\":500,\"switchPanelBackgroundColor\":\"#b71c1c\",\"gpioStatusRequest\":{\"method\":\"getGpioStatus\",\"paramsBody\":\"{}\"},\"gpioList\":[{\"pin\":1,\"label\":\"GPIO 1\",\"row\":0,\"col\":0,\"_uniqueKey\":0},{\"pin\":2,\"label\":\"GPIO 2\",\"row\":0,\"col\":1,\"_uniqueKey\":1},{\"pin\":3,\"label\":\"GPIO 3\",\"row\":1,\"col\":0,\"_uniqueKey\":2}]},\"title\":\"Basic GPIO Control\"}" }, - "externalId": null + "externalId": null, + "tags": [ + "pin", + "pins", + "board" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/basic_gpio_panel.json b/application/src/main/data/json/system/widget_types/basic_gpio_panel.json index 1752d60385..5a46e216a1 100644 --- a/application/src/main/data/json/system/widget_types/basic_gpio_panel.json +++ b/application/src/main/data/json/system/widget_types/basic_gpio_panel.json @@ -17,5 +17,10 @@ "settingsDirective": "tb-gpio-panel-widget-settings", "defaultConfig": "{\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"gpioList\":[{\"pin\":1,\"label\":\"GPIO 1\",\"row\":0,\"col\":0,\"color\":\"#008000\",\"_uniqueKey\":0},{\"pin\":2,\"label\":\"GPIO 2\",\"row\":0,\"col\":1,\"color\":\"#ffff00\",\"_uniqueKey\":1},{\"pin\":3,\"label\":\"GPIO 3\",\"row\":1,\"col\":0,\"color\":\"#cf006f\",\"_uniqueKey\":2}],\"ledPanelBackgroundColor\":\"#b71c1c\"},\"title\":\"Basic GPIO Panel\",\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"1\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.22518255793320163,\"funcBody\":\"var period = time % 1500;\\nreturn period < 500;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"2\",\"color\":\"#4caf50\",\"settings\":{},\"_hash\":0.7008206860666621,\"funcBody\":\"var period = time % 1500;\\nreturn period >= 500 && period < 1000;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"3\",\"color\":\"#f44336\",\"settings\":{},\"_hash\":0.42600325102193426,\"funcBody\":\"var period = time % 1500;\\nreturn period >= 1000;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}}}" }, - "externalId": null + "externalId": null, + "tags": [ + "pin", + "pins", + "board" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/battery_level.json b/application/src/main/data/json/system/widget_types/battery_level.json index 1a9bdd1afd..dc53143caa 100644 --- a/application/src/main/data/json/system/widget_types/battery_level.json +++ b/application/src/main/data/json/system/widget_types/battery_level.json @@ -20,5 +20,13 @@ "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"batteryLevel\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 7;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"layout\":\"vertical_solid\",\"showValue\":true,\"autoScaleValueSize\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":20,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"24px\"},\"valueColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"batteryLevelColor\":{\"color\":\"rgba(92, 223, 144, 1)\",\"type\":\"range\",\"rangeList\":[{\"from\":0,\"to\":25,\"color\":\"rgba(227, 71, 71, 1)\"},{\"from\":25,\"to\":50,\"color\":\"rgba(246, 206, 67, 1)\"},{\"from\":50,\"to\":100,\"color\":\"rgba(92, 223, 144, 1)\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"batteryShapeColor\":{\"color\":\"rgba(92, 223, 144, 0.32)\",\"type\":\"range\",\"rangeList\":[{\"from\":0,\"to\":25,\"color\":\"rgba(227, 71, 71, 0.32)\"},{\"from\":25,\"to\":50,\"color\":\"rgba(246, 206, 67, 0.32)\"},{\"from\":50,\"to\":100,\"color\":\"rgba(92, 223, 144, 0.32)\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"sectionsCount\":4},\"title\":\"Battery level\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"%\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"titleIcon\":\"mdi:battery-high\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"18px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null},\"titleColor\":\"rgba(0, 0, 0, 0.87)\"}" }, "externalId": null, - "tags": null + "tags": [ + "accumulator", + "capacity", + "lithium", + "lithium-ion", + "power cell", + "energy cell", + "cell" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/co2_card.json b/application/src/main/data/json/system/widget_types/co2_card.json index 908bb82c03..3f8260de3b 100644 --- a/application/src/main/data/json/system/widget_types/co2_card.json +++ b/application/src/main/data/json/system/widget_types/co2_card.json @@ -3,7 +3,7 @@ "name": "CO2 card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest CO2 level telemetry data in a box layout.", + "description": "Displays the latest CO2 level telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, @@ -23,6 +23,18 @@ "tags": [ "weather", "environment", - "co2" + "co2", + "carbon dioxide", + "carbon emission", + "carbon footprint", + "carbon output", + "carbon pollution", + "carbon capture", + "carbon offset", + "carbon reduction", + "carbon neutral", + "climate gas", + "fossil fuel emission", + "carbon cycle" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/co2_card_with_background.json b/application/src/main/data/json/system/widget_types/co2_card_with_background.json index f897d0d7a0..19d8b82c49 100644 --- a/application/src/main/data/json/system/widget_types/co2_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/co2_card_with_background.json @@ -3,7 +3,7 @@ "name": "CO2 card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest CO2 level telemetry data in a box layout with background.", + "description": "Displays the latest CO2 level telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, @@ -23,6 +23,18 @@ "tags": [ "weather", "environment", - "co2" + "co2", + "carbon dioxide", + "carbon emission", + "carbon footprint", + "carbon output", + "carbon pollution", + "carbon capture", + "carbon offset", + "carbon reduction", + "carbon neutral", + "climate gas", + "fossil fuel emission", + "carbon cycle" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/co2_chart_card.json b/application/src/main/data/json/system/widget_types/co2_chart_card.json index b4b6fe348f..d6fada6ca5 100644 --- a/application/src/main/data/json/system/widget_types/co2_chart_card.json +++ b/application/src/main/data/json/system/widget_types/co2_chart_card.json @@ -3,7 +3,7 @@ "name": "CO2 chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a CO2 level data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a CO2 level data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, @@ -26,6 +26,18 @@ "tags": [ "weather", "environment", - "co2" + "co2", + "carbon dioxide", + "carbon emission", + "carbon footprint", + "carbon output", + "carbon pollution", + "carbon capture", + "carbon offset", + "carbon reduction", + "carbon neutral", + "climate gas", + "fossil fuel emission", + "carbon cycle" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/co2_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/co2_chart_card_with_background.json index e4cc301fb6..cb6e3761eb 100644 --- a/application/src/main/data/json/system/widget_types/co2_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/co2_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "CO2 chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a CO2 level data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a CO2 level data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, @@ -26,6 +26,18 @@ "tags": [ "weather", "environment", - "co2" + "co2", + "carbon dioxide", + "carbon emission", + "carbon footprint", + "carbon output", + "carbon pollution", + "carbon capture", + "carbon offset", + "carbon reduction", + "carbon neutral", + "climate gas", + "fossil fuel emission", + "carbon cycle" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/compass.json b/application/src/main/data/json/system/widget_types/compass.json index 79e92d7d57..c74108d034 100644 --- a/application/src/main/data/json/system/widget_types/compass.json +++ b/application/src/main/data/json/system/widget_types/compass.json @@ -3,7 +3,7 @@ "name": "Compass", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays latest value of the attribute or timeseries key on the compass. Expects value to be in range of 0 to 360.", + "description": "Displays latest value of the attribute or time-series data on the compass. Expects value to be in range of 0 to 360.", "descriptor": { "type": "latest", "sizeX": 6, @@ -11,11 +11,23 @@ "resources": [], "templateHtml": "", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.gauge = new TbAnalogueCompass(self.ctx, 'compass');\n}\n\nself.onDataUpdated = function() {\n self.ctx.gauge.update();\n}\n\nself.onResize = function() {\n self.ctx.gauge.resize();\n}\n\nself.onMobileModeChanged = function() {\n self.ctx.gauge.mobileModeChanged();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true\n };\n}\n\nself.onDestroy = function() {\n self.ctx.gauge.destroy();\n}\n", - "settingsSchema": "{}", + "controllerScript": "self.onInit = function() {\n self.ctx.gauge = new TbAnalogueCompass(self.ctx, 'compass');\n}\n\nself.onDataUpdated = function() {\n self.ctx.gauge.update();\n}\n\nself.onResize = function() {\n self.ctx.gauge.resize();\n}\n\nself.onMobileModeChanged = function() {\n self.ctx.gauge.mobileModeChanged();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'direction', label: 'Direction', type: 'timeseries' }];\n }\n };\n}\n\nself.onDestroy = function() {\n self.ctx.gauge.destroy();\n}\n", "settingsSchema": "{}", "dataKeySettingsSchema": "{}\n", "settingsDirective": "tb-analogue-compass-widget-settings", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"minorTicks\":22,\"needleCircleSize\":15,\"showBorder\":true,\"borderOuterWidth\":10,\"colorPlate\":\"#222\",\"colorMajorTicks\":\"#f5f5f5\",\"colorMinorTicks\":\"#ddd\",\"colorNeedle\":\"#f08080\",\"colorNeedleCircle\":\"#e8e8e8\",\"colorBorder\":\"#ccc\",\"majorTickFont\":{\"family\":\"Roboto\",\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#ccc\"},\"animation\":true,\"animationDuration\":500,\"animationRule\":\"cycle\",\"animationTarget\":\"needle\",\"majorTicks\":[\"N\",\"NE\",\"E\",\"SE\",\"S\",\"SW\",\"W\",\"NW\"]},\"title\":\"Compass\",\"dropShadow\":true,\"enableFullscreen\":true,\"widgetStyle\":{},\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"useDashboardTimewindow\":true,\"showLegend\":false,\"actions\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"decimals\":0,\"noDataDisplayMessage\":\"\"}" - }, - "externalId": null + "hasBasicMode": true, + "basicModeDirective": "tb-compass-gauge-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"minorTicks\":22,\"needleCircleSize\":15,\"showBorder\":true,\"borderOuterWidth\":10,\"colorPlate\":\"#222\",\"colorMajorTicks\":\"#f5f5f5\",\"colorMinorTicks\":\"#ddd\",\"colorNeedle\":\"#f08080\",\"colorNeedleCircle\":\"#e8e8e8\",\"colorBorder\":\"#ccc\",\"majorTickFont\":{\"family\":\"Roboto\",\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#ccc\"},\"animation\":true,\"animationDuration\":500,\"animationRule\":\"cycle\",\"animationTarget\":\"needle\",\"majorTicks\":[\"N\",\"NE\",\"E\",\"SE\",\"S\",\"SW\",\"W\",\"NW\"]},\"title\":\"Compass\",\"dropShadow\":true,\"enableFullscreen\":true,\"widgetStyle\":{},\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"useDashboardTimewindow\":true,\"showLegend\":false,\"actions\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"decimals\":0,\"noDataDisplayMessage\":\"\",\"configMode\":\"basic\"}" }, + "externalId": null, + "tags": [ + "direction finder", + "magnetic needle", + "navigator tool", + "orienting device", + "gyrocompass", + "course plotter", + "bearing pointer", + "directional guide", + "north pointer", + "magnetometer" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/dashboard_state_widget.json b/application/src/main/data/json/system/widget_types/dashboard_state_widget.json index ab66c2bac1..5ba95e2593 100644 --- a/application/src/main/data/json/system/widget_types/dashboard_state_widget.json +++ b/application/src/main/data/json/system/widget_types/dashboard_state_widget.json @@ -17,5 +17,10 @@ "settingsDirective": "tb-dashboard-state-widget-settings", "defaultConfig": "{\"datasources\":[{\"type\":\"static\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"syncParentStateParams\":true,\"defaultAutofillLayout\":true,\"defaultMargin\":0,\"defaultBackgroundColor\":\"#fff\"},\"title\":\"Dashboard state widget\",\"dropShadow\":true,\"enableFullscreen\":false,\"widgetStyle\":{},\"widgetCss\":\"\",\"noDataDisplayMessage\":\"\",\"showLegend\":false}" }, - "externalId": null + "externalId": null, + "tags": [ + "embed", + "embedded", + "inner" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/dashboards.json b/application/src/main/data/json/system/widget_types/dashboards.json index 03c22199b8..a0dc6c4172 100644 --- a/application/src/main/data/json/system/widget_types/dashboards.json +++ b/application/src/main/data/json/system/widget_types/dashboards.json @@ -17,5 +17,14 @@ "settingsDirective": "", "defaultConfig": "{\"showTitle\":false,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{},\"title\":\"Dashboards\",\"dropShadow\":true,\"enableFullscreen\":false,\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showLegend\":false}" }, - "externalId": null + "externalId": null, + "tags": [ + "weather", + "environment", + "air", + "aqi", + "pollution", + "emission", + "smog" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/date_range_navigator.json b/application/src/main/data/json/system/widget_types/date_range_navigator.json index df1b8668da..06231d055d 100644 --- a/application/src/main/data/json/system/widget_types/date_range_navigator.json +++ b/application/src/main/data/json/system/widget_types/date_range_navigator.json @@ -17,5 +17,11 @@ "settingsDirective": "tb-date-range-navigator-widget-settings", "defaultConfig": "{\"datasources\":[{\"type\":\"static\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"defaultInterval\":\"week\",\"stepSize\":\"day\"},\"title\":\"Date-range-navigator\",\"dropShadow\":true,\"enableFullscreen\":true,\"widgetStyle\":{},\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"useDashboardTimewindow\":true,\"showLegend\":false,\"actions\":{}}" }, - "externalId": null + "externalId": null, + "tags": [ + "time-window", + "interval", + "date", + "date-range" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/device_admin_table.json b/application/src/main/data/json/system/widget_types/device_admin_table.json index 1aff2917b5..af460a286c 100644 --- a/application/src/main/data/json/system/widget_types/device_admin_table.json +++ b/application/src/main/data/json/system/widget_types/device_admin_table.json @@ -16,7 +16,15 @@ "dataKeySettingsSchema": "", "settingsDirective": "tb-entities-table-widget-settings", "dataKeySettingsDirective": "tb-entities-table-key-settings", - "defaultConfig": "{\"timewindow\":{\"realtime\":{\"interval\":1000,\"timewindowMs\":86400000},\"aggregation\":{\"type\":\"NONE\",\"limit\":200}},\"showTitle\":true,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"4px\",\"settings\":{\"enableSearch\":true,\"displayPagination\":true,\"defaultPageSize\":10,\"defaultSortOrder\":\"entityName\",\"displayEntityName\":true,\"displayEntityType\":true,\"entitiesTitle\":\"Device admin table\",\"enableSelectColumnDisplay\":true,\"enableStickyHeader\":true,\"enableStickyAction\":true,\"reserveSpaceForHiddenAction\":\"true\",\"displayEntityLabel\":false,\"useRowStyleFunction\":false},\"title\":\"Device admin table\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400,\"padding\":\"5px 10px 5px 10px\"},\"useDashboardTimewindow\":false,\"showLegend\":false,\"datasources\":[{\"type\":\"function\",\"name\":\"Simulated\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#f44336\",\"settings\":{\"columnWidth\":\"0px\",\"useCellStyleFunction\":false,\"cellStyleFunction\":\"\",\"useCellContentFunction\":false,\"cellContentFunction\":\"\"},\"_hash\":0.6401141393938932,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}]}],\"showTitleIcon\":false,\"titleIcon\":\"more_horiz\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"displayTimewindow\":true,\"actions\":{\"headerButton\":[{\"name\":\"Add device\",\"icon\":\"add\",\"type\":\"customPretty\",\"customHtml\":\"
\\n \\n

Add device

\\n \\n \\n
\\n \\n \\n
\\n
\\n
\\n \\n Device name\\n \\n \\n Device name is required.\\n \\n \\n
\\n \\n \\n Label\\n \\n \\n
\\n
\\n \\n Latitude\\n \\n \\n \\n Longitude\\n \\n \\n
\\n
\\n
\\n
\\n \\n \\n \\n
\\n
\\n\",\"customCss\":\"\",\"customFunction\":\"let $injector = widgetContext.$scope.$injector;\\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\\nlet deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));\\nlet attributeService = $injector.get(widgetContext.servicesMap.get('attributeService'));\\n\\nopenAddDeviceDialog();\\n\\nfunction openAddDeviceDialog() {\\n customDialog.customDialog(htmlTemplate, AddDeviceDialogController).subscribe();\\n}\\n\\nfunction AddDeviceDialogController(instance) {\\n let vm = instance;\\n \\n vm.addDeviceFormGroup = vm.fb.group({\\n deviceName: ['', [vm.validators.required]],\\n deviceType: ['', [vm.validators.required]],\\n deviceLabel: [''],\\n attributes: vm.fb.group({\\n latitude: [null],\\n longitude: [null]\\n }) \\n });\\n \\n vm.cancel = function() {\\n vm.dialogRef.close(null);\\n };\\n \\n vm.save = function() {\\n vm.addDeviceFormGroup.markAsPristine();\\n let device = {\\n name: vm.addDeviceFormGroup.get('deviceName').value,\\n type: vm.addDeviceFormGroup.get('deviceType').value,\\n label: vm.addDeviceFormGroup.get('deviceLabel').value\\n };\\n deviceService.saveDevice(device).subscribe(\\n function (device) {\\n saveAttributes(device.id).subscribe(\\n function () {\\n widgetContext.updateAliases();\\n vm.dialogRef.close(null);\\n }\\n );\\n }\\n );\\n };\\n \\n function saveAttributes(entityId) {\\n let attributes = vm.addDeviceFormGroup.get('attributes').value;\\n let attributesArray = [];\\n for (let key in attributes) {\\n attributesArray.push({key: key, value: attributes[key]});\\n }\\n if (attributesArray.length > 0) {\\n return attributeService.saveEntityAttributes(entityId, \\\"SERVER_SCOPE\\\", attributesArray);\\n } else {\\n return widgetContext.rxjs.of([]);\\n }\\n }\\n}\",\"customResources\":[],\"id\":\"70837a9d-c3de-a9a7-03c5-dccd14998758\"}],\"actionCellButton\":[{\"name\":\"Edit device\",\"icon\":\"edit\",\"useShowWidgetActionFunction\":null,\"showWidgetActionFunction\":\"return true;\",\"type\":\"customPretty\",\"customHtml\":\"
\\n \\n

Edit device

\\n \\n \\n
\\n \\n \\n
\\n
\\n
\\n \\n Device name\\n \\n \\n Device name is required.\\n \\n \\n
\\n \\n \\n Label\\n \\n \\n
\\n
\\n \\n Latitude\\n \\n \\n \\n Longitude\\n \\n \\n
\\n
\\n
\\n
\\n \\n \\n \\n
\\n
\\n\",\"customCss\":\"\",\"customFunction\":\"let $injector = widgetContext.$scope.$injector;\\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\\nlet deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));\\nlet attributeService = $injector.get(widgetContext.servicesMap.get('attributeService'));\\n\\nopenEditDeviceDialog();\\n\\nfunction openEditDeviceDialog() {\\n customDialog.customDialog(htmlTemplate, EditDeviceDialogController).subscribe();\\n}\\n\\nfunction EditDeviceDialogController(instance) {\\n let vm = instance;\\n \\n vm.device = null;\\n vm.attributes = {};\\n \\n vm.editDeviceFormGroup = vm.fb.group({\\n deviceName: ['', [vm.validators.required]],\\n deviceType: ['', [vm.validators.required]],\\n deviceLabel: [''],\\n attributes: vm.fb.group({\\n latitude: [null],\\n longitude: [null]\\n }) \\n });\\n \\n vm.cancel = function() {\\n vm.dialogRef.close(null);\\n };\\n \\n vm.save = function() {\\n vm.editDeviceFormGroup.markAsPristine();\\n if (vm.editDeviceFormGroup.get('deviceType').value !== vm.device.type) {\\n delete vm.device.deviceProfileId;\\n }\\n vm.device.name = vm.editDeviceFormGroup.get('deviceName').value,\\n vm.device.type = vm.editDeviceFormGroup.get('deviceType').value,\\n vm.device.label = vm.editDeviceFormGroup.get('deviceLabel').value\\n deviceService.saveDevice(vm.device).subscribe(\\n function () {\\n saveAttributes().subscribe(\\n function () {\\n widgetContext.updateAliases();\\n vm.dialogRef.close(null);\\n }\\n );\\n }\\n );\\n };\\n \\n getEntityInfo();\\n \\n function getEntityInfo() {\\n deviceService.getDevice(entityId.id).subscribe(\\n function (device) {\\n attributeService.getEntityAttributes(entityId, 'SERVER_SCOPE',\\n ['latitude', 'longitude']).subscribe(\\n function (attributes) {\\n for (let i = 0; i < attributes.length; i++) {\\n vm.attributes[attributes[i].key] = attributes[i].value; \\n }\\n vm.device = device;\\n vm.editDeviceFormGroup.patchValue(\\n {\\n deviceName: vm.device.name,\\n deviceType: vm.device.type,\\n deviceLabel: vm.device.label,\\n attributes: {\\n latitude: vm.attributes.latitude,\\n longitude: vm.attributes.longitude\\n }\\n }, {emitEvent: false}\\n );\\n } \\n );\\n }\\n ); \\n }\\n \\n function saveAttributes() {\\n let attributes = vm.editDeviceFormGroup.get('attributes').value;\\n let attributesArray = [];\\n for (let key in attributes) {\\n attributesArray.push({key: key, value: attributes[key]});\\n }\\n if (attributesArray.length > 0) {\\n return attributeService.saveEntityAttributes(entityId, 'SERVER_SCOPE', attributesArray);\\n } else {\\n return widgetContext.rxjs.of([]);\\n }\\n }\\n}\",\"customResources\":[],\"openInSeparateDialog\":false,\"openInPopover\":false,\"id\":\"93931e52-5d7c-903e-67aa-b9435df44ff4\"},{\"name\":\"Delete device\",\"icon\":\"delete\",\"type\":\"custom\",\"customFunction\":\"let $injector = widgetContext.$scope.$injector;\\nlet dialogs = $injector.get(widgetContext.servicesMap.get('dialogs'));\\nlet deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));\\n\\nopenDeleteDeviceDialog();\\n\\nfunction openDeleteDeviceDialog() {\\n let title = \\\"Are you sure you want to delete the device \\\" + entityName + \\\"?\\\";\\n let content = \\\"Be careful, after the confirmation, the device and all related data will become unrecoverable!\\\";\\n dialogs.confirm(title, content, 'Cancel', 'Delete').subscribe(\\n function (result) {\\n if (result) {\\n deleteDevice();\\n }\\n }\\n );\\n}\\n\\nfunction deleteDevice() {\\n deviceService.deleteDevice(entityId.id).subscribe(\\n function () {\\n widgetContext.updateAliases();\\n }\\n );\\n}\\n\",\"id\":\"ec2708f6-9ff0-186b-e4fc-7635ebfa3074\"}]}}" + "hasBasicMode": true, + "basicModeDirective": "tb-entities-table-basic-config", + "defaultConfig": "{\"timewindow\":{\"realtime\":{\"interval\":1000,\"timewindowMs\":86400000},\"aggregation\":{\"type\":\"NONE\",\"limit\":200}},\"showTitle\":true,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"4px\",\"settings\":{\"entitiesTitle\":\"Device admin table\",\"enableSearch\":true,\"enableSelectColumnDisplay\":true,\"enableStickyHeader\":true,\"enableStickyAction\":true,\"showCellActionsMenu\":true,\"reserveSpaceForHiddenAction\":\"true\",\"displayEntityName\":false,\"displayEntityLabel\":false,\"displayEntityType\":false,\"displayPagination\":true,\"defaultPageSize\":10,\"defaultSortOrder\":\"entityName\",\"useRowStyleFunction\":false},\"title\":\"Device admin table\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400,\"padding\":\"5px 10px 5px 10px\"},\"useDashboardTimewindow\":false,\"showLegend\":false,\"datasources\":[{\"type\":\"function\",\"name\":\"Simulated\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Entity name\",\"color\":\"#4caf50\",\"settings\":{},\"_hash\":0.8332260553092266,\"funcBody\":\"return 'Simulated';\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Entity type\",\"color\":\"#f44336\",\"settings\":{},\"_hash\":0.08583217494773887,\"funcBody\":\"return 'Device';\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#f44336\",\"settings\":{\"columnWidth\":\"0px\",\"useCellStyleFunction\":false,\"cellStyleFunction\":\"\",\"useCellContentFunction\":false,\"cellContentFunction\":\"\"},\"_hash\":0.6401141393938932,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"showTitleIcon\":false,\"titleIcon\":\"more_horiz\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"displayTimewindow\":true,\"actions\":{\"headerButton\":[{\"name\":\"Add device\",\"icon\":\"add\",\"type\":\"customPretty\",\"customHtml\":\"
\\n \\n

Add device

\\n \\n \\n
\\n \\n \\n
\\n
\\n
\\n \\n Device name\\n \\n \\n Device name is required.\\n \\n \\n
\\n \\n \\n Label\\n \\n \\n
\\n
\\n \\n Latitude\\n \\n \\n \\n Longitude\\n \\n \\n
\\n
\\n
\\n
\\n \\n \\n \\n
\\n
\\n\",\"customCss\":\"\",\"customFunction\":\"let $injector = widgetContext.$scope.$injector;\\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\\nlet deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));\\nlet attributeService = $injector.get(widgetContext.servicesMap.get('attributeService'));\\n\\nopenAddDeviceDialog();\\n\\nfunction openAddDeviceDialog() {\\n customDialog.customDialog(htmlTemplate, AddDeviceDialogController).subscribe();\\n}\\n\\nfunction AddDeviceDialogController(instance) {\\n let vm = instance;\\n \\n vm.addDeviceFormGroup = vm.fb.group({\\n deviceName: ['', [vm.validators.required]],\\n deviceType: ['', [vm.validators.required]],\\n deviceLabel: [''],\\n attributes: vm.fb.group({\\n latitude: [null],\\n longitude: [null]\\n }) \\n });\\n \\n vm.cancel = function() {\\n vm.dialogRef.close(null);\\n };\\n \\n vm.save = function() {\\n vm.addDeviceFormGroup.markAsPristine();\\n let device = {\\n name: vm.addDeviceFormGroup.get('deviceName').value,\\n type: vm.addDeviceFormGroup.get('deviceType').value,\\n label: vm.addDeviceFormGroup.get('deviceLabel').value\\n };\\n deviceService.saveDevice(device).subscribe(\\n function (device) {\\n saveAttributes(device.id).subscribe(\\n function () {\\n widgetContext.updateAliases();\\n vm.dialogRef.close(null);\\n }\\n );\\n }\\n );\\n };\\n \\n function saveAttributes(entityId) {\\n let attributes = vm.addDeviceFormGroup.get('attributes').value;\\n let attributesArray = [];\\n for (let key in attributes) {\\n attributesArray.push({key: key, value: attributes[key]});\\n }\\n if (attributesArray.length > 0) {\\n return attributeService.saveEntityAttributes(entityId, \\\"SERVER_SCOPE\\\", attributesArray);\\n } else {\\n return widgetContext.rxjs.of([]);\\n }\\n }\\n}\",\"customResources\":[],\"id\":\"70837a9d-c3de-a9a7-03c5-dccd14998758\"}],\"actionCellButton\":[{\"name\":\"Edit device\",\"icon\":\"edit\",\"useShowWidgetActionFunction\":null,\"showWidgetActionFunction\":\"return true;\",\"type\":\"customPretty\",\"customHtml\":\"
\\n \\n

Edit device

\\n \\n \\n
\\n \\n \\n
\\n
\\n
\\n \\n Device name\\n \\n \\n Device name is required.\\n \\n \\n
\\n \\n \\n Label\\n \\n \\n
\\n
\\n \\n Latitude\\n \\n \\n \\n Longitude\\n \\n \\n
\\n
\\n
\\n
\\n \\n \\n \\n
\\n
\\n\",\"customCss\":\"\",\"customFunction\":\"let $injector = widgetContext.$scope.$injector;\\nlet customDialog = $injector.get(widgetContext.servicesMap.get('customDialog'));\\nlet deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));\\nlet attributeService = $injector.get(widgetContext.servicesMap.get('attributeService'));\\n\\nopenEditDeviceDialog();\\n\\nfunction openEditDeviceDialog() {\\n customDialog.customDialog(htmlTemplate, EditDeviceDialogController).subscribe();\\n}\\n\\nfunction EditDeviceDialogController(instance) {\\n let vm = instance;\\n \\n vm.device = null;\\n vm.attributes = {};\\n \\n vm.editDeviceFormGroup = vm.fb.group({\\n deviceName: ['', [vm.validators.required]],\\n deviceType: ['', [vm.validators.required]],\\n deviceLabel: [''],\\n attributes: vm.fb.group({\\n latitude: [null],\\n longitude: [null]\\n }) \\n });\\n \\n vm.cancel = function() {\\n vm.dialogRef.close(null);\\n };\\n \\n vm.save = function() {\\n vm.editDeviceFormGroup.markAsPristine();\\n if (vm.editDeviceFormGroup.get('deviceType').value !== vm.device.type) {\\n delete vm.device.deviceProfileId;\\n }\\n vm.device.name = vm.editDeviceFormGroup.get('deviceName').value,\\n vm.device.type = vm.editDeviceFormGroup.get('deviceType').value,\\n vm.device.label = vm.editDeviceFormGroup.get('deviceLabel').value\\n deviceService.saveDevice(vm.device).subscribe(\\n function () {\\n saveAttributes().subscribe(\\n function () {\\n widgetContext.updateAliases();\\n vm.dialogRef.close(null);\\n }\\n );\\n }\\n );\\n };\\n \\n getEntityInfo();\\n \\n function getEntityInfo() {\\n deviceService.getDevice(entityId.id).subscribe(\\n function (device) {\\n attributeService.getEntityAttributes(entityId, 'SERVER_SCOPE',\\n ['latitude', 'longitude']).subscribe(\\n function (attributes) {\\n for (let i = 0; i < attributes.length; i++) {\\n vm.attributes[attributes[i].key] = attributes[i].value; \\n }\\n vm.device = device;\\n vm.editDeviceFormGroup.patchValue(\\n {\\n deviceName: vm.device.name,\\n deviceType: vm.device.type,\\n deviceLabel: vm.device.label,\\n attributes: {\\n latitude: vm.attributes.latitude,\\n longitude: vm.attributes.longitude\\n }\\n }, {emitEvent: false}\\n );\\n } \\n );\\n }\\n ); \\n }\\n \\n function saveAttributes() {\\n let attributes = vm.editDeviceFormGroup.get('attributes').value;\\n let attributesArray = [];\\n for (let key in attributes) {\\n attributesArray.push({key: key, value: attributes[key]});\\n }\\n if (attributesArray.length > 0) {\\n return attributeService.saveEntityAttributes(entityId, 'SERVER_SCOPE', attributesArray);\\n } else {\\n return widgetContext.rxjs.of([]);\\n }\\n }\\n}\",\"customResources\":[],\"openInSeparateDialog\":false,\"openInPopover\":false,\"id\":\"93931e52-5d7c-903e-67aa-b9435df44ff4\"},{\"name\":\"Delete device\",\"icon\":\"delete\",\"type\":\"custom\",\"customFunction\":\"let $injector = widgetContext.$scope.$injector;\\nlet dialogs = $injector.get(widgetContext.servicesMap.get('dialogs'));\\nlet deviceService = $injector.get(widgetContext.servicesMap.get('deviceService'));\\n\\nopenDeleteDeviceDialog();\\n\\nfunction openDeleteDeviceDialog() {\\n let title = \\\"Are you sure you want to delete the device \\\" + entityName + \\\"?\\\";\\n let content = \\\"Be careful, after the confirmation, the device and all related data will become unrecoverable!\\\";\\n dialogs.confirm(title, content, 'Cancel', 'Delete').subscribe(\\n function (result) {\\n if (result) {\\n deleteDevice();\\n }\\n }\\n );\\n}\\n\\nfunction deleteDevice() {\\n deviceService.deleteDevice(entityId.id).subscribe(\\n function () {\\n widgetContext.updateAliases();\\n }\\n );\\n}\\n\",\"id\":\"ec2708f6-9ff0-186b-e4fc-7635ebfa3074\"}]},\"configMode\":\"basic\"}" }, + "tags": [ + "provisioning", + "management", + "administration", + "admin" + ], "externalId": null } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/device_claiming_widget.json b/application/src/main/data/json/system/widget_types/device_claiming_widget.json index 4de31ce0bb..4ac8654ab4 100644 --- a/application/src/main/data/json/system/widget_types/device_claiming_widget.json +++ b/application/src/main/data/json/system/widget_types/device_claiming_widget.json @@ -17,5 +17,9 @@ "settingsDirective": "tb-device-claiming-widget-settings", "defaultConfig": "{\"datasources\":[{\"type\":\"static\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"deviceSecret\":true,\"showLabel\":true},\"title\":\"Device claiming widget\",\"dropShadow\":true,\"showTitleIcon\":false,\"titleIcon\":\"more_horiz\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"enableFullscreen\":false,\"enableDataExport\":true,\"widgetStyle\":{},\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"useDashboardTimewindow\":true,\"displayTimewindow\":true,\"showLegend\":false,\"actions\":{}}" }, - "externalId": null + "externalId": null, + "tags": [ + "provisioning", + "management" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/digital_horizontal_bar.json b/application/src/main/data/json/system/widget_types/digital_horizontal_bar.json index dbf54258f2..deb82422c6 100644 --- a/application/src/main/data/json/system/widget_types/digital_horizontal_bar.json +++ b/application/src/main/data/json/system/widget_types/digital_horizontal_bar.json @@ -17,5 +17,9 @@ "settingsDirective": "tb-digital-gauge-widget-settings", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Speed\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.7282710489093589,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nif (value < 80) {\\n\\tvalue = 80;\\n} else if (value > 160) {\\n\\tvalue = 160;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"#000000\",\"color\":\"rgba(255, 254, 254, 0.87)\",\"padding\":\"0px\",\"settings\":{\"maxValue\":180,\"minValue\":0,\"donutStartAngle\":90,\"showValue\":true,\"showMinMax\":true,\"gaugeWidthScale\":0.75,\"levelColors\":[\"#008000\",\"#fbc02d\",\"#f44336\"],\"titleFont\":{\"family\":\"Roboto\",\"size\":12,\"style\":\"normal\",\"weight\":\"500\"},\"labelFont\":{\"family\":\"Roboto\",\"size\":8,\"style\":\"normal\",\"weight\":\"500\"},\"valueFont\":{\"family\":\"Segment7Standard\",\"style\":\"normal\",\"weight\":\"500\",\"size\":18},\"minMaxFont\":{\"family\":\"Segment7Standard\",\"size\":12,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#ffffff\"},\"neonGlowBrightness\":40,\"dashThickness\":1.5,\"unitTitle\":\"MPH\",\"showUnitTitle\":true,\"gaugeColor\":\"#171a1c\",\"gaugeType\":\"horizontalBar\",\"showTitle\":false,\"animation\":true,\"animationDuration\":500,\"animationRule\":\"linear\"},\"title\":\"Digital horizontal bar\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"widgetStyle\":{},\"useDashboardTimewindow\":true,\"showLegend\":false,\"actions\":{}}" }, - "externalId": null + "externalId": null, + "tags": [ + "provisioning", + "management" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/digital_speedometer.json b/application/src/main/data/json/system/widget_types/digital_speedometer.json index c691064b3e..a3844fc560 100644 --- a/application/src/main/data/json/system/widget_types/digital_speedometer.json +++ b/application/src/main/data/json/system/widget_types/digital_speedometer.json @@ -17,5 +17,18 @@ "settingsDirective": "tb-digital-gauge-widget-settings", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Speed\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.7282710489093589,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nif (value < 45) {\\n\\tvalue = 45;\\n} else if (value > 130) {\\n\\tvalue = 130;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"#000000\",\"color\":\"rgba(255, 254, 254, 0.87)\",\"padding\":\"0px\",\"settings\":{\"maxValue\":180,\"minValue\":0,\"donutStartAngle\":90,\"showValue\":true,\"showMinMax\":true,\"gaugeWidthScale\":0.75,\"levelColors\":[\"#008000\",\"#fbc02d\",\"#f44336\"],\"titleFont\":{\"family\":\"Roboto\",\"size\":12,\"style\":\"normal\",\"weight\":\"500\"},\"labelFont\":{\"family\":\"Roboto\",\"size\":8,\"style\":\"normal\",\"weight\":\"500\"},\"valueFont\":{\"family\":\"Segment7Standard\",\"style\":\"normal\",\"weight\":\"500\",\"size\":32},\"minMaxFont\":{\"family\":\"Segment7Standard\",\"size\":12,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#ffffff\"},\"neonGlowBrightness\":40,\"dashThickness\":1.5,\"unitTitle\":\"MPH\",\"showUnitTitle\":true,\"gaugeColor\":\"#171a1c\",\"gaugeType\":\"arc\",\"animation\":true,\"animationDuration\":500,\"animationRule\":\"linear\"},\"title\":\"Digital speedometer\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"widgetStyle\":{},\"useDashboardTimewindow\":true,\"showLegend\":false,\"actions\":{}}" }, - "externalId": null + "externalId": null, + "tags": [ + "velocity", + "velocimeter", + "pace", + "rate", + "tempo", + "momentum", + "haste", + "swiftness", + "rapidity", + "acceleration", + "quickness" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/digital_thermometer.json b/application/src/main/data/json/system/widget_types/digital_thermometer.json index 17d7523511..ab75474f9c 100644 --- a/application/src/main/data/json/system/widget_types/digital_thermometer.json +++ b/application/src/main/data/json/system/widget_types/digital_thermometer.json @@ -17,5 +17,12 @@ "settingsDirective": "tb-digital-gauge-widget-settings", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Temp\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.7282710489093589,\"funcBody\":\"var value = prevValue + Math.random() * 20 - 10;\\nif (value < -60) {\\n\\tvalue = 60;\\n} else if (value > 60) {\\n\\tvalue = 60;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"#000000\",\"color\":\"rgba(255, 254, 254, 0.87)\",\"padding\":\"0px\",\"settings\":{\"maxValue\":60,\"donutStartAngle\":90,\"showValue\":true,\"showMinMax\":true,\"gaugeWidthScale\":1,\"levelColors\":[\"#304ffe\",\"#7e57c2\",\"#ff4081\",\"#d32f2f\"],\"titleFont\":{\"family\":\"Roboto\",\"size\":12,\"style\":\"normal\",\"weight\":\"500\"},\"labelFont\":{\"family\":\"Roboto\",\"size\":8,\"style\":\"normal\",\"weight\":\"500\"},\"valueFont\":{\"family\":\"Segment7Standard\",\"style\":\"normal\",\"weight\":\"500\",\"size\":18},\"minMaxFont\":{\"family\":\"Segment7Standard\",\"size\":12,\"style\":\"normal\",\"weight\":\"500\"},\"dashThickness\":1.5,\"minValue\":-60,\"gaugeColor\":\"#333333\",\"neonGlowBrightness\":35,\"gaugeType\":\"donut\",\"animation\":true,\"animationDuration\":500,\"animationRule\":\"linear\"},\"title\":\"Digital thermometer\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"widgetStyle\":{},\"useDashboardTimewindow\":true,\"showLegend\":false,\"actions\":{}}" }, - "externalId": null + "externalId": null, + "tags": [ + "pyrometer", + "temp probe", + "heat indicator", + "mercury column", + "clinical indicator" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/digital_vertical_bar.json b/application/src/main/data/json/system/widget_types/digital_vertical_bar.json index 4a22feeae6..aecd305300 100644 --- a/application/src/main/data/json/system/widget_types/digital_vertical_bar.json +++ b/application/src/main/data/json/system/widget_types/digital_vertical_bar.json @@ -17,5 +17,11 @@ "settingsDirective": "tb-digital-gauge-widget-settings", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Temp\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.7282710489093589,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nif (value < -60) {\\n\\tvalue = -60;\\n} else if (value > 60) {\\n\\tvalue = 60;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"#000000\",\"color\":\"rgba(255, 254, 254, 0.87)\",\"padding\":\"0px\",\"settings\":{\"maxValue\":60,\"donutStartAngle\":90,\"showValue\":true,\"showMinMax\":true,\"gaugeWidthScale\":0.75,\"levelColors\":[\"#3d5afe\",\"#f44336\"],\"titleFont\":{\"family\":\"Roboto\",\"size\":12,\"style\":\"normal\",\"weight\":\"500\"},\"labelFont\":{\"family\":\"Roboto\",\"size\":8,\"style\":\"normal\",\"weight\":\"500\"},\"valueFont\":{\"family\":\"Segment7Standard\",\"style\":\"normal\",\"weight\":\"500\",\"size\":14},\"minMaxFont\":{\"family\":\"Segment7Standard\",\"size\":8,\"style\":\"normal\",\"weight\":\"normal\",\"color\":\"#cccccc\"},\"neonGlowBrightness\":20,\"showUnitTitle\":true,\"gaugeColor\":\"#171a1c\",\"gaugeType\":\"verticalBar\",\"showTitle\":false,\"minValue\":-60,\"dashThickness\":1.2,\"animation\":true,\"animationDuration\":500,\"animationRule\":\"linear\"},\"title\":\"Digital vertical bar\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"widgetStyle\":{},\"useDashboardTimewindow\":true,\"showLegend\":false,\"actions\":{}}" }, - "externalId": null + "externalId": null, + "tags": [ + "vertical stripe", + "pillar", + "stanchion", + "pole" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/documentation_links.json b/application/src/main/data/json/system/widget_types/documentation_links.json index b021441201..f33711c532 100644 --- a/application/src/main/data/json/system/widget_types/documentation_links.json +++ b/application/src/main/data/json/system/widget_types/documentation_links.json @@ -17,5 +17,17 @@ "settingsDirective": "tb-doc-links-widget-settings", "defaultConfig": "{\"showTitle\":false,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"columns\":3},\"title\":\"Documentation links\",\"dropShadow\":true,\"enableFullscreen\":false,\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showLegend\":false}" }, - "externalId": null + "externalId": null, + "tags": [ + "link", + "web link", + "url", + "web address", + "anchor", + "hotlink", + "reference", + "pointer", + "shortcut", + "redirect" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/doughnut.json b/application/src/main/data/json/system/widget_types/doughnut.json index 33fdf77f61..6056cb5a44 100644 --- a/application/src/main/data/json/system/widget_types/doughnut.json +++ b/application/src/main/data/json/system/widget_types/doughnut.json @@ -21,5 +21,10 @@ "settingsDirective": "tb-doughnut-chart-widget-settings", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"First\",\"color\":\"#26a69a\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"var value = (prevValue-50) + Math.random() * 2 - 1;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value+50;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Second\",\"color\":\"#f57c00\",\"settings\":{},\"_hash\":0.545701115289893,\"funcBody\":\"var value = (prevValue-20) + Math.random() * 2 - 1;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value+20;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Third\",\"color\":\"#afb42b\",\"settings\":{},\"_hash\":0.2592906835158064,\"funcBody\":\"var value = (prevValue-40) + Math.random() * 2 - 1;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value+40;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Fourth\",\"color\":\"#673ab7\",\"settings\":{},\"_hash\":0.12880275585455747,\"funcBody\":\"var value = (prevValue-50) + Math.random() * 2 - 1;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value+50;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"borderWidth\":5,\"borderColor\":\"#fff\",\"legend\":{\"display\":true,\"labelsFontColor\":\"#666666\"}},\"title\":\"Doughnut\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400}}" }, - "externalId": null + "externalId": null, + "tags": [ + "ring", + "circle", + "pie chart" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/edge_quick_overview.json b/application/src/main/data/json/system/widget_types/edge_quick_overview.json index 15d67914dd..018b3f7587 100644 --- a/application/src/main/data/json/system/widget_types/edge_quick_overview.json +++ b/application/src/main/data/json/system/widget_types/edge_quick_overview.json @@ -17,5 +17,8 @@ "settingsDirective": "tb-edge-quick-overview-widget-settings", "defaultConfig": "{\"timewindow\":{\"realtime\":{\"interval\":1000,\"timewindowMs\":86400000},\"aggregation\":{\"type\":\"NONE\",\"limit\":200}},\"showTitle\":true,\"showTitleIcon\":true,\"titleIcon\":\"router\",\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"4px\",\"settings\":{},\"title\":\"Edge Quick Overview\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400,\"padding\":\"5px 10px 5px 10px\"},\"useDashboardTimewindow\":false,\"showLegend\":false,\"datasources\":[{\"type\":\"function\",\"name\":\"Simulated\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Sin\",\"color\":\"#2196f3\",\"settings\":{\"columnWidth\":\"0px\",\"useCellStyleFunction\":false,\"cellStyleFunction\":\"\",\"useCellContentFunction\":false,\"cellContentFunction\":\"\"},\"_hash\":0.472295003170325,\"funcBody\":\"return Math.round(1000*Math.sin(time/5000));\"}]}],\"widgetStyle\":{},\"actions\":{}}" }, - "externalId": null + "externalId": null, + "tags": [ + "gateway" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/entities_hierarchy.json b/application/src/main/data/json/system/widget_types/entities_hierarchy.json index a324ba6eae..48e9c3e632 100644 --- a/application/src/main/data/json/system/widget_types/entities_hierarchy.json +++ b/application/src/main/data/json/system/widget_types/entities_hierarchy.json @@ -17,5 +17,11 @@ "settingsDirective": "tb-entities-hierarchy-widget-settings", "defaultConfig": "{\"timewindow\":{\"realtime\":{\"interval\":1000,\"timewindowMs\":86400000},\"aggregation\":{\"type\":\"NONE\",\"limit\":200}},\"showTitle\":true,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"4px\",\"settings\":{\"nodeRelationQueryFunction\":\"var entity = nodeCtx.entity;\\nvar query = {\\n parameters: {\\n rootId: entity.id.id,\\n rootType: entity.id.entityType,\\n direction: \\\"FROM\\\",\\n maxLevel: 1\\n },\\n filters: [{\\n relationType: \\\"Contains\\\",\\n entityTypes: []\\n }]\\n};\\nreturn query;\\n\\n/**\\n\\n// Function should return relations query object for current node used to fetch entity children.\\n// Function can return 'default' string value. In this case default relations query will be used.\\n\\n// The following example code will construct simple relations query that will fetch relations of type 'Contains'\\n// from the current entity.\\n\\nvar entity = nodeCtx.entity;\\nvar query = {\\n parameters: {\\n rootId: entity.id.id,\\n rootType: entity.id.entityType,\\n direction: \\\"FROM\\\",\\n maxLevel: 1\\n },\\n filters: [{\\n relationType: \\\"Contains\\\",\\n entityTypes: []\\n }]\\n};\\nreturn query;\\n\\n**/\\n\",\"nodeHasChildrenFunction\":\"/**\\n\\n// Function should return boolean value indicating whether current node has children (whether it can be expanded).\\n\\n// The following example code will restrict entities hierarchy expansion up to third level.\\n\\nreturn nodeCtx.level <= 2;\\n\\n// The next example code will restrict entities expansion according to the value of example 'nodeHasChildren' attribute.\\n\\nvar data = nodeCtx.data;\\nif (data.hasOwnProperty('nodeHasChildren') && data['nodeHasChildren'] !== null) {\\n return data['nodeHasChildren'] === 'true';\\n} else {\\n return true;\\n}\\n \\n**/\\n \",\"nodeOpenedFunction\":\"/**\\n\\n// Function should return boolean value indicating whether current node should be opened (expanded) when it first loaded.\\n\\n// The following example code will open by default nodes up to third level.\\n\\nreturn nodeCtx.level <= 2;\\n\\n**/\\n \",\"nodeDisabledFunction\":\"/**\\n\\n// Function should return boolean value indicating whether current node should be disabled (not selectable).\\n\\n// The following example code will disable current node according to the value of example 'nodeDisabled' attribute.\\n\\nvar data = nodeCtx.data;\\nif (data.hasOwnProperty('nodeDisabled') && data['nodeDisabled'] !== null) {\\n return data['nodeDisabled'] === 'true';\\n} else {\\n return false;\\n}\\n \\n**/\\n\",\"nodeIconFunction\":\"/** \\n\\n// Function should return node icon info object.\\n// Resulting object should contain either 'materialIcon' or 'iconUrl' property. \\n// Where:\\n - 'materialIcon' - name of the material icon to be used from the Material Icons Library (https://material.io/tools/icons);\\n - 'iconUrl' - url of the external image to be used as node icon.\\n// Function can return 'default' string value. In this case default icons according to entity type will be used.\\n\\n// The following example code shows how to use external image for devices which name starts with 'Test' and use \\n// default icons for the rest of entities.\\n\\nvar entity = nodeCtx.entity;\\nif (entity.id.entityType === 'DEVICE' && entity.name.startsWith('Test')) {\\n return {iconUrl: 'https://avatars1.githubusercontent.com/u/14793288?v=4&s=117'};\\n} else {\\n return 'default';\\n}\\n \\n**/\",\"nodeTextFunction\":\"/**\\n\\n// Function should return text (can be HTML code) for the current node.\\n\\n// The following example code will generate node text consisting of entity name and temperature if temperature value is present in entity attributes/timeseries.\\n\\nvar data = nodeCtx.data;\\nvar entity = nodeCtx.entity;\\nvar text = entity.name;\\nif (data.hasOwnProperty('temperature') && data['temperature'] !== null) {\\n text += \\\" \\\"+ data['temperature'] +\\\" °C\\\";\\n}\\nreturn text;\\n\\n**/\",\"nodesSortFunction\":\"/**\\n\\n// This function is used to sort nodes of the same level. Function should compare two nodes and return \\n// integer value: \\n// - less than 0 - sort nodeCtx1 to an index lower than nodeCtx2\\n// - 0 - leave nodeCtx1 and nodeCtx2 unchanged with respect to each other\\n// - greater than 0 - sort nodeCtx2 to an index lower than nodeCtx1\\n\\n// The following example code will sort entities first by entity type in alphabetical order then\\n// by entity name in alphabetical order.\\n\\nvar result = nodeCtx1.entity.id.entityType.localeCompare(nodeCtx2.entity.id.entityType);\\nif (result === 0) {\\n result = nodeCtx1.entity.name.localeCompare(nodeCtx2.entity.name);\\n}\\nreturn result;\\n \\n**/\"},\"title\":\"Entities hierarchy\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400,\"padding\":\"5px 10px 5px 10px\"},\"useDashboardTimewindow\":false,\"showLegend\":false,\"datasources\":[{\"type\":\"function\",\"name\":\"Simulated\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Sin\",\"color\":\"#2196f3\",\"settings\":{\"columnWidth\":\"0px\",\"useCellStyleFunction\":false,\"cellStyleFunction\":\"\",\"useCellContentFunction\":false,\"cellContentFunction\":\"\"},\"_hash\":0.472295003170325,\"funcBody\":\"return Math.round(1000*Math.sin(time/5000));\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Cos\",\"color\":\"#4caf50\",\"settings\":{\"columnWidth\":\"0px\",\"useCellStyleFunction\":false,\"cellStyleFunction\":\"\",\"useCellContentFunction\":false,\"cellContentFunction\":\"\"},\"_hash\":0.8926244886945558,\"funcBody\":\"return Math.round(1000*Math.cos(time/5000));\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#f44336\",\"settings\":{\"columnWidth\":\"0px\",\"useCellStyleFunction\":false,\"cellStyleFunction\":\"\",\"useCellContentFunction\":false,\"cellContentFunction\":\"\"},\"_hash\":0.6401141393938932,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}]}],\"widgetStyle\":{},\"actions\":{}}" }, - "externalId": null + "externalId": null, + "tags": [ + "administration", + "management", + "organization", + "structure" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/entities_table.json b/application/src/main/data/json/system/widget_types/entities_table.json index ec137f81cb..1ebf8d4fde 100644 --- a/application/src/main/data/json/system/widget_types/entities_table.json +++ b/application/src/main/data/json/system/widget_types/entities_table.json @@ -21,5 +21,8 @@ "defaultConfig": "{\"timewindow\":{\"realtime\":{\"interval\":1000,\"timewindowMs\":86400000},\"aggregation\":{\"type\":\"NONE\",\"limit\":200}},\"showTitle\":true,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"4px\",\"settings\":{\"enableSearch\":true,\"enableSelectColumnDisplay\":true,\"enableStickyHeader\":true,\"enableStickyAction\":true,\"reserveSpaceForHiddenAction\":\"true\",\"displayEntityName\":false,\"displayEntityLabel\":false,\"displayEntityType\":false,\"displayPagination\":true,\"defaultPageSize\":10,\"defaultSortOrder\":\"name\",\"useRowStyleFunction\":false,\"entitiesTitle\":\"Entities\"},\"title\":\"Entities table\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400,\"padding\":\"5px 10px 5px 10px\"},\"useDashboardTimewindow\":false,\"showLegend\":false,\"datasources\":[{\"type\":\"function\",\"name\":\"Simulated\",\"entityAliasId\":null,\"filterId\":null,\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Entity name\",\"color\":\"#2196f3\",\"settings\":{\"columnWidth\":\"0px\",\"useCellStyleFunction\":false,\"cellStyleFunction\":\"\",\"useCellContentFunction\":false,\"cellContentFunction\":\"\"},\"_hash\":0.472295003170325,\"funcBody\":\"return 'Simulated';\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Entity type\",\"color\":\"#607d8b\",\"settings\":{},\"_hash\":0.782057645776538,\"funcBody\":\"return 'Device';\",\"decimals\":null,\"aggregationType\":null,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Sin\",\"color\":\"#4caf50\",\"settings\":{},\"_hash\":0.904797781901171,\"funcBody\":\"return Math.round(1000*Math.sin(time/5000));\",\"decimals\":0},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Cos\",\"color\":\"#f44336\",\"settings\":{},\"_hash\":0.1961430898042078,\"funcBody\":\"return Math.round(1000*Math.cos(time/5000));\",\"decimals\":0},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#ffc107\",\"settings\":{},\"_hash\":0.7678057538205878,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\",\"decimals\":2}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"displayTimewindow\":false,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":false,\"titleIcon\":\"list\",\"iconColor\":null}" }, "externalId": null, - "tags": null + "tags": [ + "administration", + "management" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/entity_count.json b/application/src/main/data/json/system/widget_types/entity_count.json index 76aba779d7..cf3ad82e5c 100644 --- a/application/src/main/data/json/system/widget_types/entity_count.json +++ b/application/src/main/data/json/system/widget_types/entity_count.json @@ -19,5 +19,9 @@ "basicModeDirective": "tb-entity-count-basic-config", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"count\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"return 150;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"],\"assignedToCurrentUser\":false,\"assigneeId\":null}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"showLabel\":true,\"label\":\"Devices\",\"labelFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.54)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":20,\"iconSizeUnit\":\"px\",\"icon\":\"devices\",\"iconColor\":{\"type\":\"constant\",\"color\":\"rgba(255, 255, 255, 1)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIconBackground\":true,\"iconBackgroundSize\":36,\"iconBackgroundSizeUnit\":\"px\",\"iconBackgroundColor\":{\"type\":\"constant\",\"color\":\"rgb(241, 141, 23)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":20,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"24px\"},\"valueColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showChevron\":false,\"chevronSize\":24,\"chevronSizeUnit\":\"px\",\"chevronColor\":\"rgba(0, 0, 0, 0.38)\",\"layout\":\"column\"},\"title\":\"Entity count\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"\",\"decimals\":null,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null},\"titleColor\":\"rgba(0, 0, 0, 0.54)\"}" }, - "externalId": null + "externalId": null, + "tags": [ + "total", + "tally" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/flooding_level_card.json b/application/src/main/data/json/system/widget_types/flooding_level_card.json index 6a96ac6457..f31aceeece 100644 --- a/application/src/main/data/json/system/widget_types/flooding_level_card.json +++ b/application/src/main/data/json/system/widget_types/flooding_level_card.json @@ -3,7 +3,7 @@ "name": "Flooding level card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest flooding level telemetry data in a box layout.", + "description": "Displays the latest flooding level telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, @@ -24,6 +24,14 @@ "weather", "environment", "flood", - "flooding" + "flooding", + "water height", + "flood depth", + "flood stage", + "inundation level", + "water rise", + "overflow level", + "flood peak", + "high water mark" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/flooding_level_card_with_background.json b/application/src/main/data/json/system/widget_types/flooding_level_card_with_background.json index 351a40fe8b..0fc557f863 100644 --- a/application/src/main/data/json/system/widget_types/flooding_level_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/flooding_level_card_with_background.json @@ -3,7 +3,7 @@ "name": "Flooding level card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest flooding level telemetry data in a box layout with background.", + "description": "Displays the latest flooding level telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, @@ -24,6 +24,14 @@ "weather", "environment", "flood", - "flooding" + "flooding", + "water height", + "flood depth", + "flood stage", + "inundation level", + "water rise", + "overflow level", + "flood peak", + "high water mark" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/flooding_level_chart_card.json b/application/src/main/data/json/system/widget_types/flooding_level_chart_card.json index f9cb12eb81..00804183c4 100644 --- a/application/src/main/data/json/system/widget_types/flooding_level_chart_card.json +++ b/application/src/main/data/json/system/widget_types/flooding_level_chart_card.json @@ -3,7 +3,7 @@ "name": "Flooding level chart card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAzFBMVEXg4ODf39/g4ODg4OAAAAD////g4OAjTMfs7Ozj4+PIyMjz8/PPz89YWFjn5+chISHCwsKsrKw9PT3x8fHa2tr5+fmQkJC2tra8vLx0dHQ7OzsvLy/V1dXk6fjU1NRaedW6urqCgoLI0vFKSko+Ys7b29tmZmby9Puesed1j9yenp4wV8uRpeODmt+tvOokJCSsvOpMbdJDQ0MZGRkRERHW3fViYmK6x+4/Ys4xV8pohNj39/ewsLChoaGsu+rm5uaDm+DAwMCTk5Nra2s4GVQ3AAAABXRSTlPvIL+vAC9A4IoAAAhzSURBVHja7Z2HetowFEbT8bvWsPHGKy6EMkKSrnTv8f7v1CsDJphVmmBM6sOwLNl8OlxdyR9JyMnjBw9PtGPn0YPHJw9OXBw9Lmk8ugceZELDCveCk/siojUiNaMRqRuNSN1oROpGI1I3Vol0X3/FIswtV2AJtqlmmQpEvr5pXSfvJHJSg2CGjUUc3jFKvW4t9btVpcmyiNZSXE/7yVuMMRj2LCpsEiCHw51Fis1F2EIMDyuivbi+fhNfv3FnIiBIJOrFAZjTc1J0EyPhtgHHMBzXdXq91kQkb+120Y2Y0XP4gUW+vnvzRrqt668zEcPokkgnBkuYESAw1Hs/EemgZ9sx0qlIFCGIuAOH2wPYxoFF8PPN9Tv5uvVucWgFA5UYDgenZyrmIlw1RGBTESNxnAESco6odGiRd69fvMnvXxaGFu+prg4CjA1XRaQQGRtFRLoRXIYgjihsVHHoiEhtci/lSNdJArC4l1BXHWcu4saOM8uR2HA6dEYKqkzGBxaJXr94kd+/YBG3mLVUcU7KOvHyekOlv6QuK7vbcxIbh+deX6IcJf+RiMBf4+tLL29iDVWLiHbfWqHyXccSnhASi5jcxzoqFvFM6Lqn+55u9b22noUZOOd+aFGbRaXQFyHXYVlctFPR5pk6h0tkoZLioaAC7QiUqVpEmvmTkGYGqaNthqINKTxVHcISmpfpCFURUkWkTfVt3fQtZHSI6UHXQ2FhJdVGRIP+PRfxIIXf7vf9QsSim+lJAQ7rpojeDwWnM3OR0OS1EPHbMhRmyCcikBkHiVBNIaJzKfNiJmcRyTgdSKVcRLZrIQIIpeMXYjdq19aJ0s56mnWkEak9/7OIX5oIUAu2iZghPdpQSL9Y7CdkUA1S9OvgslXEFrDa0KUHumXcJxGLC18jDQlq4KHQ/LxBygw7ULVIJgWJmH5bLXrC00hE8y0habdNt5Aq6Qhd87y+H2IHqhbxwoyGlkxzEXhePrTCQsSCVCIiv1SxsAOVi5hfVI812y9EpMb9UGtPImKGUxGTU9UOVCzi+xDQIUx6VlsfELqJeYWmqwPUcaZZ56H19/jSEvh76iuyG41II3IsNCJ1oxGpG41I3WhE6kYjUjcakbrRiKzlbHQ5OhuizOkNQNRdZHTxRHFxiRKvnsw5A1Fvkcuis+dY5OKoRF6qYFxdXj2j7Qg3GT45KpGn1Mu3KiHI5ONCnrxd6n+dRU6LITUq9/uMKm6d5KlLTzzdv8hL1f1iJF3hBs+pAv/A58+fxeephtFigBFxoGPvV+Rq/rZ/ePLkU2kW+Ih/wNV13UUOcx0Ge8AZ3HHAOvsUOSeR+Wz7rOT4dHh2eTl6i50wGWOmCgdnAIl04yB20Y2CvUZE5fqsWBL5RBGZzMBPd0oVrf/OUz20A56LRLa6w+6M2UFEaL/g4y5BSeW7rMhuNbQi1yGlIEBwGJELFYvR83O1wjwb4q+J7PjXAFO6LikYY5U66aEicvry/CzfKpP3u/zK5HXMsJrqRcoLyifsYBIxVC7yaasI8WHWUuOVfXH6fbU2bGpFqbXIjQXxgnL7eEWeF4l8SqWrUqyGhWIeqzqLDNUcW7rqQnEROSqS/Vxtz0ano5fYHc8yq7mMfzmdZJ/laldPf+TbC6o4zVumih/ORs/eX73/FxMTXHIZ7lPkbX4Ncnl+oYRmWXM5CQnxadJyDiWC03M8/4YdkZoSkbAgxR5FqL8zLovcuMJEacar4b+LENWI4IzmXeJiNN2l4ilyXk5bLoe4nYipQ0Mfmr9PEeL0/fPnb+d7Z8PVLaQ3xHBYz1lrF2o9/e5AI9KIHAuNSN1oROpGI1I3GpG6sSSScYljZElE9gWOkSURU3AfhBB1+GOK9VD/toggEyBCefDkYQF3sQ7J5WYRXfahsHBomNNLWokRdNLVIdksUnDwTGFOAKSdwIjJpttBGV8cx/SbkscUl48HcRJ1jnIdSZMAC/AoIZejE1EeS3SixIn4HYt0Ioa/gQ8GUTcY2+zfPZZd7lLEiR0bW2FGqxtEkWEkPfeWHgX2oEUudyUyjl077jFsxO22DDYtxoPtQTZmkMcmXOXC7kSEqXCwqBVgPW6QGHx+Rtzd+ppRMGVrrMnlbiISxVDYsbM2KLYTdxaHyxgb6Q2qv4xnLVYMnq6LFXAaHm7JrJViA0HM9iPi6uuJfxdFGcfjpXbS6PaXaqM409dityx9R26/stsLb17Qilg5xwcMKzCMzdcjVQ8t5owX93uOXc7xlbhxd0OCVC8SxMshMtismMR8w/pgr02Q6kVYq4MSxUzMtywB42RlhzstjupFomh13jhsaapapuu4qxNknyLcmDLoLMyiDMSqoKgc34Lbi1ZOAnsVYfaUKHbmE9P6dy/l2A5LxisTpKKhZRstwy4y/TYs5wOnin2I6HJSUapmk7CwxMYtCRx2Jwnim5tFOCworJVhMXq4NUaP32CHBNnpw4fiVwpCy1uR0HcxnN24dYN/fUUr3C5S70/m/jZHpNbGMbIkAv0oA1LXT1EakeOnEakb91ckwxzhl76iauEHDroHeKgLSyJteviagN8XvkVtxXcgwfQkTA2iLWCas+8Qmx2t6b6qrZTtItwMEWqWUCKTb9LSLF9qXOqyL/VQeDL1SESGuQjVgGvc9HiaoUq2i2TyCzTuQYqpiAVPs6jngktL7VphqiKUZkrEk206yzOpbKFKtouojmUIRS7CaSekIFnClJ4mLIQk6AslgtAC/NAP6RBpSl3USURK6fd5Cp336UEVqSQnmZJRavo81ZBqPs8VdQh1cp+rRm76dCZ2peLp18IWaHj9m0SzjjQidacRqRuNSN1oROpGI1I37pHICe4F2snD+/Evmx/dn3+i/fjBI+3YOXn44PEffvfx713DlFEAAAAASUVORK5CYII=", - "description": "Displays a flooding level data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays flooding level data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/flooding_level_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/flooding_level_chart_card_with_background.json index c70b9d88f4..4f6d71ce23 100644 --- a/application/src/main/data/json/system/widget_types/flooding_level_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/flooding_level_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Flooding level chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a flooding level data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a flooding level data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, @@ -27,6 +27,14 @@ "weather", "environment", "flood", - "flooding" + "flooding", + "water height", + "flood depth", + "flood stage", + "inundation level", + "water rise", + "overflow level", + "flood peak", + "high water mark" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/flooding_level_progress_bar.json b/application/src/main/data/json/system/widget_types/flooding_level_progress_bar.json index b6e1d91994..4bb5fbe32f 100644 --- a/application/src/main/data/json/system/widget_types/flooding_level_progress_bar.json +++ b/application/src/main/data/json/system/widget_types/flooding_level_progress_bar.json @@ -21,10 +21,17 @@ }, "externalId": null, "tags": [ - "progress", "weather", "environment", "flood", - "flooding" + "flooding", + "water height", + "flood depth", + "flood stage", + "inundation level", + "water rise", + "overflow level", + "flood peak", + "high water mark" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/flooding_level_progress_bar_with_background.json b/application/src/main/data/json/system/widget_types/flooding_level_progress_bar_with_background.json index 66351866eb..b5f7c0b41b 100644 --- a/application/src/main/data/json/system/widget_types/flooding_level_progress_bar_with_background.json +++ b/application/src/main/data/json/system/widget_types/flooding_level_progress_bar_with_background.json @@ -3,7 +3,7 @@ "name": "Flooding level progress bar with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays flooding level reading as a horizontal progress bar with background. Allows to configure value range, bar colors, and other settings.", + "description": "Displays flooding level reading as a horizontal progress bar with the background image. Allows to configure value range, bar colors, and other settings.", "descriptor": { "type": "latest", "sizeX": 3, @@ -21,10 +21,17 @@ }, "externalId": null, "tags": [ - "progress", "weather", "environment", "flood", - "flooding" + "flooding", + "water height", + "flood depth", + "flood stage", + "inundation level", + "water rise", + "overflow level", + "flood peak", + "high water mark" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/gateway_configuration.json b/application/src/main/data/json/system/widget_types/gateway_configuration.json index dc286e4486..985426ef94 100644 --- a/application/src/main/data/json/system/widget_types/gateway_configuration.json +++ b/application/src/main/data/json/system/widget_types/gateway_configuration.json @@ -17,5 +17,24 @@ "settingsDirective": "tb-gateway-config-widget-settings", "defaultConfig": "{\"datasources\":[{\"type\":\"static\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"widgetTitle\":\"Gateway Configuration\",\"archiveFileName\":\"configurationGateway\"},\"title\":\"Gateway Configuration\",\"dropShadow\":true,\"showTitleIcon\":false,\"titleIcon\":\"more_horiz\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"enableFullscreen\":true,\"widgetStyle\":{},\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"useDashboardTimewindow\":true,\"displayTimewindow\":true,\"showLegend\":false,\"actions\":{}}" }, - "externalId": null + "externalId": null, + "tags": [ + "router", + "bridge", + "hub", + "access point", + "relay", + "opc ua", + "opc-ua", + "modbus", + "bacnet", + "odbc", + "ftp", + "snmp", + "mqtt", + "xmpp", + "ocpp", + "ble", + "bluetooth" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/gateway_configuration__single_device_.json b/application/src/main/data/json/system/widget_types/gateway_configuration__single_device_.json index 466e40c91f..a7b3291666 100644 --- a/application/src/main/data/json/system/widget_types/gateway_configuration__single_device_.json +++ b/application/src/main/data/json/system/widget_types/gateway_configuration__single_device_.json @@ -17,5 +17,24 @@ "settingsDirective": "tb-gateway-config-single-device-widget-settings", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"gatewayTitle\":\"Gateway configuration (Single device)\"},\"title\":\"Gateway configuration (Single device)\"}" }, - "externalId": null + "externalId": null, + "tags": [ + "router", + "bridge", + "hub", + "access point", + "relay", + "opc ua", + "opc-ua", + "modbus", + "bacnet", + "odbc", + "ftp", + "snmp", + "mqtt", + "xmpp", + "ocpp", + "ble", + "bluetooth" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/gateway_connectors.json b/application/src/main/data/json/system/widget_types/gateway_connectors.json index 2e6d62866c..765d9043ad 100644 --- a/application/src/main/data/json/system/widget_types/gateway_connectors.json +++ b/application/src/main/data/json/system/widget_types/gateway_connectors.json @@ -15,5 +15,24 @@ "settingsSchema": "{}", "dataKeySettingsSchema": "{}\n", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{},\"title\":\"Gateway connectors\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"dropShadow\":true,\"enableFullscreen\":false,\"enableDataExport\":false,\"widgetStyle\":{},\"widgetCss\":\"\",\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":500},\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showLegend\":false}" - } + }, + "tags": [ + "router", + "bridge", + "hub", + "access point", + "relay", + "opc ua", + "opc-ua", + "modbus", + "bacnet", + "odbc", + "ftp", + "snmp", + "mqtt", + "xmpp", + "ocpp", + "ble", + "bluetooth" + ] } diff --git a/application/src/main/data/json/system/widget_types/gateway_custom_statistics.json b/application/src/main/data/json/system/widget_types/gateway_custom_statistics.json index 51fb71f4a9..7090490ea6 100644 --- a/application/src/main/data/json/system/widget_types/gateway_custom_statistics.json +++ b/application/src/main/data/json/system/widget_types/gateway_custom_statistics.json @@ -19,5 +19,24 @@ "dataKeySettingsDirective": "tb-flot-line-key-settings", "latestDataKeySettingsDirective": "tb-flot-latest-key-settings", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"First\",\"color\":\"#2196f3\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Second\",\"color\":\"#ffc107\",\"settings\":{\"showLines\":true,\"fillLines\":false,\"showPoints\":false},\"_hash\":0.12775350966079668,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"shadowSize\":4,\"fontColor\":\"#545454\",\"fontSize\":10,\"xaxis\":{\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"showLabels\":true,\"color\":\"#545454\"},\"grid\":{\"color\":\"#545454\",\"tickColor\":\"#DDDDDD\",\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1},\"legend\":{\"show\":true,\"position\":\"nw\",\"backgroundColor\":\"#f0f0f0\",\"backgroundOpacity\":0.85,\"labelBoxBorderColor\":\"rgba(1, 1, 1, 0.45)\"},\"decimals\":1,\"stack\":false,\"tooltipIndividual\":false},\"title\":\"Gateway custom statistics \",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null}" - } + }, + "tags": [ + "router", + "bridge", + "hub", + "access point", + "relay", + "opc ua", + "opc-ua", + "modbus", + "bacnet", + "odbc", + "ftp", + "snmp", + "mqtt", + "xmpp", + "ocpp", + "ble", + "bluetooth" + ] } diff --git a/application/src/main/data/json/system/widget_types/gateway_events.json b/application/src/main/data/json/system/widget_types/gateway_events.json index b7d1cb1343..4cbbfb8d7a 100644 --- a/application/src/main/data/json/system/widget_types/gateway_events.json +++ b/application/src/main/data/json/system/widget_types/gateway_events.json @@ -17,5 +17,24 @@ "settingsDirective": "tb-gateway-events-widget-settings", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Function Math.round\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.826503672916844,\"funcBody\":\"return Math.round(1000*Math.sin(time/5000));\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"eventsTitle\":\"Gateway Events Form\",\"eventsReg\":[]},\"title\":\"Gateway events\",\"showTitleIcon\":false,\"titleIcon\":\"more_horiz\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"dropShadow\":true,\"enableFullscreen\":true,\"widgetStyle\":{},\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"useDashboardTimewindow\":true,\"displayTimewindow\":true,\"showLegend\":false,\"actions\":{}}" }, - "externalId": null + "externalId": null, + "tags": [ + "router", + "bridge", + "hub", + "access point", + "relay", + "opc ua", + "opc-ua", + "modbus", + "bacnet", + "odbc", + "ftp", + "snmp", + "mqtt", + "xmpp", + "ocpp", + "ble", + "bluetooth" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/gateway_general_chart_statistics.json b/application/src/main/data/json/system/widget_types/gateway_general_chart_statistics.json index d3404042e6..7e1974d5b7 100644 --- a/application/src/main/data/json/system/widget_types/gateway_general_chart_statistics.json +++ b/application/src/main/data/json/system/widget_types/gateway_general_chart_statistics.json @@ -19,5 +19,24 @@ "dataKeySettingsDirective": "tb-flot-line-key-settings", "latestDataKeySettingsDirective": "tb-flot-latest-key-settings", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"First\",\"color\":\"#2196f3\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Second\",\"color\":\"#ffc107\",\"settings\":{\"showLines\":true,\"fillLines\":false,\"showPoints\":false},\"_hash\":0.12775350966079668,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"shadowSize\":4,\"fontColor\":\"#545454\",\"fontSize\":10,\"xaxis\":{\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"showLabels\":true,\"color\":\"#545454\"},\"grid\":{\"color\":\"#545454\",\"tickColor\":\"#DDDDDD\",\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1},\"legend\":{\"show\":true,\"position\":\"nw\",\"backgroundColor\":\"#f0f0f0\",\"backgroundOpacity\":0.85,\"labelBoxBorderColor\":\"rgba(1, 1, 1, 0.45)\"},\"decimals\":1,\"stack\":false,\"tooltipIndividual\":false},\"title\":\"Gateway general chart statistics\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null}" - } + }, + "tags": [ + "router", + "bridge", + "hub", + "access point", + "relay", + "opc ua", + "opc-ua", + "modbus", + "bacnet", + "odbc", + "ftp", + "snmp", + "mqtt", + "xmpp", + "ocpp", + "ble", + "bluetooth" + ] } diff --git a/application/src/main/data/json/system/widget_types/gateway_general_configuration.json b/application/src/main/data/json/system/widget_types/gateway_general_configuration.json index 66d6ee9fd7..e2129c0271 100644 --- a/application/src/main/data/json/system/widget_types/gateway_general_configuration.json +++ b/application/src/main/data/json/system/widget_types/gateway_general_configuration.json @@ -15,5 +15,24 @@ "settingsSchema": "{}", "dataKeySettingsSchema": "{}\n", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{},\"title\":\"Gateway configuration\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"dropShadow\":true,\"enableFullscreen\":false,\"enableDataExport\":false,\"widgetStyle\":{},\"widgetCss\":\"\",\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":500},\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showLegend\":false}" - } + }, + "tags": [ + "router", + "bridge", + "hub", + "access point", + "relay", + "opc ua", + "opc-ua", + "modbus", + "bacnet", + "odbc", + "ftp", + "snmp", + "mqtt", + "xmpp", + "ocpp", + "ble", + "bluetooth" + ] } diff --git a/application/src/main/data/json/system/widget_types/gateway_logs.json b/application/src/main/data/json/system/widget_types/gateway_logs.json index 247e167c76..45b380e544 100644 --- a/application/src/main/data/json/system/widget_types/gateway_logs.json +++ b/application/src/main/data/json/system/widget_types/gateway_logs.json @@ -16,5 +16,24 @@ "dataKeySettingsSchema": "{}\n", "settingsDirective": "tb-gateway-logs-settings", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"entityAliasId\":null,\"filterId\":null,\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -1000) {\\n\\tvalue = -1000;\\n} else if (value > 1000) {\\n\\tvalue = 1000;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":0,\"realtime\":{\"realtimeType\":0,\"timewindowMs\":86400000,\"quickInterval\":\"CURRENT_DAY\",\"interval\":300000},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":false,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{},\"title\":\"Gateway logs\",\"showTitleIcon\":false,\"dropShadow\":false,\"enableFullscreen\":true,\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showLegend\":false,\"useDashboardTimewindow\":false,\"displayTimewindow\":true}" - } + }, + "tags": [ + "router", + "bridge", + "hub", + "access point", + "relay", + "opc ua", + "opc-ua", + "modbus", + "bacnet", + "odbc", + "ftp", + "snmp", + "mqtt", + "xmpp", + "ocpp", + "ble", + "bluetooth" + ] } diff --git a/application/src/main/data/json/system/widget_types/gauge.json b/application/src/main/data/json/system/widget_types/gauge.json index 8bfdc6ea10..f5494f8b4a 100644 --- a/application/src/main/data/json/system/widget_types/gauge.json +++ b/application/src/main/data/json/system/widget_types/gauge.json @@ -17,5 +17,12 @@ "settingsDirective": "tb-digital-gauge-widget-settings", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Temp\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.7282710489093589,\"funcBody\":\"var value = prevValue + Math.random() * 20 - 10;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"#ffffff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"maxValue\":100,\"minValue\":0,\"donutStartAngle\":90,\"showValue\":true,\"showMinMax\":true,\"gaugeWidthScale\":0.75,\"levelColors\":[],\"refreshAnimationType\":\">\",\"refreshAnimationTime\":700,\"startAnimationType\":\">\",\"startAnimationTime\":700,\"titleFont\":{\"family\":\"Roboto\",\"size\":12,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#999999\"},\"labelFont\":{\"family\":\"Roboto\",\"size\":8,\"style\":\"normal\",\"weight\":\"500\"},\"valueFont\":{\"family\":\"Roboto\",\"style\":\"normal\",\"weight\":\"500\",\"size\":36,\"color\":\"#666666\"},\"minMaxFont\":{\"family\":\"Roboto\",\"size\":12,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#666666\"},\"neonGlowBrightness\":0,\"decimals\":0,\"dashThickness\":0,\"gaugeColor\":\"#eeeeee\",\"showTitle\":true,\"gaugeType\":\"arc\"},\"title\":\"Gauge\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400}}" }, - "externalId": null + "externalId": null, + "tags": [ + "measure", + "indicator", + "dial", + "scale", + "instrument" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/getting_started.json b/application/src/main/data/json/system/widget_types/getting_started.json index 54611c0565..f845b948fa 100644 --- a/application/src/main/data/json/system/widget_types/getting_started.json +++ b/application/src/main/data/json/system/widget_types/getting_started.json @@ -17,5 +17,11 @@ "settingsDirective": "", "defaultConfig": "{\"showTitle\":false,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{},\"title\":\"Getting started\",\"dropShadow\":true}" }, - "externalId": null + "externalId": null, + "tags": [ + "hello world", + "beginning", + "kickoff", + "tutorial" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/google_map.json b/application/src/main/data/json/system/widget_types/google_map.json index c57b80b7c3..8b27b9b679 100644 --- a/application/src/main/data/json/system/widget_types/google_map.json +++ b/application/src/main/data/json/system/widget_types/google_map.json @@ -17,5 +17,13 @@ "settingsDirective": "tb-map-widget-settings", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"First point\",\"entityAliasId\":null,\"filterId\":null,\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"latitude\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.05427416942713381,\"funcBody\":\"var value = prevValue || 15.833293;\\nif (time % 5000 < 500) {\\n value += Math.random() * 0.05 - 0.025;\\n}\\nreturn value;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"longitude\",\"color\":\"#4caf50\",\"settings\":{},\"_hash\":0.680594833308841,\"funcBody\":\"var value = prevValue || -90.454350;\\nif (time % 5000 < 500) {\\n value += Math.random() * 0.05 - 0.025;\\n}\\nreturn value;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"temperature\",\"color\":\"#9c27b0\",\"settings\":{},\"_hash\":0.9430343126300238,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nif (value < -60) {\\n\\tvalue = -60;\\n} else if (value > 60) {\\n\\tvalue = 60;\\n}\\nreturn value;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Type\",\"color\":\"#8bc34a\",\"settings\":{},\"_hash\":0.1784452363910778,\"funcBody\":\"return \\\"colorpin\\\";\",\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]},{\"type\":\"function\",\"name\":\"Second point\",\"entityAliasId\":null,\"filterId\":null,\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"latitude\",\"color\":\"#f44336\",\"settings\":{},\"_hash\":0.05012157428742059,\"funcBody\":\"var value = prevValue || 14.450463;\\nif (time % 4000 < 500) {\\n value += Math.random() * 0.05 - 0.025;\\n}\\nreturn value;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"longitude\",\"color\":\"#ffc107\",\"settings\":{},\"_hash\":0.6742359401617628,\"funcBody\":\"var value = prevValue || -84.845334;\\nif (time % 4000 < 500) {\\n value += Math.random() * 0.05 - 0.025;\\n}\\nreturn value;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"temperature\",\"color\":\"#8bc34a\",\"settings\":{},\"_hash\":0.773875863339494,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nif (value < -60) {\\n\\tvalue = -60;\\n} else if (value > 60) {\\n\\tvalue = 60;\\n}\\nreturn value;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Type\",\"color\":\"#3f51b5\",\"settings\":{},\"_hash\":0.405822538899673,\"funcBody\":\"return \\\"thermometer\\\";\",\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"provider\":\"google-map\",\"gmApiKey\":\"AIzaSyDoEx2kaGz3PxwbI9T7ccTSg5xjdw8Nw8Q\",\"gmDefaultMapType\":\"roadmap\",\"latKeyName\":\"latitude\",\"lngKeyName\":\"longitude\",\"xPosKeyName\":\"xPos\",\"yPosKeyName\":\"yPos\",\"defaultCenterPosition\":\"0,0\",\"disableScrollZooming\":false,\"disableDoubleClickZooming\":false,\"disableZoomControl\":false,\"fitMapBounds\":true,\"useDefaultCenterPosition\":false,\"mapPageSize\":16384,\"markerOffsetX\":0.5,\"markerOffsetY\":1,\"posFunction\":\"return {x: origXPos, y: origYPos};\",\"draggableMarker\":false,\"showLabel\":true,\"useLabelFunction\":false,\"label\":\"${entityName}\",\"showTooltip\":true,\"showTooltipAction\":\"click\",\"autocloseTooltip\":true,\"useTooltipFunction\":false,\"tooltipPattern\":\"${entityName}

Latitude: ${latitude:7}
Longitude: ${longitude:7}
Temperature: ${temperature} °C
See advanced settings for details\",\"tooltipOffsetX\":0,\"tooltipOffsetY\":-1,\"color\":\"#fe7568\",\"useColorFunction\":true,\"colorFunction\":\"var type = dsData[dsIndex]['Type'];\\nif (type == 'colorpin') {\\n\\tvar temperature = dsData[dsIndex]['temperature'];\\n\\tif (typeof temperature !== undefined) {\\n\\t var percent = (temperature + 60)/120 * 100;\\n\\t return tinycolor.mix('blue', 'red', percent).toHexString();\\n\\t}\\n\\treturn 'blue';\\n}\\n\",\"useMarkerImageFunction\":true,\"markerImageSize\":34,\"markerImageFunction\":\"var type = dsData[dsIndex]['Type'];\\nif (type == 'thermometer') {\\n\\tvar res = {\\n\\t url: images[0],\\n\\t size: 40\\n\\t}\\n\\tvar temperature = dsData[dsIndex]['temperature'];\\n\\tif (typeof temperature !== undefined) {\\n\\t var percent = (temperature + 60)/120;\\n\\t var index = Math.min(3, Math.floor(4 * percent));\\n\\t res.url = images[index];\\n\\t}\\n\\treturn res;\\n}\",\"markerImages\":[\"data:image/png;base64,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\",\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAB/CAYAAAD4mHJdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACWAAAAlgB7MGOJQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAA3vSURBVGiB7Vt7cFzVef+dc+/d90OrJyO/JSO/4ncxxfULMCYIAyEW08amJJgmM4GmnZjJdNq4gcSGzLQxk3bsaWcaaIHyR8CJrWAbpjgG/AhINsbYxkaSDY6xJFvSrrS7Wu3uvfecr3+cu1pbXhkJs/4nujNndufec77f+d7fd+4uw8gvIxwOfocBaz0e91yXyx0BgKyZiWUz5kcEvBKPJ18EYI+C5rWvkpKSyZGS8LGHGtbQR8ePUUdnB50/f57OfnqWWlpbaN++39O99fdQpCR0NBKJTBwJTfZFE4LBYLmh8+YXXvifKctWrEBPTze9+cbu8/3JVMoWNjwer3/ZsuUTvV4P239gP36yceNZW9CtyWQyei262hcB+7zurU/99Ge3r1nTgJdfevFsqr8/Wlc3rWbGzFkV8+fPr1iwYEEJgLadO3cmbr/jjohh6KXHPjxamsmar39pjoPBYHl5aUnnqZY2/b1Dh9LdPd39kUgk6PP5PD6fH36/Dz6fDx6PF+fOfdZ9+pPTgbq6Ou+aBx+0k/0DVYlEIjYcbX4tYM5pxeK/WKIDwM7Gxt0TJox/dtLESXC53JuHzvV4PBVHDjfvAYDZs+fonMsV16R9rYeM8XG1tbUAgMrKsrDP659DRJ5gMNhbaH5NTU0IAMaPHw9IPv5LAxORy+31AgBcLsO41lwAcLu9BgAYLheIkftLAxfzGgMeAx4DHgMeAx4DHgMeAx4DHgMeAx4DHgMeAx4D/lME1ke7gDF8ltbOHe3W923oEwYi1jxftWfZWgAziwacZkd2pfyN96XN5IIu7dMtIKA9/TI+zqCnFps2Alg5UlojFnVqIHZUlO2sl4RyC4CU+SEEylux8Z/iyc7mrxw4U7UnYwvGpXMYKIgNGdwXC/76C48oRw3sDWfnCgIkARJXcpwbvpA1e6T0Rq5jDr8EAHKA6OpjUOJwfeXAJAEhAXAGgEPKq+dIMVJqowDO4RAAC0rHV21u5LijAJaABAOIAY5Oh15iFMgj1zEpcUuuXjpIWeCouxjAtnIZcGKA5AVFbRfazPUC50QrKe8+Qy8qiqjBYIODA5DgBd1pBO9WRg9sy7yOhXBca+icYrgTOUGOiKnIVdCdisAxJGBTPsYW0nHRrJqgfNmGVtiqaeR1xchF7Vgz40q/BUNmISlcL7CUgJAMnOUiVwEdF0PURIAAVHaC8ucbAiwcQAb1KQpwXMjFrhtYMcOVO8lhOB457ujcKZd9hBguSYwcelTupKyaQWKYJFEU4xJw/Dhfcw29ilSBcNjEoTucFnSnkeOOvvTJpcVC1cYoGB5NAGEQTukjMAzHoghJghyWCRjenYoTuZjKx8xJiwU4LrSZ6waWpIoBjTuRqxDHRUkSUMWAJAZp6QU5FqOw65HHapG3bGVcBTZXDI5VnFaFgBL1yC34uoBJqEJeIwD2MMY1ilZidAFEMlDOqm9UdpJ0ZawumI+LU9ArwhyqWxyNz14XsBAMUnLVH0ttGB0XococdCGWE3XhOV85MF1WV2OY3omK0S2SkxgYAZYYJoAUpcqEEjG/Ru80isA1ysMXYNCnCum4aKUPgTu90w3sFinXL6nO/MadCAhiKloxBjFMeSuK0S1Kylv1cE1bUVoYyHwhoI6bCswpjjuxK5u2G2lcti2jzNCRTluioHEVw52EBA5/2LKsLBL+h2gs/o+Fjpa+MqtmjCbkqQJSYFF3T3zRsPMvA75i7UiBA4FApa6z5+fNnbd6/frHADghk7QdlhAHdMY0KXkZAHAuozaRMDRtKYMdAYDVq1fjcHPTD860nZlsS3qsv7+/+6pNDr0RDAanGTrf85Onnq75/uNPIJ1O4+dbnj34Ot6B4eFLqksqUeEvgcflAREhZabR09+Li/EorLQ4eFv317D2oW8t0XUdu3a9jud/9auztqD6ZDLZOixwOByeouv8D1u3brtpxYrb0XS4Kfbj3//8VHC8d0nDLXfj67OWIeQJgDGADfoOAxHQl05i14l92PHBXiTPp/c/OrFh9vwF8yMnjp/A5s2bOqXEbX19fX+8CriqqspvmunDTz/10xkr71qFnY07Tr1i7aqsLg2Vb6h/GOPCpdAYgTPlNLmF5AzpvBRp74viX3a/hO6+ge47+hZG61fVTz9y+DCee27Lx15fYFFHR8cAcNkPuw2DPXfP1+vvvf+BB7Br967WX9Mbk70eCn33zlWoCrsgKAFBCdgy/2nLBCyZgCUSMGUSpkzC0G1MrKzE0XMt/la9I0QnM+cWL15cmkwmK1tOnwpksuabg8YVifjnhEOlj69dtw6nT51Kv2q96fYG4fG7gbJwFhn7cxicIJgEZwAfEiokGASpWG1KhvIwg1/91ti1N9DEJ7ZOzKxdt87T1Nz8A67jv2Kx/o85AJDk//zXjzzCAeA/D7zU6PZjkkuXcBuEjN2OrGiHabfDFB2w7HZYoh3mVaMDWWdu1m6Hy5Bw6RIuP6b87+HXdgDAww8/zIXgGwFADwQCFYFA4BuLFi3CoUN/6LRmyL/y6gSXTtC4QDTVgQo/B5iEJFJ6Rt64lI6Vfi3JYBFHd1JA5wIunUNIQvpr/C+bm5u65s9fWBnwe9dISWVc0/DNhQsX6gDwTuuhd3WNYOSGTjjSehGp7EVYsguWuJQfssu51wVTXIIpLsGWlzBgXsSRM5dg6Hk6uk787Zb39gHA7NlzDM7xoM4Yli5fvgJSSiRmmbP9HNA0Qm4D6axEc6uJ6eOzuCloQuOOjlneqiUx2BK4lDBwut2DTFaHoXFYGilaHEjMMOdKKXHb4tvw/nvvL9UZ+Lyb6+pw/PjxpOZhsziX0DigcYLG1QaEBD69ZKA7wRHx2/C7BDSNwEi9AEmZGmJJA/1Z9SJM12hwvcYBzgmaj89obW3pr62dGmCcz+cuQ68GgEtdl7oYU40CZwSeW+As1rmy5KzNkbY1WILDlOp71ubgnKA7czVO4NyhwQhcFS7o6urq5pzDMLRqnXEtCACpdCrFHOHlAsTgYEq0nCnj0jnBY6i8KCTLBxbmzB2yPkczmU4lAYAxHtKFECYAPeDzBQZD4GU+motMueXklECWc7QkSaVDGoTAVetz8AGfLwQAQoisbtt2N4BJZaVlpZQjkntdS8w5UFOFni0YLMGhWfny1rbVPVuoOVKyK9ZeTrMsUl7qAHdzkPyktzeG2tqbw8KihCQlPjVUl2hLBkswmDZD1mJIWxwDWTXSFkfWUs8sZ64QzlqHjiRA2tQ7ZcqUYCwWgyT6hBNjb+3ZvQehUIi52tje3M6FyHHIYNkOqM2RsTjS2cuAs+pe1uYKPLcBkduA+m60sH1+v5/t3fsWGGP/x6VkjR98cAQAMNc7bXJepAyWzWHaimjW4siYDGmTY8DkGMhqapgcaVM9yw5ugMOyeX4DkmGub1otABz/6DiI2O94IpE4E+3p+aCzsxP333PfAvOi2G8JBtMRbU68GZMj44Ao0BzXmgOsRk7spq1oWILB6rQP3nt3/byLnZ2IxWKH4/H4pxoAeFzuC21tretW3rUKnk5mtWiflzAGxhgDQ66IYyrnOnqzBFfDZjAdLk1HMnkpMWRNLldmFomamtrIL/71F+iPJ/8mnc2e4QDQm0jsOXfu3L6TJ0/ivtX3T607M26P6SzMWI5eB7ktPHLPc/MV5xwTjpe9sfLOu2pOHD+JCxc+fyeWSLyZdzCoWsvjNpqef/6F8KTJU/DDLT/a3jM90eDWCS5dqmDvxF7NCRSAOikQhCuMUXHMEDjm3v7jb/+oIRrtxpMbnuzNmvatiUSi7QpgAAiFQneXlZbs3rGjUauorMSmLc+8dShy7HbDELqeA3bC4GCScHxWSMDOgVuaPb2t+t3vPfK9O1P9A/j7v3vC7ov318fj8bdyWFf8YCSbzZ7VNHb+tVdfrV911ypt/bcfq52J2uTBg+//LhWwZ0nJYTtWf6WrcccDGFgLdn5nwkPVD9Q/MLOzsxNPbvhhNpUc+G5vPL7jcqxBjonozwEsBzD5lVde9jy5YcPqTZufKX90/WOwbRv7330nsffDt08dSB41EkZyHPfwmwBAZuTFsBm48GeuWfai2oUzp02fFjKzJhp3NuLFF/+765e//Pfd31q71gLwGYC3GWNNAMCIaBKAJwBUO3uQnZ2d/MyZNv1vn/j+LUuXLq/Z/MyzCIfDTmxW8Y+IVFyWqjKRQkDYNqKxGDb97GkcOXLk7LZt/9F8c12dqKqqYM4LYALQCWAbI6J/A1AGgKK9vSBhoa8vEe+N9TwejcZYU1MTfrN9O6puqkJDw0NYtnwFpk6dCsZUMrFtG22trTiw/11s3/4aotEo1jQ04NZFt6KsrJTCoZKtJaWRiGG4KBKJ5BJWnw4gDedAx+0yMJCywLnQGWOSMabV1NbikUfX40J7B367sxFbt25DMhGHZZkgAC7DhWAojOpx4zF3wS0YP64aVZUVYCoQSN2la4bhIsNlcOS73H5GRBUAHgcwBYABAD09PZROp1gq2V8WTybq4vH4xEQ8oSWSSfSnUkinM7As9RdUw9Dh9XoR8PsQCgYRCodESTj0x1Aw2OrxBXsDgYBdXl6eM2IB4CyAbZcb12wASwBMB1Dq7C4ACJZIJHstM5PWdC2TTmcom80wEtySAFwupum6wbxeDxeCuT0et8/v94UBTTrSJABRAKcAHGCMnbrKjy/bRBjAHAATAFQ5NuAF4IFqAtyOKzKo83MLgAkgA2AAQB+ADgCfAzjBGIsPxfh/6wbDK7xbMFYAAAAASUVORK5CYII=\",\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAB/CAYAAAD4mHJdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACWAAAAlgB7MGOJQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAyUSURBVGiB7Zp7kFRVesB/5/S9PdMz/ZoHMwo4MICDuoGVIYICIuzGcn0vC+oWGuNjs8mua9ySP4wpgyaiVVupbHYTsLJmNT7WNXExwqqzrq8g4oNxdXUgyEMQARmZd3fPTE/3vfd8+ePenhlgBsFlrFSqb9Wpvn3vd77f+b7zne87ffsqjv+wE4nYDQqWl5aWfDUcLqkAyOUHunID+Q8EnkilMo8C7gnoPPaRTCYnVyQT71+1bKl80PK+HGw9KPv27ZPde3bLjp075NVXX5FLL7lYKpLx9yoqKuqOR6f6PIFYLFZtW7r54YcfqV+4aBEdHe3ywm+e39eb6etzPZfS0kj5woUX1EUipWrj6xtZedddu11P5mYymc5j6Q19HrgsUrL67r/7+8VLly7j8cce3d3X29vZ0DB9yplnfWXcrFmzxjU2NiaBXevWrUsv/trXKmzbqnz/9+9VDuTyz35hi2OxWHV1ZbJ1245d1ltvvpFtb293Kyoq7LKystKysnLKy8soKyujtDTCxx/vSW3fsT3c0NAQWbpkiZvp7a9Np9Ndo+nWxwJrLYvmzV9gAaxbt/75urrxd592Wp0Oh0tWHSkbiUQSv3unuQlgxoyZltZm0TF1H+umUnrC1KlTAaipqUpESmMzFIRjsVj3SPJTpkyJA0ycOBGMnviFwSISLolEAAiHbftYsgAlJREbwA6HESUlXxg8lkcRXAQXwUVwEVwEF8FFcBH8/xhsnZC0ksw49eQPI5mmNtP54ccAIvqgqbz4aYn8zYoTUXXcFnueyZ8eXtleZt75iQnpU0VUvYiqB5mvu5p+XH9w8RtgnJMOLut/7rd4+fpRBcS52hz65csnHdxQ8clZnyuT3NV40sHRUnfq58mUWFJ70sEn+yiCi+AiuAgugovgIrgILoKL4CK4CC6Ci+D/Q+Djf/higk8Jzs0IMjIGYDGAp0AUeBbiHf3Xs/HGAHyYlYaRX0EYC4txNeIFugvWHyXzua8cnDjYGMBoQIFhRFfLmLjaCxqAw8iuHing/nCwGlLuMrKrveNfnccPFnyLtQ8c0a1jElye8sGFAYwUSCN54Q8GB4ljKKpHkBmLOZbB4FLgjhLVYxNcDFnkMXJUj03m0kOKR0sgYzLHRvlwpcDYI7oaGYvl5HB4ZRrJ1cf9fP5E/5NwQUKM7uoTOI4/ql38kmgUOCMnEHMCL819sag2jJJAxgIs+HNY6PGlpUxXDQWXw5dXjxH8SFZBPf7SyqKrMQLKG7b/OkpmTBJI0BSjbwTGYo6Ni5+ZjMJDj1wkxmQ5iV+VsBh9BzImKbNQFhWjp8wx21c7dKIV9A94IxaJsdplZt9574JQVcUdpr3rzlEHdzLASslpg19EofLMMa3dc0Z9c9YMXT+s7/GCo9FojWWph87+6tmX3XTTzT7XA/F4xutXr4fyOuQZVQUQ0tLphY1nlcn5YqgAuOyyy3inefOtH+36aLJr5Obe3t72o4w68kIsFptuW7pp5d33TPne928hm83yLz+6b9PVb/4niRK9QNfUoquqUaUREEEG+jGd7Zi2Dnpy3qYHGr7OFdcsX2BZFs899ywP/fznu11PLslkMjtHBScSiXrL0m+uXr3mlEWLFrN58+auxD+u2HZWhb0gcvkyShZ/Ax2N+70KPcVvJpMm999NZJ99mi1dzsb3rviLGbNmz6rY0rKFVavubTWG83p6ej4psAbfr66trS03xtlw98p76s+bN5+nnvzFtouevK/s1AnJM+I/vB37j6aDziJeCtxhzUkhTgoYwJpchz3zbJI7fj/pzA829f6iR/bPPW9e9aS6utjbb715YWVl1SOZTMY5DGzb6scXf+OSS6+48kqanntu55+99shkOyLx8uuvIjSuDEzq6Ob5TdzgPJ9GhT2sCbV4W1vK57R+FP9lOrT33PnzKjOZTM2OD7dFB3L5FwaDq6KifGYiXvn95ddey4fbtmWv2fhIiVUqpbpMEao2SH4fiKCMgAbRggSuVkKwEQz22q4iVKtQEYUtJvzdlvX6+bq67PJrr41sbm6+VVv8W1dX7/9oADH6b//0+us1QO/jD6xPhGWSCgsqLJj8PsTdjzj7Ma7fxDkAzn5wjry+H3H2YfL7UGGDCguJEqnPPf3YOoDrrrtOe56+C8CKRqPjotHoN+fMmcObb7zRelsk9W1lC4QFCRlM9yfoKnsoEgOLVWCxDLfYBRwwnXmwDIQVyoMbo6lrfrq5+dCsxsbaaHlkqTFSpUMhvjV79mwLwHvjldewBGxQlqBswXn3Y6T/EDhtiNOGuG2I2444QXPb/WtOGzhtmL7PcN7di7IFFegiJDq3+ZVXAWbMmGlrzRJLKc6/4IJFGGO4MdQ+gxAQEn/2LcH0u+Sa27HO0IRq/V+MSqnBOUZARMAD75DB2w4mq8AKWkggpPiOtJ3dYgznzTuPt996+3xLoc8+vaGBlpaWzFybrygtqCPgeODtcTFtBl1hUBHfGgl+wNGv8FIayWjE6KCfD1UhBVqotPWZO3Zs7506dVpUaT1Lh21rPED7oUNtKH8OUYLSoHTwWRiEAsmBDIA4gCPIAJh8YL3lyw7vi5JAJ7QdamvXWmPbofGW0qEYQL4/0zeYjdTRTQ0Oxp9/Svx9jvKAkBocsCh1dP9AZ76vNwOglI5bnuflAaukPBo9bM8UpMIjvxeiWAUbATHK3/yNJM/h30vKozEAz/Ny2nXddoCKyqrKwc5GDYFMUJmM8peLqyCvkH6FZP1zXP+eGBXIFvQcrquyqroyALdrxGzv7u5i6rTTE3lX0gUL/DIYPPfwFDh+k5xCBhSS1Ui/9s9zQ/cLz0rEGxqEGMWAK92T6yfHu7q6MCLbtSj1UtPzTcTjcfW0E3t5EBSkv0FgPgAMQgtWa/9azpcZHICrhvR48B+52CvRaFS9/PJLKKVe1Mao9e+++zsAtk9rnIwbLBFHIQ5IACWvkJxGBjSSDeDZ4HxAIznty+SV38chGIA/PXumzZoK0PJBCyLq1zqdTn/U2dHxbmtrKxddfmXj1r7QRr9jMH/5Ye4d8OdV+odZ3F+AqyG3F/oFelr62PQnl14667PWVrq6ut5JpVJ7giLBygfWrMYOh3ll/pLx4iojR7p3QMGgpQX4kPUE8OFuF0chrjIvzL78VDsc5sEHH0SLWkmQLuhOp5v27t376tatW7nk8iun/UN8VhM5BblASS5w53BowdXD4L7Lg8EG7Z6SM36z+MILp25p2cqBA/s3dKXTLxRSBeDvtUpL7M0PPfRwYtLken791z9Y++fevmWE/WJBIelbgJbDtz4mePblBksrcPU/ubVrF65Yuayzs50Vt6/ozuXduel0etdhYIB4PH5RVWXy+WeeWR8aV1PDz+6/56W//PDFxbpELGULgwVEcwSYoWXkKExOuatqGl9b8p3vfb2vt5/b/uoWtyfVe0kqlXqpwDpql1lVlbwhUhr52VNPrQ3PPuccNm16PbXrR3f+9pvm0NV+pWEwhQKIqKHnm57iV9nydc6Smxc1zm5MHvj0AHfecUeuv7f/u509PY8N5wyCReRcYCEw6YknHi9bcfvtl9276r7qG2+6Gdd12bhhQ/rghhe3TdmywT4l2zkhEeIUgJTLZ62RygPbT5/rlv/xvLOmnzE9ns/lWb9uPY8++u9tP/3JPzd9e/nyLLAXeE0ptRlAicgk4BZgfDAGc/DgQb1790fWrT+45Zz58xdMue+++0kkk/5N8RO2iPiZ0BiMCMbz8FyXzq4u7l91L5ub3969Zs2/Np/eMM2rrT21YKQBPgPWKBFZAyQA093drTzPobu7uyPV3XNbR2enam5uZu3atdTW1LDsqqtYeMEipk2b5m8GANd12bVzJ69vfI2n1/6Kjo5OvrVsKefOPZeqqkpJJCtXJ5OJinBpRJLxeOF3bI8FZIAYoEN2SHmeJ6GQ2CiMUipUP2UK199wI59+2sp/rVvP6tVryKRTOE4eAcJ2mFg8wfgJE5nZeA4TJ4yntmYcSimUUsaydMi2wxIKKTXM6n4lIuMCV08m2O52dHSQzfbpvkxvZSqTbkinUnWpVDqUzvTS29dHNpvFcfy6aNsWkUgp0fJyYrEYiUTcSybin8RjiZ2lZeXd0WjUra6uDg2L/z3A6uHBNQNYAEwHqvAXTTl4Kp3O9HhOvk+FGMhmHXHdHGLEE8CytNY6rCKRsPY8VRoOh8tisfIkhFxgIAB2AtuA15VS20ZcTsEgEsBM4DTgFKASiAClQAnBig7EC8/8BoAc0AekgE+B/cAWpVTqSMb/AlY1WXIncMcxAAAAAElFTkSuQmCC\",\"data:image/png;base64,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\"],\"showPolygon\":false,\"polygonKeyName\":\"perimeter\",\"editablePolygon\":false,\"showPolygonLabel\":false,\"usePolygonLabelFunction\":false,\"polygonLabel\":\"${entityName}\",\"showPolygonTooltip\":false,\"showPolygonTooltipAction\":\"click\",\"autoClosePolygonTooltip\":true,\"usePolygonTooltipFunction\":false,\"polygonTooltipPattern\":\"${entityName}

TimeStamp: ${ts:7}\",\"polygonColor\":\"#3388ff\",\"polygonOpacity\":0.2,\"usePolygonColorFunction\":false,\"polygonStrokeColor\":\"#3388ff\",\"polygonStrokeOpacity\":1,\"polygonStrokeWeight\":3,\"usePolygonStrokeColorFunction\":false,\"showCircle\":false,\"circleKeyName\":\"perimeter\",\"editableCircle\":false,\"showCircleLabel\":false,\"useCircleLabelFunction\":false,\"circleLabel\":\"${entityName}\",\"showCircleTooltip\":false,\"showCircleTooltipAction\":\"click\",\"autoCloseCircleTooltip\":true,\"useCircleTooltipFunction\":false,\"circleTooltipPattern\":\"${entityName}

TimeStamp: ${ts:7}\",\"circleFillColor\":\"#3388ff\",\"circleFillColorOpacity\":0.2,\"useCircleFillColorFunction\":false,\"circleStrokeColor\":\"#3388ff\",\"circleStrokeOpacity\":1,\"circleStrokeWeight\":3,\"useCircleStrokeColorFunction\":false,\"useClusterMarkers\":false,\"zoomOnClick\":true,\"maxClusterRadius\":80,\"animate\":true,\"spiderfyOnMaxZoom\":false,\"showCoverageOnHover\":true,\"chunkedLoading\":false,\"removeOutsideVisibleBounds\":true,\"useIconCreateFunction\":false},\"title\":\"Google Map\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{}}" }, - "externalId": null + "externalId": null, + "tags": [ + "mapping", + "gps", + "navigation", + "geolocation", + "satellite", + "directions" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/ground_temperature_card.json b/application/src/main/data/json/system/widget_types/ground_temperature_card.json index 202e88bcca..56b1b6ad1c 100644 --- a/application/src/main/data/json/system/widget_types/ground_temperature_card.json +++ b/application/src/main/data/json/system/widget_types/ground_temperature_card.json @@ -3,7 +3,7 @@ "name": "Ground temperature card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest ground temperature telemetry data in a box layout.", + "description": "Displays the latest ground temperature telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, @@ -21,9 +21,17 @@ }, "externalId": null, "tags": [ - "temperature", "weather", "environment", - "ground" + "soil temperature", + "terrestrial temperature", + "subsurface temperature", + "earth temperature", + "below surface temperature", + "surface temp", + "soil warmth", + "land temperature", + "geothermal reading", + "ground warmth" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/ground_temperature_card_with_background.json b/application/src/main/data/json/system/widget_types/ground_temperature_card_with_background.json index 402501f7e8..c4e87a4c74 100644 --- a/application/src/main/data/json/system/widget_types/ground_temperature_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/ground_temperature_card_with_background.json @@ -3,7 +3,7 @@ "name": "Ground temperature card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest ground temperature telemetry data in a box layout with background.", + "description": "Displays the latest ground temperature telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, @@ -21,9 +21,17 @@ }, "externalId": null, "tags": [ - "temperature", "weather", "environment", - "ground" + "soil temperature", + "terrestrial temperature", + "subsurface temperature", + "earth temperature", + "below surface temperature", + "surface temp", + "soil warmth", + "land temperature", + "geothermal reading", + "ground warmth" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/ground_temperature_chart_card.json b/application/src/main/data/json/system/widget_types/ground_temperature_chart_card.json index 93c92941b2..897c92a9b0 100644 --- a/application/src/main/data/json/system/widget_types/ground_temperature_chart_card.json +++ b/application/src/main/data/json/system/widget_types/ground_temperature_chart_card.json @@ -3,7 +3,7 @@ "name": "Ground temperature chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a ground temperature data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a ground temperature data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, @@ -24,9 +24,17 @@ }, "externalId": null, "tags": [ - "temperature", "weather", "environment", - "ground" + "soil temperature", + "terrestrial temperature", + "subsurface temperature", + "earth temperature", + "below surface temperature", + "surface temp", + "soil warmth", + "land temperature", + "geothermal reading", + "ground warmth" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/ground_temperature_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/ground_temperature_chart_card_with_background.json index 33ba24a526..aa853de8a5 100644 --- a/application/src/main/data/json/system/widget_types/ground_temperature_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/ground_temperature_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Ground temperature chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a ground temperature data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a ground temperature data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, @@ -24,9 +24,17 @@ }, "externalId": null, "tags": [ - "temperature", "weather", "environment", - "ground" + "soil temperature", + "terrestrial temperature", + "subsurface temperature", + "earth temperature", + "below surface temperature", + "surface temp", + "soil warmth", + "land temperature", + "geothermal reading", + "ground warmth" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/here_map.json b/application/src/main/data/json/system/widget_types/here_map.json index 76a4bc78fb..1d60a8ca11 100644 --- a/application/src/main/data/json/system/widget_types/here_map.json +++ b/application/src/main/data/json/system/widget_types/here_map.json @@ -17,5 +17,13 @@ "settingsDirective": "tb-map-widget-settings", "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"First point\",\"entityAliasId\":null,\"filterId\":null,\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"latitude\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.05427416942713381,\"funcBody\":\"var value = prevValue || 15.833293;\\nif (time % 5000 < 500) {\\n value += Math.random() * 0.05 - 0.025;\\n}\\nreturn value;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"longitude\",\"color\":\"#4caf50\",\"settings\":{},\"_hash\":0.680594833308841,\"funcBody\":\"var value = prevValue || -90.454350;\\nif (time % 5000 < 500) {\\n value += Math.random() * 0.05 - 0.025;\\n}\\nreturn value;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"temperature\",\"color\":\"#9c27b0\",\"settings\":{},\"_hash\":0.9430343126300238,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nif (value < -60) {\\n\\tvalue = -60;\\n} else if (value > 60) {\\n\\tvalue = 60;\\n}\\nreturn value;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Type\",\"color\":\"#8bc34a\",\"settings\":{},\"_hash\":0.1784452363910778,\"funcBody\":\"return \\\"colorpin\\\";\",\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]},{\"type\":\"function\",\"name\":\"Second point\",\"entityAliasId\":null,\"filterId\":null,\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"latitude\",\"color\":\"#f44336\",\"settings\":{},\"_hash\":0.05012157428742059,\"funcBody\":\"var value = prevValue || 14.450463;\\nif (time % 4000 < 500) {\\n value += Math.random() * 0.05 - 0.025;\\n}\\nreturn value;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"longitude\",\"color\":\"#ffc107\",\"settings\":{},\"_hash\":0.6742359401617628,\"funcBody\":\"var value = prevValue || -84.845334;\\nif (time % 4000 < 500) {\\n value += Math.random() * 0.05 - 0.025;\\n}\\nreturn value;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"temperature\",\"color\":\"#8bc34a\",\"settings\":{},\"_hash\":0.773875863339494,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nif (value < -60) {\\n\\tvalue = -60;\\n} else if (value > 60) {\\n\\tvalue = 60;\\n}\\nreturn value;\"},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Type\",\"color\":\"#3f51b5\",\"settings\":{},\"_hash\":0.405822538899673,\"funcBody\":\"return \\\"thermometer\\\";\",\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"provider\":\"here\",\"gmApiKey\":\"AIzaSyDoEx2kaGz3PxwbI9T7ccTSg5xjdw8Nw8Q\",\"gmDefaultMapType\":\"roadmap\",\"mapProvider\":\"HERE.normalDay\",\"useCustomProvider\":false,\"customProviderTileUrl\":\"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\",\"mapProviderHere\":\"HERE.normalDay\",\"credentials\":{\"useV3\":true,\"apiKey\":\"kVXykxAfZ6LS4EbCTO02soFVfjA7HoBzNVVH9u7nzoE\"},\"mapImageUrl\":\"data:image/svg+xml;base64,PHN2ZyBpZD0ic3ZnMiIgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTAwIiB3aWR0aD0iMTAwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgdmlld0JveD0iMCAwIDEwMCAxMDAiPgogPGcgaWQ9ImxheWVyMSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtOTUyLjM2KSI+CiAgPHJlY3QgaWQ9InJlY3Q0Njg0IiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBoZWlnaHQ9Ijk5LjAxIiB3aWR0aD0iOTkuMDEiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiB5PSI5NTIuODYiIHg9Ii40OTUwNSIgc3Ryb2tlLXdpZHRoPSIuOTkwMTAiIGZpbGw9IiNlZWUiLz4KICA8dGV4dCBpZD0idGV4dDQ2ODYiIHN0eWxlPSJ3b3JkLXNwYWNpbmc6MHB4O2xldHRlci1zcGFjaW5nOjBweDt0ZXh0LWFuY2hvcjptaWRkbGU7dGV4dC1hbGlnbjpjZW50ZXIiIGZvbnQtd2VpZ2h0PSJib2xkIiB4bWw6c3BhY2U9InByZXNlcnZlIiBmb250LXNpemU9IjEwcHgiIGxpbmUtaGVpZ2h0PSIxMjUlIiB5PSI5NzAuNzI4MDkiIHg9IjQ5LjM5NjQ3NyIgZm9udC1mYW1pbHk9IlJvYm90byIgZmlsbD0iIzY2NjY2NiI+PHRzcGFuIGlkPSJ0c3BhbjQ2OTAiIHg9IjUwLjY0NjQ3NyIgeT0iOTcwLjcyODA5Ij5JbWFnZSBiYWNrZ3JvdW5kIDwvdHNwYW4+PHRzcGFuIGlkPSJ0c3BhbjQ2OTIiIHg9IjQ5LjM5NjQ3NyIgeT0iOTgzLjIyODA5Ij5pcyBub3QgY29uZmlndXJlZDwvdHNwYW4+PC90ZXh0PgogIDxyZWN0IGlkPSJyZWN0NDY5NCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgaGVpZ2h0PSIxOS4zNiIgd2lkdGg9IjY5LjM2IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgeT0iOTkyLjY4IiB4PSIxNS4zMiIgc3Ryb2tlLXdpZHRoPSIuNjM5ODYiIGZpbGw9Im5vbmUiLz4KIDwvZz4KPC9zdmc+Cg==\",\"tmApiKey\":\"84d6d83e0e51e481e50454ccbe8986b\",\"tmDefaultMapType\":\"roadmap\",\"latKeyName\":\"latitude\",\"lngKeyName\":\"longitude\",\"xPosKeyName\":\"xPos\",\"yPosKeyName\":\"yPos\",\"defaultCenterPosition\":\"0,0\",\"disableScrollZooming\":false,\"disableDoubleClickZooming\":false,\"disableZoomControl\":false,\"fitMapBounds\":true,\"useDefaultCenterPosition\":false,\"mapPageSize\":16384,\"markerOffsetX\":0.5,\"markerOffsetY\":1,\"posFunction\":\"return {x: origXPos, y: origYPos};\",\"draggableMarker\":false,\"showLabel\":true,\"useLabelFunction\":false,\"label\":\"${entityName}\",\"showTooltip\":true,\"showTooltipAction\":\"click\",\"autocloseTooltip\":true,\"useTooltipFunction\":false,\"tooltipPattern\":\"${entityName}

Latitude: ${latitude:7}
Longitude: ${longitude:7}
Temperature: ${temperature} °C
See advanced settings for details\",\"tooltipOffsetX\":0,\"tooltipOffsetY\":-1,\"color\":\"#fe7569\",\"useColorFunction\":true,\"colorFunction\":\"var type = dsData[dsIndex]['Type'];\\nif (type == 'colorpin') {\\n\\tvar temperature = dsData[dsIndex]['temperature'];\\n\\tif (typeof temperature !== undefined) {\\n\\t var percent = (temperature + 60)/120 * 100;\\n\\t return tinycolor.mix('blue', 'red', percent).toHexString();\\n\\t}\\n\\treturn 'blue';\\n}\\n\",\"useMarkerImageFunction\":true,\"markerImageSize\":34,\"markerImageFunction\":\"var type = dsData[dsIndex]['Type'];\\nif (type == 'thermometer') {\\n\\tvar res = {\\n\\t url: images[0],\\n\\t size: 40\\n\\t}\\n\\tvar temperature = dsData[dsIndex]['temperature'];\\n\\tif (typeof temperature !== undefined) {\\n\\t var percent = (temperature + 60)/120;\\n\\t var index = Math.min(3, Math.floor(4 * percent));\\n\\t res.url = images[index];\\n\\t}\\n\\treturn res;\\n}\",\"markerImages\":[\"data:image/png;base64,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\",\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAB/CAYAAAD4mHJdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACWAAAAlgB7MGOJQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAA3vSURBVGiB7Vt7cFzVef+dc+/d90OrJyO/JSO/4ncxxfULMCYIAyEW08amJJgmM4GmnZjJdNq4gcSGzLQxk3bsaWcaaIHyR8CJrWAbpjgG/AhINsbYxkaSDY6xJFvSrrS7Wu3uvfecr3+cu1pbXhkJs/4nujNndufec77f+d7fd+4uw8gvIxwOfocBaz0e91yXyx0BgKyZiWUz5kcEvBKPJ18EYI+C5rWvkpKSyZGS8LGHGtbQR8ePUUdnB50/f57OfnqWWlpbaN++39O99fdQpCR0NBKJTBwJTfZFE4LBYLmh8+YXXvifKctWrEBPTze9+cbu8/3JVMoWNjwer3/ZsuUTvV4P239gP36yceNZW9CtyWQyei262hcB+7zurU/99Ge3r1nTgJdfevFsqr8/Wlc3rWbGzFkV8+fPr1iwYEEJgLadO3cmbr/jjohh6KXHPjxamsmar39pjoPBYHl5aUnnqZY2/b1Dh9LdPd39kUgk6PP5PD6fH36/Dz6fDx6PF+fOfdZ9+pPTgbq6Ou+aBx+0k/0DVYlEIjYcbX4tYM5pxeK/WKIDwM7Gxt0TJox/dtLESXC53JuHzvV4PBVHDjfvAYDZs+fonMsV16R9rYeM8XG1tbUAgMrKsrDP659DRJ5gMNhbaH5NTU0IAMaPHw9IPv5LAxORy+31AgBcLsO41lwAcLu9BgAYLheIkftLAxfzGgMeAx4DHgMeAx4DHgMeAx4DHgMeAx4DHgMeAx4D/lME1ke7gDF8ltbOHe3W923oEwYi1jxftWfZWgAziwacZkd2pfyN96XN5IIu7dMtIKA9/TI+zqCnFps2Alg5UlojFnVqIHZUlO2sl4RyC4CU+SEEylux8Z/iyc7mrxw4U7UnYwvGpXMYKIgNGdwXC/76C48oRw3sDWfnCgIkARJXcpwbvpA1e6T0Rq5jDr8EAHKA6OpjUOJwfeXAJAEhAXAGgEPKq+dIMVJqowDO4RAAC0rHV21u5LijAJaABAOIAY5Oh15iFMgj1zEpcUuuXjpIWeCouxjAtnIZcGKA5AVFbRfazPUC50QrKe8+Qy8qiqjBYIODA5DgBd1pBO9WRg9sy7yOhXBca+icYrgTOUGOiKnIVdCdisAxJGBTPsYW0nHRrJqgfNmGVtiqaeR1xchF7Vgz40q/BUNmISlcL7CUgJAMnOUiVwEdF0PURIAAVHaC8ucbAiwcQAb1KQpwXMjFrhtYMcOVO8lhOB457ujcKZd9hBguSYwcelTupKyaQWKYJFEU4xJw/Dhfcw29ilSBcNjEoTucFnSnkeOOvvTJpcVC1cYoGB5NAGEQTukjMAzHoghJghyWCRjenYoTuZjKx8xJiwU4LrSZ6waWpIoBjTuRqxDHRUkSUMWAJAZp6QU5FqOw65HHapG3bGVcBTZXDI5VnFaFgBL1yC34uoBJqEJeIwD2MMY1ilZidAFEMlDOqm9UdpJ0ZawumI+LU9ArwhyqWxyNz14XsBAMUnLVH0ttGB0XococdCGWE3XhOV85MF1WV2OY3omK0S2SkxgYAZYYJoAUpcqEEjG/Ru80isA1ysMXYNCnCum4aKUPgTu90w3sFinXL6nO/MadCAhiKloxBjFMeSuK0S1Kylv1cE1bUVoYyHwhoI6bCswpjjuxK5u2G2lcti2jzNCRTluioHEVw52EBA5/2LKsLBL+h2gs/o+Fjpa+MqtmjCbkqQJSYFF3T3zRsPMvA75i7UiBA4FApa6z5+fNnbd6/frHADghk7QdlhAHdMY0KXkZAHAuozaRMDRtKYMdAYDVq1fjcHPTD860nZlsS3qsv7+/+6pNDr0RDAanGTrf85Onnq75/uNPIJ1O4+dbnj34Ot6B4eFLqksqUeEvgcflAREhZabR09+Li/EorLQ4eFv317D2oW8t0XUdu3a9jud/9auztqD6ZDLZOixwOByeouv8D1u3brtpxYrb0XS4Kfbj3//8VHC8d0nDLXfj67OWIeQJgDGADfoOAxHQl05i14l92PHBXiTPp/c/OrFh9vwF8yMnjp/A5s2bOqXEbX19fX+8CriqqspvmunDTz/10xkr71qFnY07Tr1i7aqsLg2Vb6h/GOPCpdAYgTPlNLmF5AzpvBRp74viX3a/hO6+ge47+hZG61fVTz9y+DCee27Lx15fYFFHR8cAcNkPuw2DPXfP1+vvvf+BB7Br967WX9Mbk70eCn33zlWoCrsgKAFBCdgy/2nLBCyZgCUSMGUSpkzC0G1MrKzE0XMt/la9I0QnM+cWL15cmkwmK1tOnwpksuabg8YVifjnhEOlj69dtw6nT51Kv2q96fYG4fG7gbJwFhn7cxicIJgEZwAfEiokGASpWG1KhvIwg1/91ti1N9DEJ7ZOzKxdt87T1Nz8A67jv2Kx/o85AJDk//zXjzzCAeA/D7zU6PZjkkuXcBuEjN2OrGiHabfDFB2w7HZYoh3mVaMDWWdu1m6Hy5Bw6RIuP6b87+HXdgDAww8/zIXgGwFADwQCFYFA4BuLFi3CoUN/6LRmyL/y6gSXTtC4QDTVgQo/B5iEJFJ6Rt64lI6Vfi3JYBFHd1JA5wIunUNIQvpr/C+bm5u65s9fWBnwe9dISWVc0/DNhQsX6gDwTuuhd3WNYOSGTjjSehGp7EVYsguWuJQfssu51wVTXIIpLsGWlzBgXsSRM5dg6Hk6uk787Zb39gHA7NlzDM7xoM4Yli5fvgJSSiRmmbP9HNA0Qm4D6axEc6uJ6eOzuCloQuOOjlneqiUx2BK4lDBwut2DTFaHoXFYGilaHEjMMOdKKXHb4tvw/nvvL9UZ+Lyb6+pw/PjxpOZhsziX0DigcYLG1QaEBD69ZKA7wRHx2/C7BDSNwEi9AEmZGmJJA/1Z9SJM12hwvcYBzgmaj89obW3pr62dGmCcz+cuQ68GgEtdl7oYU40CZwSeW+As1rmy5KzNkbY1WILDlOp71ubgnKA7czVO4NyhwQhcFS7o6urq5pzDMLRqnXEtCACpdCrFHOHlAsTgYEq0nCnj0jnBY6i8KCTLBxbmzB2yPkczmU4lAYAxHtKFECYAPeDzBQZD4GU+motMueXklECWc7QkSaVDGoTAVetz8AGfLwQAQoisbtt2N4BJZaVlpZQjkntdS8w5UFOFni0YLMGhWfny1rbVPVuoOVKyK9ZeTrMsUl7qAHdzkPyktzeG2tqbw8KihCQlPjVUl2hLBkswmDZD1mJIWxwDWTXSFkfWUs8sZ64QzlqHjiRA2tQ7ZcqUYCwWgyT6hBNjb+3ZvQehUIi52tje3M6FyHHIYNkOqM2RsTjS2cuAs+pe1uYKPLcBkduA+m60sH1+v5/t3fsWGGP/x6VkjR98cAQAMNc7bXJepAyWzWHaimjW4siYDGmTY8DkGMhqapgcaVM9yw5ugMOyeX4DkmGub1otABz/6DiI2O94IpE4E+3p+aCzsxP333PfAvOi2G8JBtMRbU68GZMj44Ao0BzXmgOsRk7spq1oWILB6rQP3nt3/byLnZ2IxWKH4/H4pxoAeFzuC21tretW3rUKnk5mtWiflzAGxhgDQ66IYyrnOnqzBFfDZjAdLk1HMnkpMWRNLldmFomamtrIL/71F+iPJ/8mnc2e4QDQm0jsOXfu3L6TJ0/ivtX3T607M26P6SzMWI5eB7ktPHLPc/MV5xwTjpe9sfLOu2pOHD+JCxc+fyeWSLyZdzCoWsvjNpqef/6F8KTJU/DDLT/a3jM90eDWCS5dqmDvxF7NCRSAOikQhCuMUXHMEDjm3v7jb/+oIRrtxpMbnuzNmvatiUSi7QpgAAiFQneXlZbs3rGjUauorMSmLc+8dShy7HbDELqeA3bC4GCScHxWSMDOgVuaPb2t+t3vPfK9O1P9A/j7v3vC7ov318fj8bdyWFf8YCSbzZ7VNHb+tVdfrV911ypt/bcfq52J2uTBg+//LhWwZ0nJYTtWf6WrcccDGFgLdn5nwkPVD9Q/MLOzsxNPbvhhNpUc+G5vPL7jcqxBjonozwEsBzD5lVde9jy5YcPqTZufKX90/WOwbRv7330nsffDt08dSB41EkZyHPfwmwBAZuTFsBm48GeuWfai2oUzp02fFjKzJhp3NuLFF/+765e//Pfd31q71gLwGYC3GWNNAMCIaBKAJwBUO3uQnZ2d/MyZNv1vn/j+LUuXLq/Z/MyzCIfDTmxW8Y+IVFyWqjKRQkDYNqKxGDb97GkcOXLk7LZt/9F8c12dqKqqYM4LYALQCWAbI6J/A1AGgKK9vSBhoa8vEe+N9TwejcZYU1MTfrN9O6puqkJDw0NYtnwFpk6dCsZUMrFtG22trTiw/11s3/4aotEo1jQ04NZFt6KsrJTCoZKtJaWRiGG4KBKJ5BJWnw4gDedAx+0yMJCywLnQGWOSMabV1NbikUfX40J7B367sxFbt25DMhGHZZkgAC7DhWAojOpx4zF3wS0YP64aVZUVYCoQSN2la4bhIsNlcOS73H5GRBUAHgcwBYABAD09PZROp1gq2V8WTybq4vH4xEQ8oSWSSfSnUkinM7As9RdUw9Dh9XoR8PsQCgYRCodESTj0x1Aw2OrxBXsDgYBdXl6eM2IB4CyAbZcb12wASwBMB1Dq7C4ACJZIJHstM5PWdC2TTmcom80wEtySAFwupum6wbxeDxeCuT0et8/v94UBTTrSJABRAKcAHGCMnbrKjy/bRBjAHAATAFQ5NuAF4IFqAtyOKzKo83MLgAkgA2AAQB+ADgCfAzjBGIsPxfh/6wbDK7xbMFYAAAAASUVORK5CYII=\",\"data:image/png;base64,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\",\"data:image/png;base64,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\"],\"showPolygon\":false,\"polygonKeyName\":\"coordinates\",\"editablePolygon\":false,\"showPolygonLabel\":false,\"usePolygonLabelFunction\":false,\"polygonLabel\":\"${entityName}\",\"showPolygonTooltip\":false,\"showPolygonTooltipAction\":\"click\",\"autoClosePolygonTooltip\":true,\"usePolygonTooltipFunction\":false,\"polygonTooltipPattern\":\"${entityName}

TimeStamp: ${ts:7}\",\"polygonColor\":\"#3388ff\",\"polygonOpacity\":0.5,\"usePolygonColorFunction\":false,\"polygonStrokeColor\":\"#3388ff\",\"polygonStrokeOpacity\":1,\"polygonStrokeWeight\":1,\"usePolygonStrokeColorFunction\":false,\"showCircle\":false,\"circleKeyName\":\"perimeter\",\"editableCircle\":false,\"showCircleLabel\":false,\"useCircleLabelFunction\":false,\"circleLabel\":\"${entityName}\",\"showCircleTooltip\":false,\"showCircleTooltipAction\":\"click\",\"autoCloseCircleTooltip\":true,\"useCircleTooltipFunction\":false,\"circleTooltipPattern\":\"${entityName}

TimeStamp: ${ts:7}\",\"circleFillColor\":\"#3388ff\",\"circleFillColorOpacity\":0.2,\"useCircleFillColorFunction\":false,\"circleStrokeColor\":\"#3388ff\",\"circleStrokeOpacity\":1,\"circleStrokeWeight\":3,\"useCircleStrokeColorFunction\":false,\"useClusterMarkers\":false,\"zoomOnClick\":true,\"maxClusterRadius\":80,\"animate\":true,\"spiderfyOnMaxZoom\":false,\"showCoverageOnHover\":true,\"chunkedLoading\":false,\"removeOutsideVisibleBounds\":true,\"useIconCreateFunction\":false},\"title\":\"HERE Map\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{}}" }, - "externalId": null + "externalId": null, + "tags": [ + "mapping", + "gps", + "navigation", + "geolocation", + "satellite", + "directions" + ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_2_1_elliptical_tank.json b/application/src/main/data/json/system/widget_types/horizontal_2_1_elliptical_tank.json new file mode 100644 index 0000000000..93087939ac --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_2_1_elliptical_tank.json @@ -0,0 +1,36 @@ +{ + "fqn": "horizontal_2_1_elliptical_tank", + "name": "Horizontal 2:1 elliptical tank", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Widget indicates the level of liquid in Horizontal 2:1 elliptical tank.", + "descriptor": { + "type": "latest", + "sizeX": 4, + "sizeY": 4, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.liquidLevelWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.liquidLevelWidget.update();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n}\n\nself.actionSources = function() { \n return { \n 'cardClick': {\n name: 'widget-action.card-click',\n multiple: false \n } \n };\n}", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}\n", + "settingsDirective": "tb-liquid-level-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-liquid-level-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"return Math.floor(Math.random() * 101);\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"tankSelectionType\":\"static\",\"selectedShape\":\"Horizontal 2:1 Elliptical\",\"shapeAttributeName\":\"tankShape\",\"tankColor\":{\"type\":\"range\",\"color\":\"#242770\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E73535DE\"},{\"from\":20,\"to\":null,\"color\":\"#242770\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E73535DE';\\n }\\n}\\nreturn '#242770';\"},\"datasourceUnits\":\"%\",\"layout\":\"percentage\",\"volumeSource\":\"static\",\"volumeConstant\":500,\"volumeAttributeName\":\"volume\",\"volumeUnits\":\"L\",\"volumeFont\":{\"family\":\"Roboto\",\"size\":14,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"volumeColor\":\"rgba(0, 0, 0, 0.18)\",\"units\":\"%\",\"widgetUnitsSource\":\"static\",\"widgetUnitsAttributeName\":\"units\",\"liquidColor\":{\"type\":\"range\",\"color\":\"#7A8BFF\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E27C7CDE\"},{\"from\":20,\"to\":null,\"color\":\"#7A8BFF\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":24,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"valueColor\":{\"type\":\"range\",\"color\":\"#000000DE\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FF0000DE\"},{\"from\":20,\"to\":null,\"color\":\"rgba(0,0,0,0.87)\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FF0000DE';\\n }\\n}\\nreturn '#000000DE';\"},\"showBackgroundOverlay\":true,\"backgroundOverlayColor\":{\"type\":\"range\",\"color\":\"rgba(255, 255, 255, 0.76)\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FFEFEFDE\"},{\"from\":20,\"to\":null,\"color\":\"#FFFFFFC2\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FFEFEFDE';\\n }\\n}\\nreturn '#FFFFFFC2';\"},\"showTooltip\":true,\"showTooltipLevel\":true,\"tooltipUnits\":\"%\",\"tooltipLevelDecimals\":0,\"tooltipLevelFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipLevelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.76)\",\"rangeList\":[],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"showTooltipDate\":true,\"tooltipDateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"tooltipDateFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipDateColor\":\"rgba(0, 0, 0, 0.76)\",\"tooltipBackgroundColor\":\"rgba(255, 255, 255, 0.76)\",\"tooltipBackgroundBlur\":3,\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Liquid level\",\"useDashboardTimewindow\":true,\"displayTimewindow\":true,\"configMode\":\"basic\",\"titleFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"1.5\"},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"showTitleIcon\":false,\"titleIcon\":\"water_drop\",\"iconColor\":\"#5469FF\",\"decimals\":0,\"enableDataExport\":false,\"enableFullscreen\":false,\"borderRadius\":\"0px\",\"actions\":{},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"dropShadow\":true,\"margin\":\"0px\",\"widgetStyle\":{},\"widgetCss\":\"\",\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"pageSize\":1024,\"noDataDisplayMessage\":\"\"}" + }, + "externalId": null, + "tags": [ + "reservoir", + "container", + "vessel", + "storage unit", + "cistern", + "canister", + "vat", + "basin", + "repository", + "bin", + "hopper" + ] +} diff --git a/application/src/main/data/json/system/widget_types/horizontal_air_quality_card.json b/application/src/main/data/json/system/widget_types/horizontal_air_quality_card.json deleted file mode 100644 index 056a6c735f..0000000000 --- a/application/src/main/data/json/system/widget_types/horizontal_air_quality_card.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "fqn": "horizontal_air_quality_card", - "name": "Horizontal air quality card", - "deprecated": false, - "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAnFBMVEUAAADf39/f39/g4ODg4ODf39/////k5OSAwyzg4OCg0mHP6bDv9+Xz8/Pf8MqQy0av2XuQkJDOzs73+/K/4ZWsrKzIyMj5+fnp6enV1dXb29u2trZYWFiIxznCwsKg0mC8vLzQ6a+enp643Yin1m6YzlPH5aPA4ZZKSkrn9Njn9NfY7L08PDyIxzq33YiCgoJ0dHRmZmY9PT0vLy8+mqJEAAAABnRSTlMAIEDfv1C6kOEmAAAD3ElEQVR42u3a63aTQBSG4WrrZgIzkHCGAInk2CbaVu//3twMEFBR2mXtol3f86OBbNLFC9ODNlcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAr+nDm6czPl4bb93s+hN3GBG9ecr4eHWj6B2Ibq5m9C7MEDIxCJkahEwNQqYGIVMzGHLIhSmpxyiJgoS0cBHQRRAkAU3il7WhkFux2grHo87DWVGSKKWIgix8LHnD4DxFi0UShkdlUDV6AvnZph7vsnfLg25u731LErtMb4k1o1P7qUbvCL/KEhZ1srKkRbA4l0SPISVZmFFm3D+cwwU/uzgvv6n74CkZphAmXdjb/LLnizkxi+f6MHagi1X9snbk3NWHjoYwux+yflBZFRJUTSEZRx0SlllQhRg8K4/GEzocsepd2pxPaTBkJ1b2rfVF2JcXCtHs8Gc42XOR342GSFs77YSkO9murGN2DpuQ+wUFD0kVckzu65Ajp2U0bs4XuWOt9vvBEE8IWT/TDVdiU48dYl+FORoiWnsy27trnInK+ypE72TfDHV8/G48Ph7LKkQdF5QFNEryWUhJPdafQmx9SS83zxG3X3JPLzGruUPeWMjpc80jb+ebQtLvVLngD9SjjG+KRuiT3FXreyyE75yzkdSx+cmVjtPLTT/ejYT87MCve5KypHG+ECt/K3JvLISXjhA7q7ckrSpGrxfZ3CJ79GskFz0OvaC5PteV2I+GkNzvOKUp9r4IWX3wnhXifZ13fO9lQ3x9xpvxEGY74tAelfO58G4dUBHDS+uV7MVmKKTd3NbHmGSZh3pz2/4Qqe2ItnWcLRwaC9maPSeqKRqgYvrJ6A93W/+2sBMWkbyEdMNcUjXdtJvzJkTy5ZeMv9CbkcdHjYc4nZxvoLasYxTFKWlRRNHMrZ6YUcT7cRBTlKb1IBou19+NfLO7mPqxP5xveCqrW+Bs+MBmGflN0FexqT7k23leXZHnLK2TsC4hSeKmYejyVkFFWqyjZeEmSeiuY3cdEbmxWq9TUq4euOGaBnjVd6OVbNfRL+fiO3rabdqkOeLU3jOvGXHSM0J2jinsLsRdqtCN3TokTlLe5ufi1C1CHTJLUw4Jl3GoOLdQNMSTXv1IQ6Se9jeHj7IcsenGoyF+nu+pFrhp4S6TsFDVHXHXabFUy9AtOGQdhy5VIVF1R+J1UA2SoqD/STqHl/mHVRrTnyVhSq/gRUKi6G9DRU8xiZApQsjUIGRqEDI1CJma2dXNO/gzO5G64TcMTOL/bv9NxG8YuPp0PTPeuuuP7+lNNQAAAAAAAAAAAAAAAAAAAAAAAAAAAACv5AfYigaXSHbHzwAAAABJRU5ErkJggg==", - "description": "Displays a latest air quality telemetry data in a horizontal layout.", - "descriptor": { - "type": "latest", - "sizeX": 5, - "sizeY": 1, - "resources": [], - "templateHtml": "\n", - "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'air', label: 'Air Quality', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", - "settingsSchema": "", - "dataKeySettingsSchema": "", - "settingsDirective": "tb-value-card-widget-settings", - "hasBasicMode": true, - "basicModeDirective": "tb-value-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:weather-windy\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal air quality card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"US AQI\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" - }, - "externalId": null, - "tags": [ - "weather", - "environment", - "air" - ] -} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_air_quality_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_air_quality_card_with_background.json deleted file mode 100644 index 1965615e49..0000000000 --- a/application/src/main/data/json/system/widget_types/horizontal_air_quality_card_with_background.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "fqn": "horizontal_air_quality_card_with_background", - "name": "Horizontal air quality card with background", - "deprecated": false, - "image": "data:image/png;base64,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", - "description": "Displays a latest air quality telemetry data in a horizontal layout with background.", - "descriptor": { - "type": "latest", - "sizeX": 5, - "sizeY": 1, - "resources": [], - "templateHtml": "\n", - "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'air', label: 'Air Quality', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", - "settingsSchema": "", - "dataKeySettingsSchema": "", - "settingsDirective": "tb-value-card-widget-settings", - "hasBasicMode": true, - "basicModeDirective": "tb-value-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:weather-windy\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal air quality card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"US AQI\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" - }, - "externalId": null, - "tags": [ - "weather", - "environment", - "air" - ] -} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_air_quality_index_card.json b/application/src/main/data/json/system/widget_types/horizontal_air_quality_index_card.json new file mode 100644 index 0000000000..60bd64f347 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_air_quality_index_card.json @@ -0,0 +1,32 @@ +{ + "fqn": "horizontal_air_quality_card", + "name": "Horizontal air quality index card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAmVBMVEUAAADf39/f39/g4ODg4ODf39/////k5OSAwyzg4OCg0mHy8vLQ6a+srKyQkJCQy0bf8Mrv9+Xj4+POzs5YWFiv2Xv5+fn3+/KIxznb29u2trbA4ZXV1dXHx8fCwsK8vLzn5+fIyMi43Yio1m47Ozt0dHTn9NjH5aNmZmZKSkrY7L2enp6YzlOCgoJLS0vt7e2dnZ3U1NQhISGmKTEOAAAABnRSTlMAIEDfv1C6kOEmAAADrUlEQVR42u3aa3OaQBiG4bRJn7yynEEOAh7xrEna///jykKrtjZK2iZDMs/1QWGXD3sP4OjIDREREREREREREREREREREREREREREdFb+vTu3Wifb+/fO//2S9VxH+HdU/efb+4UPoDo7qaHD6HHkI5hSNcwpGsY0jUM6Zo/hmSJGB5O+FvAylErbAsHlpVbUGgU+c/REa57g5CFGDNxYhzNS4U8V0oBVlisttWGX+Up2HZeFGvlQ0/ZllK+zrYtvV8f1IpnujgRuxcOcJfZJj6OXQzBAjDFxFH4tK2WaZdPwKpAHhYhQn8/Lwu7GrXLQan2lg6xwlWIh9Xa8h9W2yK05q0yDBEDB+4sMfCbmSSHYyvOBnqFRpt7xD0NGc1VqEMs3VTAX9chxTa0dIhfzW0f/DrExje9a833Vol9NXid54hhLvCDm8gh68ATEReaI7uN26/2roZ4bm2zEw8LD435OiyLHyF7G9Y81yEP+b4JWcN/CHEIWesQuygwL9uE9CXDkWksl2chpsxkWm80V/xUjKsh8tMShkgGzS+Bp70OqXfC0lfrVemvVuutDlFrG6F1CMF8FVp5OK9qihBXeeLA83DCPAvZySJJdIEhS1RikfhayMZsxIh3mSEezqknu3r5ZcQv1dlRaEWvZyfiLC6ELGSHaZ3gHK4w90LIuUxctPK0xd/KRIxsJkn8fEhfTLhivCzES+SEg1fXl35zzTwf4ugLIxHvRSHxtH+UxXhVx3s9k+mzIaYk1VocyXTABlrShHTqK8pSpldCZtJIgGlz2EIE10JmxonNpRtXPf4+oPAX3PoTdScm4P0xxBNZeBV9FlxJvDqtfz3EOUpkgdqgiVF4TFGLIkS9QA/0EAEYW2NEadpMRE15W31xMkOcemXnIcfdTGb6RWZTRxzvQsi5jZiHkDwP0skkqLaGGKbDUTQYBnk+CUaPwSgCgrEajVKooJ4IJiO0Fk9FxKhXNvtTiPNjFW79yWY6UpniBSE7xxD3EPI1GKhJMA6akPHXtNquxsZpMJzUIb00rUImg/FEVblDhfZiL27e0YbnuY7M4va/R7IkWaJhBekwGOSTodJnJBilw4EaTIJq7HE0ngTQIZE+I+ORpSfy4RCvyXOm/+eHVTrG875OUryNfw+JokuTCm10IqSLGNI1DOkahnQNQ7qmd3P3Af5mB9Rd9cDAB/ijPaoeGLj5cuvfv3e3nz/SQzVEREREREREREREREREREREREREREREb+Q79h0E444zJWUAAAAASUVORK5CYII=", + "description": "Displays the latest air quality index telemetry in a scalable horizontal layout.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'air', label: 'Air Quality Index', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality Index\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:weather-windy\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal air quality card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"AQI\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "weather", + "environment", + "air", + "aqi", + "pollution", + "emission", + "smog" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_air_quality_index_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_air_quality_index_card_with_background.json new file mode 100644 index 0000000000..0947ac3772 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_air_quality_index_card_with_background.json @@ -0,0 +1,32 @@ +{ + "fqn": "horizontal_air_quality_card_with_background", + "name": "Horizontal air quality index card with background", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAACE1BMVEUAAABoaWifoZuvr6+AgYCXnJdzd3FZXVWtr6OKjIinqaNrb2iNkIuvsaqZnZZgYVutsKtgYVvm5+Xk5eTh4eDd3t3j5OLl5uTe393f4N/p6eji4+Lg4N/q6+nc3dzo6Ofi4uF8wyLb3Nro6eisrqmusKqbnpfa29mcn5iYm5Sgo52rraeZnJWXmpOdoJmEhoGFh4PDxMDa29uChICipZ+anZatr6qHiYR5fHZtcGqkpqCZm5h4enV3eXSeoZqqrKeJjIZ1eHNpa2fd3dxwc25rb2uIioW0trG715mGiINrbWiAgn+3ubSWmZKVy1G1t7RucWxmamWJxzq6u7iPkYxobWmvsauKjYhydXFqbmmhpJ18fnmrramfopuCg4JhY12TlpGMj4qmqaOSlI57fXdscWxmbGioq6V9f36vsK6ur6ukpKTb3Nylp6KbnJuXmpeQk42w1IKWzFKpqqieoJ2cnpqCxS5dXlrIycjAwb+Xl5dudG/Pz86XmZRkZl9bXFdPT0/T1NO0tLOwsq90d3F/gnxydG6iz2pCQkLI27FmaGFfYFrV1tTW4Mq+2pyVl5PU3cjb4NW+v71pcW2k0GtXWlTZ2djFxsSPyUbE26dRUlA3Nze4ubbN3rW21o6p0XWfo6FnaGeXzFPa487K3bPh5trd49fMzMvDxMLT4MHO3Lydzl81NTXB16SbzV0gICCz1YmQMTWOAAAAEnRSTlMAICAgICAgICDKQEBQ39/fv78M9TdhAAAOO0lEQVR42uzBgQAAAACAoP2pF6kCAAAAAAAAAJg9OlZtGAbCABxcAiW0pQ9hGcuSPUkaPDidumUrLoga0mQoCEynPkdfuf+dXIG7eemkT9KdThlyh7Msy7Isy7Isy/7TzXa3HAgSK4piT4dCgWqL/brA2mhHDvdjGIUYQ6AURDKKkd6T+EBLCFeW2PBWlkqp2fih66phqLXs+36+zKSfcU8MeO+bXxMbom7oVupFxYFZOrbS1moitfyUEhc6D3eYA90FDICVUOVizTPyVIlzcQxVqqNil4n+x8r2dL5+N8as+sfGi8EIyxDLABO6hz/tU+Ac++dg2ZKWIaRsW2y6UKUPu8fYd3AuUHAltuIUBJLAjvCjcGkQfIcj1gczX5jhdH55fXp+v8qp8WC4feYB7aN1Uusfzsvup2koDOO99Xar3Wan7aERjaLidyKJAhcyg2PJXJwx0Di8EBTnBmyMZYTOXVAThh8XCgxRQFGU6L/o855z1jIFRX60b99TBjy/nnOWEW/faYDMEulANA1wonaQADng4NGlB0Dlw0MKciEYRaNnPIiKgpb3PldaO8wGTEhiGNzveJDLpDvtfttOp9Inr1/Hc79PXyRB7Sk8/sLZdoqBSXvYIePL2BRaXKlF9VcTN+iAgZwGIATiMzNnZuJcRZgoFHwQoQZvIPuNG6gAD5sKP0mKDnElB/EaafH02qVTzzLpc/bFEeJmd+dMR3vhOhgaau4GPP6O+MuHRC6XSuVmLsvIKD7+SKwjfzMgPJ1yFiAgeBknE4lCDqeRP3H+f5kGb968uZOoDQ4Pf5z8yJkYnLjyuNaXuL2ycsdnZaWvBkZH+fzfxbclaHYj4dPXh2NvTkmPuIKHD4/j1aP/zRFgGQHNVCM+qqqapq5rwUDA8AgEQkFN101TVfEKE98NBQ5CSFQfDErtZ+LwgAiYeFQ5elCRkN4qAkwZ1QgIDeEBCzUaAQc1gYGUoIvXnY8DEqEte2Vnvn1bACMQ1OHRKoKkOk9KDkJDM4VFOByORMlECwYRYx/hcQDPYBcu4w3zwQOFduyjlZ3hRAMhKrt44V4TCyJmtEXEmxI/C6ZDVSEBDh8+DBOuKlRC//DYB9ceEMowcZvS/w0hhNqCxUUigFJKEYJEfA/dxGyQhSAsXsZNBLstoT0kgqEgCIkTIzD8kIAIPkwkjhwAePC9zj0if4iE/PmQHr4IECZBIeKvn73iy1N4tMJFcgo0DiZiAeNvIjJWkL8bSI9jJELQnsdGAUi4N0GR/688zQGIXAN9rQGPWFT/rQGPkGZGd19azSi0z6XIMXhIEdopeBGHkvrR5cFv74trKULhn+kSIhkKnfkiW9/gY0C1krKswld0OBJ2AZ5SJJud7jLnI5zw6B0hEi0/gYnMGOQ7xBMhleaehwhMfMQE7AtNwptLmUwqk1HI41KftYMttv6dJT9bPr2NNuvr17a2NsvKLiemcmgqhlE5Ydj2dK3mVt9FqtVIZKRcrZYgUhopq/Pz2tu3wS/0N3VVisBDmoitQvPmqdQXPqF6bO4caUuxTU2wGcvnP1GDe3VUIQLSCv8PoWbwB2zxi7VlWAtsoXkHLKdSlp21GznLmkpY55cTjrFc6eltPLftbH//9pPt6r0yiZSdWUd1Z91yyZ3NPHe61jyRcFNkDCKAdKIQAVxjnLFxP/mn70U50og6Y3lNpC8ykCSFARbTNP4L7qcJBRpDEPmN92zBH0z0ti0bEMlCbTlhVVwukkg5WRIpOZGRtIupgMiI+rPkoFm719UI9rhyRqL+woLIMdHytSVN6kk2vrDlaVDacc0nxlixafRhaSnJFoWILhjq7u6+2a3AY2jSE9l4z1laZBvG1oYh6HWdRoJE0PfYRrZ32jGcijvdI0TcSMl1op6ISyL9tZq21oCIRh/FvOkAQoQuEIEJMcfyYrnzSYiNr656IjpYZAPsBa4In0fdTJKDL3L9JqFM4kO2L8KarAbWMaEGUWkYRqpHiGDgNCon3KntytSUm7Ltrv55dyTslNWmiLo265TvOGv9XWvPHUpCIqTRBi5cuEBrC4MxEjGFSJ0ltXpd20FMiuhEnQ28YHNoXjNW18EqG+AipqmboHDr1q2rV5XJs2cLBU9kaUHw2fi8mF9nmJMAYQBUfj2Rso3AiYAA776RcPXddjWqekTRm/N4vDhIJEoeY8JjTIigJxGYAIq9iJX/rUVEFxqIOsdir4vF17r+giX5HbqaEMHPq6D9XGdn5y0F/6UVCqM8piiokjx7H5Aj30M4ASlCzzudDkcRH+++noiuSXSYwgMW8CCgcAwtNklUiuQZG8j/YMXNFhHAPdQke6XOsVWTBEyAKzNVEhF0XTwHfrFn9r9JA2Ecr4nRGE2Ms0iJjbGLEd+SGd8AGSrYGodRYUgENW6+oNZG54S9ILplyLY4pptTNzXGJb7Et2j8E/0+d1dOCL7+zKfdvbTX7T597roeKFs2D2y+CRHOW0w0SXfbn6B3X/7W4YrAyAcT9E+IwJR57PILERpmfmQaNSMmjcl1NAFeI0UVHMXgAeyGfzVOqOoD48RGlURwCCKDqiuiq/rW8WPHdu9WNofDe8PX2wTvF59K+t//jYhGIjAR6PSjy5CQqQiInwERFNvbPSSC+0si/eh1v7GItCayEajEN+P55OSkYXxWP0MAQOg5F9EZx8cJha2MN7X9H14pIkFFhmS9K8JiQuwiEdKhoQVo8i7WiWxkIipn1hD0q48HjQcqQASZCGJP9J4F48oO+lToXJvgy+03b97cFrwQB9ubObRPw+Nnkelp4eEungB/aGGucw8pgtSNCBv7jzdufE7P04e4DEcgooqBg+Is+GoM6mo/OzwLH12HiE9j9AbBZYU+nuiTIt2SQeMTP+gwGezTC/yAqrapH1Ledu/Y8Pp2iAzPDGv+YtHn8/t9/nlNGxPzGDARFhK/8BBDi4twlUmju/8ETQA2pKSIDuDnI6j3j7uN7sXJQaMfdYhonFuRSKTzsnIPHxHNHJTrSrnAfGE8qokU51ILJ0+mULLb7AU7rzt2qjhXTuXHTjrzHk95eMxxir7psjNfyJfLtuM+WqUIjwef7JCqE3m8aBi48STwjU0NJqKTyGfDeMxEFo0Tuj47aYDBz4g7RDycU5VKJRJRZoi8XMy7PO++bbyjAol4iymnvZy6m2rz2l574e7cAspzKefux1d5e96jlYcXinNF35hdGLbHygUtP+2GZCNENDG2OBtqEYEtg1RmMbgoV2vonNpwRUbV2Vk8rb9rgGsc9lyYyGQyUWWmF1xdK5CrnP7BwdeiWEgt2CmnWLb9jtdrp/ILtuN3yin7lTOd/3C/rGkQmXecOW3YCU8X7PKrfJ6tyxkqRFhIOPRuchhaJIJGLmhWjy7gFgIxCb92H3UtDm/YcPi0OWFmKkovcXFtE+pXaUhcPt51m7C5zG6O5pKy51CpiVCf+KsWJNB9eLDKhsNcpDkNwZDwqrCABnEolDAnMsqlXqx4b6z9JV43k/h8UkTVG0Tmx1jNJ+8zWpCJiwdQRiK/MuEaUsRTr1OzaCeOhEKJhKlcugVIZN3af4X/uxM3qPbXWFnebbkaEYiRzUX038WDBwB4BLICC/JwRaCi3DoF9q8ToHcuf9aQIvV/CEpSRHSJGkkPwESamjTODY8UoURGQxCIWzCBCFa8B9Y15U8a4h1dwjtMHu6wEV0Stg0iZAKah4MjJwTLRKVm4QddsXg8nlVOXTh94cIt/BNmW4MIdmxA5jJq8BAiEk12sm6+NmukSRMdAg0eQkLGABuviGj4XRJTyWQsrmDdfuj06bn1Luhe0+A05M1FxN/hfZQeP58UPeMi+i9ocIcGQEpbvce8/+IUSEIEC97AkVPF9Q3A50+sJxH5gRV+eJkKWk2Ed6kRIeKqqPUeviYe3MUV8bsi5+JTI1NTI0nl9JEjgUBX185LeeKg4Ny5g9joW7hzBEoogn0ACatup+8j9gwM3Az3CcLhgUKY5TcL20ABe6EQlvTRPjDAyjcHCtSIvp+TnKEjdNUA/V4GfuE9cJySvr6tfXfuzcz04hGFz4CQmKPVkZ4p7BAJBHaCDkq6ApAKANhhQX+IoExyGlDCznR1dVyLZjK5XClXMp88eVIqlaKmZVmJUqYzeDlIdHZGSyXTNBMJliLPZSoTCTz4zUoEjcDZOuhIsDMSzUyYExMmkQgBzOeQSzyWHOnpGar2jIxUn40ih8iIcigAiY7du7HI6oAM2RCBrp07A3CAEUEpK+EADjK/ANrsPov3HNN6YqWvpNOkEs1lrbQVMqOdnUFs6FGllMtZIZI1zRwI4YJQDiYZahOEC7O5TA5U4fZRsoBvSFhkaQ9Z2LLZWHIKIqPVoZ6e6uizZ0M9I6gqK3Z27IYGIBWCfHhKne9ibqTHk4CAxiMuDZZKOYvIQQUimdwVKFmJaKSTiEQqGXY+m6WEpWYmgTyXmIhGI0G4NMKuqkAEFgymEYvFslkUqASPoeroKETggQyRWaOs7IDF+Pg12qHCOM8zqEBJIEpwwc69OnBpsITbnAZXAImkkyikrShMIgAi2SvJJE5n05aVBtmEmYvH06EQRIQuix4LIL8oGq1UMhh/uPvCgUhCKIucBlZ1qPpsaJREEJEqIrNSUVatgAPiivF57RhDxAe7EBIp5UKLGaI+HilZWfQSnUwmoZAz0WuQzlAvsWEK4XSSTpINRGIJ04rF0lkrUUETQDIsJQWy4B4YWFY8Rha4WCRxiPCBNTQEkWp19OVLCslqeIClYBlY+h8sW9KcZRLUft+mOUt+w/IGlBYtWrRo0aJFixYtWrRo0eJHe3BIAAAAACDo/2tfmAAAAAAAAAAAGAUsOGduMAlN0AAAAABJRU5ErkJggg==", + "description": "Displays the latest air quality index telemetry in a scalable horizontal layout with the background image.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'air', label: 'Air Quality Index', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality Index\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:weather-windy\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal air quality card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"AQI\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "weather", + "environment", + "air", + "aqi", + "pollution", + "emission", + "smog" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_capsule_tank.json b/application/src/main/data/json/system/widget_types/horizontal_capsule_tank.json new file mode 100644 index 0000000000..426bbdc744 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_capsule_tank.json @@ -0,0 +1,36 @@ +{ + "fqn": "horizontal_capsule_tank", + "name": "Horizontal capsule tank", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAABg1BMVEXg4ODf39/g4ODg4OAAAAD////8+v96i//g4OD+/v/f4/8hISE/QYJbXZSxuv+rqsnGxdv8+/8kJ3CQkJD+/f+rtf+srKzh3+1aXZPj4+Px8fGRk7fi5v8xNHl0dHTIydvHx8g9PT3k5O2Ehq51dqbm6v9aW5Pu8P+trsmdncAuLi6QkLdnaZ339/+dnZ6Dg67V1dVYWFjIyMifoMBNT4syNHmCkv/x8vZ0hfYpLXmKmf+7vNM8PDz08/92eKU5QJSCgoK7w//T0uRKU61ZWVnL0f/y8vbv7fbW1+RKSkofHyHs7P9kctu4uNKSk7h2eKaOjpBvfu25uNJUX8DEy/9ZZslmZmbT2f/U0uRfbNK5ubouNILU1/+6urpPWbdETKU0OooyNXk6Oj3b3v+bp/9qeORMTovu7fbX2vHJzOO+v8ipq7qFh5BvcHQ4OTzc3v+jrv+dpu3c3OPU1NWytcikprqbnKx1eKU/Rp13eILh4O7Nz+OtrsqLj8lwdbefoatCR5TAElP8AAAABXRSTlPvIL+vAC9A4IoAAAfpSURBVHja7NY9i7QwFIZh5919YOCUGQLnFMG0KUK0trCwSbeVxYL//2+8ybrgfsGWc9zJjRqDIF6okO758q+7nr2ny3N36eSGk3eTwngS/IGkfFanfx+1W9dd8Se6NoiyGkRbDaKth4WMfAw/xCPu0HeIXfYhJ3xpzvtI5hh+yBDuVIF8f47kGF+y8YwQtgL0cUzb26lYRr8BeI38ASI2cjmkArf7TB3E0ogX8j549OWUycJ5YKAcDghPYaCIYUHdUwg+JI2QaQXyJ0hPEXxAXGDMQV5I6vUpV49CCFMEhk8QQwIckOyNWYmFrK3HwZjsVULsLxDvXUkwuHUB01Ims0KIBPcO2ZB2iK2mA7KG4ipbDKGYw1ImrAiylNL+s7uVPCRM87RDxE8uH5AUJjNkQIgqh9Z50vNGelPjZBiwzgweYOc2k/AaAZ7dGPtd3L9NjaAYLErb7GK9Ae7Qr0uUAjlNjwFJCafpYZfxamsQbTWIthpEWw2irQbRVoNoq0H+s1sGK87CQAC+zWlE/1wUQhASkYgBD7F4EDx4aHsphZ563cu/j7Cvv91C2U1tsUOJreB3kITxMF9mhuTdWETeDe8ijfyhGQZmJNLYLxSMISI7fRMuneiMRAxbdVo257KkqmYrNzwfkVYwRHbmvFBOdEYinIlEcWs511wZZIETnZFIituW7/dBEOz3XKeGO9FZiTjbbhFZRBaRReR9RGRr1VfiUl+JYDLAKNtu30aksUaIOitLVkV/2WGtbJpKKbepVokoI5eQhUVpciaMlq8XaWzCgqKHE1UGLptdleeIDBFNVWzgiryEM32Rs0S/VqThIrhkGLMYKOzwdx2HOXZyYhFXI4ILWQYk8tDZ9hnj69eItPirQS9IhHBFbFC/QKQxeIA/FMSCZAUMCLGTU4ts0bjTixFQuF3AOEM5rYgWxfVhAoH7E1UyO6UIFxG4mBAo3C9gj3w6EY5OXzw76i4xcl8i4x4QBsTOqoBg4kmkFfGtS4EEHuE+sdBTiEgxbO/PpzvLDX9I/yINljBgR+ysauTSKXDtXUQZGJKVQOL/Yez9onyLpJdBf+423Iz9IVLPIhjeTAxGIHdigX5FNMIQ+ohUMEpuvYpgSE9sSH6AUaKPtUcRXRMTuw07ArkkdBF6QUAcgUK/ggeIan8iKZITe2KkROpNpMvunB388O8R4ET52EiVypvId3vn1pw0EAVgbxAxC0kjELEiSCgmgKBDwBqILe1AMalALVXbMlZt66U37453/ekmREbbbtpdnYXYyfdwksn05UvO2T00uxObFJKyZgz6UDBNspIRUMqdlEgM2IymGXSRIMbYAGKERASbDikrYYhg9AF5gZDIOZs7mWLxRFBbZcZPSMRulAV4Ik851JbsERmRht0oy/EYIjijdTRBRCQm24nM7BY5H+nFePw8VIQFyN1+mYiICJ/HzFTZJRKp0HGfbylN05WrUBEZVSQrEhEZTdqk8h6Ri7QpUrl09c2lNFQEuVdOjpIRySCJxOlrdNyIOZ8vR1+FiDDIInkyIgKaSOXiWUMkTId9ZrDclv5OJCMQEbmJJNK+FNkrEr87GX8TcY7IaP5gkR4ROhxs0/Fg2DhawTiczS1dC1qM4PyezIwOo9hHelTS7fY17WI8rIVHRsxg0p6cXPrd/bLykItdzB44j1zp8dggrT3ObWi5K1dy2oZ19fV2e/u1dYozj6TIDL9l2RuAwr0y49jlPlvaxuVP6Z1GY2fnssXH79ubW72ze4HAKxBAw/skRkQkUfSWKBjL62ZcHeuzpb0dG3uf1rT0pnXh8+azWx/f906rFDXHUUiUvNEGoaaRX6NgPFw0470LfZ6/fWbGd+/MQ/9a2ToaIhQ3jiSyNkWoafT4mQAF48NCT+QMClXrCaIQuE2qjRfyqxSMlQcYItYTROFFUiD2U1eFFsn8Cp7IyjxaiYAYsX8+sCEKwuJDM3aQRMzknJ5GEQlNAQ8pESEDza25G2ZUUB5JRzH+cuEDikg32SImErMZgG/MUTisG+KHohiZRUzEI7NVm/EXh3EOQbzGAA85kYIfUu4ISY8vruhAJChyPQp9JAsTFAJY4lUGEH0/UpBVBVrtyFjiCBUiEhXxyNIqrNpnkSUs8fHDKkQCpF+GFnlIn2JMcVgsHyIe4qMN4q+n/apCukgUNSUMYsGAXto/oI5jicwuH9ic6BkwkCUcd7rUXiYW8GaSA6fQ7p1iYiCLaor3a/v6RszcshpmOJ2paHkwy5wKgO/su8WYuWUvXuNBc1ALz5qA75b25NY8Zm7N2tRHbcryIC5imRRZXfmn3JqG55ZygY02B7s4M6OHdt/idbzcgubiS1UqfhnsctkESPI1BXKLUZlYhKTVTAo0Br6AuQUYPQC5xQhAc7FUVZmoUB/CknIRPOH1UOmfy72vwaZAbEi7FZogyeq1NchsjcCDPx7JWsfQKDbrQ9t2kWgCwPB67aVidoJ/N7sroY46I1kaBESQEf1cSmK96ovu1x+BEA7fpqud2gV1hpVSnL9cH/7WpISYBZyczUtcnsFB4hgpn5Q50BLrw9+a9It6rCC0/LhkW0KhXHfMZjFH4Io4DVfEabgiTsMVcRquiNNwRZyGK+I0XBGn4Yo4DVfEabgiTsMVcRquiNNwRZzGERI5djQ+EHz62Imj8cnmk0fnI9qnjp88/b9z7MTxUz8BmBKhEvioflsAAAAASUVORK5CYII=", + "description": "Widget indicates the level of liquid in Horizontal capsule tank.", + "descriptor": { + "type": "latest", + "sizeX": 4, + "sizeY": 4, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.liquidLevelWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.liquidLevelWidget.update();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n}\n\nself.actionSources = function() { \n return { \n 'cardClick': {\n name: 'widget-action.card-click',\n multiple: false \n } \n };\n}", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}\n", + "settingsDirective": "tb-liquid-level-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-liquid-level-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"return Math.floor(Math.random() * 101);\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"tankSelectionType\":\"static\",\"selectedShape\":\"Horizontal Capsule\",\"shapeAttributeName\":\"tankShape\",\"tankColor\":{\"type\":\"range\",\"color\":\"#242770\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E73535DE\"},{\"from\":20,\"to\":null,\"color\":\"#242770\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E73535DE';\\n }\\n}\\nreturn '#242770';\"},\"datasourceUnits\":\"%\",\"layout\":\"percentage\",\"volumeSource\":\"static\",\"volumeConstant\":500,\"volumeAttributeName\":\"volume\",\"volumeUnits\":\"L\",\"volumeFont\":{\"family\":\"Roboto\",\"size\":14,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"volumeColor\":\"rgba(0, 0, 0, 0.18)\",\"units\":\"%\",\"widgetUnitsSource\":\"static\",\"widgetUnitsAttributeName\":\"units\",\"liquidColor\":{\"type\":\"range\",\"color\":\"#7A8BFF\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E27C7CDE\"},{\"from\":20,\"to\":null,\"color\":\"#7A8BFF\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":24,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"valueColor\":{\"type\":\"range\",\"color\":\"#000000DE\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FF0000DE\"},{\"from\":20,\"to\":null,\"color\":\"rgba(0,0,0,0.87)\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FF0000DE';\\n }\\n}\\nreturn '#000000DE';\"},\"showBackgroundOverlay\":true,\"backgroundOverlayColor\":{\"type\":\"range\",\"color\":\"#FFFFFFC2\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FFEFEFDE\"},{\"from\":20,\"to\":null,\"color\":\"#FFFFFFC2\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FFEFEFDE';\\n }\\n}\\nreturn '#FFFFFFC2';\"},\"showTooltip\":true,\"showTooltipLevel\":true,\"tooltipUnits\":\"%\",\"tooltipLevelDecimals\":0,\"tooltipLevelFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipLevelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.76)\",\"rangeList\":[],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"showTooltipDate\":true,\"tooltipDateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"tooltipDateFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipDateColor\":\"rgba(0, 0, 0, 0.76)\",\"tooltipBackgroundColor\":\"rgba(255, 255, 255, 0.76)\",\"tooltipBackgroundBlur\":3,\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Liquid level\",\"useDashboardTimewindow\":true,\"displayTimewindow\":true,\"configMode\":\"basic\",\"titleFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"1.5\"},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"showTitleIcon\":false,\"titleIcon\":\"water_drop\",\"iconColor\":\"#5469FF\",\"decimals\":0,\"enableDataExport\":false,\"enableFullscreen\":false,\"borderRadius\":\"0px\",\"actions\":{},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"dropShadow\":true,\"margin\":\"0px\",\"widgetStyle\":{},\"widgetCss\":\"\",\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"pageSize\":1024,\"noDataDisplayMessage\":\"\"}" + }, + "externalId": null, + "tags": [ + "reservoir", + "container", + "vessel", + "storage unit", + "cistern", + "canister", + "vat", + "basin", + "repository", + "bin", + "hopper" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_co2_card.json b/application/src/main/data/json/system/widget_types/horizontal_co2_card.json index 85b8ef899f..83c280e62c 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_co2_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_co2_card.json @@ -3,7 +3,7 @@ "name": "Horizontal CO2 card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAllBMVEUAAADf39/f39/g4ODg4ODf39/////k5OSAwyzg4OCQy0bQ6a/v9+Wv2XvIyMjf8Mqg0mD3+/LOzs6/4ZX09PT5+flYWFiIxznY7L3b29u3t7fV1dXCwsK8vLzx8fHn5+fn9NiQkJDH5aN0dHS43Yitra2YzlOenp6CgoJmZmY5OTnU1NS33Yio1m7t7e1KSkqn1m243YlPJUzgAAAABnRSTlMAIEDfv1C6kOEmAAADiElEQVR42u3a647aMBAFYNpuJyYX554QkkAId3ZZtu//cp1xUHoVpbS0gM4nYYaMf/jIGITIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBfenf3BuL9B+veDT985BxWSncvsd4PnhJ6AOnTYEgPYYggNwZBbg2C3BoEuTUIcmvOC7KelUR6tpShltclfaXc0P93VpDNRh/0cqu3S70tdxOiuabJhCwiS551RhcJ29hxSfhtPKK+ul6Qw4RKK9Okt7zsLkidZevNWM+tw3Z9YZBYMbvpK7evwmsF2RHLSiozotmMJEg2Wx/0fDOeb5a7y4K4SvlNrGypbL95UQGRL9WbWlwrSKZppjdrWs4lhwmynWlNu4zm/HxZEEe98Zgrl15k5WGuQvKUw5XKyQjdMByNXFNR6Pgm/rEKfW6cCuI7js9THefraWWWZRNrlx0svcuyWoKU2XZNszm3OMqFQQITJKRAybFYqYYfslpbuccZ+1zxHhEH3Js3n/Q8qRqbx/ZUELUKchrlgf3t9k76oTfpny8T2qp1PymPOIhPZuwi8Ogfg6h45Kk8JB5iZ6UC6dmOwykW0jgZxCWXnIBij66tUWwVngryZq47HKQ1b76m67XHzXTPCxIodcU0siNvsa3iU0E8IjlB3dmhPY/SOzbs00GCVU6OeWuFbhvQ9bRmNbnyfxEk5rEL4v1OkJE57Dy69MkOWrqefb84eZjDLsfehAu/2ZG4myHdM4L8KPA4k5HQTySv319I6HwSYWFWM6JW7c2XCVEs1xqpjp9axxmeimWGci8KsgiCFzLGXZiEXgsy0pTSYSQXhpQS0XQ5pbQoukYqM3/NV8qLA2Wb0+J1pyXMTeUcg/QzPKl4Fl0URPRByjIqtI64qqgqqjodV1FZ6qh+jeqUKJomdV1QEplGpGv6tZF8FwSyGJerfEGskar98k3DL1euBHnhKgj/QpDn53Gio2nUBZk+F1zztWkRVdoEGRYFB9H1VCcct0roDKEb/lC5fSXr5ZfUnSSpTjgvyDIqqmhc6iqRHYnqohonYx3xtVdeeEQSJJUdmdZLaZRVRX/OBBEmyFV+WBXTE81nXfB4H0HS9FQzob+k6X+ajOIGP3XvDYLcGgS5NQhyax4oyNMD/M1OlDzxDQMP8Ed7yjcMDD5+GFr37sP7R7qpBgAAAAAAAAAAAAAAAAAAAAAAAAAAAOAf+QwerQBC9f0WmwAAAABJRU5ErkJggg==", - "description": "Displays a latest CO2 level telemetry data in a horizontal layout.", + "description": "Displays the latest CO2 level telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, @@ -23,6 +23,18 @@ "tags": [ "weather", "environment", - "co2" + "co2", + "carbon dioxide", + "carbon emission", + "carbon footprint", + "carbon output", + "carbon pollution", + "carbon capture", + "carbon offset", + "carbon reduction", + "carbon neutral", + "climate gas", + "fossil fuel emission", + "carbon cycle" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_co2_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_co2_card_with_background.json index be668528e9..d2baacdade 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_co2_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_co2_card_with_background.json @@ -3,7 +3,7 @@ "name": "Horizontal CO2 card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest CO2 level telemetry data in a horizontal layout with background.", + "description": "Displays the latest CO2 level telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, @@ -23,6 +23,18 @@ "tags": [ "weather", "environment", - "co2" + "co2", + "carbon dioxide", + "carbon emission", + "carbon footprint", + "carbon output", + "carbon pollution", + "carbon capture", + "carbon offset", + "carbon reduction", + "carbon neutral", + "climate gas", + "fossil fuel emission", + "carbon cycle" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_cylinder_tank.json b/application/src/main/data/json/system/widget_types/horizontal_cylinder_tank.json new file mode 100644 index 0000000000..02cf7724d3 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_cylinder_tank.json @@ -0,0 +1,36 @@ +{ + "fqn": "horizontal_cylinder_tank", + "name": "Horizontal cylinder tank", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Widget indicates the level of liquid in Horizontal cylinder tank.", + "descriptor": { + "type": "latest", + "sizeX": 4, + "sizeY": 4, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.liquidLevelWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.liquidLevelWidget.update();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n}\n\nself.actionSources = function() { \n return { \n 'cardClick': {\n name: 'widget-action.card-click',\n multiple: false \n } \n };\n}", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}\n", + "settingsDirective": "tb-liquid-level-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-liquid-level-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"return Math.floor(Math.random() * 101);\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"tankSelectionType\":\"static\",\"selectedShape\":\"Horizontal Cylinder\",\"shapeAttributeName\":\"tankShape\",\"tankColor\":{\"type\":\"range\",\"color\":\"#242770\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E73535DE\"},{\"from\":20,\"to\":null,\"color\":\"#242770\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E73535DE';\\n }\\n}\\nreturn '#242770';\"},\"datasourceUnits\":\"%\",\"layout\":\"percentage\",\"volumeSource\":\"static\",\"volumeConstant\":500,\"volumeAttributeName\":\"volume\",\"volumeUnits\":\"L\",\"volumeFont\":{\"family\":\"Roboto\",\"size\":14,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"volumeColor\":\"rgba(0, 0, 0, 0.18)\",\"units\":\"%\",\"widgetUnitsSource\":\"static\",\"widgetUnitsAttributeName\":\"units\",\"liquidColor\":{\"type\":\"range\",\"color\":\"#7A8BFF\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E27C7CDE\"},{\"from\":20,\"to\":null,\"color\":\"#7A8BFF\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":24,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"valueColor\":{\"type\":\"range\",\"color\":\"#000000DE\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FF0000DE\"},{\"from\":20,\"to\":null,\"color\":\"rgba(0,0,0,0.87)\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FF0000DE';\\n }\\n}\\nreturn '#000000DE';\"},\"showBackgroundOverlay\":true,\"backgroundOverlayColor\":{\"type\":\"range\",\"color\":\"#FFFFFFC2\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FFEFEFDE\"},{\"from\":20,\"to\":null,\"color\":\"#FFFFFFC2\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FFEFEFDE';\\n }\\n}\\nreturn '#FFFFFFC2';\"},\"showTooltip\":true,\"showTooltipLevel\":true,\"tooltipUnits\":\"%\",\"tooltipLevelDecimals\":0,\"tooltipLevelFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipLevelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.76)\",\"rangeList\":[],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"showTooltipDate\":true,\"tooltipDateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"tooltipDateFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipDateColor\":\"rgba(0, 0, 0, 0.76)\",\"tooltipBackgroundColor\":\"rgba(255, 255, 255, 0.76)\",\"tooltipBackgroundBlur\":3,\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Liquid level\",\"useDashboardTimewindow\":true,\"displayTimewindow\":true,\"configMode\":\"basic\",\"titleFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"1.5\"},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"showTitleIcon\":false,\"titleIcon\":\"water_drop\",\"iconColor\":\"#5469FF\",\"decimals\":0,\"enableDataExport\":false,\"enableFullscreen\":false,\"borderRadius\":\"0px\",\"actions\":{},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"dropShadow\":true,\"margin\":\"0px\",\"widgetStyle\":{},\"widgetCss\":\"\",\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"pageSize\":1024,\"noDataDisplayMessage\":\"\"}" + }, + "externalId": null, + "tags": [ + "reservoir", + "container", + "vessel", + "storage unit", + "cistern", + "canister", + "vat", + "basin", + "repository", + "bin", + "hopper" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_dish_ends_tank.json b/application/src/main/data/json/system/widget_types/horizontal_dish_ends_tank.json new file mode 100644 index 0000000000..6ba607edaf --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_dish_ends_tank.json @@ -0,0 +1,36 @@ +{ + "fqn": "horizontal_dish_ends_tank", + "name": "Horizontal dish ends tank", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Widget indicates the level of liquid in Horizontal dish ends tank.", + "descriptor": { + "type": "latest", + "sizeX": 4, + "sizeY": 4, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.liquidLevelWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.liquidLevelWidget.update();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n}\n\nself.actionSources = function() { \n return { \n 'cardClick': {\n name: 'widget-action.card-click',\n multiple: false \n } \n };\n}", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}\n", + "settingsDirective": "tb-liquid-level-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-liquid-level-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"return Math.floor(Math.random() * 101);\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"tankSelectionType\":\"static\",\"selectedShape\":\"Horizontal Dish Ends\",\"shapeAttributeName\":\"tankShape\",\"tankColor\":{\"type\":\"range\",\"color\":\"#242770\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E73535DE\"},{\"from\":20,\"to\":null,\"color\":\"#242770\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E73535DE';\\n }\\n}\\nreturn '#242770';\"},\"datasourceUnits\":\"%\",\"layout\":\"percentage\",\"volumeSource\":\"static\",\"volumeConstant\":500,\"volumeAttributeName\":\"volume\",\"volumeUnits\":\"L\",\"volumeFont\":{\"family\":\"Roboto\",\"size\":14,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"volumeColor\":\"rgba(0, 0, 0, 0.18)\",\"units\":\"%\",\"widgetUnitsSource\":\"static\",\"widgetUnitsAttributeName\":\"units\",\"liquidColor\":{\"type\":\"range\",\"color\":\"#7A8BFF\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E27C7CDE\"},{\"from\":20,\"to\":null,\"color\":\"#7A8BFF\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":24,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"valueColor\":{\"type\":\"range\",\"color\":\"#000000DE\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FF0000DE\"},{\"from\":20,\"to\":null,\"color\":\"rgba(0,0,0,0.87)\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FF0000DE';\\n }\\n}\\nreturn '#000000DE';\"},\"showBackgroundOverlay\":true,\"backgroundOverlayColor\":{\"type\":\"range\",\"color\":\"rgba(255, 255, 255, 0.76)\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FFEFEFDE\"},{\"from\":20,\"to\":null,\"color\":\"#FFFFFFC2\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FFEFEFDE';\\n }\\n}\\nreturn '#FFFFFFC2';\"},\"showTooltip\":true,\"showTooltipLevel\":true,\"tooltipUnits\":\"%\",\"tooltipLevelDecimals\":0,\"tooltipLevelFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipLevelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.76)\",\"rangeList\":[],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"showTooltipDate\":true,\"tooltipDateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"tooltipDateFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipDateColor\":\"rgba(0, 0, 0, 0.76)\",\"tooltipBackgroundColor\":\"rgba(255, 255, 255, 0.76)\",\"tooltipBackgroundBlur\":3,\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Liquid level\",\"useDashboardTimewindow\":true,\"displayTimewindow\":true,\"configMode\":\"basic\",\"titleFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"1.5\"},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"showTitleIcon\":false,\"titleIcon\":\"water_drop\",\"iconColor\":\"#5469FF\",\"decimals\":0,\"enableDataExport\":false,\"enableFullscreen\":false,\"borderRadius\":\"0px\",\"actions\":{},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"dropShadow\":true,\"margin\":\"0px\",\"widgetStyle\":{},\"widgetCss\":\"\",\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"pageSize\":1024,\"noDataDisplayMessage\":\"\"}" + }, + "externalId": null, + "tags": [ + "reservoir", + "container", + "vessel", + "storage unit", + "cistern", + "canister", + "vat", + "basin", + "repository", + "bin", + "hopper" + ] +} diff --git a/application/src/main/data/json/system/widget_types/horizontal_ellipse_tank.json b/application/src/main/data/json/system/widget_types/horizontal_ellipse_tank.json new file mode 100644 index 0000000000..35df7fd221 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_ellipse_tank.json @@ -0,0 +1,36 @@ +{ + "fqn": "horizontal_ellipse_tank", + "name": "Horizontal ellipse tank", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAABaFBMVEXg4ODf39/g4ODg4OAAAAD///96i//g4ODf4/8gICHj5O3IyduyvP/9/f8kJ3A/QoJ2eKaRk7fy8vaQkJAxNHmsrKzIyMitrsnj4+O5wv9bXZTk5O0/QoF0dHTx8fHm6v89PT3i5f/W1+T29/9aXZOdnZ5NT4vt8P/8/P27vNOEhq6eoMBYWFguLi7V1dWfoMDv8f+bqP+Dha5ZWVlvfu1mZmY7OzzFzf89P4BnapyCgoL19fg6QJUuM4JKSkqCkv/s7PK6urpOWbeEhq/e4v/M0/+st//6+vzu7vNoap2Pj4/T2f+9xf/w8PVmdN4pLXl1hfZUX8CnqKx0doKhrv91hPbw8PBKUq9ETKVpa52HiJDp6vHV2fHMz+PFx9VZZsmxsrqgoaxqa3RfYGZcXWZQUVjY3f+8xf+Tof+Lmv+foKw+QIH4+f/e3urP0OC0t8hxeMCYmqyTlJ5SV5xVWJA0OYsuNIFCQ0sFvgoaAAAABXRSTlPvIL+vAC9A4IoAAAc3SURBVHja7NaxiqwwFMZx5+5+DKcOCafJIU1gCpNGtLAI2O4D7Ps/yo3rhbDDwN1qOO7kjxqDjT+ikOH98me4nr23y/twGT5vOHk3qYw3wS/os35Wp1+PvdswXPErunaIsjpEWx2irZeFOG7Dg9jhyT2G2OkYSsZdazlGMm14kCE8vwa5f4/sGXfZeEYIWwFcdHn7uhXLcBuALXKDQGzkeslAtsdMHcSSwweFkAIcOTBZ+ACMVFKD8JJGihgn7GdOKaSsEbLMQPkGcRTBDeITY03yQbI/X8ruUQhhisD4DWJIgAYpwZiZWMja/ToaU4JKiP0PJARfE4x+nsA01cmqECLJ/4NsyAfE7qYGmZMA9YgpWSBNgLAiyFTLx8/uZwqQtKzLAZGw+NIgOS1mLIAQ7Rya10XPijizx9kwYL0ZA8DebyZjiwCv3kV3iN3X1AiAaFHbVh8BZ/C8fr5FqZDT9BqQnHGaXnYbr7YO0VaHaKtDtNUh2uoQbXWItjrkLzt2s6o2EAVwfHU2M2TOBwcGJlmFIahZBO7qBjeCC3XhA0gfobSrvj81tvSWqngKidXifz2Q88sJgeTRekEerRfk0XpBHq37QKSOLS+ImFtfw4+eEFLngInWfIx2SZEEjj0hZK6ae+YYh7X0VUglHHtCSBs0dWs6xdwEfNaN1CFpqKqcc1NpwHSAoSeEuAAgtT/lBCLB0JNCPnpBXpAX5D+AiLuU/wNycD+Th4O4ebvoqyqEoIgYfqV4KvjfsaTv758RUYcDTV603j0CRHzbqzbEce7ch6z2kXdNwL71AIyhybRgJspVSPXZMc3s/ylE2qxIXQ3X8t0OtY9f6nnHQ12sBc6rIw3H3MgQuyKk7ubFi6/8LfQRblXGFHKUu0PqhaZO4CZjudovizIikrNYlNxdIT7r2vBUz+STbOCUp2CZsRyO3Q3isrJYGKtl8dczlozk7gIRDhYGLFdSnN1uBtNWWKaHeDR94W22+82FGRGdhbJDPzXkTTswrWMJF+PAYCgqTwqR3FjWUey3G7hSiSSWpWBy00GcbYjZdl/A1WSHzrR7dFNBHDJYHCsZZURGNwnE7lgaRjRKpoCIzQFbgZtRAzaJTAAhsnm3YCgtwBIdxoe0lrtTFMVsBoZKnduegm5siFPTe/dIsf5HFTDk1Y0MIbI4CjCXGCy90bgQF0oTxE7xtpWIulEhRGCEjL6S7+zaa0/aUBjA8VcHd3qhBYtlRVIpUqwusSiXbUJwXNQhggIGhvf7ZUt2y7avv3MgZDM29IkeGUv8vzBRSZof55SS9plnCpEMoAMO4SXoygEhwIMyhyDFQJAkHghhs76xcJBAKqnlABjyZhG4txhCZi00vCDGU0h8i5dTOAWFLMgIkqoBIUyWN00gRBMWURgHgRDLRJAMiSHEy6GhVWbCBDKFYyIK4ADbs53zjg4SxIFJAiEGkWj6kFQq+B9BxH7pGZFARAoRCUQkTU2+i1UCYq8xgkjGMEgMT4gVAmngxhyBNETSxqtULCyKwySWBtyBDCGaihyL9krjXt1j3IhG6Q/a3kSX3+v//xNybOEDAkS8bK8jZcEhPU47vr09OcPdQw6fxeOn+DDe6+TbxdlJnHYpOPb9i+BemRyb7ZX9yuPQpT6oiz/r+jk+beJzvdfBxcHpYVOnlT2O5Woe9wRkWgwhfoXXPQ5tRgZ9vbAikf3mr3RzP9JvP9I8P4jQMh6najkPIJtTmH5pXPKhhBPkBSRnSKcAcCSQLDOF8Iq/xBaS9CYBkBLnDcEhwLsFCaaQTgfgWKMLwhYSUng7zxBylAMsyI1NFoQxBC1K/vL9dwwEaTlsrNyRx70yvZfGGkI3V/XeoVov3XP6lMi2AY4qWtKe6E7jmodNhdw25BLik0KsIbQQkQiMHEnIiU4dzCEDSXVUjqqDAwCBSzL5RzJ2OwBHPoOWiIM9ZCAxTc6+eZQj+SPrfn5c29ysGXraZ4iS+qjttVMvuC9HFVlK8amf6qqSzNlrD12OLOArb4IsB4OnuqDH4A+j7Ba8hW1XRsnvU4oMnrNDKJqk/qHAGfVs0m1TCZSh8aObRdHoBisn4Ixau56tuS1GJgpgsJ4OkulQEtCyu5Ott2tuCtuvzioyP/J5rZBqkjksLlq6SuSHnuBEkd3ZHrahEkIpShSgwSn2EGpZ1LzmvGUgvZQRWg6e5FH75zDFdUvIbNqIU+dNOsT2T2caraKmKGTE0uK5v/7KGeqCbCqKVuT9iLa+srW6urG1sr4+Jzq/bBymTA3L916T6NToNE3xDpq+0+tBH/u/kxdImuxTx2LK9E4cx8MzOM4/bnO/Y9AzZNx6hoxbv9u7oyIAQhiIoS1wgwu+TxH+pYCM0EkcvFkBK4SWEFpCaAmhJYSWEFpCaAmhJYSWEFpCaAmhJYSWEFpCaAmhJYRWIUjUOAie0fZXoNUjYz2/yb8vY2SfrxctxwH1s0SZo8iyaQAAAABJRU5ErkJggg==", + "description": "Widget indicates the level of liquid in Horizontal ellipse tank.", + "descriptor": { + "type": "latest", + "sizeX": 4, + "sizeY": 4, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.liquidLevelWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.liquidLevelWidget.update();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n}\n\nself.actionSources = function() { \n return { \n 'cardClick': {\n name: 'widget-action.card-click',\n multiple: false \n } \n };\n}", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}\n", + "settingsDirective": "tb-liquid-level-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-liquid-level-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"return Math.floor(Math.random() * 101);\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"tankSelectionType\":\"Static\",\"selectedShape\":\"Horizontal Ellipse\",\"shapeAttributeName\":\"tankShape\",\"tankColor\":{\"type\":\"range\",\"color\":\"#242770\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E73535DE\"},{\"from\":20,\"to\":null,\"color\":\"#242770\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E73535DE';\\n }\\n}\\nreturn '#242770';\"},\"datasourceUnits\":\"%\",\"layout\":\"percentage\",\"volumeSource\":\"static\",\"volumeConstant\":500,\"volumeAttributeName\":\"volume\",\"volumeUnits\":\"L\",\"volumeFont\":{\"family\":\"Roboto\",\"size\":14,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"volumeColor\":\"rgba(0, 0, 0, 0.18)\",\"units\":\"%\",\"widgetUnitsSource\":\"static\",\"widgetUnitsAttributeName\":\"units\",\"liquidColor\":{\"type\":\"range\",\"color\":\"#7A8BFF\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E27C7CDE\"},{\"from\":20,\"to\":null,\"color\":\"#7A8BFF\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":24,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"valueColor\":{\"type\":\"range\",\"color\":\"#000000DE\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FF0000DE\"},{\"from\":20,\"to\":null,\"color\":\"rgba(0,0,0,0.87)\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FF0000DE';\\n }\\n}\\nreturn '#000000DE';\"},\"showBackgroundOverlay\":true,\"backgroundOverlayColor\":{\"type\":\"range\",\"color\":\"#FFFFFFC2\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#FFEFEFDE\"},{\"from\":20,\"to\":null,\"color\":\"#FFFFFFC2\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FFEFEFDE';\\n }\\n}\\nreturn '#FFFFFFC2';\"},\"showTooltip\":true,\"showTooltipLevel\":true,\"tooltipUnits\":\"%\",\"tooltipLevelDecimals\":0,\"tooltipLevelFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipLevelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.76)\",\"rangeList\":[],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"showTooltipDate\":true,\"tooltipDateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"tooltipDateFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipDateColor\":\"rgba(0, 0, 0, 0.76)\",\"tooltipBackgroundColor\":\"rgba(255, 255, 255, 0.76)\",\"tooltipBackgroundBlur\":3,\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Liquid level\",\"useDashboardTimewindow\":true,\"displayTimewindow\":true,\"configMode\":\"basic\",\"titleFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"1.5\"},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"showTitleIcon\":false,\"titleIcon\":\"water_drop\",\"iconColor\":\"#5469FF\",\"decimals\":0,\"enableDataExport\":false,\"enableFullscreen\":false,\"borderRadius\":\"0px\",\"actions\":{},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"dropShadow\":true,\"margin\":\"0px\",\"widgetStyle\":{},\"widgetCss\":\"\",\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"pageSize\":1024,\"noDataDisplayMessage\":\"\"}" + }, + "externalId": null, + "tags": [ + "reservoir", + "container", + "vessel", + "storage unit", + "cistern", + "canister", + "vat", + "basin", + "repository", + "bin", + "hopper" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_flooding_level_card.json b/application/src/main/data/json/system/widget_types/horizontal_flooding_level_card.json index a37a2032b4..8f35d8ad76 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_flooding_level_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_flooding_level_card.json @@ -3,7 +3,7 @@ "name": "Horizontal flooding level card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAn1BMVEUAAADf39/f39/g4ODg4ODf39/////k5OQjTMfg4OCRpePk6fisrKzx8fHIyMg9PT11j9zOzs7y9PuQkJD09PT5+fmtvOqsvOpYWFjI0vHV1dXb29u3t7c+Ys4wV8vCwsK8vLy6x+5aedXn5+dohNlmZmaDmt+enp5aeNUrKyt0dHSfsedMbtGdnZ0/Ys6CgoJLS0vW3fTW3fUxV8pKSkpA7yNPAAAABnRSTlMAIEDfv1C6kOEmAAADcUlEQVR42u3a53KbQBSGYUV2DivKUgQSRTR1F9lOuf9ry9kVUkjGQyyT8WDN91iGBVx4h93xD3kEAAAAAAAAAAAAAAAAAAAAAAAAAAAA8JG+fHo6Y3xjfHaTm6/cYUT06YXGeHQb0hWIbkcTugoThAwMQoYGIUODkKFByNC8FmI9egm12dOpLW1quaep0z40qEV/aX/9Q3IhRD636CzeydSekqNu1+AAx3HpwCM11CddQ503+Ihf3E29BA9m67fXM+0dIVtxtJ6fQ2zDsadGvIlpunGl8bK5I5fce9dWQx0yjV0ZGwfbjn9WPUPmguXnkqXQLg8xxVn+0IRs7iVPrx3F6R3JDQ9c/WFPn3moQ+7s5/vDLjZeprtNvxBLiOS7KZbUeBLveyKJOFvu6yZEqnVyUCHuXyH2KWQhDeclJnehZmG/B+LxthAWHYmcfgusIEhqvvRtlnSHWHkrhKgdYvCD4an1M+XBXROihjrk4G4kxTbZbrzrF+IJNQ/WYk5aIPZktabLWt1grebbY1dI0HQUa978COhPjv7Um4ZRSfd0sbXvFzJvtto38aMQwgvO896crTli9lCIuiNkK/bNSit4n9C/OPZzSp36hxTbbS6W5yeiHpKw1K2aHSHW3BKM+z3ebamv/iEUBETWacmYegEJoYadIexJzUGimV4kvfUPYXrJXBaSLAuhrWvB5gF9uK1e7EuRnP4eWvqwvizkSazVItmrtV54efPTQnpF6Px9IqT/IRFLPZfUjNJd5numVh0QJbOEyJrNeFhbpCx0DL+cjLQoomjiqxMTivh4Za8oyrLjBT7RKykXnvmo1ue8SVKHHl0WQsGsJm6prSboFJKmfialz6OSyqysokXpp6n0K8evIiJ/FVZVRqGvL/iyovez1JzYBipkzYffczXTgwtDtoUQuae/dalWu/U7ZBFKf+UfQ1ZpxmM+t8r8UuqQSZZxiKxWMuTcMqQeAis47luHr+laI/t6novCTDxRbBOzSEix/az0F6ksQ/VE/CorF+FC+nzO4Rv3SYVE6omsKltdSMuSPpgOuVi26riYyozeYBAhUdR1MaS3GETIECFkaBAyNAgZGoQMzWR0ewVvsxOFt6OxcQVvtEfGeDT6ejMxPrub8TX9Uw0AAAAAAAAAAAAAAAAAAAAAAAAAAADAB/kFV7oA4xEmmqQAAAAASUVORK5CYII=", - "description": "Displays a latest flooding level telemetry data in a horizontal layout.", + "description": "Displays the latest flooding level telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, @@ -24,6 +24,14 @@ "weather", "environment", "flood", - "flooding" + "flooding", + "water height", + "flood depth", + "flood stage", + "inundation level", + "water rise", + "overflow level", + "flood peak", + "high water mark" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_flooding_level_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_flooding_level_card_with_background.json index 0dbe99ca95..589b3cd7e5 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_flooding_level_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_flooding_level_card_with_background.json @@ -3,7 +3,7 @@ "name": "Horizontal flooding level card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest flooding level telemetry data in a horizontal layout with background.", + "description": "Displays the latest flooding level telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, @@ -24,6 +24,14 @@ "weather", "environment", "flood", - "flooding" + "flooding", + "water height", + "flood depth", + "flood stage", + "inundation level", + "water rise", + "overflow level", + "flood peak", + "high water mark" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_ground_temperature_card.json b/application/src/main/data/json/system/widget_types/horizontal_ground_temperature_card.json index e3c564e861..8294dc23d3 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_ground_temperature_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_ground_temperature_card.json @@ -3,7 +3,7 @@ "name": "Horizontal ground temperature card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAqFBMVEUAAADf39/f39/g4ODg4ODf39/////k5OQjTMfg4ODy8vLIyMjI0vFYWFh1j9yQkJDOzs7k6fg+Ys50dHT5+fmsrKxKSkpmZmaRpePb29vy9PvCwsK2trasvOrV1dXn5+efsedaedU9PT28vLy6x+6enp4/Ys66urowV8taeNVMbtI8PDzt7e2dnZ2CgoIhISExV8ovLy/W3fXW3fSRpuODmuBog9nW3vRsY+KEAAAABnRSTlMAIEDfv1C6kOEmAAADiUlEQVR42u3ai1LaQBiGYar232WXzflACIRzOSnVVtv7v7P+2bQijoVYHRqZ7xkIm92M7jtmBmegBQAAAAAAAAAAAAAAAAAAAAAAAAAAAHBKnz48m3FxKT669uVn7hARfXhKXLSuFJ2B6KrVprPQRkjDIKRpENI0CGkahDTNiyGDpXygp+ZuTC8I+anogAOrpwjpyeCHHNGOu9WJVkpR9RAk+MijCR9SThT8sPOkqgX7KhTpRIlybI9UX2fUnfmPo93GRoO99WMhHTnoSod2koKEcJPtjTFzHZIRJt3EIkm/csAmpSRM6C7cpKkRX0MjFomZx8nWDTc63CyM0KGehHz1nOpyJAu+8+jejnyy/GAVjMvXsZ0d1Anp7YVMVJzGrkuJUJMqRMShO6cJr4V6kcSm+EpuLCbCkDs37pyvJjFPXT63ISml23hCNQ1k0PnmyDXvpBo5ZM3W5MseUSBXs05Xyu81Qr7vhRhNLuMgkbwQYrRWv0MS4oobrTnELG4eQ0IKXa2pprXslPc379mRo3J026v2ddu5D2wnMb5paoSM9q4qTDpZcEg8MQuVpHc2RJj0jtdcwzPJn5C7NBELY+YccpMmW7VZ3CSmDClM6FJNs0G58TJkXCbRF+mT1V0u+XzMdayzqhNC+7kkqKKqJ3txIIzanav9RUWvMpArTihDbM6OnawcD1mPOeQfKJfexGe9ahRI/x1CmEP/wRf7i6uOEb01hH9IaUanN+p27dtGL5Bd+nvIrF7ISFq39P+sqw76Yfe8lD494VSLM7k+EjKWlZ+H/9FQ188nFL2Tx3eObjnwZfDszr/1beTDq0P6VYyi64ysKKKo7ZUTbYr4fBgPKcqyaoEn3pZ0L6VTGlBvKZ1uIEfPOwPnYSwD/0hIV1oBPQ0pCi/T2uNRTnmWT6N+7hWF9qbX3jQi8oZqOs1IeXbB01N6g7GsOETfAimXI3qG26Rc+XQkpBfI0mA/xOsr7Q29KmRYZDzmuWHm5dqGtLOMQ3R/qBXn5oreie/3DsweDCHfWcpVh3ZiL8u9fqFzxUm5N83yvuprj+eup0PtURkSlX+R4TQuF4o8p9OqQl4tG9LfFTqjOpoQEkWHFhXV0YiQJkJI0yCkaRDSNAhpmnbr6gw+ZidSV60LcQYftEfiotX6fNkWH93lxTl9qQYAAAAAAAAAAAAAAAAAAAAAAAAAAADgRH4BUVMBmbp0nFsAAAAASUVORK5CYII=", - "description": "Displays a latest ground temperature telemetry data in a horizontal layout.", + "description": "Displays the latest ground temperature telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, @@ -11,7 +11,7 @@ "resources": [], "templateHtml": "\n", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'temperature', label: 'Ground temperature', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", "settingsSchema": "", "dataKeySettingsSchema": "", "settingsDirective": "tb-value-card-widget-settings", @@ -21,9 +21,17 @@ }, "externalId": null, "tags": [ - "temperature", "weather", "environment", - "ground" + "soil temperature", + "terrestrial temperature", + "subsurface temperature", + "earth temperature", + "below surface temperature", + "surface temp", + "soil warmth", + "land temperature", + "geothermal reading", + "ground warmth" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_ground_temperature_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_ground_temperature_card_with_background.json index fd5124632b..004b66759c 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_ground_temperature_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_ground_temperature_card_with_background.json @@ -3,7 +3,7 @@ "name": "Horizontal ground temperature card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest ground temperature telemetry data in a horizontal layout with background.", + "description": "Displays the latest ground temperature telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, @@ -11,7 +11,7 @@ "resources": [], "templateHtml": "\n", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n};\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'temperature', label: 'Ground temperature', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", "settingsSchema": "", "dataKeySettingsSchema": "", "settingsDirective": "tb-value-card-widget-settings", @@ -21,9 +21,17 @@ }, "externalId": null, "tags": [ - "temperature", "weather", "environment", - "ground" + "soil temperature", + "terrestrial temperature", + "subsurface temperature", + "earth temperature", + "below surface temperature", + "surface temp", + "soil warmth", + "land temperature", + "geothermal reading", + "ground warmth" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_humidity_card.json b/application/src/main/data/json/system/widget_types/horizontal_humidity_card.json index 2b58b32288..133214dc6e 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_humidity_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_humidity_card.json @@ -3,7 +3,7 @@ "name": "Horizontal humidity card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAnFBMVEUAAADf39/f39/g4ODg4OD////k5OQjTMfg4ODz8/M+Ys7k6fjOzs51j9zIyMjy9PusrKz5+fm2trbb29vCwsKQkJCRpeMwV8usvOq8vLw9PT3n5+eesefW3fWRpuODm+DV1dVYWFhMbdHI0vF0dHS6x+1aedVmZmZohNnW3fTt7e2CgoJKSkpaeNUxV8ovLy8hISG6x+6enp6dnZ2UGhvnAAAABXRSTlMAIETfv0i0+14AAANBSURBVHja7dp5b9owHMZxxvrkh+OcJOSA0HCUY4WtO97/e5sdygCpg2orbVo9nz+Qa0uVvzKOUEuHiIiIiIiIiIiIiIiIiIiIiIiIiIiI6DV9evc6Vvez8971PndNhxPj3VNOt3Oj8AHEN50ePoQeQ1qGIW3DkLZhSNswpG2eDqlmIY5EDiYljmwABFEQoT2f054MuRVxNQ6mAaI7peDAaV4RAU40mATBVjlQ16oJq6zQsOZVttBH0/psyHHHacn0Z7C5C+4wdYab4Wo1xRCb1XAQDQbD/oPaRHhhx9v4AsDfjyztujP58pyQW2nMwkPI3WD1GGIOAt9NyAMiE+JMMfg5dHANWmQ+zsS1G3LnY1+WaGTfQri+6ZlfCBnLo/rkrXUaoob7kGC4wlUUsgaQi8ZM5kAoEu5CTNrSR+1eOhFX9uand2S7ejicyGC1NSFqW2Ia4SoKWTYhIYrCJoigUYnWbq1FXwgpRPwql3wt4uKUeuIH5WwVriJ0pdK1+Pt97UfhzF5g18eFENeW+/kYM3skl/3q40rGxzdV54cjGI9RufpCyBcRuV3Mxs2Vr/GGQlfWmSu3uw5XKhzovBhnmT4XMhcjtx2GjzdUid/ckfkuKsMR39f5V/MQPhOiHzvWVf7GJ7KWwm7Zvoaz045CdP0NcOszITD7X5jzsL9Cfpxe7FPqHqeUwkvypW6u7A/bVJ++6TL4zUP4XEgm4tb2nriHp1Z/F6Nwn6ARx4h7np3oIQYwikaIk2S3YCZeImku4mdLu4najKwFdhZmrvqmdV6cCwld2SuOQiYTLwkCz4xSpElaxv3Um0wCr7z3yhjwRqosEyivWfCCEv9vYXfyVQNL2cmOt7k0a+G5EOh9SYXjEK+vAm/k7UJGk8SMzdwo8dKgCekliQkJ+qNAmdxU4QWEOsRfaX3ps1ZYzERyf4w/Ii9Jvf4kSJU9Ea9M0r7qB56Zuy9HgQcbEtsTGZWRXZikKV7F+ZDLkhH+bhIkeI42hMTxuUWF52hFSBsxpG0Y0jYMaRuGtE2vc/MB/s0OqJtO12nPH3D/Wex07Vc4es5797n7kb5UQ0RERERERERERERERERERERERERERPRKfgPNbdZin3BhXgAAAABJRU5ErkJggg==", - "description": "Displays a latest humidity telemetry data in a horizontal layout.", + "description": "Displays the latest humidity telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, @@ -23,6 +23,15 @@ "tags": [ "weather", "environment", - "humidity" + "moisture", + "dampness", + "wetness", + "humidness", + "moistness", + "dew", + "water vapor", + "condensation", + "dew point", + "steaminess" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_humidity_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_humidity_card_with_background.json index 8dc416249c..deb4c48ad6 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_humidity_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_humidity_card_with_background.json @@ -3,7 +3,7 @@ "name": "Horizontal humidity card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest humidity telemetry data in a horizontal layout with background.", + "description": "Displays the latest humidity telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, @@ -23,6 +23,15 @@ "tags": [ "weather", "environment", - "humidity" + "moisture", + "dampness", + "wetness", + "humidness", + "moistness", + "dew", + "water vapor", + "condensation", + "dew point", + "steaminess" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_illuminance_card.json b/application/src/main/data/json/system/widget_types/horizontal_illuminance_card.json index d07223f469..166d6583ee 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_illuminance_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_illuminance_card.json @@ -3,7 +3,7 @@ "name": "Horizontal illuminance card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAolBMVEUAAADg4ODf39/g4ODg4ODf39/////g4ODYGDjdNVH1xc2srKzx8fHOzs6QkJDiUmn98fM9PT364ubIyMjz8/P5+fnb29u2trZ0dHTj4+PCwsLnb4K8vLzn5+fwqLTri5vpfY/409pmZmbaJkXV1dXumqjzt8Hu7u7sjJzkYHbU1NRYWFjfQ12dnZ1LS0vgRF0vLy8hISHwqbSCgoLpfZDofY9vEfvyAAAABnRSTlMA7yC/r7BI7FImAAADHklEQVR42u3a53LaUBCGYcDJsmqoC9QLiGJip9//rWUlOWAcTMyECTLzPeD10dEf3jEyzMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM42uhuO37sPI+kYrujd04ejwQedbsDqbjCmmzC8lZAxQnoGIX2DkL5BSN8cD/mp0HtzPCRmem4aapqr0Z4+ob55GWLFlswsJlGX1Jm5k4k20XUKKWwnae2CdF3uckhhd3BRVp1/c6ih1vmSnqisvCkk488WddZsPg+RG9n0ZWZXVdUt3IdtpWmPlU3fq2042douXdCahVLuVs55IZTnZK03n+OSStP6M+QrTbTQpuY208JJNdNmZOs2LcJH7fuMLsdhVsuclWalqGXB5nkhwlG4sSZxOmSbPOxD7Kkb0uVkvJE5Z4cKLoisOVu7EMtp1o7MkyEKd9QXIYvH6sthyMN224bQpHoMH+xKu2iI2YZYZPJSVp+43IU4PHdkKM7JkIyfmPSS/uqG3o0LshSunYJjkhCV2rkLoZxjKavp1ZDaLKjg30g1TbqaksVn62iIVMby+/WQXELifcjyiiHyWDe5wuujITKZHaIznlpXU3PcXiPq0RA58Yn+EmIp3PlG17ThTGYsU34OL/anl5b6jf9+c9rx6Ahv9XLDowuK+YdMhZdU86Z9MaF9iMPzJc+tkyFiyWJDe9M2Ru6rgFq+T/7YaDbG5MtxqqXkB0F3QjYukKQyx7n5+8rOFc6fhWzkqOD4byEli/gwZLEwAtc1ZBVRFESJP42MxcI1kpWR+ERG6iVJQJ7RnjDchP7ZUmFm03l6iswL2odkbZ9cPydDxDLLMucw5P5+6rlGanQh6X0ga9lLAyNy25BxEEiIm6SuJ7mRR//OcqyD1flv41XTLOgZzQgiY7pwI0+SIiMJoqk3dQ3ZW8kDN6gJ8Zu/SJpozYlFFNH/cjrkk1LQCUFKr7t3A7qCJuRsvn/qpEdv0YuQPkJI3yCkbxDSNzcUMqSbMB7c3cTH0/rHwWh4AyX6sPnqw4fxeze8Gw0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA4Fy/AL5F9/papj6AAAAAAElFTkSuQmCC", - "description": "Displays a latest illuminance telemetry data in a horizontal layout.", + "description": "Displays the latest illuminance telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, @@ -23,6 +23,14 @@ "tags": [ "weather", "environment", - "illuminance" + "brightness", + "luminance", + "luminosity", + "light", + "light level", + "light intensity", + "lux", + "candela", + "foot-candle" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_illuminance_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_illuminance_card_with_background.json index 1e70bae331..c896876dab 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_illuminance_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_illuminance_card_with_background.json @@ -3,7 +3,7 @@ "name": "Horizontal illuminance card with background", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAC/VBMVEUAAAAWHB8VGB0ZHSAWHB4fISIgICAfICHIyckXHB/OzMrMy8rSzsvRzcveI0PJycnVz8vm2tDQzMrZ0czOzMvUzsvk2c8WGx4ZHR8YHB/X0MsbHSDOy8ri187k2c7LysrIycr///7e1Mzb0cxDR0no3NHa083d08zY0czW0Mzg1s7KysodHyDd1M0hIiJER0kfICEmISArJiM0KSIvKCTY0s09LSTb0802LCXi2NAzKiQyJyIqJCD//frdOFQ5KyM6LST45dXg1c1AMSctJSEnJSP87uAvJyJGMiY7LyZONidxcXI3KSL25NPd1c5XUE1ISUpENClTOChDMCX/+vT559YtJyMjIR/q3dH+9ez15tjz4dG9vb2MXDJJNypALiT+8+j769vp3tXg08zFxcVhVU5dU03RoahnWE9xSSptRypmQyr86djl29OHh4dwYFOYZTeUYTWtbDKjo6P56drz49VRTUuQYDV9UCx3Syr+8eX97N3v4tbBv729trKenp5bUU0wMDDs4tpqW1GeajuOXjT78efIwMCQkJDVdobcTmX/+O+lnZmZmZnYTGTKfTh4Ty1gQClLMyb+8eGtrazWo6moqKjwuodaPSnv39Dt3tDMtbmys7OtpqGlfltbW1tSUVF1XlBNS0veLUvfjUWGWTGkZy/UuLr91q3fj5eMionWYXX4sG/aiEG3cjWCVC7UysK2trbPipfbQlyObVPSgz07PD2hbTzAdjacZDJrRioiJylYPCj27eX06uHx5tzt39LMxsPQwcO2rafde4jUa37dZHbuqGhfXVxtWlBOOiv/6M3az8fYxcT+3bf+y5mVlZXUgY/bb3/vsHZnaGnmnl72o1nRkVaGaVN5YFG6fkencT7ZrK/9z6KelpHYnmjGjViVclXnlEoyMTDevrzMqa/ZmqHQlqD8xpGAfn37uXrZV23KmGu8j2a3i2Kcd1d9Y1GudUIxMTDjzcXgtbT3yZvlrHffW2+xh2Gge1rTzMfRs5beqHfLhUfRipd2EeMNAAAACHRSTlMA7yC/sO8gr7sVXXAAABGASURBVHja7MGBAAAAAICg/akXqQIAAAAAAAAAmD06VnEbBgM43qS36Aki41cwwbGMEHLABp9RBF5CIJ563kuHxsu9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", - "description": "Displays a latest illuminance telemetry data in a horizontal layout with background.", + "description": "Displays the latest illuminance telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, @@ -23,6 +23,14 @@ "tags": [ "weather", "environment", - "illuminance" + "brightness", + "luminance", + "luminosity", + "light", + "light level", + "light intensity", + "lux", + "candela", + "foot-candle" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_leaf_wetness_card.json b/application/src/main/data/json/system/widget_types/horizontal_leaf_wetness_card.json index 82c85c3c94..62c8faf373 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_leaf_wetness_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_leaf_wetness_card.json @@ -3,7 +3,7 @@ "name": "Horizontal leaf wetness card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAk1BMVEUAAADf39/f39/g4ODg4ODf39/////k5ORLcN3g4ODy8vLIyMhYWFjOzs5hguHo7fv5+fm7yfK7u7v09v2Opurb29utra3CwsK2trZmZmbV1dWlt+7n5+c9PT2QkJB0dHTd5PmaruzS2/d4lOWwwPBWed+Dned4k+WCgoJKSkrt7e1ti+MsLCzH0vSenp6dnZ2DnOgFpIuiAAAABnRSTlMAIEDfv1C6kOEmAAADEklEQVR42u3aaW+iQBzHcde2f8Y5GOSUm3rbc9//q9sB7Wq3DfqAbUbz+6QYHEIyXwZsEzsCAAAAAAAAAAAAAAAAAAAAAAAAAAAA+Em/rl6XMb5zrt3k7sF0OB5dPe6MR/ecboB3P5rQTZggxDIIsQ1CbIMQ2yDENheFxA4d+buMTjhkh4tCpDAvnJvNIS7jbp+3Ce1bwc2o2eXHbWDNtBNQJ1jm+tKQZvkYGvn8JETI9M3Z1VK8pET+Vki+c3ap9F/qeJeWtE2lU9WleKtN6MBy1tnPRrurDZtfFDJ12UF4EpJu30oeV2X3hsut9LdxGpeOdOKKSv4S129V7fP31Oc0sDXLp4bez45pWvwmcl/PhYSMfRtSCRHXzj6EpIxL8Z4KQR8hQjiZSONM1BUNbMH06fIQhRvK3eBMyCP7JmQnt5msK1Gmh5Bqy1+Il2nN07oNoUqmWWXutHcpfRqYy+g461c2D9xQsyn1h8zZ15ADTl/w4zD/2DgNja2eGVvo45V2dRjSmZA16ywOITYIGFvnLvt7LzUNTVf6XMiKGavD8/5IVgga8/LMlvRBu0u9zJveEGa4et9hTrVHfnJZQzPD5zWbn1uRJmd7c7JBM20+h2imlyyg57AvZMFY/rEgbs9jbgaf/h3g9F9M2aK7taZ04D5S7pqpbvo/tVxzZud45qyLMT9PEXU8j7yJagcm5BFRERfkRdH+gBkYNClwzcO+OF7WZhPQK3vVpqf398jSrEpnQychWaYiIZTZSyiJEt+bJSrLhPKflO8RqYL7fkRcdQeU8GlAet3ORlPn9EO4N4QCYp0w+BSiZlyoQu1Diiwy+2asiFQiupBJFJkQMSsEN7kJpyEFOvg6dPZvrWC9YqvNnI5iFSVqlomEtyui/CiZ8ZlQZuzJL4SiNsRrV6Tw4/ZAliT0w05DLhcVPQczEdElbAjxvL6DnC5hRYiNEGIbhNgGIbZBiG0mo/sb+JqdiN+Pxs4NfNHuOePR6OFu4ly7u/Et/VMNAAAAAAAAAAAAAAAAAAAAAAAAAAAAwA/5A5Ee9c9zue74AAAAAElFTkSuQmCC", - "description": "Displays a latest leaf wetness telemetry data in a horizontal layout.", + "description": "Displays the latest leaf wetness telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, @@ -23,7 +23,10 @@ "tags": [ "weather", "environment", - "leaf", - "wetness" + "dew", + "leaf moisture", + "foliage dampness", + "leaf humidity", + "foliar moisture" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_leaf_wetness_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_leaf_wetness_card_with_background.json index 57acfcf515..9b498729f9 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_leaf_wetness_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_leaf_wetness_card_with_background.json @@ -3,7 +3,7 @@ "name": "Horizontal leaf wetness card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest leaf wetness telemetry data in a horizontal layout with background.", + "description": "Displays the latest leaf wetness telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, @@ -23,7 +23,10 @@ "tags": [ "weather", "environment", - "leaf", - "wetness" + "dew", + "leaf moisture", + "foliage dampness", + "leaf humidity", + "foliar moisture" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_noise_level_card.json b/application/src/main/data/json/system/widget_types/horizontal_noise_level_card.json index a32b3ff059..4b82b62bb7 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_noise_level_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_noise_level_card.json @@ -3,7 +3,7 @@ "name": "Horizontal noise level card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAnFBMVEUAAADf39/f39/g4ODg4ODf39/////k5OSAwyzg4ODP6a/f8MqQy0bIyMhYWFig0mDOzs67u7v09PTx8fHv9+X5+fn3+/LV1dXb29vi4uLCwsK2trav2Xt0dHTn5+e43Yi/4ZWIxznQ6a+rq6tmZmaYzlNKSkrH5aPn9NiCgoKQkJDt7e3X7L2enp7Y7L2w2Xuo1m48PDytra0hISE2LSZJAAAABnRSTlMAIEDfv1C6kOEmAAADL0lEQVR42u3ai1LaQBiGYar294fshs05hCQEEo6e2/u/t+4unVSoVaiMRuZ71GXdOGNeFobMQA8AAAAAAAAAAAAAAAAAAAAAAAAAAADgI3378mzGxeX1Vze6/K47riP68vzri96VT2cguur16Sz0EdIxCOkahHQNQroGIV1zUEidUOKRcTeiVrKm59YjOspnhLgu1QWRPlMZ0CggCvQPSVcvmWlgD7knC3GW1X3czmjHkB0KZ9r96pCQSe7shtzVxWjRLIJCboon6ekFG7IoFmYcucUiOFnIA2vCnGdlZ+F+yIAtEb4dIniwE+ItNoW3pnVtQrygWd896RC9XLuJ/pL61jtVyICFs6pYEIVmNuHh3yHz2Ww5Z3F8iJQ/i3pNhVfIRDZ1s5HShugDwcatE71JJ9uRXNzqccohTXhCFE85pq343tmG2LaYOXwtJHacF0KoKYKnxqVC3jWul7jNxoQErn60BT9HtG5cE3JC5vSHbJLmvCJrMGUW8zaEmFevhQyY25A9QTvaYff2hOIwNJth7/3taITMk1nONmQemj95pINCPo/DzEPaD1lyrsftjljz+KAQ+xj7HGE1EVzthzzycufJnrOIDwnRE0GfJp5yuBcy5EEbMvy90OmQ21lMZJ/oOQ+ePdnz/ZCcq2NDfHqBf7O/4NMpzO0OCD0u+dG+mJC1tKcv2pBQ8O2xIWMbo79vUrKiiKK+Mgt9ioiorEuK0nR7QC+8J2nJ04dqaP55LPihEly1jzazbkOmef44feMF0clze4miJ5NnIUmiUimVnmWUpZkXjTOVJFJ5N8qLiFTpe15KvrIHlPTo/w0E6zON9Sw0s/YsVvq34Z9LFDGJj71otCFq7EtVqm1ImaR6rtfKVGXShvTTVIfIcSl9nZv59A5hGLcvKfHO+juvfn+oNFPjRGa+2RHlpdnYH0ul1268UioyIZHZkdL7YQ4kWUYfzIYcLS3p3xKZ0gE6ERJFrx306RCdCOkihHQNQroGIV2DkK7p967O4G12Iv9Kf2DgDN5oj/QHBnrfL0fXX93lxTl9qAYAAAAAAAAAAAAAAAAAAAAAAAAAAADgg/wCTYn9BVfiGNYAAAAASUVORK5CYII=", - "description": "Displays a latest noise level telemetry data in a horizontal layout.", + "description": "Displays the latest noise level telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, @@ -23,6 +23,13 @@ "tags": [ "weather", "environment", - "noise" + "sound level", + "acoustic level", + "decibel level", + "volume", + "loudness", + "ambient noise", + "sound intensity", + "acoustic intensity" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_noise_level_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_noise_level_card_with_background.json index 02ddfe3a58..dd4a79a5d5 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_noise_level_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_noise_level_card_with_background.json @@ -3,7 +3,7 @@ "name": "Horizontal noise level card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest noise level telemetry data in a horizontal layout with background.", + "description": "Displays the latest noise level telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, @@ -23,6 +23,13 @@ "tags": [ "weather", "environment", - "noise" + "sound level", + "acoustic level", + "decibel level", + "volume", + "loudness", + "ambient noise", + "sound intensity", + "acoustic intensity" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_oval_tank.json b/application/src/main/data/json/system/widget_types/horizontal_oval_tank.json new file mode 100644 index 0000000000..32fa8954f4 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_oval_tank.json @@ -0,0 +1,36 @@ +{ + "fqn": "horizontal_oval_tank", + "name": "Horizontal oval tank", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Widget indicates the level of liquid in Horizontal oval tank.", + "descriptor": { + "type": "latest", + "sizeX": 4, + "sizeY": 4, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.liquidLevelWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.liquidLevelWidget.update();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n}\n\nself.actionSources = function() { \n return { \n 'cardClick': {\n name: 'widget-action.card-click',\n multiple: false \n } \n };\n}", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}\n", + "settingsDirective": "tb-liquid-level-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-liquid-level-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"return Math.floor(Math.random() * 101);\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"tankSelectionType\":\"static\",\"selectedShape\":\"Horizontal Oval\",\"shapeAttributeName\":\"tankShape\",\"tankColor\":{\"type\":\"range\",\"color\":\"#242770\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E73535DE\"},{\"from\":20,\"to\":null,\"color\":\"#242770\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E73535DE';\\n }\\n}\\nreturn '#242770';\"},\"datasourceUnits\":\"%\",\"layout\":\"percentage\",\"volumeSource\":\"static\",\"volumeConstant\":500,\"volumeAttributeName\":\"volume\",\"volumeUnits\":\"L\",\"volumeFont\":{\"family\":\"Roboto\",\"size\":14,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"volumeColor\":\"rgba(0, 0, 0, 0.18)\",\"units\":\"%\",\"widgetUnitsSource\":\"static\",\"widgetUnitsAttributeName\":\"units\",\"liquidColor\":{\"type\":\"range\",\"color\":\"#7A8BFF\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E27C7CDE\"},{\"from\":20,\"to\":null,\"color\":\"#7A8BFF\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":24,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"valueColor\":{\"type\":\"range\",\"color\":\"#000000DE\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FF0000DE\"},{\"from\":20,\"to\":null,\"color\":\"rgba(0,0,0,0.87)\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FF0000DE';\\n }\\n}\\nreturn '#000000DE';\"},\"showBackgroundOverlay\":true,\"backgroundOverlayColor\":{\"type\":\"range\",\"color\":\"rgba(255, 255, 255, 0.76)\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FFEFEFDE\"},{\"from\":20,\"to\":null,\"color\":\"#FFFFFFC2\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FFEFEFDE';\\n }\\n}\\nreturn '#FFFFFFC2';\"},\"showTooltip\":true,\"showTooltipLevel\":true,\"tooltipUnits\":\"%\",\"tooltipLevelDecimals\":0,\"tooltipLevelFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipLevelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.76)\",\"rangeList\":[],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"showTooltipDate\":true,\"tooltipDateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"tooltipDateFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipDateColor\":\"rgba(0, 0, 0, 0.76)\",\"tooltipBackgroundColor\":\"rgba(255, 255, 255, 0.76)\",\"tooltipBackgroundBlur\":3,\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Liquid level\",\"useDashboardTimewindow\":true,\"displayTimewindow\":true,\"configMode\":\"basic\",\"titleFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"1.5\"},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"showTitleIcon\":false,\"titleIcon\":\"water_drop\",\"iconColor\":\"#5469FF\",\"decimals\":0,\"enableDataExport\":false,\"enableFullscreen\":false,\"borderRadius\":\"0px\",\"actions\":{},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"dropShadow\":true,\"margin\":\"0px\",\"widgetStyle\":{},\"widgetCss\":\"\",\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"pageSize\":1024,\"noDataDisplayMessage\":\"\"}" + }, + "externalId": null, + "tags": [ + "reservoir", + "container", + "vessel", + "storage unit", + "cistern", + "canister", + "vat", + "basin", + "repository", + "bin", + "hopper" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_pm10_card.json b/application/src/main/data/json/system/widget_types/horizontal_pm10_card.json new file mode 100644 index 0000000000..0548e0cafa --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_pm10_card.json @@ -0,0 +1,37 @@ +{ + "fqn": "horizontal_pm10_card", + "name": "Horizontal PM10 card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAllBMVEUAAADf39/f39/g4ODg4ODf39/////k5OT/pgDg4OD/9N//vED/sSD/+u//3p//0oDOzs7z8/P/6L//x2D5+fnIyMj/6b//qxD/46/b29u2trbCwsL/2JBYWFjV1dW8vLzn5+erq6uQkJD/tzD/78//zW//zXD/x187Ozuenp7t7e1mZmb/wlBKSkp0dHT9/f2tra2CgoIEnlQuAAAABnRSTlMAIEDfv1C6kOEmAAADg0lEQVR42u3aiXLaMBSFYdqkh4ssb9jGNjY2OyFLl/d/uUqihTYt0IHSIfR8kzCynMnojwyBgQ4RERERERERERERERERERERERERERHRv/TuzetY7++6b13v7oPp6KZ48+Lu+859jBuQ3nd6uAWfejcSAoZcG4ZcG4ZcG4Zcm/8rZDKddjFpgWYNZI2d6OLK7AvpB4XCd6N19tCMHoCPL/gymqJ9al5wnn4dFv52hCNU4OMV3y7weEgiIrrYhmR4Go6esq6NmUwxXePlvC1JxNBzMwrdSOGglcYrhWidz4+GLMXK1feQl9EIo+nHyeRbyASjs0IC0YN5KBpQdrQUDwflyS8hIZSER0NyccLdjtibp4d4E7Je4yE+a0PcbueisJQl4Ofiw1EK5lC5o36hYEe2u28n3QxU0Ie18LQ6FqJkI/k5ZP0Rm5D45ekLzmeX74lNmskclhLtrrbEDGd2AZutejazA5nZmdBeitrm1Svp/+mO1Ngnxpl8pZaygAnpw92+DlnJLKi1eG42sSGyKBYmoi60hKjNRkpyKMQPkwC1WFrhUuy6xMP+ECWigML9TGD3a+CGWgJ7/Gy+dS7FoZCZ2wm3gXNcjgoXWsL9IW7d3269mR3uugM7VHXg40DIXAwNqMEcF+bnovaGBLsQJcEvIcf/ISoxZriwwv413R09keC3d/ZCttsQijohBCsR+7trrzhy144fX0/E+FMztwPa3Nby7Na//TP6dgmJ265vS9YeTglBEA4AXyTH1tDFmK/HEk6aIu1FdqKH1ByPJ2OkZbk5kR5/UKslT0LPLt/XkoRawm2IDhfucX9pR7l4piA4JWR3/eqfQpomKrMsMqMKVVm16bCKmiaL2seoTYFoHLdtiThyJ6KsxWGBFtPi27Xb0WJ3YeeSezYESzNeiWf2xz85ZPc0bRcSDeMsGkebkHFTmrGZG5dRlbmQXlmakGw4zmKTW8U4QikfG/52ZK8x/8d5+0Crk7/3NP5zVFbRsMmq2O5I1JbVMB5mkZl7bMdZBBuS2h0Zt5/tiaaqcBK1uw7qZ4W+luCiL6zKMfZrshLG2SFirXDRkDQ9dDLGyfyw3kWFyWLAl7pvF0OuDUOuDUOujQn5hFvQ69zfwNvsQHxvPjBwA2+0p+YDA50Pd73uW3f3/pY+VENERERERERERERERERERERERERERET0j3wFxKH86witj0MAAAAASUVORK5CYII=", + "description": "Displays the latest fine and coarse particulate matter (PM10) telemetry in a scalable horizontal layout.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm10', label: 'PM10', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"bubble_chart\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#80C32C\"},{\"from\":20,\"to\":50,\"color\":\"#FFA600\"},{\"from\":50,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#80C32C\"},{\"from\":20,\"to\":50,\"color\":\"#FFA600\"},{\"from\":50,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10", + "coarse particulates", + "coarse particles", + "particulate matter 10", + "inhalable particles", + "larger particulates", + "dust", + "airborne coarse particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_pm10_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_pm10_card_with_background.json new file mode 100644 index 0000000000..823b419fdb --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_pm10_card_with_background.json @@ -0,0 +1,37 @@ +{ + "fqn": "horizontal_pm10_card_with_background", + "name": "Horizontal PM10 card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays the latest fine and coarse particulate matter (PM10) telemetry in a scalable horizontal layout with the background image.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm10', label: 'PM10', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"bubble_chart\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#7CC322\"},{\"from\":20,\"to\":50,\"color\":\"#F89E0D\"},{\"from\":50,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#7CC322\"},{\"from\":20,\"to\":50,\"color\":\"#F89E0D\"},{\"from\":50,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10", + "coarse particulates", + "coarse particles", + "particulate matter 10", + "inhalable particles", + "larger particulates", + "dust", + "airborne coarse particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_pm2_5_card.json b/application/src/main/data/json/system/widget_types/horizontal_pm2_5_card.json new file mode 100644 index 0000000000..b64711d5c3 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_pm2_5_card.json @@ -0,0 +1,38 @@ +{ + "fqn": "horizontal_pm2_5_card", + "name": "Horizontal PM2.5 card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAkFBMVEUAAADf39/f39/g4ODg4ODf39/////k5OSAwyzg4ODv9+XQ6bCQy0bz8/POzs7f8Mqv2XuQykb3+/LIyMj5+fm3t7fA4ZWg0mDb29vH5aOIxznCwsK8vLxYWFjn9Njn5+fV1dXY7L2tra243YiYzlM9PT2QkJCn1m5LS0t0dHTt7e2enp5mZmaCgoKdnZ0vLy8j+senAAAABnRSTlMAIEDfv1C6kOEmAAADWUlEQVR42u3aa1PaQBiGYar2yctmc2gSciaEk4Da9v//u+6uiFMcEVt0kHmuDzG8Ycbcs4TDwICIiIiIiIiIiIiIiIiIiIiIiIiIiIjoM3378lzG1bX31Q2vv5sOL8OXF3hXg5sAFyC7GQxxEYYMOTMMOTcMOTcMOTcMOTdHhcxubz3MWqC/h3c7243OyWshkT9VeDK+T5f9+DewWWOdbu7taJQGOImkyn2Fw5SfYE/i++qIkFhE9HQXkuJhNH5IvfESHjZ2SZY/ZziJXAzd4aC5qP20utYSvRkyF6tWTyHr8Rjj281stgTSNYyR99DiBJRI1OWicZBeYU+Uq0Tmb4bU4uS7FXGbh2WwRL8OAAT3uL3HCfiycv9Pbbvs30QlMLppZ28bkfiAStwEiR/Bygut3gpR8ij+O+TXBkss1+Of7QY/H9beaUIKF5LAEXGzGEgKewLyA0Zc23Na2ElemY0r8GOpjl2RCq871aWupVJzibEfEov2ff0YomMbIvE0F6mr6ULmJiNBvToUkuSxD5vtwj9eJ8YieREiooCpC/ElsiE1gIVUdrpAJFqLfyhk4VYif/up5GQrssq15PshkU3YblcaJsTtFuJvp6o6/PTbiWHvF3X4DJV7VGmJXoQsnkKUxC9DnEMhyq00Ps3KPT5i8fdC1POK+NK9M8SJReydq2L6xoUd3O0PArxfLHO3ItOnkG67SrVE22uk0HhviOPnEZCI1NgZPcYEuCvhZBmyYWgHQ2QAJrMJsrJ8PGAGxydFInFeiN5dIzqf1zYkFz03ez9MQfX+kJ2kFv1XSN+HZZqGZq9BUzZtNmrCvk/D9i5sMyCcBG1bIgjdgTBtcaypFpFCPYeYWzYEc5F6ZU65EvUfIbu3abuQcBSk4SR8DJn0pdk3s0kZNqkLGZalCUlHkzQwuU2Ao7kX8l0IVPI8j6SALk74Nj4sm3DUp01gVyRsy2YUjNLQzO7aSRrChmR2RSbtzB7omwbvtQvZihYdOi3Vh36wKid4XZ+WMP43xBerwIeGZNmhgwH+XZ7jiariecSPul8XQ84NQ84NQ87NBYXcXMDX7EBwM7jyLuCL9sy7Ggy+Xw+9r+766pJ+VENERERERERERERERERERERERERERET0Sf4AN2T4354zjDoAAAAASUVORK5CYII=", + "description": "Displays the latest fine particulate matter (PM2.5) telemetry in a scalable horizontal layout.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm2.5', label: 'PM2.5', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"bubble_chart\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#80C32C\"},{\"from\":10,\"to\":35,\"color\":\"#FFA600\"},{\"from\":35,\"to\":75,\"color\":\"#F36900\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#80C32C\"},{\"from\":10,\"to\":35,\"color\":\"#FFA600\"},{\"from\":35,\"to\":75,\"color\":\"#F36900\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air", + "fine particulates", + "fine particles", + "particulate matter 2.5", + "airborne particles", + "microscopic particles", + "respirable particles", + "aerosol particles", + "dust particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_pm2_5_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_pm2_5_card_with_background.json new file mode 100644 index 0000000000..0d5690cd8f --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_pm2_5_card_with_background.json @@ -0,0 +1,38 @@ +{ + "fqn": "horizontal_pm2_5_card_with_background", + "name": "Horizontal PM2.5 card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays the latest fine particulate matter (PM2.5) telemetry in a scalable horizontal layout with the background image.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm2.5', label: 'PM2.5', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"bubble_chart\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#7CC322\"},{\"from\":10,\"to\":35,\"color\":\"#F89E0D\"},{\"from\":35,\"to\":75,\"color\":\"#F77410\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#7CC322\"},{\"from\":10,\"to\":35,\"color\":\"#F89E0D\"},{\"from\":35,\"to\":75,\"color\":\"#F77410\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air", + "fine particulates", + "fine particles", + "particulate matter 2.5", + "airborne particles", + "microscopic particles", + "respirable particles", + "aerosol particles", + "dust particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_pressure_card.json b/application/src/main/data/json/system/widget_types/horizontal_pressure_card.json index fbc79c2255..7a2a3da436 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_pressure_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_pressure_card.json @@ -3,7 +3,7 @@ "name": "Horizontal pressure card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAolBMVEUAAADf39/f39/g4ODg4ODf39/////k5OTYGDjg4ODri5v64ub1xc3nboLdNVHwqLT98fPOzs5YWFjz8/O3t7faJkXx8fH5+fnb29vCwsK8vLziUmnV1dXHx8fkYHbn5+f409rIyMjzt8HpfY9mZmarq6t0dHTiUmrfQ13umqiQkJCCgoJKSko6Ojrt7e3tmajsi5z39/faJkTgRF3pfY4hISGGGYADAAAABnRSTlMAIEDfv1C6kOEmAAADqUlEQVR42u3ai1LaQBiGYar2z89uzgdIYgKEcBJBrW3v/9a6WUCgUiTMlAnM90hCTHCyr7Aggy0AAAAAAAAAAAAAAAAAAAAAAAAAAACAS/p29XTG3b1x7dr331WH8YOuXmDctR4CugE/HlptuglthDQMQpoGIU2DkKY5HOJKujaHQyy+upJDIc6bxaagrfF8blDDHQqxOVJfQ/rgj/NlZnQ6VOUYHb2otVoZ1eUs5vrqVXycaOCYq31CmLQmWGx+wFGGgzoh0mZmQVt+TqPQX+TPI7/zPFlk88kyn+SGb/xeGP7o+YyKMmKqvLFiS50xZbY2Z2fb/TvEYs2Wp4RsSwTt8Be+T35mLMejsT9JO3O16BCf5qPxkmpyZ6yQItk2ByVPq46ILaca5CNbcjBj8Tmk5zivM5VYY7LLJ9rl59XKMJZ52MlzP83y0XgS6pDnSZ5TTdIWziqk5FJ1RazGZrNDml2NdMj2R4g7HEodopMidlaPQnk8RIodw/0Q0g+t0cKYj/xwvBxVIcZiNKH65CrkUc/EGQ/UyC2S27GZPN2E9Gzmd3MToq/klJW3oyEm77DoL529Zbvv/BBzvS65F20mgCvNn+xsQlg4PZ5+hDzyE/W4NJ2I5bEQ19whqZ7zQ9TClrB5uh68Gu0m5JcaFHMVYpnm0OJIkhAuqRrnjHvkAiFCz5aBfvq1ondzd7KvQrSouoX7Wlo2O3XniHKBkGrL2gzO5NnnkJ7jOLrviaPZowqp+6yl/KcQPXA92fUDRa2HrjMkhflziKAVl1luo794HXmjHQEdELz8vSOoHfLKvWrbrram+rzS5Xc1ygHb/w6R/K6jnVNe2fdKQh2jLi8xad0uddtetaNNXfV9f9ynbhyvDqgdwYkhrq2nuFhv/WSrGqAtyojF4RCtuu2UvwxxV39rOXshWebFReGprYSSOEm7YeJlWeGlL16qRu71gzSNKfD0Aa9ITwvRv7Oo1Fs9Zi5ddXpVwdETHQkZ2MxTi8ujIYoQFps9dz/EC4PC63urkH4Wq221rx97SaFD2nGsQoqwXwQqNwnoRK50P21JSV+Q8qz3I2MvTrwwK5IgVCFeGidhEBae2veS9gsVp0K61T3ST8fVgSxJ6AyXf4cY9+nfsiKmy9MhtXW7xw4GdIpGhDQRQpoGIU2DkKZBSNO0Ww838DE7UfDQujNu4IP2H8Zdq/X9vm1cu/u7W/qnGgAAAAAAAAAAAAAAAAAAAAAAAAAAAIAL+QMW1wDljmkjjQAAAABJRU5ErkJggg==", - "description": "Displays a latest pressure telemetry data in a horizontal layout.", + "description": "Displays the latest pressure telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, @@ -23,6 +23,6 @@ "tags": [ "weather", "environment", - "pressure" + "barometry" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_pressure_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_pressure_card_with_background.json index d0beafbf6d..d0551423ef 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_pressure_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_pressure_card_with_background.json @@ -3,7 +3,7 @@ "name": "Horizontal pressure card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest pressure telemetry data in a horizontal layout with background.", + "description": "Displays the latest pressure telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, @@ -23,6 +23,6 @@ "tags": [ "weather", "environment", - "pressure" + "barometry" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_radon_level_card.json b/application/src/main/data/json/system/widget_types/horizontal_radon_level_card.json new file mode 100644 index 0000000000..36ea0ef3f3 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_radon_level_card.json @@ -0,0 +1,29 @@ +{ + "fqn": "horizontal_radon_level_card", + "name": "Horizontal radon level card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAApVBMVEUAAADf39/f39/g4ODg4OD////k5OSAwyzg4ODv9+Xf8Mqv2XuQy0bP6bDOzs5YWFj3+/Lx8fH09PT5+fnA4ZWg0mDHx8eYzlOIxznb29u2trbQ6a/CwsJ0dHTV1dU8PDy43Yjn5+fIyMjn9NjX7L28vLytra1mZmbH5aPY7L1KSkqenp6CgoKo1m6Qykbt7e3U1NSQkJDH5aKdnZ2n1m4vLy+qqqrWFLAGAAAABXRSTlMAIETfv0i0+14AAAPtSURBVHja7dqLVtpAEAZgSzsZkmyuBEi4BAhXsdba2/s/WmeWUiJW5dDSA5z/O4rJBOP87G6EAzcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9O7i3ejGu+dS9d835AcTosuXuo0bj6kdAVaH26adBWaCHJmEOTcIMi5QZBzgyDn5g9B3JiUt6ssHh8d2kiWtJN8pLq7ko5wsiArzmwcNu62FN11Rgk5ibRejogklOyRbES6kySU2P1hhw7lrbLg9+n7/ZisuC9uPXpm9rzm9W9fDzJm7pIIeJck6tAo+Thcl4v1cETRMEqGUfSoQWRn7Uip/LiU4sFBMhZmun3k2CPLZcvc0lNx7tOeMXe5+1qQjIWe1+gZY7Ki9fdH6txFi6h0Rp0lfb0bduxoRJ3RQqujZLRYLg4OErDxphkbUq6pB5Eh8TmP9+/v0Z4skFbdF4PoWcU9kccq247I1yGty4+LZccZlbUgEqHTSxbRneTrOAcHafNMbvNNI9J3LQiJLgc6DDLHYpdU25BsSuVWEnq3UxJT32SvjEjAIveI3C6L7m5qOdFyveiMZGoNl2tnG4R0SiXfHfm5PHxqzfquDRLbv5iZvSA2Z5AzmzZ7tjzWvPdamWlfmRYzY+KXg9yzCCgYu3HOon7XRL+3G/Vq/efhAu7aKWCoHsR13TEbuzme+WyPBOzagVtpivYsY9n3A1rx9OUgXdv9jPmb/KaY0qm4xp7cl1uzv9g9Xau+bcfT26694xed8LkdsUC+u7l58x+iJ8HptGJjJ8hU+zVPFvvK18vlvfStLXtaDWyQQDc/bTdnctF+M4hOLTqpuCs5hMTp93Mee/U14vNYH/VtkDG7z4NYbwaJ9euktFfb+S/tehCdVv5uREybjg1ijE7OnZT+IH3YL6R0qLGsQRV7yvBq+vTyO6aVzaZteBwcGyRjUb+29bRN/XooyGq1qNUMtdCkluxPfkyoVRSbA1J4I9KK+d4Xtp+na8T35SqbuxTn7GdtliM+x0cGcdkaPwlSlmFRVaFsDWhQDOat3iAsyyqcP4Rz6TycpPN5QWloD4TV/I2JteE/C6Lyb7ompkYmnB4xPh0ZxPDGtB7kc9hLq3ASboJMPheyLbVJEQ4qG6RZFBKk6k2qVOIOUvprrqtrZMazo5/G+13mvF1/Gh8Wg7BXVoNURyScF4Ne2qtCqT3MJ1VIGqSlIzKZL/RAORjQv6BBTvrCqpjQyz5XupAuI0ir9drBlP6ZIHPxUvdSIci5QZBzgyDn5oqCfLiCt9mJ0g83DecK3mhvOQ39CEfTuXTvG9f0oRoAAAAAAAAAAAAAAAAAAAAAAAAAAACA/+QnXMPkgka4f5kAAAAASUVORK5CYII=", + "description": "Displays the latest radon level telemetry in a scalable horizontal layout.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'radon', label: 'Radon level', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Radon level\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:radioactive\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#80C32C\"},{\"from\":100,\"to\":200,\"color\":\"#FFA600\"},{\"from\":200,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#80C32C\"},{\"from\":100,\"to\":200,\"color\":\"#FFA600\"},{\"from\":200,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"Bq/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "radon" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_radon_level_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_radon_level_card_with_background.json new file mode 100644 index 0000000000..27694748ce --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_radon_level_card_with_background.json @@ -0,0 +1,29 @@ +{ + "fqn": "horizontal_radon_level_card_with_background", + "name": "Horizontal radon level card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays the latest radon level telemetry in a scalable horizontal layout with the background image.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'radon', label: 'Radon level', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Radon level\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:radioactive\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#7CC322\"},{\"from\":100,\"to\":200,\"color\":\"#F89E0D\"},{\"from\":200,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#80C32C\"},{\"from\":100,\"to\":200,\"color\":\"#FFA600\"},{\"from\":200,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"Bq/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "radon" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_rainfall_card.json b/application/src/main/data/json/system/widget_types/horizontal_rainfall_card.json index 4eefae88c8..9f94eb4b46 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_rainfall_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_rainfall_card.json @@ -3,7 +3,7 @@ "name": "Horizontal rainfall card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAqFBMVEUAAADf39/f39/g4ODg4ODf39/////k5OQjTMfg4OB1j9yRpePk6fjOzs7I0vGtvOry9Pvk6Pj09PT5+flYWFjIyMg+Ys7b29vV1dUwV8vCwsK2trbw8PC6x+6fseetra3n5+eDmuBohNi8vLyQkJCsvOo9PT1aeNVMbtE/Ys7W3fXW3vRohNkxV8q6urp0dHRmZmaenp6CgoJKSkovLy+su+pLS0shISHWoRcHAAAABnRSTlMAIEDfv1C6kOEmAAADUUlEQVR42u3aDW+aQBzHcWe7P3/BA+QZBETQ4aytfdr2/t/ZDgStjS7baBtqfp+m5Q5Mel8P0xg7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAPhIXz69OmN4pXx2o6uvskOx6dOzlOHg2qILYF8PRnQRRgjpGYT0DUL6BiF9g5C+ORWilyF7Gh3MFguFKnfB7vBUT7f0qFBfnAjROFTVkj2TWs6D+y0mJaYgiGOFYueO5IG+kdMxRJffptFY789qWvIGITrPq4RlWB5CXPoWP26fgsVs4dw77vO94mydriH6PGR5GHNDo9p4xZJndgxZ5uGKailP9iFPzwtyH5zZQn7t1n+3+NUtxKzXWw30Wtj+ug2rk/WK591CNA7LdltDbbLfkYct/QweDyF3W6VjyPi7ZsiQls55E8i3RJSw10wnppkkciE3yU0z1eupof8pROeNSa0Vc27uby3Fuf95CAmc++e4U4g0fhGSs96s3EjqhZRUU1negHyrl8zVJhm88eQoVeWPlXk+ZM6TF1WGyjkdxESnZ91D5NCjl1RetoNQMzZy1UYayla5iVoiKzxj6XF6PkRlOpLf0juSIUcLP0j3XSpr9QMn1fAHGfVTy3xTPenz8yFpVTkOE/JS2uQy5CjsHUJOb8g6DCevQpqhwaocfa+6NFbPh5hyv2SNrssD568f+34h6tGzOw55Td1CaJwn1f2k8Y0uN1srTXo/h5Cx17w229mSuoS0wpxK7+h1b9EJVvz6hPW/Ict2TZNdh0ZvESK3wpSPKVe0N93FWBT7VLNtskeiOjEiW86zWUa27+8uyBPWv4W0G5KyWk1u1YreeUcSM5F7m6yPQoJA+K4r5CiiyI8KexqJIHBFEYvCJhKZVRQ+WaK+INziX0KWXFITMifixo+OIYc/J8chYmq5IhO7kCzw5Viey3wRuXXIyPdliDvNXEvmRhb9D/ON34+kczoyE34kpoEbWdWOiMKPptbUFfJcXGSuoCrErnYkK2bVhSCKqIOPe2PlZ3Re4Pr0N/oQYtt/umjR3+hFSB8hpG8Q0jcI6RuE9M1ocH0BH7MTWdeDoXIBH7TbynAw+Ho1Uj67q+El/VMNAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAf5Damp/4Ir985nAAAAAElFTkSuQmCC", - "description": "Displays a latest rainfall telemetry data in a horizontal layout.", + "description": "Displays the latest rainfall telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, @@ -24,6 +24,12 @@ "weather", "environment", "rain", - "rainfall" + "precipitation", + "downpour", + "rain shower", + "drizzle", + "raindrop", + "cloudburst", + "rainwater" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_rainfall_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_rainfall_card_with_background.json index 62bad4bbb0..ed2e536310 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_rainfall_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_rainfall_card_with_background.json @@ -3,7 +3,7 @@ "name": "Horizontal rainfall card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest rainfall telemetry data in a horizontal layout with background.", + "description": "Displays the latest rainfall telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, @@ -24,6 +24,12 @@ "weather", "environment", "rain", - "rainfall" + "precipitation", + "downpour", + "rain shower", + "drizzle", + "raindrop", + "cloudburst", + "rainwater" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_snow_depth_card.json b/application/src/main/data/json/system/widget_types/horizontal_snow_depth_card.json index 690a99c3f0..0823d85d79 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_snow_depth_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_snow_depth_card.json @@ -3,7 +3,7 @@ "name": "Horizontal snow depth card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAxlBMVEUAAADf39/f39/g4ODg4ODf39/////k5OQwWtfg4OCXrOsjTMfl6/qxwfDx8fFKb9zOzs5+mObz8/O7u7tYWFjy9f3k6fjj4+PIyMisrKw+Ys48PDz5+fnL1vXb29vV1dVaedXCwsKQkJA9ZNkwV8u2trZkg+Hn5+eKoul2j9zY4Pe+zPPW3fWCgoKkt+51j9x0dHSRpuMvLy9wjuRXed9mZmbt7e1KSkr39/dMbdGenp7I0vG6x+2fsebJyclLS0udnZ0hISFSqBZZAAAABnRSTlMAIEDfv1C6kOEmAAADuklEQVR42u3aeXOaQBjHcdukT1ZuOQKogIBXtRrrEdv0fv9vqvuANU7GsZVOMsT5fSZRZP1jv1k2OqMNAAAAAAAAAAAAAAAAAAAAAAAAAAAAgJf05tVrsLdXN6+df/VOdtx8olfPvnnbuLbpAny6bjTpIjQRUjMIqRuE1A1C6gYhdXMkxCO6U4luac94yHw6YvZ41qcgpAqeMeS2/ZFDPvS/0R/uQ/CDDMMgeVP8kE987Pp/HhmdJOTYSqa6RlI0V6Ye7UWKMq0ewt6rH+/UD/327WNI5vu0XHQSZ+s+OLPANbZE/naz9DO3E2TbzcJZzkJ341IVuhA6ESlCMjUqaevioVc55PaWS/pq0fGVSkbYyahDi9BNqGO4M9eZEclf1++Es0UW0pI6fshPqUAzi5BI5NFkLIZUWomWNlmLceWQz+2iRC3vvlBhQXKiHLKRIeRuwk5AFHLI0gn8/wwZC5NDFNEi8oQgiQ9yvuaESTvedKrxneZ5ER9N9Oh0SHlJ9dSi4yOVsh/ugjgkcN2Mspnxi5dp6y79n52Nk7mubFpUDJmI8ZBD5mJ8GKJPeZvsF2ieCyHGRa4pj/SVvFmfDClL7tSDDmY8PWBGeZOF5X01pqkVIV6e69qYJ/uoxQNlbT6fmkLhjaRwhanLtOmJkLter622e32191nt93q9D/R3TkDVKUInDuHJSkM6MN9fWSt+hiYfKmJVrJvGl6RyImQoQ2RBm0PUIuR5abwzOIT3fEsxDyc3yXONSrmY8JO1cieREMWfQKlwaT0XOXNdX4vWlFrFHsmFt2/k2e/wErBTIac3+zPTxI5JQxHRbnEYr5D+2Hs85Ox/vzYdYd8/PWHT2SK2FuMJrYp5mZyjlR3K4a5XuHr9JOTsF8RBGWPTfUyFbpe6TYtPNKlLRKNwRN04LgfkifOShuULotwjQ2HyHm9xUd5i0W67lBvoSci5b1E4JEms+Pt3Sx6llMap0x2kVpIElnNvOV0ia2Q7Tky2VQxYgXN2COkm/9fSdq8oYkenQiQH8zmdFeIdvGk8DBnYgTWyypBREstjeW4UW2lQhDTjWIYEziiwZW5q0/k0zSPmHR+s+jbeo73QilNrkASpzStiOXE6sAeBJc/dy4lbxCFdXpGRE/JAkqb00jjkbPHoxGASxPQv6hDS7Z4atOlf1CKkjhBSNwipG4TUDULqptm4voCP2Ynsa/mFgQv4oP2T/MJA492Vf/PaXb29pC/VAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyQ32C4FBab7K0VAAAAAElFTkSuQmCC", - "description": "Displays a latest snow depth telemetry data in a horizontal layout.", + "description": "Displays the latest snow depth telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/horizontal_snow_depth_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_snow_depth_card_with_background.json index 76fcd31a5e..cc6364dcfb 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_snow_depth_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_snow_depth_card_with_background.json @@ -3,7 +3,7 @@ "name": "Horizontal snow depth card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest snow depth telemetry data in a horizontal layout with background.", + "description": "Displays the latest snow depth telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/horizontal_soil_moisture_card.json b/application/src/main/data/json/system/widget_types/horizontal_soil_moisture_card.json index 1fb4e01f9e..0e42ee38a9 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_soil_moisture_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_soil_moisture_card.json @@ -3,7 +3,7 @@ "name": "Horizontal soil moisture card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAolBMVEUAAADf39/f39/g4ODg4ODf39/////k5OQjTMfg4ODy8vLk6fg+Ys7IyMjOzs5YWFjj4+Py9Pv5+fmRpeN1j9zV1dWsrKyQkJDb29u7u7uDmuDCwsK2trZaedUwV8t0dHTn5+eesefW3fVKSkrI0vFMbtE8PDyRpuNmZmasvOqCgoK6x+6rq6uenp7t7e2tvOoxV8rW3fRohNkhISGwsLAvLy8aKS4pAAAABnRSTlMAIEDfv1C6kOEmAAADj0lEQVR42u3aCW/aMBjGcbZ2b42P3CEXCYSrQKHXtu//1faaQQPTFCYNlbR6fhVSaquS/3UcoZYeAAAAAAAAAAAAAAAAAAAAAAAAAAAAwHv68uH1rK83dx+dd/ONO+4C+vDk3dferaRPILjt9elT6COkYxDSNQjpGoR0DUK65u8h9dynI3KbeGRlxgyIvEQSJTFZI0lMXv/92l9D7oXQihru1kyJuCWOBwmR+Z7xa0CSRzZ2XC63JPnLk/ZFl6OeZmTN6vCBDvw6VGdCmo7TEjfxPHJHrpcMdiFLl0buwJsu17Sg0dqNF27MQ8ZdbNZL17tYRilEaVdeHi9IaT0XL+0hTQc7urvkZpHwSgfrfcjIlW4yWGc09RY03cZyNPB2IUZ+H4y2l+rQonya8EUu5rNJZJus8NknHfHs7EzIROzldDAiWpgpbZN9iJtNN6NdiFyQMdOYQ6a0tCE/jfHoMiIR0s6rXbMvxD5EE5UR5frcjmhx8JacTN0RrZdT7xAif3p2E9zE3lp8M214a5YLDqHEXcZ0EUpoUqr59hBSC6V0roQ6E7ISIqorUb0KcdQs969T8nhONmMXsRLlnNfwQsxX6m1/fDuqdERnQrQtj6oJze2WXFHIJz18Fc/2qD6d3OmTCdVanQl54R+5f5hP6L752euIhP2ll6K2Sw9zzRdvVLWahKFqC5kJVtkOFtGVNGc9FPlh7c9+MxepquSHcEuI2ne81tWVd6QW+T7k6YmYFrPm+Kj8mUfylhDi9T/wfnC1vWg5wPLxzwFJlzQT2ieaixVVNkFVb88pX4cU7R7CbSGhEDq350Q3T63h4bn0mNJOEFDQd+xAnwIiGm/GFKTp7wkekJe5t3RY2kXUvKJQNzf6gx17VnxQ2kJ8LQ5WRyFx7KTGOHxVUJEWWTAsnDg2TvboZAGRM5ZZlpJ0dhOOyej/+TmvobTbwBWiCv2TyZLn/LYQUoeSmo5DnKE0ztj5HTKOU77msXHqFGYX0k9TDjHDsZGcW0i6AF8dlqrs1Smlzr3X8ldzIapoQm9+OGnhDGNTSLsjTpYWQzk0Do89ZmPjkA0J7I6Msx92Ii4KehftIeel45bJ2KT0DzoREgRtk5L+RSdCugghXYOQrkFI1yCka/q920/wb3YiecsfGLj+H27/W8AfGOh9u/HuPrqbr5/pQzUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7+QX7yoAidBTT3IAAAAASUVORK5CYII=", - "description": "Displays a latest soil moisture telemetry data in a horizontal layout.", + "description": "Displays the latest soil moisture telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/horizontal_soil_moisture_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_soil_moisture_card_with_background.json index 3a40804efe..2a4d3245f2 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_soil_moisture_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_soil_moisture_card_with_background.json @@ -3,7 +3,7 @@ "name": "Horizontal soil moisture card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest soil moisture telemetry data in a horizontal layout with background.", + "description": "Displays the latest soil moisture telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/horizontal_solar_radiation_card.json b/application/src/main/data/json/system/widget_types/horizontal_solar_radiation_card.json index 1b357d2d38..51abeedec1 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_solar_radiation_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_solar_radiation_card.json @@ -3,7 +3,7 @@ "name": "Horizontal solar radiation card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAk1BMVEUAAADf39/f39/g4ODg4ODf39/////k5OSAwyzg4OCQy0bf8Mrz8/Pv9+XQ6bCQkJD3+/LOzs6srKxYWFjIyMig0mGIxzm43Yj5+fmYzlPb29vV1dXCwsK2tra/4ZVKSkrY7L08PDzn5+fn9NjH5aO8vLyw2Xuenp6CgoJ0dHS6urqo1m5mZmbt7e2rq6svLy8hISGYzLGRAAAABnRSTlMAIEDfv1C6kOEmAAAEBElEQVR42u3aiW7aQBSFYZqk18N4X/AKGLNDSNL3f7reO9i1ukAbpCInOp/SaDLjkvnrcamUjgAAAAAAAAAAAAAAAAAAAAAAAAAAAADu6cuHNxIPj9ZHN378yh1WTh+eYz2Mnhz6BPKn0Zg+hTFCBgYhQ4OQoUHI0CBkaP4Q4gYk7H7G2fkWiehIHcv3IxJm+lidJ+mY0P1cD1mruclR2qVWvEtq2SXx3h2Hw3iY1Mnel5E0RVUlC07jyMDiKf7qCptaQTuy1/NFN+V5xBZeYD6vzGbki0532cK9GpIpVRDzVF8S+5ZF8SHmHR/j0876VnNITMnJqg8Hag5xxAv1aff69ur7Vn3a09uhSS5WZKn6MdIk5orpdrOpks1rJWWFMqVb/duxSVOt3Ssh5iVt80L9SzuvjV/FFO39yNrtYysmDnmLG8uJ/IYX/IgX/ENMDfn+/ki19U1u3h8FhWLEVql8CxOktL16VhkZW7XmRSVfBkrJFoJ0S7/ICv5d3uUQVyv2LK8t5mQciBo+XDvf55ZjG8LbtqKD1Vi1CdnvojYkoti5HOLquXcOsSc80uete7LptDvbW3MgCr6kOx02Bfzo2nKaXM/u/syv3BFPsdTmywvFCjL8Oj7Q/lTz0do1cd2FHOOkObxRfKojXqjjmhputWI+WhdDhGtC2ltBPw6Qbje2km/7rAoVcFNGbKLl0olsaT3vTspcra88I8+KeeRlbpAqFtCZI7/a0a/6hf6T+NeQLkFLjkhVQGmxVgvezsJcn5kjki0yjvAWWk5Kltp0JaQwu1/I6doqtqKb3R4yUfZKZbL9wix4/FnuSPdXgMe7W6tU6+xyiDD1E+rdOyRT6zWPUx20J6+gPsTmEB6uPGb/LUSOFvXuGyKz22cV8JFYqGdzufd7SOd6SCAfvf8eMlGL9tEw+EakE9mvVmtzg9xbQ7Ru34jYxafXefl1wrk1ZC5P84rH/ZM65572GdUTui2kf5/tzGSb8vFSkpHnlI9DmRhTTkTL1yXlZXle4AnnfSFBqrZz3b+/Zd17cmqu8W4McZWR/RRSVWGZJCGPpjQtp5t8Ng2rKgk3L+GGdx4unc2mJCc0C2GyeVcIrbRS6Zo6HhewzGx4mwY3hmh1tvopJJw5SbgMzyHLquQxzy3LcJqYkHFZckgyWyYO504deh/XvfRU6u3N/4zf8hlNJ5zeicJyGs6qZOrIHQk35XTmzJKQ5142yyQkCcnljiw3kSxU0yndm4S8W7mky6qkpH8xhJA8v7bo0L8YRMgQIWRoEDI0CBkahAzNePT0CX7MTuQ8jR6sT/CD9tx6GI2+Po6tj+7x4TP9pxoAAAAAAAAAAAAAAAAAAAAAAAAAAACAO/kOdioE5akwBJsAAAAASUVORK5CYII=", - "description": "Displays a latest solar radiation telemetry data in a horizontal layout.", + "description": "Displays the latest solar radiation telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/horizontal_solar_radiation_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_solar_radiation_card_with_background.json index 7122187d2c..b2e7fd63d8 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_solar_radiation_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_solar_radiation_card_with_background.json @@ -3,7 +3,7 @@ "name": "Horizontal solar radiation card with background", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAC8VBMVEUAAADPfgjntTTCagSpWgHx0kb///rgoCDckg7/+H+hVgGhVgKtYAGaTwCfVgD////z38Pt2sJ8wyL14sPw3ML04MPy3sPv2sL46sv25MT57M7679Dy3cL358f57s/46cnr2ML568z78dH25cawYAH///r78tT89NT++dj358X358n//ufx3MTNegLQfgH///bUhQT//eP++tvKdgH999X//N7rvTutXAH//+/89dWyYgGjVwKzYwHBbAKmWQGtXwK9agH///PEgTH//eDSgQO1ZQH//uv78dOvXQGoWwGrWgHXjQe4ZwLnszPHcwKqXQHtwkGLxzbhnyX89tflri/ioyjFcALwy0zgnCDblA7ZkQu6aALV2JvuxkXpuTjclxP14sX02E7otjaMyTjmsDChVAGeUgH13VLy1EzWiQXKaQ3G1YbkqCvGZQZVUEaDxSzNcBP67F6ay0qx0WnuwzvBcAT248jwyUbkqyzgox7EuaGrpI734lWTyUDVigWaTwHy48XKv6bxz03emBjReRf89trb0bW+133451i3ZAHq2rrVgRvfnRXiqCTflyPYiR6yZASkm4jhq07xzkk8OTT36srtxmzXmkzbn0tJRTzr5rnPxqza46WxqZTP2ZKOiXf99XWKgG93cmTqvGDepEzquDK5ei+/YQLl3cDl3K/i2a/++568spqQkI7++ouq0F/ckCHw9uLy7s7f173ay6/d6qq+t565tZ3I2Ynxz3W30nP88mjv5b3j1LjVzrT//rHk4q7Z3aDmtlihzVXRlEqlVwK4XgHy8vD//87ksFFcWlEoJyTjtxThrhHx6sXs4sW/v7lqZVz36y7OkAuXTQGVTAHLy8X//8Curqv354bz3CTYoRDFfA7j4+P78Y/13oDz133y0lWTSwH//dnx89ng8cTLyrS3rZaCgoKZjnvarHToxRzhxKLR45jG34/rzCf5+OnV1dOXi3j25m+c0FDDjlDAh0TEfCWVSwH3+/Hj49mNwMzJAAAAD3RSTlMAICAgICAgICAgQL/f31DNJ4eVAAAOsklEQVR42uzBgQAAAACAoP2pF6kCAAAAAAAAAJg9eldNGAzDOF5P9VCpN2GnEhsRQhFjlcZB4iGIRpOiQRGM4OIgWhAHXSyY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", - "description": "Displays a latest solar radiation telemetry data in a horizontal layout with background.", + "description": "Displays the latest solar radiation telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/horizontal_temperature_card.json b/application/src/main/data/json/system/widget_types/horizontal_temperature_card.json index 8884bcf132..93804c104e 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_temperature_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_temperature_card.json @@ -3,7 +3,7 @@ "name": "Horizontal temperature card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAsVBMVEUAAADf39/u7u7x8fHr6+vl5eXf39/f39/r6+vq6ur////z8/MjTMc+Ys7IyMjj4+Pk6fitvOqRpePPz8/x8fGtra2QkJDCwsLy9Pv5+fnI0vHV1dW2trZYWFg9PT3n5+cwV8vt7e1aeNXW3fV1j9zb29tog9laedW8vLxmZma6x+5MbtGCgoIvLy88PDyfsOeDmt+enp50dHRKSkrU1NSRpuNMbtIhISHd3d0xV8qdnZ2QKY5sAAAACnRSTlMAIN/vz6AQML+/B+y1FwAAA4lJREFUeNrt2glzmkAYxnHTptfLsssNCgoqGPCsR8/v/8H6LjTVaqsZ66TGeX4ZDbDMZP+yDpPRFgAAAAAAAAAAAAAAAAAAAAAAAAAAAMBzenv3wr1tae8+GC+dd3/Xat29phvw+q71hm7Cm9Y93YRXrVd0ExBybRBybRBybRBybW47ZGiKPKL/IurY9pAalm13dofs8a8te2zRrr+EmOZIOLTVZT4d4cV0GXYm2Mgi9lEwk6salpmJSZ3BA81Jp0Is4TjZgLaU31UexYqUkiqWPG/eJk8SxbHnSUX+WilFkmJ+5vGzdYQYOLkQD7z9SYiPjim+RdTIzcgS+ppM+KSPI26MnhASmQPaIbtE3elaBvNpb9VdynUwl/F82qVeFfe+z+V0LgOfvvCunK6qJZ3roU5whLCITL0oooyfG6MRUWYT2ULYepJ65HTIMNsPUbOgmgYB9cgPeDdYrqpg5vV4bNrz+UATomgWrCo6lxCL+u+Ljr44Q72+OK1hi9FDVgfmxHjEfELI4jCkp5S3DVktp0uleM+bedVvIXp5ncuyomaBWTQWgthiO117MOK0SPD60obOU64IHS6tYF3Jx5BZtVZqXa10yLya+d7cl71qpkO+97pL+je5GNQrqLkO5sHbqENbJ0LMBzGgfd5Ol7dzwGse3va8f8PvcusyIUPBPtPfqYAuzBSsQ0yvKYcuEzIR2oKe0cBkHWLDjDuOhAyfHmKL2reIHvXpj/oG7Wi3+ZHSP7JM7tgJcfaXRvT4Eo/z/ETISDTG9ChpZs3T3Gx4tvqH2/puyr/aZTP92NcnuFQPGf12nXlOR/5zq3nlR2L0x3uNHvl8IiQXjc5uSOom7cRVUhKFRmj4sfwqwzRWYT8xEtclfdjw9YarSqOUxUaW7XM6JtsFntc59uHd/1NzxewTIQvRiHZDvrqJUci0KJqQhEI3LVJ3UxJXuXEd0ncNHbJJiiItSnLTM+7sIjO1vH7Tmw+ZMGmfowdMwcknQqKJ0BzahoSyKH0jCeM0JCpC3/C5IyzT0k0oMUpX1SHtRHIIH2uXYRGHCZ0T0hjwjm3qDYv2NQOZQ6dCKMozMbHpmOOTbBdS0QVYw+hvA9x3GHKGPh1l9Ol53fp/iC8RQq4NQq4NQq4NQq7N/e18PH0zXxho3d17xkv3/t0tfakGAAAAAAAAAAAAAAAAAAAAAAAAAAAA4Jn8AJ01hSMevW95AAAAAElFTkSuQmCC", - "description": "Displays a latest temperature telemetry data in a horizontal layout.", + "description": "Displays the latest temperature telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/horizontal_temperature_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_temperature_card_with_background.json index 0bb6084afa..25168535f2 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_temperature_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_temperature_card_with_background.json @@ -3,7 +3,7 @@ "name": "Horizontal temperature card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest temperature telemetry data in a horizontal layout with background.", + "description": "Displays the latest temperature telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/horizontal_uv_index_card.json b/application/src/main/data/json/system/widget_types/horizontal_uv_index_card.json index c05fb69779..636a0f5630 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_uv_index_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_uv_index_card.json @@ -3,7 +3,7 @@ "name": "Horizontal UV Index card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAArlBMVEUAAADg4ODf39/g4ODg4ODg4ODf39/g4ODg4ODf39/////39/eAwyzg4ODCwsKQkJD6+vrn5+fz8/O2trbt7e3b29vV1dXOzs50dHSQy0bx8fHP6K88PDzv9+XHx8e7u7v3+/Lj4+PU1NTH5aPA4Zatra1YWFjY7L2enp7IyMiqqqqCgoKYzlMhISHf8Mqv2Xun1m5mZmZKSkqIxzmo1m6g0mDn9Ne43YgvLy/H5aK3Tah+AAAACnRSTlMAvxDv36eQgG8gyT+wCQAAAqtJREFUeNrt2OtuokAAhmFqtYevODDAgFIExPOhtrXHvf8b20HcqNntYv9QNN9jgs44MXkRBTWIiIiIiIiIiIiIiIiIiIiIiIiIiIiI6Nsa162LU3fTMIzbpufcnTqv2TBaIc6Ad2Vc2jgHl0YbZ6HNkJphSN0wpG7OPiRdDnBSvgrpmY84EIZAP+xDb4vRVhyjFo4O6VjoP4QPIeIoH42wZVmo3uppUh7S6w4BpB+T/PFycBCC8RSLzibEt6xFiGlHzyc6a+r3F6jG6uPFNO/LQ9LublXXHB6GJGNE8SYkjpLONIn8Z8uP/HESrztTVGJimseFoPc2QToZDnrA0y8choSfcYQiZAxLyzfROLLQ+UQ17t8GaWnI7vAytSH2LBbwI30XWXsh0+diE6K/XseoTHnIriM3wE5f7/c5ED/090LC/M0In8dRv2PFa5SoPmRoFl5S7AnxD2GxKVF9SLrsdld4M7fe8dTt1vDMeGzIq7m1OtmQvw6tejo2JN1+2IeoqW98/da648iQ3usE0CfEd+B116Js/OEdvEB7f0rmo8xDiUpCegeXKANsCQeQgWNnypl6gIR02vkwUE4mnblnZx7gBAJ2JuRmKbJMzyoUqg9Jl0Noj5NN1H6I7WezQPnO3AZcuFK0hfJnKpOurW9eYgOOgJ6VgK/0c0Eg5EyiRMWX8TrEcX3hBa49RxESwBWOUjN/roejIChCEjuQsPXSQMoggVIoUXVIIjxXCF/ona8ANxhJVyiZJGqWzO2k7QuBTYgvRnnITMi5G+jlDkr88E9dGzLAfzlqplDu5/98sL2y15b4Wo1C6oUhdcOQumFI3bSNS5wD+9K48nAGvJbRaHp3p87xmreG0bi5OHWt64ZBRERERERERERERERERERERERERERERN/1G1Juby0y7njrAAAAAElFTkSuQmCC", - "description": "Displays a latest UV index telemetry data in a horizontal layout.", + "description": "Displays the latest UV index telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/horizontal_uv_index_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_uv_index_card_with_background.json index 941cea4b4b..8c0096e803 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_uv_index_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_uv_index_card_with_background.json @@ -3,7 +3,7 @@ "name": "Horizontal UV Index card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest UV index telemetry data in a horizontal layout with background.", + "description": "Displays the latest UV index telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/horizontal_value_card.json b/application/src/main/data/json/system/widget_types/horizontal_value_card.json index fd52ab74e4..c6919027f9 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_value_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_value_card.json @@ -3,7 +3,7 @@ "name": "Horizontal value card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a single entity attribute or the latest telemetry data in a horizontal layout.", + "description": "Displays a single entity attribute or the latest telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/horizontal_vibration_card.json b/application/src/main/data/json/system/widget_types/horizontal_vibration_card.json index 4a2b878e4b..878bc1b67a 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_vibration_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_vibration_card.json @@ -3,7 +3,7 @@ "name": "Horizontal vibration card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAn1BMVEUAAADf39/f39/g4ODg4OD////k5OTYGDjg4OD64ubwqLTdNVH1xc3nboLIyMjiUmnOzs7aJkXx8fHsi5v09PT98fL5+fm3t7f41Nrb29vCwsLzt8GQkJDV1dW8vLxYWFjn5+fumqjpfY90dHTgQ1398fPiUmqsrKw8PDyenp5KSkqCgoLkYHYvLy9mZmZLS0shISGwsLCdnZ3pfZDpfY64MVbEAAAABXRSTlMAIETfv0i0+14AAAO7SURBVHja7doNb6IwHMfxnbc/tS30eBZQQHyYD9vu+f2/tmsL7LadOpZcFrb8PomsApp+04kmegUAAAAAAAAAAAAAAAAAAAAAAAAAAADwlj69ezZj8tl576afJ7rDSendi53J1XVMH0B6fTWlD2GKkJFByNggZGwQMjYIGZsTIZnb4tQJD0RK/XQOJT1wqFI0Jv+GNKwjqXcfUq1UuJ45FIbmRuE+LEvSY3L0vaHc7k8TzZ+MOnNhuHTO3KXHJ7svhHgeWZxRb3Fw9rRW62N9UPfH6vj1sLvfLRbOt69rul/v1bCKVcDIiJgm+cMooU7AjBs6gzOPHmwCyZpLIfxxCE/IUvVubUJUuFc1OYfbmva0WNzO6JvznRY7etl2w7T2eaWbrcx8XTO6Y6v+FCaFNqczBMuol0lBG3kphPFHIV8Eteq6NCGz8KhDbg+zLmRHdTgwhMtItCErM/NtwBLymDDTD/rJPVmMhFMydxOdO+dkfZH2LOEm/QKdDUmy5yGJS8ZiTybkW73QIT/39ZGOC/2vVX+9pYEhGm9DvrC53m5Ypm/m2SXrJurqQk4dXekFTC+ZWcmofXijNzesu5/JTXI2RNw8DxGSHgu77ZNNZ3iI2267BKlHlmCbgAXRQ0jQzHXF3Txi9rzGbD224iLQj8iCFdHrQi76nyERk7/1KkR9SGMWKbCrJ8x5N/1yCs/d6sWSko8zhHhip96HCHthsOfqYaY3NnalU2grjGSkIVbA+MkQr93fSL0W0UtviDx7HsKz/x6iZ9i+2LuXfcCS/i0uuRAi76iViaBPf/XlN6YT4vD5jnhQSMPuuhlG7Jeel50r7xbJHjgV4tr8rdzYC3hE1uA3xCQha9bGxBTmZKUppVPf7JhSSkTL3ZLSPG8P6B3xhZCtZF4kWaRHgR2JbmpzFtgDJ0M8PbDDO9H0i/b6jyg6pCz9XClfjwoq8qJKZ4VflsqvQr9KifxlXFU5xb494KvqfAhxyVh78czMqLGvYbMV5m5EJ0MCj4ytx/Q5goaERKwjn4T4s1j5S78NWZa5Hut9y9wvlA2Z5rkOUbOlinVuEdMFCU/6uG7E/949STD34bF86Md4t5NQ74efF/6sVEVsVsSv8mIWz5Sv94XVUvlkQlKzIsvqhzlQFgW9qS7k1fIlnVeqnIYYQ0iaXjoY0xCjCBkjhIwNQsYGIWODkLGZXl1/gK/ZieLrq4nzAb5oT52J+QnH1HnvPk8+0o9qAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN7IH7CH4Te59eAaAAAAAElFTkSuQmCC", - "description": "Displays a latest vibration telemetry data in a horizontal layout.", + "description": "Displays the latest vibration telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, @@ -17,7 +17,7 @@ "settingsDirective": "tb-value-card-widget-settings", "hasBasicMode": true, "basicModeDirective": "tb-value-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Vibration\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"let factor = 1000;\\nif (prevValue < 1) {\\n factor = 1;\\n} else if (prevValue < 10) {\\n factor = 10;\\n} else if (prevValue < 100) {\\n factor = 100;\\n}\\nlet value = prevValue + Math.random() * factor;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 1100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"vibration\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":0.1,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0.1,\"to\":1,\"color\":\"#FFA600\"},{\"from\":1,\"to\":10,\"color\":\"#F36900\"},{\"from\":10,\"to\":100,\"color\":\"#F04022\"},{\"from\":100,\"to\":1000,\"color\":\"#D81838\"},{\"from\":1000,\"to\":null,\"color\":\"#6F113A\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":0.1,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0.1,\"to\":1,\"color\":\"#FFA600\"},{\"from\":1,\"to\":10,\"color\":\"#F36900\"},{\"from\":10,\"to\":100,\"color\":\"#F04022\"},{\"from\":100,\"to\":1000,\"color\":\"#D81838\"},{\"from\":1000,\"to\":null,\"color\":\"#6F113A\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal noise level card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"m/s²\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Vibration\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"let factor = 1000;\\nif (prevValue < 1) {\\n factor = 1;\\n} else if (prevValue < 10) {\\n factor = 10;\\n} else if (prevValue < 100) {\\n factor = 100;\\n}\\nlet value = prevValue + Math.random() * factor;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 1100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"vibration\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":0.1,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0.1,\"to\":1,\"color\":\"#FFA600\"},{\"from\":1,\"to\":10,\"color\":\"#F36900\"},{\"from\":10,\"to\":100,\"color\":\"#F04022\"},{\"from\":100,\"to\":1000,\"color\":\"#D81838\"},{\"from\":1000,\"to\":null,\"color\":\"#6F113A\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":0.1,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0.1,\"to\":1,\"color\":\"#FFA600\"},{\"from\":1,\"to\":10,\"color\":\"#F36900\"},{\"from\":10,\"to\":100,\"color\":\"#F04022\"},{\"from\":100,\"to\":1000,\"color\":\"#D81838\"},{\"from\":1000,\"to\":null,\"color\":\"#6F113A\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal vibration card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"m/s²\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" }, "externalId": null, "tags": [ diff --git a/application/src/main/data/json/system/widget_types/horizontal_vibration_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_vibration_card_with_background.json index b39869c2ab..18cc00d6b2 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_vibration_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_vibration_card_with_background.json @@ -3,7 +3,7 @@ "name": "Horizontal vibration card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest vibration telemetry data in a horizontal layout with background.", + "description": "Displays the latest vibration telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, @@ -17,7 +17,7 @@ "settingsDirective": "tb-value-card-widget-settings", "hasBasicMode": true, "basicModeDirective": "tb-value-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Vibration\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"let factor = 1000;\\nif (prevValue < 1) {\\n factor = 1;\\n} else if (prevValue < 10) {\\n factor = 10;\\n} else if (prevValue < 100) {\\n factor = 100;\\n}\\nlet value = prevValue + Math.random() * factor;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 1100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"vibration\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":0.1,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0.1,\"to\":1,\"color\":\"#F89E0D\"},{\"from\":1,\"to\":10,\"color\":\"#F77410\"},{\"from\":10,\"to\":100,\"color\":\"#F04022\"},{\"from\":100,\"to\":1000,\"color\":\"#DE2343\"},{\"from\":1000,\"to\":null,\"color\":\"#791541\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":0.1,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0.1,\"to\":1,\"color\":\"#F89E0D\"},{\"from\":1,\"to\":10,\"color\":\"#F77410\"},{\"from\":10,\"to\":100,\"color\":\"#F04022\"},{\"from\":100,\"to\":1000,\"color\":\"#DE2343\"},{\"from\":1000,\"to\":null,\"color\":\"#791541\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal noise level card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"m/s²\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Vibration\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"let factor = 1000;\\nif (prevValue < 1) {\\n factor = 1;\\n} else if (prevValue < 10) {\\n factor = 10;\\n} else if (prevValue < 100) {\\n factor = 100;\\n}\\nlet value = prevValue + Math.random() * factor;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 1100) {\\n\\tvalue = 0;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"vibration\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":null,\"to\":0.1,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0.1,\"to\":1,\"color\":\"#F89E0D\"},{\"from\":1,\"to\":10,\"color\":\"#F77410\"},{\"from\":10,\"to\":100,\"color\":\"#F04022\"},{\"from\":100,\"to\":1000,\"color\":\"#DE2343\"},{\"from\":1000,\"to\":null,\"color\":\"#791541\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":null,\"to\":0.1,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0.1,\"to\":1,\"color\":\"#F89E0D\"},{\"from\":1,\"to\":10,\"color\":\"#F77410\"},{\"from\":10,\"to\":100,\"color\":\"#F04022\"},{\"from\":100,\"to\":1000,\"color\":\"#DE2343\"},{\"from\":1000,\"to\":null,\"color\":\"#791541\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal vibration card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"m/s²\",\"decimals\":1,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" }, "externalId": null, "tags": [ diff --git a/application/src/main/data/json/system/widget_types/horizontal_visibility_card.json b/application/src/main/data/json/system/widget_types/horizontal_visibility_card.json index 2d7507602f..e7cc869d8a 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_visibility_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_visibility_card.json @@ -3,7 +3,7 @@ "name": "Horizontal visibility card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAolBMVEUAAADf39/f39/g4ODg4ODf39/////k5OSAwyzg4OCg0mHf8Mrz8/PP6bCQy0bv9+XOzs75+fn3+/K3t7erq6vCwsLA4Za8vLyQkJDa2trV1dXHx8ew2Xvn5+fn9NjIyMi43YhYWFg8PDx0dHTY7L2YzlPH5aOIxzmenp6Ixzrt7e2CgoKn1m5mZmYhISHb29u43Ymo1m6tra3H5aJKSkovLy/b7uh5AAAABnRSTlMAIEDfv1C6kOEmAAADOUlEQVR42u3aCU/bMBjG8a6wN27jxM7dXE3Tm2uw6/t/tb02ZWEbdFWpqoCenxCx7EjwT0xboAMAAAAAAAAAAAAAAAAAAAAAAAAAAACAc/r07tmM4YXz3o0uPnOHE9C7J53h4FLSBxBcDkb0IYwQ0jMI6RuE9A1C+gYhfXNIiNwSleXWIZaVccaHG1rQVsoevUw7JIR+SmrLUpIjqSgmMRfFNKdY3nALOXRK7jr11NNoSTueGB8R4la+EJuxp+jJZOvMaVFOFvNyEk/au5a+0JzbfrTRggcnlArmT3+P1PEhaix2fI92yjZe2JBMcgjfDWlDHDPklNPxhO9OU+ETKTOaifHRIdMNF6xDmt5yyox22rbgkKK8i23Izy7k5kdEpzMWZjddCUUz88XDKxE+C1EqDBV/a0vFS567N0SZDkUun1s9K5nMiUO2d23EIXftDT2GxHOnnNMJLT1lQ8Jd0kpMu5AHsQpdsTI7Jk3tvtsT4vMJ3+nBnBUK9me27A5PI95zp+aJFXGIS/bz75DUXmG+uMuZ2TRLX6Svh3iCuVPBZrQS4r9bUy4cOjHli+kLIbaDQ8b2Rnlm7vb1kLUNUV2IT+cWmiv9b8hGmDwbYqft8PWQ0DcbkCrB+TbHozMLV6bj3xA2OziETa+E2ChaeiFVtuncKjHbHb0/ftg3yyvhHhbSlfic4Y6fPWhJeoG8/ntC0ps9PG38tfhqn0y655Gl8MODQ5haiZ3Nd9qJbAx/XOdkBQEFI20mRhQQUR3XFOT54wJPHJu0FuJrxTyzyavUF2kXQrfcdngIc6sVV4zXIT0LKQqdN43mUUJJnmRBlOiiaHR2rbOASNcyy3KS2i7oJjt2Yz2q7IOX2MyoCzFt6/0he3QhOpKNrvVjSF3c85jn6lwnjQ0Z5TmHNFHdSM5NJL1ZqMJTv/r9pu8THRVNIs0d0VmeRDJqNM9dZ3WjyYQE5o7U2TezUCQJHeH8v1jlNb2uaO7pEH0ICYJ9i5IO0YuQPkJI3yCkbxDSNwjpm9Hg8gP8m51IXg6GTo/+gnuswBkOBp8vRs57dzH8SG+qAQAAAAAAAAAAAAAAAAAAAAAAAAAAADiTXxBy+4qYs+NTAAAAAElFTkSuQmCC", - "description": "Displays a latest visibility telemetry data in a horizontal layout.", + "description": "Displays the latest visibility telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/horizontal_visibility_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_visibility_card_with_background.json index 95bf6c6a82..0be7d6a74d 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_visibility_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_visibility_card_with_background.json @@ -3,7 +3,7 @@ "name": "Horizontal visibility card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest visibility telemetry data in a horizontal layout with background.", + "description": "Displays the latest visibility telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card.json b/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card.json new file mode 100644 index 0000000000..a06d5231f8 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card.json @@ -0,0 +1,29 @@ +{ + "fqn": "horizontal_volatile_organic_compounds_card", + "name": "Horizontal volatile organic compounds card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAmVBMVEUAAADf39/f39/g4ODg4ODf39/////k5OTYGDjg4ODdNVH64ub1xc3ri5v98fPOzs7iUmnwqLTaJkX09PT5+fnnb4K7u7v41NrCwsK2trba2trumqjw8PDn5+fIyMhYWFjHx8fpfY/gQ13V1dXzt8Gtra3kYHaQkJB0dHRLS0s6OjrU1NSCgoLb29uenp7pfZDkYHflYXZmZmaiBA8wAAAABnRSTlMAIEDfv1C6kOEmAAADj0lEQVR42u3aiW6bQBSF4bRJL9csAwyrsQ1e4iXp3vd/uN6ZIcitWtrIaWS751PijIEg/2YGKYpvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF7Tm4tnM97eepducvtOOrycLl7mvb25y+gK5Hc3E7oKE4ScGYScG4ScG4ScG4Scm9+HqIp6809EyyVt9yXRZr+d0zn6fYjPIfUe59Qt9x+WD0vvofzU0dyj0w1nV/0onEX3R6MRPgd/HxJoHk62/+Q90sOGykP5gaj0ukN3asVK8zDyyYhY+EpGBYu1Oi1kliiyCp6ptD9+2W0P9OjR8rDdy1PvYbukU6g1CxKVloFvg9gPqx2viFIzWnN0WgjzjCI21rTihJyu28jkIpld38g7zJfbBzpF4EepCwkTGfnujUulkDVRYqZCJVstFSh1H5IIAlJp2IdUMhoNSbUv5yiKIuGwGN6V/SOR13WdRx+6RzO1DnSiwIW4S0FizaF7iebbvqOqn3FfNbNfmcAvLCPZ6dtRokbXyIy1PZHSmgv6wfzo4YVDXIK7w3A/Cp6WTpTu2Dch/uze58Ts89PU52g0RI4vXJGJH/FqISt51LI94dT+npJ9lf298ZCQP5ORslY04tVCInfrsSFuCg6TbzSEdhzaBamlaPCKIdqO9FGIe3QhyVFIMB4SaLfY04RnNPjHIe5eRZrV8DLpKGT3yytC4yG062+/FXNFRka/kM1/3pCdEhLx5/6muzIvPeXkKaQw08OukdmwRkJzxPoPIYE980oOLhKypjZGvuYNWXlO+SQ2GyaUy/PFdkF507gdsiF7fojSXEQ+p6aGi5WWUR8i29furqXNESt711qZI8ZDAm2vg2KTPYRsNnHTtrGMaqqbusyndbzZtHE5j8ucKF5kZdlQFtsdcVs+O4Qqn1nPSNwPIxuyk6dJICF2tFMmRPI4ovEQpXXgVt/9Ucj7eJq18SJ2IYv3H2Us2xZNXLc2ZNI0EtJOF20muXVGzxcEahiR5daIe2rXyHCEcqPxqaXcj4qebOOPdTzdtHVmrkhcNvU0m7axbJuXizYmE5KbK7Iot2bHpq7ppbjF3oe89B9WzWJk5/v2ozxeRkiej+3M6CWFUUhOGlX/95+6FwYh5wYh5wYh5+aKQu6u4N/sRNmdfGDgCv7RnssHBm7e3U68S3f79po+VAMAAAAAAAAAAAAAAAAAAAAAAAAAAADwSr4DXzz6NDozanMAAAAASUVORK5CYII=", + "description": "Displays the latest volatile organic compounds (VOCs) telemetry in a scalable horizontal layout.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'voc', label: 'VOCs', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"VOCs\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:molecule\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#80C32C\"},{\"from\":500,\"to\":1000,\"color\":\"#FFA600\"},{\"from\":1000,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#80C32C\"},{\"from\":500,\"to\":1000,\"color\":\"#FFA600\"},{\"from\":1000,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"ppb\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "vocs" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card_with_background.json new file mode 100644 index 0000000000..75db4ba6f8 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/horizontal_volatile_organic_compounds_card_with_background.json @@ -0,0 +1,29 @@ +{ + "fqn": "horizontal_volatile_organic_compounds_card_with_background", + "name": "Horizontal volatile organic compounds card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays the latest volatile organic compounds (VOCs) telemetry in a scalable horizontal layout with the background image.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'voc', label: 'VOCs', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"VOCs\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:molecule\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#7CC322\"},{\"from\":500,\"to\":1000,\"color\":\"#F89E0D\"},{\"from\":1000,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#7CC322\"},{\"from\":500,\"to\":1000,\"color\":\"#F89E0D\"},{\"from\":1000,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"ppb\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "vocs" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/horizontal_wind_speed_card.json b/application/src/main/data/json/system/widget_types/horizontal_wind_speed_card.json index e31569ea97..c2acbd33cf 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_wind_speed_card.json +++ b/application/src/main/data/json/system/widget_types/horizontal_wind_speed_card.json @@ -3,7 +3,7 @@ "name": "Horizontal wind speed card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAn1BMVEUAAADg4ODf39/g4ODg4OD////g4OAjTMd1j9zk6fjx8fGtvOrOzs7IyMiRpePy9Pvj4+O3t7fI0vFaedU+Ys7z8/NYWFj5+fnb29swV8vCwsI8PDy8vLzn5+eesefV1dWenp6QkJCDmuCCgoJmZma6x+2rq6tohNkvLy90dHRLS0shISHW3fS6x+7W3fXU1NSRpuNMbtFMbdGsu+qtra1mE7QcAAAABXRSTlMA7yC/r1EOHTEAAAN3SURBVHja7dprU5tAGIbhJPpmOW2AcAgg4ZRzGrXa/v/f1neJLbY2FJypg5nnMgSy5MPeLMw4oyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6G1yM55+drcT7hgb9OkZ48no9go6uORmNKWrML6WkClCBgYhQ4OQoUHI0FxtyIneMgpyUnKd0qCzkDenKB36Q5HTB2oPERW9tTdWIYUO9xgGdxlfeOwo3Tsy1Od6c9T+IKmfOSkPZs1uxu05XbYxO4VolGWbk02vHWQYGnfEP4e7rXNcq5CwcBzny+FopMew4LGVwSdlr4oqFqRooqb/qvB4Fpf5WqeQ+N4TLPZ2M3OuU60ow7JcqxBnW662pEKc7V3phLTahmWxXq23e7mmPitiPwlGiieyVyuyiYVoC9mI+44r4vH2IITnPQsxJyXfF3Jf/BZirIi+OEdauWEh89VBSnmgdY8Q3Z+ZLyHPvGvMvCxrQmzdtjcbnei0OVFN84npfJW7hJAQ30hXIbV9zq+XkDxc73moDMOVs18fHTfkWytUt9Z6L6kP/SVExGTTa2YTookqFiKeq9ukqsvUOdsT7Gu3EG22UyF/YfzcOaFRHzTbe0JsEfNcd/qFkHhm8kSezCyuZ2Oq969i9zDnz20hPj8jvi9E7O+qbGNTG6OkFh1DeBdrlS/8CyGz+ou6OvzGA5763k49J6a2aV+RSpuZDzr9Z00I2TpvfH3bQppDfqNM+Jq6yO0hH6IJaWbcJcQUOjHTV8/IwELmpppb1S3k2aMznVvMviEB/W3Q+HMgeF9IJnb87os5j/wr5HSe/JNvE83ErG+IW8fwy4iotljQYmqpgSktiGi5XdIiis4neCDoE2L7Qpt5wldJWnsIb3VrJTwz88X9O0Ly3IqktPgooSRK0oWbWHkurdSwUp65tQzSNKLAqk9YMu0RQronhPB0FVL9I8TfkWJX6pePjN4R8mi5gbSW1jlk+RjxMY8tIyuRdcg0ijhEuksZcG4SUB+2bp/31G7ePBY6h7eFzHV667sVJZabyyRQK2KlUeIGrrR4zEiX0iIVslArsky/qxN5ktBHUyG9RUu67FFG1MUQQhaLtpMBdTGIkCFCyNAgZGgQMjRXFDKmqzAd3VzHn6dvr+cfBkaT2+lnN76ZjAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgrx9YOdsEpKcg1gAAAABJRU5ErkJggg==", - "description": "Displays a latest wind speed telemetry data in a horizontal layout.", + "description": "Displays the latest wind speed telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/horizontal_wind_speed_card_with_background.json b/application/src/main/data/json/system/widget_types/horizontal_wind_speed_card_with_background.json index 3808c7d538..a1fc60bd29 100644 --- a/application/src/main/data/json/system/widget_types/horizontal_wind_speed_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/horizontal_wind_speed_card_with_background.json @@ -3,7 +3,7 @@ "name": "Horizontal wind speed card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest wind speed telemetry data in a horizontal layout with background.", + "description": "Displays the latest wind speed telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/humidity_card.json b/application/src/main/data/json/system/widget_types/humidity_card.json index bf034c0bbf..ea1f3cd17c 100644 --- a/application/src/main/data/json/system/widget_types/humidity_card.json +++ b/application/src/main/data/json/system/widget_types/humidity_card.json @@ -3,7 +3,7 @@ "name": "Humidity card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest humidity telemetry data in a box layout.", + "description": "Displays the latest humidity telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, @@ -23,6 +23,15 @@ "tags": [ "weather", "environment", - "humidity" + "moisture", + "dampness", + "wetness", + "humidness", + "moistness", + "dew", + "water vapor", + "condensation", + "dew point", + "steaminess" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/humidity_card_with_background.json b/application/src/main/data/json/system/widget_types/humidity_card_with_background.json index bd7c696405..31f0ca2444 100644 --- a/application/src/main/data/json/system/widget_types/humidity_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/humidity_card_with_background.json @@ -3,7 +3,7 @@ "name": "Humidity card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest humidity telemetry data in a box layout with background.", + "description": "Displays the latest humidity telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, @@ -23,6 +23,15 @@ "tags": [ "weather", "environment", - "humidity" + "moisture", + "dampness", + "wetness", + "humidness", + "moistness", + "dew", + "water vapor", + "condensation", + "dew point", + "steaminess" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/humidity_chart_card.json b/application/src/main/data/json/system/widget_types/humidity_chart_card.json index c66869c29f..0a352cd2ff 100644 --- a/application/src/main/data/json/system/widget_types/humidity_chart_card.json +++ b/application/src/main/data/json/system/widget_types/humidity_chart_card.json @@ -3,7 +3,7 @@ "name": "Humidity chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a humidity data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a humidity data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, @@ -26,6 +26,15 @@ "tags": [ "weather", "environment", - "humidity" + "moisture", + "dampness", + "wetness", + "humidness", + "moistness", + "dew", + "water vapor", + "condensation", + "dew point", + "steaminess" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/humidity_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/humidity_chart_card_with_background.json index 8e3d3db401..e5e3435d58 100644 --- a/application/src/main/data/json/system/widget_types/humidity_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/humidity_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Humidity chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a humidity data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a humidity data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, @@ -26,6 +26,15 @@ "tags": [ "weather", "environment", - "humidity" + "moisture", + "dampness", + "wetness", + "humidness", + "moistness", + "dew", + "water vapor", + "condensation", + "dew point", + "steaminess" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/humidity_progress_bar.json b/application/src/main/data/json/system/widget_types/humidity_progress_bar.json index 12b81e5be7..cdb98533ed 100644 --- a/application/src/main/data/json/system/widget_types/humidity_progress_bar.json +++ b/application/src/main/data/json/system/widget_types/humidity_progress_bar.json @@ -21,9 +21,17 @@ }, "externalId": null, "tags": [ - "progress", "weather", "environment", - "humidity" + "moisture", + "dampness", + "wetness", + "humidness", + "moistness", + "dew", + "water vapor", + "condensation", + "dew point", + "steaminess" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/humidity_progress_bar_with_background.json b/application/src/main/data/json/system/widget_types/humidity_progress_bar_with_background.json index 697d527eea..4eaf46e7ee 100644 --- a/application/src/main/data/json/system/widget_types/humidity_progress_bar_with_background.json +++ b/application/src/main/data/json/system/widget_types/humidity_progress_bar_with_background.json @@ -21,9 +21,17 @@ }, "externalId": null, "tags": [ - "progress", "weather", "environment", - "humidity" + "moisture", + "dampness", + "wetness", + "humidness", + "moistness", + "dew", + "water vapor", + "condensation", + "dew point", + "steaminess" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/illuminance_card.json b/application/src/main/data/json/system/widget_types/illuminance_card.json index f118b2dd61..a728e235bc 100644 --- a/application/src/main/data/json/system/widget_types/illuminance_card.json +++ b/application/src/main/data/json/system/widget_types/illuminance_card.json @@ -3,7 +3,7 @@ "name": "Illuminance card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest illuminance telemetry data in a box layout.", + "description": "Displays the latest illuminance telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, @@ -23,6 +23,14 @@ "tags": [ "weather", "environment", - "illuminance" + "brightness", + "luminance", + "luminosity", + "light", + "light level", + "light intensity", + "lux", + "candela", + "foot-candle" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/illuminance_card_with_background.json b/application/src/main/data/json/system/widget_types/illuminance_card_with_background.json index 7cdf502d79..2048c150f9 100644 --- a/application/src/main/data/json/system/widget_types/illuminance_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/illuminance_card_with_background.json @@ -3,7 +3,7 @@ "name": "Illuminance card with background", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAC/VBMVEUjHyAWHB8WGx+XZDiRYTk9MCeUZTtAMibIyckYHB/LysnPzMrNy8reI0Pd08zQzcsWGx7a0szZ0czTzsvf1MzVz8v//vzSzcvX0MuFiIn///7m2c/j2M7r3M/d1M3t3tHb083h1s3o2s7W0Mw7LCTf1s48LiX/8+b//PkyKCLo29Dr3dEuJiL+8OM0KiP45dQ5KyMcHR/68+z/+fL35NP559bw39D/+vX89vA/LiTr39QhIB/48Ojz4dH97uBMNSb78ukjISDk2tLx4tXo3tU3KSMnIyH77N/w5dzu4NTw4NP77+T56Nn05NU3LCT14tI+MCYrJCHk18z/9ev/9+//+/caGhry6N/99e325thHMiX66txtRSj369/n3NJGNSiLiomXZThCMif37eX97Nz86tpDMCXcOFTv49jh2ND/9Ony5NeTYjdgQSpQNybs49pwRylbPytLNyn06+J2TCtXPChAMCZ5TSv36Nvr4djf1MupcT+lbz6eajvz5dmsdUJUOSf059zX0s50SipmRSy4t7XPoKick43UdoZzcnGQjYyaZzowMDCNXjWYkIxySSmenJqzn4/ee4fLv8HLtLjo4NjFwsFKSUixeER6UjBtSS786dfj3NaUjotQOilyTjCuraunpqSgn57fkpjdLUugbD6YXiyQWSyAUCre2NO/vr3ZTGTSi5eHUyrb1dCglY6Afn3XYXVpQyeHWTO0bjKAVTKkmI+onJLGejisZyzWubrPtrnRlqD9zJvTgY7ikUr3sXLyp2T93LnQtJqVlJKGhoeibDvczMHSxr730Ki7pJFcXFzbY3a8dzugYSzswZqZl5X7u3/eTmXQhEGlaDP917DeuZjHrJX8xI7YbX7inV7dOFQ/PTv/6c7vuobxnFG4f0zihzjIvbPPjVO9sqjoxaX84sXNqrCto5vjqXJsaWfbo6jUspRlZmeOhoDaWG3aQlzZjpjahI+WjYXIoHy2kW+HZUrSei62mn+ceV3eOVRkTTvSrLHhu6eGcmIMaDY/AAAACHRSTlMT77cgv7+wr1+KSX4AACaoSURBVHjapJVPiBJhGMYtiOo21w7dPr4QbBjbQ0iHyYNegmGGdaGGhalh69REM+xMhwiCBKlQ6NYa6SldugiZ63YYRl0oLCxkdRuiUSMQFupWewmi93WwKZEKepw/zh+/eX/zPO9nKBTav+/wTzG4Mr98D87Pau6V6OFo9NSpU/FTyaQUAbHhsCAIIqyUClRVVdHCjWiJVCRUYMMRouVNbXC/XL3cK5XKpdXStWyt7DS3OwPPO+557YuNRne4bD7Rlq+Vnz57trndbJc2P3SeXb4UZjlBpISjonowBNo3LT+oifm1woBs/mWsPlDUB4nHkxFUOMwCAKKIIlUVQFBU3KmWKFAOQSJSMi7uFg2qFvTlq9X19dWr69dd+53TaNmt1hgomu6wnC0BZfl1qdzrXRhU87oCA7MsR4lILM6C8cAPvzYfBotmfi98esjMgMyyzXJIks8hCCyhKBVARKBQgMNQVWpRcISNSFIyKXxZUwhL9EtWjBYKPP/R7jrNZst13X7Xbjpdp5bWTVPPr9bWszeyu4oEI6PXHBUIgTcEnwMhLBSXqSnMbKgCrH+IVxSyFZ8ECwQcwkQUgyUAhKUohqEoQGOpkAoWHUGQXd1SWClMOUsgtdGtjt0YOk7L7jZsx9l23OElmecs46aWv1C6Xh18A7eRREiIlIoWUWGrhAITfEN+qy3olrk0QaYCEPADHPFbBB+HEvCd+aky8IO2wIuEK74j8hvNwB9YjyhYaGrX2w0HQNxut/Xhg9O0h7K8VpQtPr/8fHM3O/gmSdh8CRyXoxS8JTEagtqDZDEzVf8LBRPgREF+sKYgQCJw2O5IAhwIYRgF3KlEwB6RwDyzXWDBmrXv+SqlpKjd77vDYXNs9/teczjs2tuW/qWop8187UKnl323l4yEIywMTAjBicPCiSPEBI0Q+DFhClLmH0f/lKoABEgmyfIxsEdw1oIgURVjhckyFOBQCeEwW3BrtaXruqXF9G/0iixnzZHX77r9xePHjqXadn/cHtE1nacyr69Cs5fefYTBASTBUeh2yFZMRJDZYmYiNef0XJwAJDkJlu8+iyTA4s++2Bvoh2EgCeQbIFnEHW2l93RFM7hwTKbaKD1aWXlwfCW1uJhaWPBOLnl7Mq+Z6Zualn3deXr/4yCGY0cSaDUHGBREsEdA89qa+QtAYMTMn8jUDxafh8Wy8CxVoH62DEQBIpiB0RGwxNj5uvc9z8mEixFe5su9u97CgwfHUisLqZTnLY5b5VqR500tnU53nM1Ox61hq7MJAS2BoS3chJggRsnPR/5b51F37sBy5yEqBwvoYS6Ty4AqvjKVDCqH1zKVl0e3Xm5UNjYqGdjW6/febp07cXphaWnp5MmTx86eGY+36vWN+j3Up52dnU+tF3BrJpe7/R7QMbITEETwTXn1+NB/6wet9dOaNhyHAbzHMctE7UjFaP3ziwd7CRlsVnKQ+CtIx8BbvOw3WC4JHnIIBLwUlksZDG/ZKW/Ai3tfg72HPd9vMJa5tpf4tHoUPjzfJ/o6zzlSeZTqPpqmNSiaVs3TSHaBo1q60a3VkW7HCFQ696zxBzAo78a2G0rHoPT0Vvtq9mnlp9ku0fC5v8UQWZhfhXlWfN39eFVCCgdDDvkHohWQQWIEzqilX3TrlBogjgwjQGBACBIBEoABR799dTdb+etsmzSqlcrPL7EwMRBTCG6ELX/KchxD2HGQ8P/jQhhSYwhVAog9BmLMsexovlZOoCOAXDNEbneDKiTfcVnmIsbrrJhy83QOSPYWbqSAwLF1FEE61MglSYwgC13bAmG5XOKNIdJBWi2CoBLfl1QJJBshBG5rYd4Awp2cEHJ8WxqFHIMEDqlGeo8glwzpBCp0PWsJB8WybA8jUWDA0W/jtiChSkiyQSPo4yZGI/vfJs1Sl/40BGEJO3ZZJqXCZXVqcABSRyNy7Xq2lSus6dT26LaYwZD3dzNIMpYAIlDHkMZOEm7kZEvnFJBD3uKwsjSVSjeokAMkBGRKEHbYfFuKISNASOL7KY4r0Ta32IgYilgAQn2UBznn/MdxJGnkjoly9Is3XEj+2HKk70YEGQNCDrqtyajPDobQ3kOSDB4EMYb81OKA0yzTAclLndBAMlkUUkAChnycLjF3DIQSuT4g5MDWc8hqzpIHE5UMScMQTvNkfRyvhB1cyBoz7nVQCE+dt+5M/G+fvSk/txjiEeR6RAw4AMHc7+9Z8kvc4k/EgHAbz23kLyt2E9o0GMYB3GMwrUGseHDWDzrBTqQTEVsmyraWqgiyQ4bKZDLYFA9FBrJeKoqRVnIQtjUXka4MPzY/KhT0MIYfFTaKTnAojDKE+VkceFBRRPD/PG2WZImrB/+YBbdLf/zf532T3kqO/w8HJBbL6qqjtZkKAQSBgyFoBNO+C6lCooBU2tiP7KRKEudIcj8YCIfDgUOB8DJSYET+Dhl19/wzZCkHGEZ4QLCwQlhYVAgg5EAhnjorpKsLhRAEbYChQw4ePkeS+8Fw2BfE0tqGRqrvIv8Lon/qpShYWAxpbcWR7UEhkKxENqzwbqw7ZkDg6EXao/tC5NAhuB883NfX3h79GAiEA7jCgJDCCdJvg+A3powogjD/VCgUHSBSVsHHXQJiOGhhbQABAcPrIUjUgPS2I1yIPh58Y0hHR/tHnOwB/Nu2hSCOM5LsGRA4F2+NCZyBnqRgSkoWBLWIm0MhUqlEEMk2JFXLKosDEFxexOPx1K0NnYj2dgGyHZAuKHQIKBxeYy2QHO3oeBKEAo1swYywwwYZc7shMUIOt3tsSYjhkJS0ZKuEXQuFsIN33oUykI0b2/xYWXCgEYZEEYL4GzDuHJr6nbsPHibJjp/YsWAJh5fpb4eLG7nndo8umhX3PedGhrQhupZrKU0tZ3BJUrksdWo5tVQQxZyqaoqY1VJqKSeK+HMps+r8kKZqEzQg7OA6SEFP6v59iQ5yVCGxGCCxyu7r92+i+PnJkSR97x+fpkYIwgz7OQIJNdI/PjrsHh69xY3A4Qi5LGeXZ3HJaiEll3BlJU2TUnI5W1LFLN00sVMuFrRIOq1qL3AbkVOZklbZeTnsYMimBpwiTXu3VyC9gMQIEvIjcFQfHRto3kGZnPp8NegL450ZjVAnDLFP+wcsJ07PB0iEWpCUKy3nREXurEAkMSWLaUXJFFVAFLoKckZKFzPlrRMTdxsnmuu9XnMfXEiohSFwGJBoHJXoEJL4+SG4pWVqZvKbz4eTBEuLFcDYIHAMu/XweNSGuOTORRBFi2iq6qpCOmVMyPk7842UtycZ4jU5aGWdMjcSjcVjPCQkYQgHEt6M372cnfwFScAHiH3XMsbbyPBALYjLCeLKyYorZYIoUvqSmNo6yEcIIEg9BQp2NFQge02QWDtXgim3SrAN/87PTf7oxrAHePvFZYPwvJtz76+QEXk+W1yASAsQkRrJybmCGtEh6YiWLUfSmcZiJqedxOdnhweOOooO6apC6AE+Ho/xBlyV6JBN/Mjy5Hn+0/vvAV8QEIozZNgCGe4XLMmpgqDN8y2lRubVrEvNuUS1ICrqC6moSTlVwo4lpouRUlkdKaiKiEvKlGRt6MqVj6XG0mU4aE3hBocOWU+QA3shqUJC8Zh+lMBhhqCT19evzU5+9XVvDuvDbpmR8WQy2S9cdFtzEadk0vkJ0vKcJemh/9DvzE9geC3kt5ArzfUcDAZ+6A7+liTRp0O2MyRUgeAphQsxIKjk9Zsbcw8fXzgT5BlhiRlCszGAM9Ea7MG0fzlDEMNhQJhihZwnx2BlPsDg1JkgLYmOA00EQQAJhbgSlqzjQtraqhBU8nnuxvTM5JMgIOQgTG3I2NIQlzPEZYHgiyyGtDaTw1NvKEwjgkIsEKMSbqRObwT5PH3t+MzM1B5fNyD2XWsAwc9FEDpKkFqFLA3B3ntzMFaFwGGHJPqoEJ72CqSVK4lCYoOsf5d/Nj03N/W9G5BKH07nyBcDYavCGcKpvbJicUDqvcZw0Mdra8PNjxHhQpp0SBwQVBI9B8j6hk0sMRp59SB/++zMp6/Bbn7WAsYJMm4dkX99F7EXYvoTQ7gRxHBg5QOC04FGBF+hNCG8tOgAaQ2dwJmYIMg6gpBDX1r5/HT+5czskTN6I45viKO2Qmo3giw40iPiIsca2rPi8cFjzf2mPRfhGaZZ30eb1oEufv5lCB7fQyfwZps41bJ/PfYtC+RV/tmz/Nyj2atB+5cPzkd7j202/tBud7EthWEcwF02IwSZiBkzWYhl6QUjLqxLt6Q6bSQ+oq1UGsxXoyIymV0sJalKL6QyeoHQkhCN0Au2ulh0rFoSlCEiQUwlEwkXIyFu/J/n7bODM9/H46urSPrb/33e95z3vCLxbyFxPSQRVYpkSL1PkFiiaw/tOLwlgjjkGqoE8W7wer27+CaX70Ts2GvY63Y7lyycqSJhBieSvnTn7MATNAkS+clOY5cs7u+6dH+XZUgsxL/FymKpGCQm09iysgmxshAgplAiOnZcMjnOdKpgGmtKxgCZHCocHET/5qYqSD6Pj5XLd3RUV+dyfC2IWQuK9r0ouTfEe53t7YAsb1mIGVgcVK9epm+fvf3k9afdah2RZtfV+RLkgGl0SDzbn40ls4Vs8lQqOo4yoJ+pQsQ3Iekr+KJj+wvZRCySDcXwVYhvDaODzc14nMOQ7qGDxeri8NDwYPXFnnARl+cEaW9vx0Dy+zs7t6Av8BbuPRxrHY5653KKhBkCSaefPXjwpPejLpE/hISSyVQo4UuGkmWpcQKZkEpOyIYKCbw0hWJx3zh6txCLFwSSH67oIEhHPlc8WB3OV/YMDvZUrni7ApAWvxsQt9PZRGW300UuOVCQ0OBCzZR6NdD38PWNJ5mP68fIw8PRIftlMfwBJOFLpEKmeCTLkHECiU3oD/XHqUci0ShDoniRGIGEK6YTpOLg0FC4+m0OkOJQZeVwB0ZWk4KUJC0ozsNms21EKOamloVf1yOcWklfen7v1m6afuWefVQJF9ZCPSSRTMZ88VgqFE+U9SfKUiZA4v1jo5RILBs7FcXLZNZEiRTwF6ZYUiArhnM5guSHq4vhyp7iiu7B/HBHLsy7oXCsxUd2O1F+/KBdBlsDlQ3v4+0lX9WjgavpS+m+DA+tnz7o6TpP1WXSVySbzcbjeOoZT+LJZ7Is6qNmj/gKp9AjvviEsn56ecoXjZiSEXoRSfK+3FBXc23xYPdBSqQYHuquzHV3hwdnFrsv5tTOWzu++0RxtFM0cNmWLavDM/e6OkWBZTkhlqPupq8OPBjIPAaEHPRzVIhcp/Dc+/sLSSr27YooszJB8BwHE9G8Cp53aUehMp/LXczzQFlCDIwifPNL5V271mvDSr+NSiiO+gWEYAgCeYA++bDpl5vYm2kR6fozSH/ZBL2E3sCObxUgdNtaus1DdfT0DAKBomGEz42iCBobl6lqXOlatQrHB1aWKK31ZvMCVXcHXt++1Ju59unXkMNoETj+AIISBTkgoT9lq5QgdjskYMyj7XXMQQiDRgp2RdbStx+PRlZyufB6Dr5aNZ8KFpY0tEIikBfP71x5krl2FENLTjcB8velf7j+DUQcBKmxAoKrJsWgWoiCY4HbAQd9bir+6C4UGItWUy2aDwkoDRtbj0kkd3sHzrzsu/cwYFGbD8ZDRIJ3JBByTJ49scZaaydJrXpow0WtKw58bio+MEAaMOZysWSlgqhI0COvr9x+lrl33WIx4EGPfmzpSwIpnz1pxtZ5WONmcokCDqdZOeRz80dfDQ++nMI1dy5nMkcg1PGP0leu9vbd/EAQpGEYRE/5LpDyckDW1doFwgyeSc0IpKFu2yo4pkgRhhnTUPiSMkEkODtUTxKefi896+17ejnIEKYYDxHGt5CpVTUVuHyCopYgJcaCBeZ6QOasnL9oLn/uEYxiiIQhEgn1yO30w0zmlYUTMeTAwE8fvGkOQCbWTJ9XSw5tumKHgqxSEKGIg0oNLoGoKfjRg5cb7137EJRml6FldCRSysEQNMmsCoFwJOxAIA6bGlpaBHilXsuXBNlWh7FFkZDkUTrTe+3m9kBbsHTRyIkYIRndIoEwBBMwR4K1UCBmCqR1IyCu+atVJFJ6yEgkqEcDjzOP0eoWQFCEMQCC+jEEDgWZOmkGjy1kwl0iiQBiq5Mm0ZfqER3kaiZz9zMcJ3TTr9GZSItIIIAgElrdZdoiCSeCSOZsW/WjSGT+FYiZYrx7r7f3UyBgCQTUEQ789t8h4pg6aWINX6a0cC0ZGVvHeGxxJCzRO1ZrkHoFeXWz91UgaCGI7M8ZAxHJ6HMWIHxQYwZF0tTkpxsnToQjqW9ttVGXQAKKvj+0axRbq6PezCne7Lt20hIMoACBxGAISgdRDiRCkWBRxBaPH3eBS6hk/m1dS11Cg0tC0RjskOtfONS/uNb3CYFgaAVlg86AQzWm34HIWSYrSZwikYnLUZKMLO+skDhc2h0JOcxut+Phe4qjLQgIhpU0u+GR6CdfcsgZIDtDWCKDC3sMDUoCirJoDFpBGrCE4MaKA3Gjcm2BIBhIRVZ2gyEofYuoVueqYgl2FyCRtV1JbJBsAwWpwMJFDhc3Obqc2sOsHJ2d/kNtbW1B5BHQXf0aJ9Eus7TJlyEiwegiCmJREJRIQHHBglxQi6Q5iHHsWOn20Injv1v23NoZDLZhcFkAkaehhkMg0bcIDCKpURInFRyqICEKUkEspTtDSYMcNKpQNCjtOFp0KBBEWdDuaHbjE5FIvr6C1wLRJNPX1bLELCUSW4Oy0O2ua1ujMMhRuhMhhtV6rscCCYogPGXhl6GnTKU0iOaYOHLKrGZ6BSTYckDhEyqHA5KNG7E2goKqw+4DGMpxrHQj0tRix1HIcxeqeoLoESyHHoLw4DIIIhJx6CETuUqh1HCj+J1wOOqp2IFIAIGEireGoGAHQ5xwgLGVDkJ206jCL0AYQRqjICiF+AoiyzrnwaUNL2oUP5YELlagGlDCgAOlJOC6nS322nXWGjhml18MeuDY5PHwJrY8DDVQIvUNRAIRiRzqJ0onURRiGRUNLL3EgX1Gv53jAGN2eTklEvAwhBBGLYh6iKyHWiAaRBoFoTTTMyns+XqVopFK7S2iQbiwha0YTfbmdVtrqibtm12OG4NuzFgej2exZzHPWvJU1/h219Z1hrCjSqOwBKEwpXPvXjyrUgwXFbYWG8Histmw69sJhsQBBuoiLSFIZJM8ntZ6xPh2Z4hyaBCx0NdEsRJl6d41Xjxw4yM1Lq5GJdmwzOvd27mFVg4rxTG1HA6GWOCgTAii7cYb3yUysgRCjKrxE78vplib+YjDml27NqhnunygHDCcNKWHcHsQBjP2CQMQxIFm3+RZzBC5HzE+Eq1FZGSNV/W9pESBBRiybICGCEBAsQOP5qGgo848qqTCFjBQiz0ytAxPpGT5HlJVgoyairIcIQw0VHSeEYgjzcetW7eqI/SKgbPckogH/8V3E5pdBzFu5pJIuEUUhAxv7qNOj6SjUdhCGCSD2kG/NaOsEgYY4lAVRptDsVidDvq33fiu819YOX/XJsIwju82nqgJFJT4KwgVKVkziFNnwTGL6GAWK7RghkwOcgahDsbFgu1gt7iE0iUXsurQya3kD3DI0NZRKvg83+e+ed/cnUHu+rXom7Nt7pPv87zPe++973UHR91RLwHSC8dHcjhSRyxFBEQNqQZfLoo+BDP5tgQxi2xYgpRBvADGsmBUvL1mAGkApNYoGlphf7bC7qNH0uvu8XAkb1gRMbKqZYIkSKxPC8AyW2mj67nK5UB6OnIQAyjvGw3JkJqCxDuNczrS9ZfYjWYgc6shT63TIkiZIAkSSl9jKbNJmvoNAAEHMTBkeNuoCYqsYMaGSoLk5qBCAyEHNfXKYTK09DRJQhkJhW9wHMSALokjqlrdciTfZjHeKW2Nw3Cwh1ZsyAAGdUfhVxC1vvsgZQeiLxaDOA4FMT/0HhJlIPVGvV7oCnGA0+yBCSShGYLDkfZbPaTQrxlI4HJEGXCii0n8wIIfhkGQmiZ6vaYgtCQHyAkW1nlRNgDIGMu77A5WpO3+XO9LECgbRPTPwDKCkgNpyF4xrI3PH1qIID/M+ogsuNAzkCW8+C4kC0G8YWSChIFVoSGg4CzNZyzxl79s+54qL8gJXzgQtlAQYc8IZYRBQxAUxuP4Mx/+UH2LUQKIkEgQj4MSR5ThrmwYWzFHcm7f20OCm3ozkJ8IMt4cHSFJMkHKP/B/ZsghDi6LgBI4qVEMLGJQ7+u6wF+0Wmim0WLI+lwsiDpSkFBbXYKc4biLrLIH8gex+U1BTrU5WTaRhBzOkCTI5zWpIUKygo0wuSex8WkfI8F76GgjbY4IgiEjsv2wcsdxeDlyBEoNnglK53LFJ0kGFkBK8yCra/BDHcm9xZWWDH6KCyfx2dObrqUIQWhIdR7k229tDi9f+WC4UEwiUgxwLKcCiyD11fqq+KG9Vh5HKPgAMS8A4jsyxCkyQ8oeiGqqzR+Xh3saY8NKggSiIdkgKwKhqqsjRSaxj9xQa2yXIc4RDwSRdTMFEgTI9+mhlU3IUHhdnMiQUgoEjyxZq7X9bRc5FLY8Q1DLfZAl54iBVFMg8GKCTL9KxSQiwXAZ4jgu4AsgyiGuNBrFQMbmRctwWmcl1T9BgiRIINLsgIa87PNIwAEQP7B4CaogwiHPWqq7JeW5QEJgfJUiHnVBEjmQOLLmHSl7IKzaE+M4tOsMY2Gi0BCCAIOKHREU2a7bLDRoZJergjnHCRDnSDpHOPqYgmMyxHhQBFOY84LByAIHQUjyTp50I5HVbm+KI5zEzmfIgL/UqqP8cqsjpbQjQcIR611/mSNnHNSKKSSJRUMI4hQne639HHd1OdbK1WOF/HBszCsNq+WceQhx1pk5AkOGcWj1lwiSJEkHFiWhpY6sNtrN10WSfYAFqDGHRdRY3q6HIKMjNtZirfZBqhieo+flj5Z8T4CSzpCEI5rqzebLDQ5RcoP8JMh4djYYSxIEtk2zQGDIKToJ1EMNS0cCFBNrSCaIdlkAKbDyAec4JgiwRvp+aIXxnFZLz/EOQToOxAxBYA27jEY3E0YSV9SJ4evd/ZU1AdnZWOcKujw5EtqVrnFEiI9I3w/Hj+2UTpHrWSBiCMdYwAW7IzEUYNCQTBBkyEsFwQ3EXI709nBlFaklVuL7tukQ7a6ekh2eAgRzWh0PRDIdH8Xw0lKIRilJAsGPRSCbDzfW33hr4/MUdqg/GJxYK7JAHlmhPx70rdZVYpCqnyNqyDGI9Tz7LD5MFJRG48jOdILUNLLebHOmsfi8lnW+RsLjca0TEOa6WNKJQXg1hfOMkO9irr8hS+Q4skHkOaDPn+ysv9lFsudfwDyW96daYYkgPkl/WCFIdR7ESsipJUCXl8oeCVguZQcWQeq19s6r9e2Dojd6Pn61qNrrj3slT9GgZYdHGDgRBDky/S36FVz+MJlMWkdxJvdOWqIQID6K48gEWZXIEkO2P7H7zf1YKp1tCMOI9R2ydiSHv2tHSkdEnblpN6l26a41sQMz2xBKrtmbm68ksvZnjhQAoZwf8Qt3b4Qg5U5HWTqBkGDWzfrWkip5Q5haCFK/KyBiyIE6AkPOBeSCOyNX2rxbCrEZnD60YRQtSel/QKzP2v2071f24iQAcf7wthsnsN2ktQPh7EhCaUcuZILcbcuTKHcBwiQpDlLC2es/DC3h8EEoBxJXbvlDJcAWGiITdI3NHQXZ3+I9xGIg1LwjS/MgN+c5eA+Kw1xconPOBOHmgagyQZ5JZG3vHuwj2YuHFuVfUzNFshwhCEiQQf70O3ozZ8tCkOaOpLpE1osCYy0qaUiJrcUgMQkoyrIh3J76p7uo9Yl0cEWUCeI8f9t8Lam+fbCF0MLXuYSWUSx0pOxbIgLG9dv3dJ286IZuxn18S1xBz6xaCLL5SkD2t7aecsr0HB0BUAYICQhiCqqCgYcaQY8e6Hbca+LKFaLQkgwOAdlYV5AXL/RxIoZSCCTtSTq0sjjUjr+9nVnoDXEUx215kqyRfZd9X7MmZN9S4krWxKVLl5E749IoZWjyZimeLlJSdg8eUApRHiwvwgNPvJEn5XPOzDHDXEsMZ2aue4txP//vOef3+//m9/sd9keQhZTRumImwy6YyGJvSCJR2v0cRAQpAxLgWoqSE4hZumEHJJu0AFEyOAbMilcVT9IpmIrStbO4V/1xBzO5/4G92wj1w8XVRUA4MFwrD5J0c5iAtDeQLikQ+QgHux7t0hmyajq5d9TIiaOjQFFRMpIk6f3CNronxw4frhVtkn8+IFhdkIxnteTACHPhUIy+kSkKJF2VhED5kSQq+IUdW+hnXUISHUVRmH8F0rp+iEQtB/Nl2U4LDhDMIDkxZIHEye6EpJ4g3P3qtuNXxLMAsWYkX0XSM5zqN+yihwqyZ4VxJCTrT+BcQgJwlsQE4eYXtpw6dqUIyL91LQPJKmKO1ZGN2mYqSNpUkomAdN/NX4WkLojc+9pxQA6vDgBJ7a+VqyTfdbVMEDMTZDwRkuLYhCHJOo33NImBpAVpDQgpC8/CYkVa5B4jmT5jBgOQjhGIAiwx2ySSxCBCQtNI5oLkuwiRlb9H6J0Ug9VBoH0tjnxdK5t9s7144VisuVcXjLA0wWzJEpVEwl1JMpLEIHD0PEJ3seh5gUfWgkHO/wzCL7y2KeMcOOIVFvECfEhmzh0yMSHJSCKCwNHqyJVLRc+Fw1zrn4CkJ8pmBNkNyOIIBI4RY2zRiyxih2TOzLnzpnU1kvZt25kiSYRI83T/0uHgbu2ut7qmY79y5gpiA58GEgvSJRFEORbr7pJzotVhXw2cEcuYuLxyz7RZAyAhCbeKfOs7QViaef+SV6u5Nc/1bKea/EGUo25XyzwLQdhs2Rbjp1exjxkzdtmUCSv3bZ6NKNpXMZBEEOHocn+1V624LmcDIP5tjFh7mA312LOm2MJDzFjwMdnsd9+e2V1FkgyICNKK6bXParVq9WjFrVSIkVxBft0eGgcg/dWzouW5Zh1MlqUj2JN15Z7Z0qU3EOMQEBGk97OgUq0cFVEEJBIlzwaxWd32sEvWs2hFCBHWtKbXrhvKGEj2be4KSHPSVhpEt3CGo/czvOoomlSP0mmEI+8GMZt9AamffG1XAUDMDAaSKSIJ0a4gybCGCgJH92fVChhimUHs/EHaZ0HaRCADtBVZgmdlOJRk6Qgkmda5Y3fLv8ZBqONYTHO+40JyFJQqIH+/DvE3Y71LAoLFIBYiJkTMwKtKMmHf5gFpEG4dh7pwdLxTiRzrVSWZwvFPQbrppHgjMRBLWiYIEFg6eY2dsHLzgB7dm7cCJCNIJ0CqFawKTHrINDcSaw/Tsc7+kt9KEgc7IBoiQJgcXPVBmilHnHtFkB53jlZAEUlsTmPOINlf2AHBUiCQ9JBfD2kPl5oiiRoW7YDgWpa1mmFwxIKwrdWdCiCQvHpFgxhbfiDfLYCJQt04LG9Z53flnOFjNUbkTJuCaLBr1oofomijboIIyN27RAm6AJJDIZVfhEhGkEQSomTKWPUtEyQdIpJ+Z/W3lh0zx9IIYZ+xO3c99OCUGMlfkQyIPj4E5NtuI207Y3P7qPWkJBk9yL4kra54Fp1GOMyx2O2GNoQIAaTiVQJJwbiWzdfKDQRLQPSpm21vD0laE3OutcNJwHU4iBAE6SwNO7FuIK1TgohrVWjcq9KOWEWu97m6FhwxSCsDwbL9RnWuCZTfsghXs3adCBFBzLNMkATkAz14rPLK0i/XjHP5Zl8b0xIQOCKr05PvujFxrm/bkOGkLCIkEcTaQjxLWiGsunp1zXU9wt3W6vLyICdJ4iSpIJZ864NoV76zSLJsTJy5uDiso7Vv2oAeGurfgpggiz96RS/wam7V1S6KjWwdev8nVeoydlAL1kmNOgrRsWuplJu7b6cZ77mwZ8/evXv6+c2924PSYbJ00pN7b948vfPsGX/v6gFK38lND3JX7niEf4Xd+VD1AFkNiBuDWONu22Nnip1y/aSSo5Y71UvPRZT0lNKB1Aw8uX3bti2n9h93rviO45TLvlMqlPxC4WIhvMhr6Djnz585/egGZWY/vb71/MnbE+tPvHj75Objl68/Xb/x6Mz5s4WLW7ZuYFXFokXUvJy+cAOP2uRh9OG7d++6lSBgJMgrBjUixWJETpXlq9mnmE4/xZwGZCRQxDiAzFAQKbm4ZtXJHTsYLj9ecMrHnLBcDp1SyeeAAQqft/5ZSM6cvnHj8o3LDz99eh3Zp0/XL984feasH4Zbtk2ePG4oRRMpFtlvaJ9VW3XUuhjcJVt5tSJjc1DUuJLJmT+vVJk+lSfhUFGs5mlcLlSq6aKIPDtmoogPiOgBih+WyshRKqFIqVRwRJPzFM19hCzgXL58nevGjUenzztnC1u27Ni7fDlleAYO5LYDma4xmR/MMcayPO8uMe4FwWEGGRHGU9eyb2dv0j94+4wlryYeIGpTjWMqF8ZsMKl3Csf2bYD4p3Ar8S2/VHbCAgSFixfxsbCARoCgibJAAwJ2Gp/yC1u2sbnGBpZ9MpNUil7KfOvtMsuBL+/erboMZ/GuuBpZ0MTGftORkpYkESDGixDSxTURZBgUsaki8wfDsQaQk4AU9vtl51gZmFD8CxrkCMHBCgUH5zoLihg0MPAZ3C07dixXDMrO9hPHmtGv14blzJ9BDwLDPcogkGIEkHherUHDmCD9XRMVvhOmRZpZMTA4uBQCWSLX6tdn/pqdq04CIpU+T5UxvAuOkO8Oh19AFN74pdJZMSQAgDcC4RPhO1Bj+bhx1D/uJ0WEMdx1OwKf4rEOESKtRy0oQgIVR9CgkY2ZmuPYt80mL46UIxqHBXuiySJxrT6Uy95+chsgRHtZE1Y5LBPsMIDAJX8SLPgcBJwOoGQAIgMMEaOXFBHqBwiCyD13Lj+5//gVBLnrEiGBiyJwHOYlWN2UItqpyDbvN4qfFpw2DPyKAwIlgoP/lCrNCymfqyCn4Dh25QouhRHnfkndKpRYKfshhI5fDlUJ/yIYiEGmooDFYCloq3pwT3KvTGg6JU9DPH4JYYAxKELBk2lQgsYNkjLadmDJa9q1shwYGEnu5YxcK44RKX2NIsdwK0lbIT9/vj9ZtRBCwSfhCh0fHwvPlkWhHXt36G4UfXqJGEohjkX+6LVmu6ZeQpteIgFSlOQrFIeDJo0bfAFYQ2yPkkGEQQAAAABJRU5ErkJggg==", - "description": "Displays a latest illuminance telemetry data in a box layout with background.", + "description": "Displays the latest illuminance telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, @@ -23,6 +23,14 @@ "tags": [ "weather", "environment", - "illuminance" + "brightness", + "luminance", + "luminosity", + "light", + "light level", + "light intensity", + "lux", + "candela", + "foot-candle" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/illuminance_chart_card.json b/application/src/main/data/json/system/widget_types/illuminance_chart_card.json index 1ff8482347..8970889f94 100644 --- a/application/src/main/data/json/system/widget_types/illuminance_chart_card.json +++ b/application/src/main/data/json/system/widget_types/illuminance_chart_card.json @@ -3,7 +3,7 @@ "name": "Illuminance chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a illuminance data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a illuminance data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, @@ -26,6 +26,14 @@ "tags": [ "weather", "environment", - "illuminance" + "brightness", + "luminance", + "luminosity", + "light", + "light level", + "light intensity", + "lux", + "candela", + "foot-candle" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/illuminance_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/illuminance_chart_card_with_background.json index bac5f3d382..fb2c9a741a 100644 --- a/application/src/main/data/json/system/widget_types/illuminance_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/illuminance_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Illuminance chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a illuminance data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a illuminance data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, @@ -26,6 +26,14 @@ "tags": [ "weather", "environment", - "illuminance" + "brightness", + "luminance", + "luminosity", + "light", + "light level", + "light intensity", + "lux", + "candela", + "foot-candle" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/illuminance_progress_bar.json b/application/src/main/data/json/system/widget_types/illuminance_progress_bar.json index f90aca3d94..6d7de6d4f0 100644 --- a/application/src/main/data/json/system/widget_types/illuminance_progress_bar.json +++ b/application/src/main/data/json/system/widget_types/illuminance_progress_bar.json @@ -24,6 +24,14 @@ "progress", "weather", "environment", - "illuminance" + "brightness", + "luminance", + "luminosity", + "light", + "light level", + "light intensity", + "lux", + "candela", + "foot-candle" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/illuminance_progress_bar_with_background.json b/application/src/main/data/json/system/widget_types/illuminance_progress_bar_with_background.json index 47877fee13..80005ba78e 100644 --- a/application/src/main/data/json/system/widget_types/illuminance_progress_bar_with_background.json +++ b/application/src/main/data/json/system/widget_types/illuminance_progress_bar_with_background.json @@ -24,6 +24,14 @@ "progress", "weather", "environment", - "illuminance" + "brightness", + "luminance", + "luminosity", + "light", + "light level", + "light intensity", + "lux", + "candela", + "foot-candle" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_co2_card.json b/application/src/main/data/json/system/widget_types/indoor_co2_card.json index 3a3c955819..b2f2f73c66 100644 --- a/application/src/main/data/json/system/widget_types/indoor_co2_card.json +++ b/application/src/main/data/json/system/widget_types/indoor_co2_card.json @@ -3,7 +3,7 @@ "name": "Indoor CO2 card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest indoor CO2 level telemetry data in a box layout.", + "description": "Displays the latest indoor CO2 level telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/indoor_co2_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_co2_card_with_background.json index 3629187ba6..ff5479630b 100644 --- a/application/src/main/data/json/system/widget_types/indoor_co2_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/indoor_co2_card_with_background.json @@ -3,7 +3,7 @@ "name": "Indoor CO2 card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest indoor CO2 level telemetry data in a box layout with background.", + "description": "Displays the latest indoor CO2 level telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/indoor_co2_chart_card.json b/application/src/main/data/json/system/widget_types/indoor_co2_chart_card.json index 1fa38e4b05..3b1cb244ff 100644 --- a/application/src/main/data/json/system/widget_types/indoor_co2_chart_card.json +++ b/application/src/main/data/json/system/widget_types/indoor_co2_chart_card.json @@ -3,7 +3,7 @@ "name": "Indoor CO2 chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a indoor CO2 level data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a indoor CO2 level data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/indoor_co2_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_co2_chart_card_with_background.json index c8db6aa95d..93f19217a4 100644 --- a/application/src/main/data/json/system/widget_types/indoor_co2_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/indoor_co2_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Indoor CO2 chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a indoor CO2 level data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a indoor CO2 level data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_co2_card.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_co2_card.json index 87ed101aee..980e06157b 100644 --- a/application/src/main/data/json/system/widget_types/indoor_horizontal_co2_card.json +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_co2_card.json @@ -3,7 +3,7 @@ "name": "Indoor horizontal CO2 card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAmVBMVEUAAADf39/f39/g4ODg4ODf39/////k5OQ/pxrg4OC33qnn9ONXsjbz8/OHyHBvvVPP6cbz+vHHx8fOzs6f04zV1dX5+flYWFhLrCjb29u2trbCwsK8vLzn5+fIyMiQkJCTzn5Xsjd0dHTD47jb79Sr2Jutra17wmHn9OKenp6CgoJmZmY5OTnD5Lhjt0Xt7e1KSkqTzn9juEU1uySMAAAABnRSTlMAIEDfv1C6kOEmAAADkElEQVR42u3aa2/aMBiGYdZ2b0wSx3HOISGcz7Rl+/8/bq+dCE3rhAobG6Dn+mCMjSbfDRlCbQ8AAAAAAAAAAAAAAAAAAAAAAAAAAADgX/py92zG07Nz7/rPX7nDyejuSeep9yLpAWQvvT49hD5CbgxCbg1Cbg1Cbg1Cbs3nQjajlCgaLc1Qm+cp/STd0v/3qZDtNjpEy120W0a7dC+JphFJSQ6RYx6jnC41cz0e566leRouktfrhRwkpU4eUbTjY7chdZ5vtoNo6hx2m8tDXCFcfgiExU2JYBN9rZA9sTylNCcajciE5KPNIZpuB9Ptcn9xyNpvQ5RYtFckFJNwvhLja4XkEY2i7YaWU9NhQ3ajKKJ9TlN+vDhkLHwb8iaoFZinWhRkaU/r11fPzki7ITGvm+mQN06FhC6/TPOP5+eXpXmeS2efH5xon+e1CUnz3YZGU97ilAtD1uKbsiF8ck1ki8xpfeGR4YpVIfgamcCV4Jln9gIzm/s8Lk6FiDdV0KxQfkI/k8fhSB4fL+VPPNVdAj7wymsTzBh2ISKZBaLQxEPivgll9iauyxXfzMbJEI88chUlCV1bwhE2ZC2KYMwn/BiyIjIv4ZAF9xZi3u4tTBIVwvtciBIioOtZm3/dhpBe22OGH0ICeyON23uHVjzaPdeG+KdD1PeC3EJNEtLeQtH1+CJx+e0SvB5v9OS3IQmPbUhwTsjM3uw8ejT21YKuRovOhELXsz958yaY2feMPobY9S7E7J4O+T0VuOGJ+1m+/7og6Ryh8SbGc1qIVXcdEvMRMuc2y+3WZ/Zq0VoI76KQsVJjsgZtjKT3kqwso6wfm4U+ZUQ0XA4pK8t2gxc+ndT+r+WLIFHm+Lrgmc9rXUi3ziF2PaCLQoxjSJrGZdPEPKuoKqs6G1RxmjZx/R7XGVE8lHVdkoztRtzU54TQWgkhlDmW+XwoFmTY8/LT754JGfNM6b8SMpBNPIzbkGFa8pzXhmVcNTakX5Yc0tTDRnJuJeks2tPU8o4zc4/w0+4T38w+ODdkGZdVPEibSporEtdlNZCDJua1dz54TCYkM1dkWC/NRlpV9OdsiGFDrvLFqhye2Eybksf7CMmyU5uS/pL58avJLJnjq+69QcitQcitQciteaCQlwf4NTuRfOk9OQ/wi/bMeer1vj73nXv3/PRIf1QDAAAAAAAAAAAAAAAAAAAAAAAAAAAA8I/8AKu9AITe3vWrAAAAAElFTkSuQmCC", - "description": "Displays a latest indoor CO2 level telemetry data in a horizontal layout.", + "description": "Displays the latest indoor CO2 level telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_co2_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_co2_card_with_background.json index 1c12804184..3cd254896e 100644 --- a/application/src/main/data/json/system/widget_types/indoor_horizontal_co2_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_co2_card_with_background.json @@ -3,7 +3,7 @@ "name": "Indoor horizontal CO2 card with background", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAC91BMVEUAAADk4ebSz9XFwMEcHAq/u7q2sKo3NBd0YEKfj31NRCLW09hpRSpnQSPm4+ni4ebm4+jj4ubFwcPf3+L09PX39vf5+Pn29fbj4eb49/j08/Py8vPy8fHx8PA7kRzl4+jw7+/IyMXd2+Df3eLi4OXKycbt7Ozb2d3Pzsnh3+TX1drr6urt6+ru7e7W09jU0tfv7ezLy8jc2t/m3dbRz9PGxsTQ0MrNzcjm5ejm29TS0svz8O/n5enl4+bq497Cvr/m5ePi4N3T0dTZ19LMzMjp5+XT0s7k4+DZ2NXw7u3q6ebd3NjIx8nW1dLFw8X08vLy8PHZ19zV1M/y7+7EwMHq6ezg3tvBvb3p5+rNzM7CwcLb2tfV081UVFMkIxHx7Orq5uLPzdHHxMa9t7Svz6QcHA7Ozcu8u7y9uLgVFAvk4t7c2tTY1s/o39nb3NHQ0MxPmzMgHxDg2tPW1szLyMtxqFwoJxLZ2c7GwsMxLxWwr69pqVJaWVJFligXGA0aGQypyJs/QiTy7uzu6ufc19G9xrWqiW+hf2JRnTY4NBbNyszBvLuac1MPDghjYFU/Ox45PBorLRYuKRLt7O66tLC3r6mbuY21moaPaUqCXT96VzpNmTHe3t/f3dbPzc7H0L6Xt4isjndwbm+ceFpho0hbPiQ5NyM7LRna4tW3treznpGvln95rGWTb1FnpVBXVzVMSiLH28C0s7SYwoiNu3xtSC2LUClGRSDa2Nmzxqewp5+JiYl/fHyih21+tGulgmZ0bl5raVt1UTNkQyje6du/1bWnpqeZl5eFsXJcUytSOyHKy8aon5Sgw5CNhXmLZERGQDBNTi7R3MrMx8e50K3Gp5ONtXyBeGqrgmViYmKFclpsaT64raOov5y5pZajvJWZk4uOi4qBfmiLgGBwYUVboUFhXTdGPx3n6OTDnoS5kXa3h2N4dWNISEhaUT86OjrNwLzKuLDItKerpKXDrqGloJ+Xin90clVmXkcvLiqll4l/dUieYjdaRNp9AAAAFHRSTlMAICAgIP4gICAgIEDPSN/fv7+/UGhrHyAAABRbSURBVHja7MGBAAAAAICg/akXqQIAAAAAAAAAmD3yB00riON4fb6897RN6egm3AUOb7iD4wYHi+DUIRQeCMXlwCdHzfhAilmUB11qa1olYuOuQqHYpaE4GmhBShAyZOhilw4tdJGQjj2fCRrInOk+3Pvxe9/7Ax9+Go1Go9FoNBqNRnOXRG7DMIxozHFi0agRuR2VW6qoJmZdR+q4FTMiRtQw1ueszVevia6wLPWtcGzHMU0zZlmmHbdtMyTuqNB2bNOxrDBSe45qwt5x4nY8rmqocf9hJiS95nEKIMIr1Q/Hx3/GWc4QwghAmII7kBEGIKMYIZJC0PUKaoN/+4oTiR2IcY5hVp1XEfcqBCNCkLqJafclWMLCP0wI5cVCxavms1vlcqlUXpbDw874X7s9k3Ux78ybIhgEL6S/12yK0ehS7v8atWbf/0pRl/W66E+Gw1cDURO16aQ/7fcnvaMH28ojmcyodUMlsRb5/foMM+wSjF1MC4BUdgsMgKUZgiAFmYs9mv85VyKIAZ7jxcbitMK41yCU5oqukiG0+2QlokzcK5HGrlfNPtsKNUKR0vlsOGzvyZp/MD5o+q1B0JJ+U/EuuJR+8GMUCFmTAyH2p9OTdvvT25YU/uzjUf9k0uu9ef95+96jZEg6nckk01cyyY2JdHIYqFksF2AIFvOIEPqc5ymGTAX8qectTi/cRIoTAF1QpPz8jC0uChTTfIMiNaVc9wvcFKErkf+M1F1oUmEYB/BuuuvymMfjkU5+neNM82NpWxolJ1PqVJMMoWlYaJ0ixDFGxVCkKPpyfcKUCCrWqBhFYHURNNtFVGMrIopdBK2oi0ZQUVRX/d/XbKsgepx6znlfxv+353m3fibk9LOx14ODKbVQyGS+9Twa2/0YkAwc+cc3S6pauvq1lCk+Gh7OFwsP7g8O7j5x7Vg+n3k/VBmpVavVypHxObMog7aEfv7siEl0phuQL5f2bE6n0yabmWVtHhPSm4zirj3dHSbIbOaX5Zcd129/Es3mjlBri7FFbFl9+5B4eHbIKRo7urtDrWBfuYWtv0O6V68hkG1bts2ejQE79bVvYuJZPlVESwpH868e5d+UUoWMelRNXb3Wo6oX+64eez81+iWlqj033xb77ucP7u45Xpw4MFR7MFCr9h+p9gMyLcFrMSjzMFoNSO3Gu9E1rQs9RhwKm9mG1rBms81sEvcsxCULnKkl1LF1eI9oM64+u7V1IQbw0PlDYmva6PSInoWbu9NOZ/qcaGqeEQoJAbKZQrac2kYcY30H8yd6Bi+qeVUF5Gj5m4ozUizgrnjxaqmgpkqli99HR8uFo2pf37Hi8TfHU8dTqczEgSOVgYGRWuXC+P5fkPjJGRUP4LzfCn248Pxpp5kNxONBUQwG4qyNDWL8EomEzcOaE3FaiYBy7xAbj4uRsHlxwOa59dnJmkUjy5pM7BnR6TnT8TEYSJAjOC8YZMkfAi291eJUQq1n5Sfy2Wz2ydhwPdlbLvfSSiaT5Ks+XE72JvE9OYmFyakpzF+9N1meGq73lifr5Xq5XL/84kX/yMCDWrUyfgQQ/P5gQD93Zuk0WoZbt2Cpt23p3iWMVqtl9AaB5/CQFxyCQc9xPL3XaLCTt9odvFan02gYhuEEe2KBgWP0vMHA6/EpuFyudQz20dKisAkLWBccUZcr6rKvjOQs86dr0aJF8925cJg+tPh97ZKUUyIbN2yI5NyyJPktFrckSbIsde7wette1EZGqtXxIUAgmWeY+xdETyE7967jGhDkZxi9YLUjNqc3OByCnoFRwwBi5TWAaCkEdwaORIUDXofL6loCSFNCN3ENCBwoAnFTgsXtbogs2bCi5OTfIKs2KhQiWywP/U3ITm/X5ZGBaqVWAQQVQPh/doS4eA4NcdjtdqvAA2KFhOOQykAgWgJBQLqAneQSn3qSNkohOuqYhqBZgoN2ZNnGcJYILHIuhwsLQFklEglnicot+XxSGJCIgl0QYIPFL/l/Qbru4pDcbRz2QPyfEI0WERiEBkdwWK1kttAazBhPpkdYQCAIydB8AoAkLBwoLEejWNXh1ZQ0IUQSjUYXLNsQQUZkzilKLCejLbgCRKKzBYgvrICRA0H2+6nYTyCxLq8XkKG7d/uHLgCC+gdk01rCaM448iE7gzTIgUMwA0IC8qDhDTL24Ys+W7dkLSC6PyBUAqTDYV2xfFUkhlZklVUbVikwoSPhWKxdcjdmy9cejpHHZPbkRuvgkH0U0tZ1pzpeqdyZxf4PRNcsGoW66IhMjxaxMeRcoDjccDw5U4gNCYWgZkKaEkEAZCUk4Ww2HFm+fflGhUwXHSj/z9Fqb++Mdfrc8/FPwILBox75od/Xua/L29bWdaDSj0JH/h+CmqvDKt5NFH5+MFp+r0mFcRjvj5hz6nopaGWoYEWZepEyfywtCgNnx85FcJggURLsJhGCOh4Jry0QNj3uYrE5aNtForUb08GIYITkxRhdDLoRr7vreb9mHlewHvQw3Bjfj8/zfN8XvQGIjoYeSE+ODUHuuI0cBPDatUXhIhJ7KJj0hmcjkbloMuiNR1ANjMrDg6lhCMyJPHBdAxZIIDxm9vb2fGbXo5dPnU7nhzfVL/nqf0bLoEGh90h6k80KEJpygkSVoo5AQ5DxtaUlsVk8QXgSj0d/G4KBQYKqQJcw7uzsI4CY8TnXb2P2fA786qnzypVypZpX0JGpk0AmdO3vSwaD8L3FH5sYqf1QA6J71ThvM+lHucNzkCCa+M5dN4GMl2QULqCcD/k9nqTXC44wcdA3P8OFNRV49HI24nJR0oiDjMEKdpgpXFfWqtWK8h9ln55oNISe0OoK3ZbQffjTYjCogsFiMVw24BWL6edF6xnTaFLNyYdOYxvbb1JHoHEQoHyVVsGy/5z02OsN1zq7BfraIR4scoQMAcglQiBf0Hds4oElZaWSr5zYEaxfYy+mW7ogCjqhG7Po+jGdThU2RbHd2BTUy71uOwEQ4zB8IwwOAg6rxWKfHoFQtoYkEmMSXPnISPvecIdBRZlORojKYg48CAAD8s1wuiEIPiBLnGtKPps/OVov7hn7vNPikn5JNE7U6xhDnRfr7d4NtbGpNlr9hGj5AzL0Ay9yBLmxWgFiOAZCJKu5AUiafSZHojVWPKhtsHVs38CCg055tJ0o8Hb4sJeHyZtBsLglkZdP15Sdb4rCHZn6J4jpD4h4Q1+/0WhPtFRTvW6C1ES3nkhM90WTWp9PcBB0fTxcBELZusmjpd3eA0ugbZYjkCNmt6Imyeg6K11aOMsygdtx3EeuyrJcKMgow1X52nLpAGtsQZYXhNLh2Rn54FBG2MiS19msUskei9Y7SXo3aZckqalx5D4upLELfbH3fv6nKD6bnlYTt8Ru+0xdPX1LVOtvRdwSqeVaEmiAcveem0C0bSeSJttOMwmdZxlb0BLyJ6NH7MDx5HaKLUeDwfDtEtvIMHjk8y2yDYqc40mRLfKfakU8O2b0nYPslJWd7KmpqSkNCFtJZyY/ZdK5LQ5Cl0Z+4bjOwxUbDADxS+25MzjZcYG9aDtvxeWK7o9/kUD4P27jGMiQJJdrchDTD5bBwIv7nmiKyY7AXIp99fv93rkSY7uFRZa56sNjt3DEVsyRFCuWSqBYP8RnyBaBfFCU8s5xkOZkc1JKG7YGIE6A3AMIP9m0kaGqEhFfn/y+zo8N+hPQHANxEwhJC7LFJCOBrLLMx+0cy3m8BBJPsU8hSyg5V2Ab6MgKKwGk43ItZ1gNbtVcrg5bcZkdGSZjlxFIRcmWfzFmpsEtRWEY9scvv5hE0OTIYGLJjWaoIpQkd9KbTUMQTdqhtglN1FJaUvvaYuy7xjK2RquCjm3GOhg1Y1/HPvZtDMY2+OE95yYSXMvb2+ROOun9nvN+31n/DFICboDk2cTmViQFiUCg+FQDAhCdkSRTSIMkSE6Qw01EEOWzCptGmERO5gOkFQPhOLsAkHEo6ipS1XEc2ZBuSK8mK3iABItXkM256a3WkvW5mYbc4MzK+YeOzEZqQUkgJZsnNRzCUstecba6PUD0AFHEQGL1CgQmcLjgCaTW6XQolGQK5h0ul1ISpJTsGTLkMTl8BU2hxqLlMKkxAiTT7QCIhtMKOQBBL3uajGsFEMy9xpEVVoAUFJwlmwsNBoDw7txgcOahQ7OPbAQI1Q+Qk7TYbSdpsdeUVu9hIFjvMQwG8qOIY9MMWAGBQ5MEohAVn6EkQBK5ZScxlabsGlKhtulqAFJN7litnklE0Gi0Rg9AMJ+vIqcpCDqozeQe3LoSpiDFhYXoEwL8TOjm/DmzmSNQtkT3W3J46hUKolFl/wQSCya7kTgYuOAHm8ZmdJLFMJgRTKyMJEFku6gek5pLKWfJOKxLSslJSw057TGtJ6VYNoLkHqkemYmquAeQ0x3TZxGy3hEHKSgupiCBcHjMmEfHV885tFEShC1ba0qqTzOQniEEppXL+8ozUsVolD3lqv1OuVaRsV+mRrDtPrRLWZpmVsiVKrlKLWuSLVJAsAzdr1RqMZWg4JvYS8nhPSWkVGOvmESqakaRqXqNBsk1FUV6bTNZm4kaIeNOryVVDlM8tQoKGEjYM6J9+0Pbzpzf8ReQFBXXTXQEIF6v0+zzOUONG/vlfrM/ogr5nV6vzxnJcEZUCoWzPHv3brNC64yoQ/4sX7/ddJWbQnMPblEQaQ4Ggm4L/QopqdBxll0Y6yed1YPCruWmkupRhDxeT0Gq0OVWFwvGUnKguHBFEkj+iBGVq7AjNP/fIBxAZF5vSOtzljvlcgpS7jXjHp+Vm51+n0ohd5bvN6cBxBcp794p65Qqkp0CiTUEEMnuN5F8tN96RjsMTstVVAhIK4tRMNqnksPaS5dM1tx01Ejm+ktGi8Vu9PAGg6GwoKCgsDAY5APhfKFb5aH5a7Ycl66RZBCt+lSW2T8o5PX5tSGFwu+MmP2h7JBvkL9DSIiU+5xy6ogajsjKd5/KDvnhUwQASgbye2r9wgFRXAgkkE2H8sDqxGMEiB63AXcmQHp4jDBJa/H0GNkqHSCodrpOCXiEvLsrK89vWvUXkJ5xECVdI4n9EIvCXC4GQVfniuQmRkyqQf51qH4l/RU96fmX1EqssUQSSKfnLPkOns8RAKKxC2Ge56vIihzBwqFwLFhBjjSIIHyAD/IewfK+snLj7L/WyAwRRKeKgciYUlJ0avrO9iHwcVJg4NB1EgCO2oBghxSIVG4lSKghnhyr1SHs2nOFy8sPg2nqtZMmi1YDaUHCB4uLwVEcwPI46BAs746srNy+vU6jjH+AcDrsKVIStoqN+cCGEijBF9uuortE4g4jRFl6qgEi/2n2+/N3EpZAANEBBJmVb7Gj5CmI1ZFvNDIORiJ4Aj9Act1wat7t2we3H/wPRzQAkUFi3OKW4695Hnt3KRGJGvGIm4g2W+8uvW22BIhkaiVARBIOjjhMRrvdbskzAoSmj5aK40CCxAuDA3OTAKrHDUf64JRo+XIRpKsUiFoEsXMAQdZAAKGAyh9GUABxb9TlUipdrP1tkEajZ5o+vTfkkiU7IgWi/BnEARMswMjLE0yBYDCQj9mwEWK2aIUwOAyGoJV3Z9I+YPxgKoBQyaUd6UxB4AgehkRhIGyASPLCpcJfenZB0+NiFNP1AziOGzCAYnTp0sXlkiUGdokSSQaBsKkiOKw5ALHnwRCkTy7vwLaEx+FwmJ6BBIYVFBrSsZTv4e7hEOzGukwxkKV/L3ZwaChP4uFUzIYuGIan26YP0A8QNZ0KEDaAAcIFePghASKZWQwkP4cPmPLsEO18sT3HBwIB3s3C5mjPBRCDuwfPW+kH6+rOm9dv3jyAMPWV/bHY6XpDSUHgBCv6+LzXRQcJPWv9AVwCozekFr2ge3XJHNLF/guI3WTtYQWIVktBctH4bowY7syRmTkmC6ePg/BWKypJmNuPqTtAJBQ7sdq499v8dW28bXuN9/ZKbZs2aPDtg1+2r1z5/MWNIzderLx69f27t2/erEszp7Zps79ly3btmuHoF1dcrVvjakGPuFrjlh2/sdM3qC2Umoqzq7SBA71zxzoH4ZC3z/isrCxfn+7dH10cvu3RkzPXB29d0n/ivuitnYsX7zt4/+aWhws+H/y4bPDHrUOLJhw7+AWHj0ipeYCgkgbBMXSb1LmDAHJj8O27iP3F7Pk3brx88fw5on/75jINnh70suARPoSgxahZ4Oz6odYQOKRBvCJI1niRAydyNxcO3/ekduHFc1OKlgxfuCh662LZ63PXJxRNKJp8dPmyZdH+/YsWL774cPkwJFVdkaNPnz+BNGvXq6358t3ZLPR3iH3uujQWfS8WvdjuScE2akG/lvQf4i8xkua/gaSKIGler3es0xkHgSPLax+Mrq2Nli18NXR02ZQp0UW1D3d++rRt29OyouFTao8uuzChbNGifdHa6COAwBCKAZD6kiCt8Vh61p9mNqciehp+y0TjQwj9vwSYX0AYyQ9DYEkMJGt8Fl7gyLJHy7c+fVq25OL9/qPLiqZMu7Xo4r598GPhoiXDJz9d8nrrhIXR6K2vD78+RF7FDWlQp57041uIj46recKBGEJTJvaeATXCTwa9kwCBkmvku5A84oTwSJIfEIA9Yh9+sHBSYWXcAfvGssrKstT16ydsn1BZ1tm5vbK+rjOufuLEsrLKztt773SHA30C9kZIBTcDgzA/rsAE2Q9L/qC0jxQL8hBgYWthC3I/iJCH02jGwP2B1SOJoEwCiRJw0oqyDw/fU5iaOqlsqt+jCZXPO+MyGydM6C+bBPJIamF/XOqZKWcOXD+za/XU5Du3n00Be4SVG7Kohq6ACRtgRgXgVTPMzJxc0NU17Fws7OxgFicLC3gBDgcbJxsnJwcXJ1g9wygYBaNgFIyCUTAKRsEoGAWjYBSMglEAaA8OCQAAAAAE/X/tCxMAAAAAAAAAAKMAalqkCwVGkiUAAAAASUVORK5CYII=", - "description": "Displays a latest indoor CO2 level telemetry data in a horizontal layout with background.", + "description": "Displays the latest indoor CO2 level telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_humidity_card.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_humidity_card.json index 1d630dc25c..f48aa374bb 100644 --- a/application/src/main/data/json/system/widget_types/indoor_horizontal_humidity_card.json +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_humidity_card.json @@ -3,7 +3,7 @@ "name": "Indoor horizontal humidity card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAmVBMVEUAAADf39/f39/g4ODg4ODf39/////k5OQ/pxrg4ODz8/NXsja33qnOzs7IyMisrKyf04zz+vHn9ONLrCi2traHyHD5+fnb29vCwsKQkJDn9OJvvVPb79S8vLw9PT3n5+eTzn7V1dXP6cZYWFhjt0V0dHTD5LhmZmb19fXt7e2r2Jur2JqCgoJKSkp7wmGenp4vLy8hISH9/f1hfASuAAAABnRSTlMAIEDfv1C6kOEmAAADLUlEQVR42u3aa3OaQBiGYdukD6+7nJGDKApKtDGapv3/P64cYtFOqvmgDXGea0YHd794uy6DIwMiIiIiIiIiIiIiIiIiIiIiIiIiIiKi/+nLp9dkfL0zPrvh3beqw/iOT++78XVwr3ADvt8PhrgFv4Y3EgKG9A1D+oYhfcOQvrnxkKfSwwHHQJHhwBaA7dgO+nOd9maIK6J9dJY2nAelYMBonuEAhjMubHunDKgr1qxMH8DUbHhoeBvXPxPSdRyXLH/Y2wf7AUtjtp2t10vMsF3Pxs54PBu9qK2DazFFTAChNHzUUq1Lmb4nxJVG6XUhD+P1a0i1EPhZhbzAqUKMJcY/ZgauJNVtyEQ23Yq4gQcdVnOLMyFTeZUffbWOQ9RsH2LP1riWXHQTUgo6rq7KQuQaZ0K07C2O98hu/dKtyHi9q0LULsPSwZWkkk+aEAngYe9J/FTnqfhnQkyRcBNI8CyicUy98UIZO4Ur0dpvQjwJApFnHw2vrDewDnEmRIsAYTBFWS/JeT9GuBK3imhCUgnCXHef63SKJ+2fDGl3iLsqp3CbXfKBUgnRhsBLq0cgi24uMKeu658KWUglaDskxAfS4ppmKeEKrVBc7IVhGkxKmZ4ISV87njfBx66IJ680FqYPIO9CTPHzAND5iRAEIiu4AoT1QUvhDeoRx5TCJS1qpeTVhpDnZoUW+0btImxOwqdCXBGd1/vkYHeN2hiFxxiNKEI0tOqBISIAc2eOKI7biQi4WFJ71tISupPu7aw08BT41UY5FeJp2TMPQorCim3bqo4SJHGSRaPEKgrbyh6tLAKsucqyGMpqJiw7u2QI0omITHwc8CbViHcqBOm+ZIPDEGukbGtutSHzIq6Oq7F5bCV2EzKM4yrEHs1tVeUmChfl+R7+4vvnrrU8sxQJwin+cKw4sUaFnah6RawsTkZqZFvV2GM2ty3UIVG9IvPMqSeKJMEFXP+HVTzHvxV2jPfoQ0gUnZpUeI9ehPQRQ/qGIX3DkL65pZBfuAXDwf0N/M0OqPvbuWFg8O1uaHx2d19v6aYaIiIiIiIiIiIiIiIiIiIiIiIiIiIiov/kN5uj+TgHcSVHAAAAAElFTkSuQmCC", - "description": "Displays a latest indoor humidity telemetry data in a horizontal layout.", + "description": "Displays the latest indoor humidity telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_humidity_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_humidity_card_with_background.json index b2776b6a8d..028a1127fc 100644 --- a/application/src/main/data/json/system/widget_types/indoor_horizontal_humidity_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_humidity_card_with_background.json @@ -3,7 +3,7 @@ "name": "Indoor horizontal humidity card with background", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAC/VBMVEUAAAAPDw+qn5W/v8GKcGTi5eien6Kgk4R2c3NxZV2OiIetrrC+o5zS0tO4t7nWxsOIi4yyqZ9XUEu7vLzMzM17d3Pm5ubBwcSCfnv29/m5vr34+Pp+eXT1+fzy7+v6+vr29vb19fb7+/zz8O39/f3x7enx8fPw8PH29/j4+fn09PQ/pxrz8/Ps7Oz+/v/3+Pnv7+/r6urs7e749/fz9Pbr7O3a19Xq6eni4eHv6+jk5OTs7e/k4+Lx8vTu7e7p6Ojf2dXg2tbn5+jn5eTp6uzo6evZ1dTu7/Hq5OHe3NvOwLP29fTg396mpab18/Li4+Xo39nk3Nfv6OPc2djs5uPCw8XNwrfNv7C9rJzy8fH08u/k5ejMva6NbF3z8O+7vb+trK3R0tX08vHq4drV1dfm5ubt49zIuKnp5+bk393m3Neys7VkYV/s6Obf4eO5urxyXlLu5uDY2Nng29ji2tbW1NOQi4jY2d2/wMCGfHXc3d/c19XPwrSvsLHKu6upqarBsaGNg3zd2NXKy83m4d/NxLyLiouBd3G+wMOfn6GLgHmjoqOampnFxca/rp6VlpiKhoXGtabEs6STk5N3YVXNzs+2t7qalJGVkIzw6eWEgHxVsDTNz9PJycrEx8q1tbay2aWPhoCVcF9+ZlpKqyfNx8Lc6tnm3tnPy8iXmp+Fg4F4dHBWVVSrrrGpo6CXi4R9e3twcG+DxGyBa2GFaVzi7t/Hw8K7npuOyHpraGVsulBWsTbcysSkqKyanaKu1aGemJQ6OjrS0NDU5M6/urm7rKWwp6SioZ+cnJ2gnpykkYubzonL48S5uLi8tbKgm5medmLc0c3Fvryipaqnnpqzm5avlo+Pj4+RdmpgW1huW09NSEVgtUK7nI2go6idoKWcn6SGb2Xjxr7Vxbuk0ZWVyYOdfXB3b2x4aWKei4fs8+vp7+fE3Ly62a+foqjWsJm/p5ipiX94vmCzraqXhoLewLPSt6yeoabHqplWUk8tLS0gICDh19DcuajjuZ4H1qy9AAAAHnRSTlMABCcmICAgJiYgISYgJiAgJiYhSMBDQeDg39/AwFAoM0PiAAATsElEQVR42uzBgQAAAACAoP2pF6kCAAAAAAAAAJj9OQZNIwoDOO5wOTgJJ9gSaKFDlqSdOmWSLKXS6XASAnJ4mTp41GxpA8UcoVVjIbZaB0kVLnTQSxolUhGumWoaOojYGr0eGE2gxuWakqatQ6Hfe0aTELJmer/h8XjvfTz+BEEQBEEQBEEQV4mmWQtLmymKocw0CzsGWK1WhjFjdA9Ls8N9lhPsMIyhtzBqxjdwcAl2CIMhqoc5g6IGX8FyHotYLEOXwxnXbgpCYCHgSytKwV8LeZK+TEEUs5re1QpKOhx+/sLHBYMhjhOOjorFqanDw78//h3vIer+w2pHenLwTddFRersVPP5fPXn93q91WptgBbfJ8tyvfJmwuG4Z5t9XeJlPpdbWYlGozMgOgObA38cvqotpVKpJZDa3P2z22w2N5vGhzVPzO1MLE/Pzj1yuFwuu91+f8JmezAwPjl645bJNLLsTAruRICLQ0imxiVjvRCx210Vs5l0OMJ51kJBlLK1VcQlvRBVVfeflarr0qJf1HWtvdj5fCZkA8nlTjvKcuU9DpmDEJ6Hjn4I6IdEIASBDsNoNBqG8QU63IEE7nC4UAJuGBsfmxwYvX33zojp+vSCV/A4H3+KK+1sJiJ4vTikIGqrGoSEa9u+2FMuuA0l73DJ/Pyrl7+P91TwtlL6ui5J8baGQn7hkB0UUr8QUi7LH/+zXee/LcZxHMD7f0jW5yn6WJ+WnlpdtXSO0rVzrKSIdtNiVhqroyLLQpnSCbGoe5NYEOZMKqOuMjcRd9wS95UgQsIv3t/PU9Xi3bDIuvq+vD+f53ncHFZdPbliTi1ByEGQB0wCCBVy8uRJ5jj5HY5bt26dgCOabE9QH3AAoVQOJoTRyPNGHr/3g0PeSxYKrQ80B5OBVkD2bm5rCDAIJJH79yORvXta1qT2dezzpAC5kNq/H5J1M2ZMmfj8+PEbN3YDsv/AkrUL9hztuv960dfLdwF5/PnVKwZ5swMhCfWBnOuZPJkgPXAQhBh4IW9WrEIhgGCagHkGBRh5R/sfhwABwiP9KGDIy+VyhWxrbQIQX7QNkINrWxuSgebNRyFhwY60XfQE9zWn0Agk+5lk3cQJy5c/hwOQIz3nNyxoa21Dh29WfH37G/IKEDAIAgYcLHd65jirJ5vm1N6kFUEfzCEFEDTCVoPl2dPvT06cAGSftB8JabBYH3AUEShyimxboj0a7PA1XPRcv+QJRhO1tb7m1tYNbffubWw7faG5IRr3xePRa9euRaM9PTdv3ly++8bSWCxWj4wa3zh/W8+1eDIQvLRhw+3z52ZMGT3627pPnz7duXtZyl2Wx1LW7bbqh1UIw+bMp2+/ffv2AOUrXgc23N7fHMSpfyfJ4mtnhhBt+fCKkUog6PTlLPKiKBQKWSCejKaT22ptFovF6tTZtVqT2WqpGsVSZbGFHWadzuxwOMz4qtHY7Vq/X+3mOIPBwHEqtV/QazQ6R9hWVVW1zFUzbtOmcXOnT582ZldsKEssNhaZNWvXrjFjprkG+blyefkAfupsV31s6JClS5cupgwcuHj8qFEWmzXsGEYZLn0xmfSYJUGpNvIc9oAO3Kck/fv36UMMQJo6ogFfYlQYEJvVrNEKgl7nhIQgoJl1gCCMobfDKdQBYiAIrwLERBBLVf0/EESCIASpM+A05QZv2exlYwsQOAhSZQs7h+PwJhAoGsmBHiQIOUoYFEUe4gk2JBO1YasFkLDOLiiVqIRJEFYIzq/RsUgM7VR/AcKzRuyA4P02SylkrASZN5YFDkBq+noN+EvlBq6ub019jCDkQMZL7Q/TV1To9bAwBhyAKAGBo195MQQGYkgSCXIxtc9XG7LSZDn06DEvsTGZ1Ynz45M1GhMxEAEQFUcOQJRavTRbVtuy/0KYJF/Ipt5uA8YDEG9vVEIQMIogw03sHlEBjAkv9CEVwrNCAFEUQchSAmldGfRt3WqTCtEq1Wp2OA0kVpu1Eg46vh0MySFBUAlXKAQQsyNcWekqhQwZMoQkBGGOMi9nwJIaDG5v70GuXUPAIAdBaIxxKUADgkAY1PFnsEpWhBD/NgJIYrWFVt0kqI0SROdwImadic2a0i9AIDEEvwQhh5LeimCLZs6srCmBkAQQSACZPq6szs1+zO12eyf1ZrNFfRRDHCZcmBCysAh/NqS4ERiKWumjgJDtSHMTrnY0Rw6ToIQD/8p0nWIMrUAdKYU8hRyAMAcrRIJgntHK7CLILDTCIkFQyNy+k9zeukmTJnnxC5DZywAZWAIJmysEutsRhVK06iWNEIJe+ErXX7ks2NSQbmigyXJo7PhRzBEcTodZo9cqwcAnQ8Io5PCrGcSNBaFGgIaDTZ6OIOPykHmAFCQoZFNvL4pAyNG77yBX/RBARgwcMaIA0Y1U4tA8X0zBARiEJAT5N3K6JcoaotF0cxAObLZZ2mzdlUdVTocODnyKSqXyNKoTTX6lUCjkIO/m4554SmllbJOpQsA3NQXItGLIUIKwQup6l5VBQikbVLMsthiKEYxCEJvThEI4BBQaMIKgkiLI/yTlmDtA0slk2tPMJssaRg1mDNVLUdxyltWDQlQqnu+K855DYasQ0oasVnUjZG73eE9LIh54WB3SWixatkcSBA6CjAVECoPsQiHYjDKEGBD1xU1xKAwUguCaCQjOTJ0QRfh4aicgZ7dT3kmVqE9dyZRA+vHsbi9Lt7cHTgRZIb8DB5MQBBKe62qNHzwUP6TsCuUO5iKRLj7nPhjJtaRaWnJNP6oPppQsdt0/kKV5yKxpNWVet3dqCYRVsrQg+QNhEqKoBytPieIpQA6LlAxtSSabfSTuZABFPkZ6/pKlEwlfU5ONIDZ2Fe4WKY9s2HQBEDRyqCWShzSmWlQ/+Rz3w+0BJNSlXduWa6Trmt1c4wJEWhGMFoOQZN7YMS7cCjFZpRBUElv8B2KxmnEXYw9TJGGUnVsAwSmPiS+oEdr3K53qPtnDfTLZqwq5lJEmDPdIWce2hK8jbaWAUfVBzKfbPlJLw4XR4jwEaZQgXM6c4/KQaC4CB1ZENxP3EThKIJAMHbvLNciLmwcmqwiSlwz8D6RA6Ra3AKI2PhJREz0qgnIlK1ccO6zozsrxR4yUYYCzuhoPlbJg3OfriEoQGx5Mtoi/84E1wiQECT+M/ChAuJbIw5bUWtvDoLYrhaVkq175GzKtGDI0Vu8aNMlQbsBkUchBEElSDMFVi+ZdouwUu48RROzk3jEJWV6ImUy2OyNm6G0cMmfhwoWNjbKVTel0RyDMAojlhSh+udIpdn7BmpCDnj15FS66YTXCtp89oJjpiVGwhR5Wow67xoxC/oYg5KgzyGmyJAheBCmRMMhwBuHYgSVLNrsTEKPxvdjZiVNlqKoB7x6JYjaTPSy1plIZVY1bkfWytpX4n1OU3cghsVhQiMX2pfOq5hEqgQJREURCIDzbx/wjo9+/pklyVFYuK4LMAmQoY8TqK5mj3KBCIcUhCEnGDyxABEBoggZgaK6I27lj4nasith5uHuLmOXyOXuWe7FlJwzsVo2caV+9enX7L3bt/belMIwD+HFJSERCEH4QbV2mW1e7metstMpcaphiJrSUlWqX1GUsq43NvTUsRUyNZEpchiYWcQnpxCxziVtEgkgQiUsEIX4Q8X2ec9aLgz9A+p2dnrbTnY/nfc/7vucQHlff3GHcS2ddHWaK76lzXH16S/uadsZgHOESMIT6vQrP2KHmKYo0NUvT6bOqYiAzMEUhRpUjG1PeSEFQkTCEJbOqluVjQHThrAUIX0cQc14TTFEDgt/5LqAa+q5e8z6J/v2HIoH6q02trQFu06mph4opwuOaas+2Ol5z5OhGfdAg9bfSyaEJ4tDp4MWJFYmwg4YFB0PwGjBYvyzBamQZQWYxZDpBVhFDn7ZgCk6ZicppCwCQl4Qo+qpJ+fn5gKCzU0EUYi5pWg8ffqoJfhDPYDgHt2JoSU6gBIOB+otPNbcwGiNb3RShBleRPHYtkoaZYpPk+PyqHhWBQolQp2oTcbuKQMgxfBRWYStFyCyGHFt+bMYM0HJQDjjQsBYN+AsEElvuMiziABmdoJLWTwrFW40YtKhbhwOQXNC0tk1brmoCF+pTs2svpGfSUReXGxGhxlNd47FnYqLB03Ec/2HUY/BgjEIfqDsgWvQ9JUda85MkbVTEkT8sf+WyYRsZkkuQY8fgcmgXKBP700pKhYL8AcIUbBw2fdaILJpqqeDoL+YW5anmQpP6leYzalKreY+GhClx6vna19nB2vT0i0Etz7vrmltaWjxCtcdTffN2OiUTb9D0BENi64daTW0Snb4RO5psZkqKVr3EimeoSEFBRoHLm5STMMKSPgqOxseNk/IbG3Nzq6pmHZsxffq96WCMXDAlo/9AONTK5EV/gyD0AIsNy+xkZYrkID9WxegjKeq3lzTB1ouaWjqrjMZhfgDiVX1TU/1VKDBL/3Jt3759+wni2bGQF09UqfORceSqShqF7IkKn89vNZn8IC1UL1y9sG6wu9hb6V9rcrtuG1dPWG1uDDUYG3PHXb+xrOHLnTt3bhADrQrziES1clryPAkilwwiCI8q2uyEJHWiHJKScv4ijuZigCfmFHQDvIRXwLDZbDf271+z5ojg8bQ0l6/l6Tv9WHagTfIK3RoOgigUoUp7usk/wq8giGWqL+Qt9fpN5Vbv7XJzaDUg9++jIivvNITujL3e4KjTSwyceJVJ0xYtAEReEg6VhEeXAQsWJf1eEYSagPJd4N0YKghDtJS0pqbh5NDr9Q1rjmzYsE5oad5hdB8S1xu0nE14d/UpOnywCQ1LdCjMlda1lfaQaW26HRB/naXYnYMJwW1TeX75cbN7NUGGGVGR0I3mlQ13rjfevk4MdqhxzSgMwbcMQgFlACDzpk3BZRaJwQ6GpEinekCYweHeAQfy8MiRDdvXCUZjubmukq45QJJKs0ReMyWJjqgrYOJOIkZCS6m4OtTm6Eego69GcPqs0ufOcjgcjddDqAYU7KBxEwtDhkRb5BK8M48kGbTc40gMGsKxQPmjQ4JsIIgZS8Rin7SeLWCHisZvmSMCSc1mB4bzrKmTGIKRGYOGzeEY2W/kcGIMwVJaciSHIUyJgcgoi6bQBQpWsIMhXBBq+xEHwg0LyQJkOyB1uBq68CAOHRTRoQQFjowoRyyEfrYgVZtmyxoRBcnSO9KyqYszgxzcJlCQaIi8IrENjIuSISGiHAkyBxcEjiypIsXFuPZgSaLwLITC0xA4ZJD+bRCsP7Q5KIgEodmrPmdkKo1/YEiODHagIAyJJCKBRVYWUDArJQKHF4zJ0Y40yfEbZOtaxMcAbLge4gQ3FiLthSE8weKKTCAIltw2bcGURGYAArHoSI51cGQdXk4hC/oG/lA9pA4SZsQ4sq7BAYjJhKvt/gSVUgocDBEvJCliQs1eLUG0DBErQpNXmxazXGZwPSTHNG5YBJFRZEXh0ZEiUTgqOKgegERaVYxjGLoIQyiVTpU4i1IrI12dKyGDpIiXSjFz1y0RIVa0rKl6OPozgyEKqR7/dsghSFjCDLFdDY5xIOwQITe4IOsELxxenzVvsBIMdRiS8UeIQoSokgsYMkqqCCbhOalTqB6xEO4gDPm7RAYJSxjCBeGhkB1hiE0qSOjhdmJs2SJ4EX/I6sItIYOh0FnqslosVldpnm48lvQcesw06HDZaeLozMK8Utx2sW6tMxu3eWo2nzi34tSpJ+u+KCUDEcaM1jldlpDv+PHjR49u2rRptpjJZZM5c+bMmS9lPVJUVLSbsmdPRUXFTsrcuTsrKnavn/zyR+4SV+WhQ6aFWMO63WZjQ0Pzw4d3kWs8uzpzBiMhFMTYchIV8Xp9FhcguPGrK3SWEES8gwoKWfgbty5wKXb0eF1hHu4RW7faw5AVnz4uHRLjMDhLLL7fHWCUsYMSDSFKRMIQUHZWFOFG5Y+ZOf7ivXa33W0uNza3EIEN+1mBNsUIcrwRqCA+FKQENxuRvFIXQXBZQmfQwSLWBYDxuDAMiMGANwpLttpPX9lxE5CT135+7NfGCNcDDjDgQNocZWUEKZsjk3AAYQk7mFKxe37Zy3uLB1ndZnO5xIABWYNEFYMhJ4WeJq//ILUspzMPR05HcZAqwvfmcdyZlPEGHe5EomnRXiEgpr1u84Ob1Y9rLv/8lhhdj6GjDaXWkK+SHREGG+iLaxKNiSoKICyRUlFRNBk3XXPvYeHUDAcVgxXsgAQ3xpF1nL5Cj7WoiMVV4qS2jyPPK7HAhX1Q8BQ2QAyFBrHD0C7iAuT0lW3Vz5d//BpmsGMiPuAgHMSI7h8UsiARS3RRWMJFCUt27imaUzZ7/r09+J8XVI9wQTi7KCdOnDhwApqzvYR2PXr7K3H3t7SEWxfaFnUSLhD1/jyW6Ar5AYHUmee0ommdvvLiuerj98j9FnIMNjhLLXCAEXFQNSjYMkLcRCSIrHVJzWvP+qJHk5/tNG5rudmCFeC+mghk82ZgQCFLn17thHbt2nXp0qVDhw7ilndo95/p0r4bpX3XTt27xoTf5LRv3717e2zwzVvxyV/Tib460bc8HTvyr+vcrfPfAoTQ7j+JIAj/h0X4g0SQ/sgi4MexxUO4lvxEfJnfFz8y5rOkF/ldJLzDEcLb8AfJD4Yfxa/Yvy+0vRVPPPHEE0888cQTTzzx/GoPDgQAAAAABPlbLzBCBQAAAAAAAACcAEoMP11KvHM+AAAAAElFTkSuQmCC", - "description": "Displays a latest indoor humidity telemetry data in a horizontal layout with background.", + "description": "Displays the latest indoor humidity telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_illuminance_card.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_illuminance_card.json index b0fb560e4a..7d5f21020f 100644 --- a/application/src/main/data/json/system/widget_types/indoor_horizontal_illuminance_card.json +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_illuminance_card.json @@ -3,7 +3,7 @@ "name": "Indoor horizontal illuminance card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAmVBMVEUAAADg4ODf39/g4ODg4OD////g4ODzaQD7x6D2jkD82r/x8fH+7N+srKz+9u/Ozs6QkJD0fCDIyMg9PT35tIDz8/P5+fnb29u3t7d0dHTj4+PCwsL3oWD0chC8vLz4q3Dn5+f0eyD9489mZmbV1dX9/f31hTD70K/U1NRYWFj3l1D6vZCdnZ1LS0s8PDwvLy8hISH6vpCCgoLwemShAAAABXRSTlMA7yC/r1EOHTEAAANOSURBVHja7dqLbqJAGIZhtf38OSMIogIi6mrVdk/3f3E7DN1l27V1jcag+R4bMgxJM28GqYntEBEREREREREREREREREREREREREREdHJeg/d/q177KmOrv0FN+6L3e11Hm3cAfuh07/5/ah86Xb6uAt9hrQMQ9qGIW3DkLY5HFIEuDWHQzLB38ZT1w1dNOwB2uZ9iJd56mhkUPYL1CbhYOAObBtTTPURrh7AttWPOsW0PrmMjeGo48LQquVYP6INXlli/leIIWsPtUjMv0PUC0N8m3xdLpf1IHzeLl33ZTnEz+V2Oth+DXEJhoih7wrNqRaiBN5pIYgieNFunS2wML1/Q75j4E6HqF4TdzpYTtwJhvYQq+mL+3OCC3CCOsSUfb0jlpTWYifFiSH6N1UiKJ+HbGfPTchwHE5xAYUEOmQtqGXVqSd5E+I5XrVO50hIIDXrXcjqZfntbcjzdqtDMFi+TJ+HSxfnc6QwdYjk8ABdZOlVOX9CLMk9GFJ6n4YYUjuwhfaHE3Z9uICgdMzXLchFdo5O0CFWc2sVEqHatw9DfpgFCvkNlmniyiIxoEMcybOilOBgiJfnkWT4OCRSIVkTsrl6iCMZ6hB4TrVgsQ6FYF8/z064ta4skMgw1pJtUMskOhji5LLGkRCvlJqBq/PkVQDLcFC/GUypsnLxmhAVmIt19PFbvn/8xjggtt9PxDibVVlLscBedq/7EEkBLKREE+JIaUjgHQnBRpQdGuM6JoadQBuNMOr71UQfIwBzd45RktQX1MR5SfVTq5QsMqvle7kaBWquCanOdhIdC1mIkr0NWa38JAx9NUqRJulsNE791Sr0Z7Y/GwH+PJ7NEsS+vuCHs7ND4JgiYupPXaVIvkcTEkmp3yaLIyHYGIbhvA15ehrHoT/365D5U6LGam6e+GmoQ/pJokLC2TyMVW4a43z6D7jm6NHpH+Mt0yzwF9dPUn+8CtO42hF/lqTjeBz6as5WC/dRhYyqHZnP3OrCKk1xDcdD1kGBTyRzfOwpTHB9OuRko9FnF2P8j1aEtBFD2oYhbcOQtrmjkO59fBna7zzcx9fTj/fzDwOd3mP/1nUfeh0iIiIiIiIiIiIiIiIiIiIiIiIiIiIiOtUvJ7/Ykm8IwzsAAAAASUVORK5CYII=", - "description": "Displays a latest indoor illuminance telemetry data in a horizontal layout.", + "description": "Displays the latest indoor illuminance telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_illuminance_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_illuminance_card_with_background.json index a13e99ccf2..9fbe5d75f1 100644 --- a/application/src/main/data/json/system/widget_types/indoor_horizontal_illuminance_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_illuminance_card_with_background.json @@ -3,7 +3,7 @@ "name": "Indoor horizontal illuminance card with background", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAC91BMVEUAAADR0dTPz8/67+uzt7zS09b37+ezs7v67+vS0tbPz9K0uLv27ui2ub/Pz9f+//7+/vz++vjw8PD//Pn08fD3dBDz8PD+/Pv//frv8fL28vH18vL18/T/+/j8/fn8+ffu7/H8+PX39fT69/b39PP08/Tz8vP9+fXIyMj8/Pft7vD8/f7x8vTx8fL29vf59PL89/T38/H9+PP69vT59fS9vL/w7u62ur78/fv79fLz7+3v7e36+fn7+Pf28e6/ub35+Pf8+/rU1Nby7+/++/bLwL/W1di7u74XFxnKwsXCu77Y19nGvb7+8+i6vcG5ur65tbrNxMe8t7vh3dz19fXNztLLysvPzMr+9u7t6ejS0tXJyc3Xzszs7e346+HUzMu0s7f49vf+9Oz57+vX1dTKycjNw8LDvr/y9PXk4d/j393o3trc19X09ffq5uTs4Nv8+/X68u/07Ono5OLT0dHMyci+vsD4hSzj2tjd2djRzsz8+/T99+zv6+r77eLm4uHNzM25u7+2tbnd293Ky8/Gx8v37unCxMizt72wtbz9+vHy6efc19ra1dg9Ojn++PH26eDQ0dPGxci/wsb//vzr6Obn5OXf29rIzdTHyczh3+Hg2NXY09H617zl4OK8wMQeHh/v5+X05972k0j57eba2dvN1NvGwMG6trWJiYnW1tmko6P4xZ78+fns4+S8urrywJv5lUn3fB39+vTw49xycG/77+bn4t/55dbX0NHFy9HUyMfIxcTBvLuppaT2pGXk6OrU2+Hs49/2rHNISUr++ffg3OD97tvc1c/6toJjYmL54s782b/quJJXU1Lx3c7o1sqvrazzs4KCfXz2girm29Pg0MS2tLK0r66ynJT3jDorLS7b4unw5+D86Nnz49m/x87JvbfCsqmQi4psa22Jh4b3nFZBQ0U5OTvWxb7z07vaw7L3zK2al5b3vI/wnmCHbmBhW1kvJiPx2ceMd2u3pZudhXryj0NQOjDoybKmnpzvrHnGrZrE1aY2AAAAD3RSTlMA7yDv768gIL+/v7+wryBdcwczAAARbElEQVR42uzBgQAAAACAoP2pF6kCAAAAAAAAAJg9OlZpGIjjOK6iOIi+zXHjQSC55gy5JGMotIPk3iB7sxiht2Ry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", - "description": "Displays a latest indoor illuminance telemetry data in a horizontal layout with background.", + "description": "Displays the latest indoor illuminance telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card.json new file mode 100644 index 0000000000..2bdde8beb5 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card.json @@ -0,0 +1,37 @@ +{ + "fqn": "indoor_horizontal_pm10_card", + "name": "Indoor horizontal PM10 card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAn1BMVEUAAADf39/f39/g4ODg4ODf39/////k5OT/pgDg4OD/9N//6b//3p//sSD/vED/04D/+u//x1/Ozs7IyMjz8/P5+fm2trbCwsJYWFja2trV1dW8vLz/zW/n5+etra3/2JCQkJD/tzD/qxD/46//78//wk87Ozv19fX/+e/t7e16enpmZmZKSkrx8fGenp7b29v/tjD9/f3Pz8+dnZ3/2Y/zJp/4AAAABnRSTlMAIEDfv1C6kOEmAAADdElEQVR42u3aCVPaQBjGcVvtw8tmNyEHVxIIp/W21/f/bN3dRGkR044MHaTPb0bmdcOM/F1iZOCMiIiIiIiIiIiIiIiIiIiIiIiIiIiI6F/68O75jI/nnfeue/7JdnQ+49373Pl4dpHhBHy+OOviFHztnkgIGHJsGHJsGHJsGHJs/ouQnkJtOpt1MC2A/AFIc7fQwZFpCenNTQ/e6CG9zEeXwM0dbkYzFLf5Hfay0l4PnhtaqZd36Omlag/ZdEiEJiTF7WB0m3ZczHSG2QPu9tuSSLwATuWGVrHBlqUYs1i9CGnvwOhuNMJodjOdNiFTjPYLWUukLQVLmT+GLOIXIRGURH8KqUq96fA74m9uL+/rkO8PuLzHPkJReBLL4jlEKX9u9mAFS4V60hK4Rb8CpQM4ZWhUa0ig642PsB3y/QZ1yP3d7Q32YgQ91LRE5ilEifHPu9iOcxGJJfT7Z1cDmbuVyD02f+5WsQQtIUEoErmSL2hzj/3IYi4SKv/EMtgVEstcV8aHKIldiJTL0kZUSyMRqhKQ+PWQShxfEuBwrkTWkfG/2VhWu0KUiM1c+hAtKxviRyPafb+2X2Yhy9dDAnku0Tig3grAXCqsJMauEP+4m9vwy2Z099RuVJXutf35DZ9LFA4tktI2RFovpAy2QvQmRIneEeK1nSPyVHJIK72qQ5Q0wq2QpTxvQyTqDSGIpBZgI8MO2fX2Qoa/1DyUueirwDFSrZoQ8adNjKuFqOZ+JsRbQlCKY4CNQR2T4XoMr99Hv5u4hS76ACbTCfrjcX2g35S3uDKyjsLmh/x2joiJSrEhKN20kNAW6DeFNHuit0LyPBmnaWKnIYbjYdEfDJM8T5Pi+lvRB5JJVhRjZN/8gSQt0E6tRSRUO0IWsghdCEo7u+tILL03hkDFImo7JBlkaTJJ6pBJ/mhnuzYZJ8PUh3THYxuSDiZpZnOHGdr5K/ULSsxm3U5a1jDxHv/9qgC/miaPw2SQp8PM7UhSjIeDbJAmdu26mKQJXEjf7cikmLoD+XCIN/AhaFRrhcCIPugLq/EEr8vTR1j7hvwQJ8ZBQ/r9toPZHlf8qNpERXEZ8KXu+8WQY8OQY8OQY2NDvuIUdM8uTuBtdiC7OJ0PDJx9Ou923rvzj6f0oRoiIiIiIiIiIiIiIiIiIiIiIiIiIiKif+Qnt477Z3V+66gAAAAASUVORK5CYII=", + "description": "Displays the latest indoor fine and coarse particulate matter (PM10) telemetry in a scalable horizontal layout.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm10', label: 'PM10', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:broom\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":150,\"color\":\"#FFA600\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":150,\"color\":\"#FFA600\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10", + "coarse particulates", + "coarse particles", + "particulate matter 10", + "inhalable particles", + "larger particulates", + "dust", + "airborne coarse particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card_with_background.json new file mode 100644 index 0000000000..f5c4edad54 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm10_card_with_background.json @@ -0,0 +1,37 @@ +{ + "fqn": "indoor_horizontal_pm10_card_with_background", + "name": "Indoor horizontal PM10 card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays the latest indoor fine and coarse particulate matter (PM10) telemetry in a scalable horizontal layout with the background image.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm10', label: 'PM10', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:broom\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":150,\"color\":\"#F89E0D\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":150,\"color\":\"#F89E0D\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10", + "coarse particulates", + "coarse particles", + "particulate matter 10", + "inhalable particles", + "larger particulates", + "dust", + "airborne coarse particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card.json new file mode 100644 index 0000000000..96f201d693 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card.json @@ -0,0 +1,38 @@ +{ + "fqn": "indoor_horizontal_pm2_5_card", + "name": "Indoor horizontal PM2.5 card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAq1BMVEUAAADf39/f39/g4ODg4ODf39/////k5OSAwyzg4ODf8Mrv9+Wg0mHQ6bCQy0b3+/Lz8/POzs6/4ZXIyMiv2Xv5+fm7u7vCwsK2trZYWFja2trH5aPA4Zbn5+eYzlPY7L2tra2w2Xvj4+PV1dWQykbn9Ni43Yg9PT2QkJBLS0uIxzq33Yh0dHTt7e2enp5mZmaIxznU1NTb29uCgoKn1m6o1m6dnZ2o1m0vLy9qOap8AAAABnRSTlMAIEDfv1C6kOEmAAADhElEQVR42u3ai27aMBiG4W7tvv6NsZOQEyTjPKAUeti60/1f2WzDykbbVAMxAfoeqZVxIjWvHEMRnBERERERERERERERERERERERERERERH9T++Ons94f3557IbnH2zHZYajF12+P7uIcAKyi7MrnIQrhhwYhhwahhwahhwahhyaupBQYal/fT1EPwdGdxhe95+mDklNSNg1Ibz2XTIdtX8CixlmyeLOTeVJhB0EVVMrrGgdopZ6fkKoe6o+ZN0hH7EKSXCft++TYXuKIRZuSaaPfeygKZYZw6tEAtQaGGzoiTEP442Q+g4XMmu30b5e9PtTIJnByof3ObamxQTjphg4yrwZcpM+C2lCSfOtkGqi1x1+Rfyv+2k0xWjmbqnoDtd32FpDeu7yRMEayM1TiFJ+b4awgp6CG7nuwE36GSgdwJk0jKoNCbRfeNexEfJ9gSmms/ZjvsDj/WyIrfW08iGhv8qP5neIkk/+vkvtsCsiA2nA+maAQLpu5qO7Nr93q1SCmpCgYU92JV3Ui7Ar7f+GMgYvhQykqyvjQ5SkLkQmvbmNqHrGXmE1ByR9PaQSx5cE2C9lZOxvrPFLIUpEAT0fot2JgR8a0e7xV/tjHqT3ekggTyUaexUaf/OOJcVLIf66V78b3fXQnandUFU6rHv6bTyVKOzP+knRSFPrG5kEGyF6HaJEvxDi1e0R+V2yXwOZLK98pbER0pPVMriHaosQNGUpeGtjR7ebE/+w/yfyFU4YOEaqMVZdoYtMEd6IWl2yaWCbEMzFMcBaaxkT4baEl2XIrmI3cYUMQKffQVaWywOZO7NeJfIjtTSsv/aImOZE3L6Zu9GDNGyB3ipktSZ6I2Q0isskie2oQFEWedYq4tEoifPbOM+AuBPleYko9gfiJEetVJbS5yE38tDw83ORB/c6MpBwyxCoVERthHyOW1ESd+JlSOfzFzu2c50yLhIfclWWNiRpdZLI5hYRtuD2iH9Z9+zIPdGadIf/flWAP/XjL0XcGiVF5FYkzsuiFbWS2M7d5p0khgvJ3Ip08r47MCoKbBuCleqbQmBE7/WNVdnB6z4nX+DsGiLOAHsNybK6gxG2FjardVQznQd8q3u8GHJoGHJoGHJoTijk4gQ+ZgeiC/uFgRP4oD2zXxg4+3A+vDx25+9P6Us1RERERERERERERERERERERERERERERP/JL+y8/ulGq8beAAAAAElFTkSuQmCC", + "description": "Displays the latest indoor fine particulate matter (PM2.5) telemetry in a scalable horizontal layout.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm2.5', label: 'PM2.5', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:broom\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#80C32C\"},{\"from\":35,\"to\":75,\"color\":\"#FFA600\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#80C32C\"},{\"from\":35,\"to\":75,\"color\":\"#FFA600\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Horizontal temperature card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air", + "fine particulates", + "fine particles", + "particulate matter 2.5", + "airborne particles", + "microscopic particles", + "respirable particles", + "aerosol particles", + "dust particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card_with_background.json new file mode 100644 index 0000000000..a22d207dd2 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_pm2_5_card_with_background.json @@ -0,0 +1,38 @@ +{ + "fqn": "indoor_horizontal_pm2_5_card_with_background", + "name": "Indoor horizontal PM2.5 card with background", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAACalBMVEUAAAAAAAAEBATAwMD5+fnv7+8qKiquq6ual5dBPT7l5ORZVVZZV1hzcHAvKyuLh4cyLS+BfoFvbGzRzs8AAADl5eWSj4/p6enBvL/n5+f19fXy8vLY2Njy8vL6+vr8/Pz19PTz8/Pq6el8wyL5+Pny8fLr6+vV1NXp6Ojw7/Do5+fT0tL4+Pjk5OTW1dX39vfm5eXx8PD29vbv7u/X1tfh4eHg39/S0dHa2drm5ubU09Pe3d3c29vj4uPW1tbZ2Njs7Ozf3t7b2tvu7e7j4+PU1NTd3Nzg4ODi4uLt7O3R0NFAPD2YlJX29fY3MzSTj5BDP0DLycmsqaqHxTjZ2dnEwcFaVldKR0ippqeBfn5RTU6loaIzLzDPzs6in6ChnZ5WUlPTz9Cvq6yem5tuamuTyU/Qz8/PzM3Hw8SQjY07NzjKx8i/vL24tbaalpeFgYJycHBnZGVGQkPD1a2bl5hfW1xNSks9OTovKyzNy8y7t7igzWecyWJiXl/IxsbExMSzsLGnpKWqzX12cnNlYWJXV1fO1sKzs7O1sbKVkZKNiouLh4h5dnaNyUC9ubqdmZq20JVrZ2hcWFmxr6+WylJTT1BHQ0SJxznV0dLL07+IhIV7eHlJRUZIREbr9ODb7cXL5qm8349+enub0ViBxC3W283H2LA8PDzN0Ma/v7/Bvr/S6LfB0arF36OTzUrLy8uzzZG734+mzHcsKCnz9+7l7tjR2cPG07TD45yy0Yqq1nGiyW8nIyTHz7vM3La+1aC734203IHy9uzR1Mu+z6e9zqa815isy4OExi/09+7E2ae22omq0njf4tjeZHX1AAAAHnRSTlMABQYmICEGJiYgICAmJiAnJiYgIAdCIMAh4N/AVFA5JnX9AAAVU0lEQVR42uzBgQAAAACAoP2pF6kCAAAAAAAAAJg98nlRG4jieA/mkARyiKzIlkKyMLKK1vzooYUWbHtZGZlND0222bBkqWARbWuoJhQWFvTSdiloUaTopcdevfrH9c04K3T/gD3NZ17e92VmmPk+RiAQCAQCgUAgEAjuE4mSo5EDJJ657CoWChdJkSTlljwdhYKuMjRNljVd01RZl6HWdVnW4UcFVWVNVlUIENgEVUHWIcMOpVCEI6R8sQjn5ZUcu4UZ2Jvam2BW+QybosLaODg0TIMG4gqA8A+gBeTb1XITGaiBGm7DsionR5b1vLa8Pr9ZL9qDwOtGySbabkkUzNNNRiYXUzzyprNp7BFMCElCgkfrIE7WsYeHrbAdXM3j8PT7+18fW3++tPp/3zy97By5BgWZzAhiNTe1c4OoAI7j1KvVat1xDh9BH+Zu/X8QMhxjz34ZQQUD2WWz3HQvK6WT5nHlSaf39uLdJB0MsAckZLPtbomXpYvM732Y4CgISEZwGmXE87tpjNM5SYOV155c+f5oOIvHpz/P+2P/x7ev/d7j5fLVi5oNVyLHLrvMPk93xGHU69AHODp48BDMIZP3Th2zRJVn3qVJX6wJdckwbWQbtvv62Cq9rNWeLTtnnz7fnP1eJbMkieNFEOEoS7JsFODhdX8cEtrGCock+kd5eTYpDYVReP+F3yIhEkyQLJAQA4QWmrhixV1ZHXtdG1iwrh372sa29r6ObXTsfrD38p88701EUcdywCQEMvs+97zn3uvq08tWnjpV75my+sjK2T29s1d2r+w9uHJb5eSuys5K7cLUa5MWztAWzZgXZiCsJA/edMKw4k1yrkN423KhIGlQGyjIKqdykscxoclH13TB3CBuSVKLmaKaHqrLkbB/3qJRYzYtmTSp1n1qbM/Yeu+2sR2rp3Qs6+no7VzZubTW3XN3yuj66I7ujinor66OendPT0dnL74/daS3c3p1W6W6bfqsSRMnr722c+3E+el58zes0T30t9u/1RHk+ZAzrECwGdpxcEl2qbAu2MYMwXP0Qzxhl8o61MHjHa/YUeWDmUwmpRbdkigNDchmMjlj58K1M/R9m/bM3jq9e9nRo9O7xh5FjZ0Y9u4TXb217u5VdztWddXHnp7S0XOop7O+qr6sc8qqlb21ztr02t7Ze2uVpXsmLVq4dtG1hfMWzl+7durkfTN0MeNBHFFSM64QmWN/ooYiNoKQghLUxjyg2qnXHFritY/tTbnoHo8f8BJgVA+vBotSwDweO57XzHhA2TB+wdLdY8acOLn0wkm8xlS2HqxWd1ZO7pk26uDBk3v3VvZWt26tXqhUlp6sXpi9t7q0MnXJnlHT9o/aPGvJ+J2LZm6YOH7+OG3DjHFrZihe0y/zQVc7oky2tLNKQsNQPS5xmx82ZMgQlnJ0OMRAPOh4gAwb/A/iWjUkFBTdKUkVZdntjhQMJefVDMPQFG/CMA3FN3y4L+pNKDmfLxqN+oaPhIZHvV5vLurz0TdJI58uZP1QNpuNx+PZiFssZlQJBfGhdhTLcb8toaWcEAxhIKDAg3/n4PAcDi0gJQaSGYrER/y6lchRdcmEN5ewYqYGEJDkcgQE4dNIXOVyXtzCffzUyqfDcX8gEIkE/P543C8PFcUUI+FLcONXElZDyzWRSEGoDRTQP9nBKFpBUvjDYiQ+Ip4Npy2NClQUJRdNWHqs7HUI2Iko6By1BQ5FM8yYTiAReagcCLCzW4QnDCTUDk/s4cehaQCOzie87BseYEhqmyeIl+v3pf9M8hPKsFIwk0qJcragQzFL86JWkKC1rHTaSnijAIAYC9rK5xB4IUXRyJBCeETWH5BlORIIAMPtdixBpoHCSH4wgWutwWFxSeAACHWWi/ufxkLS7DOCnxGH+guxvGmaeTOJWPi8WjmpaUYMXIoXKKy9KCF2nxGCgkNCS5IhBSgcR07gB/oKHCApqhJmH0Kh7mJqOtAEwMu55ikkmTaJjHFx3J8saU2GLbpqdwURED1vGeVk2TCSSjSnJPPptGlY+bylJRSWa5iQ8zl9xUASis2RT+t6Ogal9XCYku6GHFMo8HzTlRZLfnaEp5kLICDx8M22w/EXFq6VYxgJJAwkJYfzZU3TEqgt4QVHLOyPF2LwxwAHco3aoSgjgTBrJRL0YwMgYMAgJJMGpR5RJ8mUFIYCFlrfbJRmRFussR2RwKG2SehIlW9JQkvAfvGDpm8aKFwRSCRsatQt1DWYfq1CQA7EdRgCf2yIJgih0B1gwBDDMiELk5yX8hILZ/2kLBotwlAyaiaD5Htc7Q4J93tHsKpho9FGDRbkHT9apth7ZxyU8QsWFLjxiznOt59L754UKrlKm3fvTsMQLI1ufyypUKkUABgSl4dG4mgucND4Qwq+a6aeNRcwygCxDLQjTQlRPEiNhg5Dr6XDWQSGwiK6QZSR+BCRNB1pFWYtcgStReIJoslsn+7d6vtg0zX2bxzwNaZwXLXOdU2sriiVSo0dE8VhJey6sIowS7xsqBHyERHZH45hVUQuqGwo52OrIUgYGfXV8sdbDmwvJ5MarZe3b1+NJsqWBYtieZxihThI3G60WYTMUe+fewmUFt07d/2Mc0lzVrHYFlQJhDhamMEhnHeuGxu52uJGbaPeGODSQ6qbQ6XSQGUSdm0eCUoFdCtJ+UWAMaPqcT8M0TDOUJRCwlZ1EoEoLOhbBOjYQ02jHL0ThDdRuKSh4cCGxMT0Ef4ITclMsvjkWMheH5u6LvT1vb/vgGSgInNE5VkwfgzSB+Jw1Kg3Glxjwdbx4wc4bmIXhWSHuW0HOFQKmJgFiYbyqFlAUtDzhmJvQ6LsBI65c4nE50PSAXxAOLb84RZhgkYk/RMAQjsCTNegxNdlM5amxCAtWCcRmfdPEPoSkkk4Nshz7ozw/AeQFEBUONLSe49enLP9aDrCDrWB4gA3skvE5s29orR7CU8gWE6LchythJ0TomvQxGuWEzCCKcdSDhDYQfsTck1LzhGeIR2XhP4EQNYLl4TXeLoMkP5+tN6r7ZfRY/qVj5cLl78g/PG3wlNRvu8OXr9+n3fdP3eWI7242HfGASkWiymxTbUdaebj7DnujgCddzC+g+zfyg1wA/VGZUc1VNnWZQCErVySiH0WHDEsgNCBcs42h14CIRKWFkQa9ZKeHdhuEcgrNNptYcsE4QaNgqH1CxPw2BZhnWlt70MN64TD8XA4vP6YP/JUuHULdz59wqHvJY32EwFEJIlA4AhConpY0YRxEQhEcuuHCa5VbP/skl3sf7xBgHgycsHUiIOt7+QHTbMKSCAwASKhkZL4TYxtA8BxQOhD1f0TJngBYmFNMY3twgQsMQSSXCf0HXh8TDis64XLwrrwiCuC8PnjZwTr7fVjwnM0DccJTzgmFRgiQL47AkzwOiRnHYjfkACkBBGJh0Ak94i8YaCx07RU5w0kPUo7ERjC5jK2iufz9A+bEvwELAai8RCk64WHygRheT6NuyZAEBGAWP2C0J80nglzsOy/FR4U0ldgTjx7THgmBm8K67hzQt974brjiA3ylRLz+U0aDOM4fwkZfaVQJgQthdXSrYWMAomHgktMTGeioRzcvHBCG5gc5DQlGYm3ucRtGYmGhYM6yYxGjf+W3+dtUxE10W8KbcKlH55f3+eVZSyt16K+XrKQ5CiMCK4/zkR0XxhPWgPEtFmsYAjoOio0X0QPw+tTRAiCe0NdVywLWVLV8UTvfNJkA7C+Y956DiAadysAQbUDJPeVtZCGHdYC+3gf/06HB2fMPqbKb9iraPTw/RESjEs2aOJEZJQ8QAK9CklQSX+JCIUEovZLVQKSmqqYeZ0bv1RW0bjLImVo5fB7qZr1hdENEPNknw1Q9jngjEbHbHYK+5gnEPgygCTOWSuTI5Bi8S0bYbp0eHDG7DQtEsiiZEEwRDFCHGWAhCEJSJZqZMltBSDXZCr3uCykaRqnyC2pVbQwigbfOCq0cPAxLSSTuAAEEE17zGaYfCiKQGOEyyIQtIYZ8wpUQByktDZgT9HRXhNTBSB68jcQERIitRpQQhCqDq6XCxDybyCQmL0Z9F8YFUNNZzWNWz4MlRy5XnKHa3CQhAfjhAYJCSkVltLU8K6VInTSIb1gFx+RdUoFXGd112Oee4benMG8ad3aaLZo3LwmpmKLdazUT5ArQWoZYs2IlA2QSNFQnxlpP7qgIT5luoR1HyQWvxpf662kpEpBMnBiUbq7qlYf2EJKySu3ErmEDY5N4qhmKRjgQCUahgEQHpALxrzH0AgsSL0X7JSKh4M0Z3P82HbmrDmYH7MWQnGeg10OQfIEAgJcgSRuyyLUhGsACfWJQUdLIK47Xe/3p3iaXNlJ7OzG93Z6U/vZ5MDsD6WV+Nam1rhni5VHTzbu32k0ntxfpc0EvksgBpl/IALRrTwSy9djcKATAASnD2kOcsyOW8zrOu4czx5K3mNf4F54apUIRBEIZNGuSPiLEBHiqFFqhTr8wNjhEkjdHpb706odvUIglrtpW71uv5Hrbj3aklZiWxnHtqdiZbjda9iNh6vbNhx9UckKhixhb4MIpSYmKSCmL61C0tCQq6CAquZb1jy7PHO63W7bcfF0zsaZpof2tXGLDAOGkGlljTh2iF9rxMBWGeE4QURCFFTIgu5N1yf20O1PykOA2LuJnT1jr//gWe+eNSxNetdvxvobqYODrrF6+37h+e3GwfY2FYiZToIjDoEFJBSQNAJCJPRFqyEEED3NQfIASdwouE672/4+vqx/a7IR3ChA+CAFiFlVRZx3BfEIUwtJi9RCpSC1/lkokYRyFaK2FYtxM+cPeaksYBPZvb1LeZUrabqKXYImJidBkYipbJrmSR6yCAj3cGfXqxZFJHOjUHfabec7I3m+p15DQGiKaopqgOPqEkhNBANAKCL/wYFaj/kgGIs3gcGJ6ExGNrDAJ7qbVB8lU1eRWGRhiIRAeKnraLP8/XEnCNw5CB+TJ4MLDuI4bv1y5s2/JjgGbSoIHuWVKK3QicRSaokUEYNu8n+BQBwkFJIrDuFI5QdlZrTaIBBE0f6KQ7KYBWmIaCu0BaMY8/8/1HNn14X60OA8RCEP7nFmduder/0nZwh6r5+jqbAyiCekHjTLAuKr/147BRdcMe3Jy116UTM/HC7wSazGM7cniK6xqbrx6D8kJ3at0cKbPBhrD2DsQbghJXrrAhkBEUcTw7RxkK4EchWIMgGGu6QrV/0icRm/pEg2MZm9SGH0gl67x9rUqbCyxtpgWvkunpGnTcc4ACEcQjcF5GkzAp7+SH3upnJqEW1Z3iJ56JrnzWhwnkePyvdz9INwDBfOOmV8ZtAraIbQKiFwbOEsUyotI4KdjnEUEKKQ0CMR/c4CvroYaA/n4I/c6ubLYdnqChm+skndv+aMXHArinjxqvpxjhGOaFbLHbbpTEIySUF5N40MBohIzvslvwCBpARpAUSDVxhwsqmskWfCURFJtqjVHcQrahVIVAzKESDjck92ihvFCrU50kAgbkEyjQ7WVnzc2INcADGB1Ka7y2234n8xiD1IVQGCD/HLldn8JA6EYdx/YuN5eyCzYyCTXb7GblwlXWjshAIRKBQoXxEqyleKKAkGogdAAgGDMagXj173un/cvlN62jlMnx6avL+8z3Qyz8ASCfoJb8hXG8TpCDgLURuEGx6Sa4wAhKPJ4KwdCD/k7xLvHQjfBiFRARCbBLu+Qbb9X0u+/xB2sdEeEnYDuezWOK+YaxefQGMkHCNEBSpJCAtEpjw89xCZyDz7oYSG5WCg5K3XF2ax957NrLTBXanU8HpEOF+VGqXkbX1QLutLtTmbqdvHraqaFmsahebSqMweWWZr6veddmoIl7yxfmzznIsqN10l180WN+n0/HVqVcqJq6vJpO7x+vGZ5McUIdlFKUZQzs5YjrUQgnL57OAghwXccAxPDhMhfBcgbox8mGBECBFgvYohmUbkE0JOwp5ScqFXn4upoXk//ry9rEGYHQoFXvKNWvyu/jnSKrrOgMCEeypmsGahbBlsMptXZ5aZMPV5xnxtFzcK3Pu+3dz8jUYvut3YW2rdKw6ZVh4lGo3FZ712SBp+DCQIn0g+LBHZzovtM8IeQmiHAANzQZwGgeQMLtAEUSogwACFqIwxJPBuDK2QZDcJyj7iFoNivq61Out1rLiqavV4PP8Ljh2eg3jyMplsXCY0zWJsqppb1XpkS9ZUdXV8NS4XCi1LZVPDWM5aurbqZdLVVLqf+5PrX/SVmLJ5X6d6H/P79nQ0WSzOj87C4UAkEhKDvlMCRbiR4yYEIPt8hpJtDMol3jVEgomDYIGCgM9kt4yR6POFKHBhAVP4dxJJkkOS3xcWD06f9FZn2LvOdpaDUu3l51Eg5H1J3t4lwVsDTdd1gzHWUs2n8riiWrphWYbOCqqq6iOrMC0s1QT7mLcfVr2eouSisWhfUS6y79nidXX9UGXG0ySZP/Se+c+93vPfsl90C1SUHAqoeX/vC8KUa4CgGGO7QrsNgEMJBhA3NyOAEPqPMytYaRgIok2FZg8NMaAHwZMXJSJ4sLX1IAg15lAaE2y0FRO7GzBVk4iIomBpaA+NhYItFKn4r75tpYcefRl2ZydhM2HmZZcdHbmZzxXz+HGWkGn8XBMr1aau6hrqOoNy/+H6vd6N2ncN39/TCqbZeL1DnbYaUEpdhnxCTMLQDZMmcy9ZsxwHbaPvsrgX07j/we5ZLYrsd3s8vAVLKreVyunPsNvt1GuT7/jCag/M0Q3fvry9Fko7eP/JxuE0AEU4vpoS1tdAXh4GdZZlO1OKwEmECWMV2YMKIeKo5nJgdwmfcVLcxZXPcdJDtCMdx71Vv2UMvU+P0SBofW1rZ4UD86axf+XT+1GvbTm9xHkKjTIIbsUWvWCJc2lRp5lYzSenb7CkY4RuLZp4tl0/P0Ut+7EyfjkfP9te5EWdmjEZuW+0emX6QbVweLyp6qWipm7Bbe792qqQEoT00n8gLhqIKErZbFYRiUgIf2AGmDGWCSGKrMhElrgOkwINNklWFIVIEpEUaYosx/IU6NBwiwzBtPJ8ygUXVtIpQEgDmfQCMhkuApS/u/OG97/sjcEJACAMA82nE7j/rIZ4iAVHMKKpTY+qJgSxNX3xLjCeygiUfPytzchpEgEV9CZlY6DlBjUie46UygWl69PNX6SEurC3BgMoBEaA30vBWI43kgbo19IoGAWjYBQANApGwSgYBaNgFIwCQHtwQAIAAAAg6P/rfoQKAAAAAAAAAHMBXCnzl8gV+M8AAAAASUVORK5CYII=", + "description": "Displays the latest indoor fine particulate matter (PM2.5) telemetry in a scalable horizontal layout with the background image.", + "descriptor": { + "type": "latest", + "sizeX": 5, + "sizeY": 1, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n horizontal: true,\n previewWidth: '420px',\n previewHeight: '90px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm2.5', label: 'PM2.5', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"horizontal\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:broom\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#7CC322\"},{\"from\":35,\"to\":75,\"color\":\"#F89E0D\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":36,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#7CC322\"},{\"from\":35,\"to\":75,\"color\":\"#F89E0D\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Indoor horizontal PM2.5 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air", + "fine particulates", + "fine particles", + "particulate matter 2.5", + "airborne particles", + "microscopic particles", + "respirable particles", + "aerosol particles", + "dust particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_temperature_card.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_temperature_card.json index a97f8d62c9..887b697dc6 100644 --- a/application/src/main/data/json/system/widget_types/indoor_horizontal_temperature_card.json +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_temperature_card.json @@ -3,7 +3,7 @@ "name": "Indoor horizontal temperature card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAt1BMVEUAAADf39/u7u7t7e3r6+vl5eXf39/x8fHw8PDr6+vf39/////z8/MjTMc+Ys7j4+ORpePHx8fk6fjPz8/x8fF1j9zI0vGQkJD5+fnV1dXCwsK2trZYWFisvOo9PT2tra3n5+ft7e28vLzy9Pvb29swV8tmZmZaeNXIyMiCgoIvLy/x9PvW3fWesedog9lMbtI8PDxaedWenp50dHRKSkqDm+DU1NQxV8q6x+6qqqohISHd3d2dnZ2F97sdAAAAC3RSTlMAIN/fz6AQ7++/MOBJYlEAAANbSURBVHja7dppc5pQFMZxbdP1cLisIiCKiLjvS5O23/9z9V6pI60NSdWmxnl+GQNceHH+IyGTiRUAAAAAAAAAAAAAAAAAAAAAAAAAAACAl/S++sq9ryifP2mvnXNXrVSqH+kGfKxW3tFNeFe5o5vwtvKGbgJCrg1Crg1Crg1Crs1th4x1djv034xJsmp7+0k60X3n5959FI2p6JEQXZ+yQQcNqUUlHJ8uZWx0dZJc3qvRjqUz67uSSZcl3SKpNMRiw+j26EC0GsIhX5AQpvBNObfcJ8ck8n3HMQU9rIUQZJIvv8vzp5ss1IgkRe5Oj9minUi3rO6EiDbMvc1U5y/WM0JGeo8KzAZRY7A2vfmguWoszbU3N/35oEHNzG9+n5uDuem16Ks8NAerbEknkxUzGXLgsks5Y0a02BDVmI38DVo8I2Tc/T1EDL1s4HnUpJYnD73lKvOGTlOeGzRbciEPETT0VhmdzKiRUQyx9m+ICphO1cH05/kJf+k8HTI5DmkK4RxCVsvBUgh55Ayd7JcQdXud4dcQlw9z3Pem6sely0Y+pWE8I4SOby1vnZn7kGG2FmKdrVTIPBu2nHnLbGZDFfK92VheLMTSOaJfjfhoqSREX3CPfucUupzCgpO/nMN1FwuJ8v0i6y9CxizN6HHCozKXC9E5OidkxsqEznR+SKR+cZx+a0WsFJ8JbfqjtkYF9bp8xSRdLERnl450eUPK2HU75SFTzt3TXphPLcfcbuW06ku2te1YbupJPr7/oC6waXdKa9fzzLNCIvXsPeLyl8O2NMTlXK0YEtthPbRFv08UaIH24Pe/9YPYF0E71ELbJrWstdSOLRIt6afbflI/M2TBLh2rMW/UpsvuEyETznWKId/sUEv7cZrmISEldpzG9jahQM7v70LatqZCtmGaxmlCdnxWiJq49ucLuLvQmXXriZDRjBWDDiFBP01aWhj4cUCUBi3tIbDjIIkTO6RQS2yxC6mHfRki1+pJkPpBSOeFuI89OSOdZYsxotIQVeJ2eRZRmfIh62lf0L80qln0GxVygjaV0tr0sm79L8TXCCHXBiHXBiHXBiHX5u52/j1d/UA34IP66MOdo712nz7f0odqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF7ID2D6pgpcp3y+AAAAAElFTkSuQmCC", - "description": "Displays a latest indoor temperature telemetry data in a horizontal layout.", + "description": "Displays the latest indoor temperature telemetry in a scalable horizontal layout.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/indoor_horizontal_temperature_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_horizontal_temperature_card_with_background.json index 6fe2e71a3f..5295d4bad9 100644 --- a/application/src/main/data/json/system/widget_types/indoor_horizontal_temperature_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/indoor_horizontal_temperature_card_with_background.json @@ -3,7 +3,7 @@ "name": "Indoor horizontal temperature card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest indoor temperature telemetry data in a horizontal layout with background.", + "description": "Displays the latest indoor temperature telemetry in a scalable horizontal layout with the background image.", "descriptor": { "type": "latest", "sizeX": 5, diff --git a/application/src/main/data/json/system/widget_types/indoor_humidity_card.json b/application/src/main/data/json/system/widget_types/indoor_humidity_card.json index 848cf84203..621dfb8823 100644 --- a/application/src/main/data/json/system/widget_types/indoor_humidity_card.json +++ b/application/src/main/data/json/system/widget_types/indoor_humidity_card.json @@ -3,7 +3,7 @@ "name": "Indoor humidity card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest indoor humidity telemetry data in a box layout.", + "description": "Displays the latest indoor humidity telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/indoor_humidity_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_humidity_card_with_background.json index f1a69015fa..e9f5058ed0 100644 --- a/application/src/main/data/json/system/widget_types/indoor_humidity_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/indoor_humidity_card_with_background.json @@ -3,7 +3,7 @@ "name": "Indoor humidity card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest indoor humidity telemetry data in a box layout with background.", + "description": "Displays the latest indoor humidity telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/indoor_humidity_chart_card.json b/application/src/main/data/json/system/widget_types/indoor_humidity_chart_card.json index 0c8502b5a8..74448c77cb 100644 --- a/application/src/main/data/json/system/widget_types/indoor_humidity_chart_card.json +++ b/application/src/main/data/json/system/widget_types/indoor_humidity_chart_card.json @@ -3,7 +3,7 @@ "name": "Indoor humidity chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a indoor humidity data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a indoor humidity data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/indoor_humidity_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_humidity_chart_card_with_background.json index bad113015d..d0250a4bdc 100644 --- a/application/src/main/data/json/system/widget_types/indoor_humidity_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/indoor_humidity_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Indoor humidity chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a indoor humidity data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a indoor humidity data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/indoor_illuminance_card.json b/application/src/main/data/json/system/widget_types/indoor_illuminance_card.json index 6f9c866f4a..47a3c14d50 100644 --- a/application/src/main/data/json/system/widget_types/indoor_illuminance_card.json +++ b/application/src/main/data/json/system/widget_types/indoor_illuminance_card.json @@ -3,7 +3,7 @@ "name": "Indoor illuminance card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest indoor illuminance telemetry data in a box layout.", + "description": "Displays the latest indoor illuminance telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/indoor_illuminance_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_illuminance_card_with_background.json index 7e215b854c..00ef351d75 100644 --- a/application/src/main/data/json/system/widget_types/indoor_illuminance_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/indoor_illuminance_card_with_background.json @@ -3,7 +3,7 @@ "name": "Indoor illuminance card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest indoor illuminance telemetry data in a box layout with background.", + "description": "Displays the latest indoor illuminance telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/indoor_illuminance_chart_card.json b/application/src/main/data/json/system/widget_types/indoor_illuminance_chart_card.json index 10faf304eb..2b9fdaf0a6 100644 --- a/application/src/main/data/json/system/widget_types/indoor_illuminance_chart_card.json +++ b/application/src/main/data/json/system/widget_types/indoor_illuminance_chart_card.json @@ -3,7 +3,7 @@ "name": "Indoor illuminance chart card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAz1BMVEXg4ODf39/g4OAAAADg4ODf39/////g4ODzaQDr6+vCwsLj4+P5+fnz8/POzs7IyMghISHn5+fV1dU8PDz+7N+QkJB0dHTu7u7a2trx8fG8vLxYWFj5tID0fCAuLi6srKy2traCgoL+9u+rq6uenp5KSkrb29v82r+6urr2j0D7x6BmZmb2jkD0chD3oWD1hTDR0dH70K/4qm+wsLD6vZAWFhb948/5tH9hYWH3mFANDQ394s9xcXFTU1P70LChoaH6vY+BgYFFRUU3NzegoKB3nxmSAAAABnRSTlPvIL8Ar7DvmsykAAAIf0lEQVR42u2dCX+aMBiHd/7pQg4SBATmfdTVHd193/v+n2lJUHHiZnVTY8dTKiGAPx7fNwe2P71x++atG96pc+fm7Rs3byQ4eVKtcSfFNSDRaYVrwY3rIuLVIo5Ri7hGLeIatYhrXG+RzwmW8H0I9+djVZFL4I2HucokRhwh8PELvRiuURUJSHLpoU1g6eSFSJpCL36qoBcdJFuE3jD1qW+LxcORqIok3suX73oJfhXRD1HsB3k4Go1yXUQwGoWYhNPQF+08jDHQj6kf5qGPo1AVwfcgCF6S9SKpr4MT+EZE6Voh/Lwj2loIoUCs8gF6QxyBqshl4L0zIj/efFgnAr2gEPH1MhnF7Y4IIcKiGYWjPHdERPPNiHgrEdHNO66KTDsYzURGArHIe/DdSS1Pe0RYEVHhKKyKDNphGBUiKgxj+GHoUBvBm3fvcHKsE/G+PsfJsU4k+XyJk+N6z7VOkf9HhEpcGVmp2PDkBxSRfJyhilhj3EQXK2TYwOFEMu1CBbxEEUYEJTyRRCg5kIAiRAgFxRUEzyjv0ufcXLknBPVIxnTpeeKJjKosQYVDi3ShIWhKnpiVkplsgthqnjCOjBIoSeA1Gde1nOn6ptT+ibAnSo+YU6scWoRQNKkVYSBQXCalCGNc7xdWRJYiiczoQkQkypxa5dAirCs4FOkWIrQrxlYkk4WIlSMwIjSjhYjSaTUWGbMiKut6ToicDLWIa9QirrGDSII5lOoHR/4mvEmEc4BwGFQ5Rlr0iCLtSDOGA2wU0ZedcZhZRhNcGJnnQqBJEym1CBWc0CblwoMSnOJobBZRsqk4lYyYYRCZETFDOZNNjVQJJUz/oEszCIajsVkkyQjjjHgE9semlvTmIoLBiHB0mQB3WoRxxbQNz0oRlbExF1ZEEj4TARk/d1mEmoWCUWbXehOM6ceEWvSOoppBJpnLbeTqjPlWz+SuyHbUIrXIqVCLuEYt4hq1iGvUIq5Ri7hGLeIatciuNM7P+zC4LnL/7OzsPiwPzkrOC4tnj8zGkwtddlykcVaKtFZFGlZjdoTjIq2lyzxbEWmYna3HNlAvHBd5sfR693XpaWNGf5Z1r2dCj/pOi+jcKUXe69KrlWi1FroXTos8Pjt7vBA516XydS/EXixi9RhXglLKKGakqf035P2LXOiXvFGIFFuPsMQn01QWsXmCK8ESDSx+3BZAlE8AMdmjSJH756XIfXO1jadP5+PGizLVHmhjXInE19AiHiIXmMQqBXodv7M3kSKxUIrozdZDvaVrG/MRplGOMLgScvxhPNYivvABLRKF0zBFpE32J/LUJFYpUo6Hpn5XEf/yzeWlFhnEEyvSGyLu6OpIm+xJpN+yXVEp8kSXHj6+//bMrHcV6Qw/DmKKglxoIYxMS4kQ7UmkaBLLIuf3H3zBfBw831EEH162FWb0lP4dDXUpVcPJXkQKgUYpUlL0w892FcFXddhxpFWM2lURzSMbrKqIiwOiucqHBtMyWg8fvsISuq5V6X4dFdGXVlKOfMvXfWHmXguzhzZ87ok8rojcb7Va/UVqPSynKBpdemsNsSN0byL9xgzbsvVs1wbgomzsCx/NJ7OrEDnXZ2I7JGEge78fKRt7/9FsIOzb7re8eSwqGoXIs/OH24qwphZhypMHEsEXOzu5/+yRWRVqJqWKitewIlrqAlvBJYwIOMehRPBseYpSTGLmvMVMpPHkPralECGHE8FFcdf+6HV/vvPBrAJzkSeNt6+wJR4Fl57cc2rB3tfOefX04uK8v7z3l4o+Guj3nep+j04t4hq1iGvUIq5Ri7hGLeIatYhrVESo8sC4gic4FD8dy4oISzg4momAoAQEp0I1tZgVkQScnbyIKESomIlk5FgpptLfXjhRm0U8kkHZNsKhOV5cRBCMpkOx3maHW12F46DakZr08ra1wSrsZLpf7QGLsQnCWJ3oOOKHEZYYTINw6J+giPZYrRnkQd7x9yUy8bEZPxp2hPDTbTzidbW9MIgnexHxwyDCBtKoPcrDdhCE6a4eJSIOw1j8e5FeqDZ9zI4IQ1Fc3SjfFN5oRjj901G6uXT+sYgfTJD2/hQUP29H6bwc9v78bDpyBdP0zwcOJv9YJJ5CM/ltUNIomC7tUsEAfyCMjzWN9wO/WMfrg9JpjwSWGbb/kIZR6O9XJLn3O95M56Xh94+Xq3snH9vRat30m1cUqlwG3Xtb8C9H9o4NyOKfd4ZYRjedXlrNtbKZVPZER7tDXBl7w9hfTqJcrJ94TH7X/+FYIp2VnPani15R5Cvx2dhMdHSPJhIOqhdpg5LGZVZVyfMNM5JDi0QhKvijsGOySkGzTWOIcxxCZBIX9MTyazhYqxeE7cGm+yVRCWXoH0RERAVxMOpgRhz+boKYbp7XpCvnaPc9i1Snn2HPt6VAYGfyaWVI36cIUwyGBMsMRkGsHeIYu+O3h9sP6bvf6mZ0/ZsPQmfY8O96y0Fb+AvUTsGVVxchM4Uul6uv6PBvkyEKloh20ODq6iKn/QbdEiK5JiLMozgV3H0XpRY5cWoR17i2IlTit6iV2Q2QuNM9r4owYmyY/aWEAmahRQVhYBSeAlgxcQE3BVYcYs44KJtFKBkTdMdZ8lwCTcmI7KoM2XjA1DijgoCPjS7hzIh4gshEKHMGwUHZHJEmz8AFA8FMpAlCBQhLRCZlkw7IgEFXZUaEcdLkCcxB+pQDslnEfmisR7NCxEsKEYKMaT8jQmxuEXjWh8mmkpQkXB+EY1Ft7IJzEMKhhIIamzxTY5nxMTzOqSdEQjO9GhtFgFMgybj9TD0orrA1h+1+ZXPTAUKrbcdRRECxgZ17rHpArEVcpxZxjVrENWoR16hFXMO7cQPXAu/GLfe/IvAKpHf1t09fA5NUa9y+ecc7dW7cunn7Jw2lch4ARgY+AAAAAElFTkSuQmCC", - "description": "Displays a indoor illuminance data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a indoor illuminance data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/indoor_illuminance_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_illuminance_chart_card_with_background.json index cd4941c66b..acc5c38195 100644 --- a/application/src/main/data/json/system/widget_types/indoor_illuminance_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/indoor_illuminance_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Indoor illuminance chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a indoor illuminance data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a indoor illuminance data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/indoor_pm10_card.json b/application/src/main/data/json/system/widget_types/indoor_pm10_card.json new file mode 100644 index 0000000000..3ecdad80bc --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_pm10_card.json @@ -0,0 +1,37 @@ +{ + "fqn": "indoor_pm10_card", + "name": "Indoor PM10 card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAn1BMVEXg4ODf39/g4OAAAADg4ODf39/////g4OD/pgD/9N//vED/sSD/04D/x2Crq6vz8/P/3p8hISG2trbCwsL5+fn/+u/u7u5YWFj/qxCenp7Ozs50dHT/6b//6L/a2tr/tzDn5+e8vLywsLDj4+PV1dXIyMj/2JA9PT3/78//46+kpKT/zXD/wlD/x1//zW+CgoJLS0svLy+QkJD/2Y9mZmbltT9yAAAABnRSTlPvIL8Ar7DvmsykAAAF7UlEQVR42uzXTW+CMBzHcZzmZ8GHphqtrHNqCuvBAw/Z+39t+4PZQAhplixYHN/Lvxx6+KT0UG86efHmQ282mXoTb4/Bx4kx43iC9vRb4SnyngUyHyGONUJca4S41ghxrRHiWiPEtUaIa40Q1/qnEB/O9ivIalGXcK01LydHNXD7iCLYehxkxViAKiUoqbEWKQAakgChVACiTAgFSw+DkGPh30G0jo0kgYgBpAVEmEwV65RrEcJSLxC7gyAAEkEQmQCRkASJYQjCC0SqYKl/SOVoQVRGkDzjUFIRBCVEizVALku9QOwOgkiZipwgUXaBWUunIbvgwE4ffstRQvI8jEEQnciL4A5Ddj6wZNShdLQgoEpILKRCBeFZSIsElvqC7JaHxbekdHRDYERcg0CaOBEbWOoHcgwY9SM5oVViULYxGmFKsE9QMgGgVWZC2OoFUjDuJEe4XRdkwRqSFdyuC3JlDUkAt+uCvLF7yWBPBEFDMtQ7QkdSkzj8DrFCcP0DCd+js3NfkN2JVQVot2nsfEer1y3K9ucaYHvbF/YFgf/Fjh20NhMCYRy/PZLLzMs4DKzwiop7qLTf/+tVTdPS0hx6WPDgnyVMdHP4JWEX9nEJfnLxpYiepvmi4IPHpOPgj9UBMYOeWaHG6DmZnzMekLkLsKmOpQsgPyW3Z5BImZTJk52Hn7/BOI5cCNa3PCRT4EKO+7uEkUSgiAzI2K0ILbeIIhQuguD2+He94hnE2FqqxZLhwBfE0FIOfdTEleZq5pofkNSg4/T7bgdKdNKX9CLIuH/M/j+FhBJaQhTibxCGOIljLN5PiO9D+IQQ7qdT351nx+qBxpdBcHsbFy38FlVmLU5bigE5YH6fVeA7xLjx6ftoTWOHZFRRtgdEG/OAWEMlyKklpsZGuAoyKf9eX/BbQkQuFhHHIsLwBEAL5RNHpgqVMZ7ki1oZQ7lDvAMCCaF3Ui6wUigiFErLPWk8GH/ImZFb85GpKP4Qi9T97HdDVm1DVmtDVmtDVmtDVmtDVmtDVmtDVmtDVmtDVmtDVmtDVmtDVmtDVmtDVmtD3tk1g13FQSgM78h3eiBhQ8KiTXdNm6qbef93m/FUVMY71nuTRs34b0rhkPLB+Vs0vJo+IK+m/xVEzkqXyiQi7ttK9zulsUvbgYxfHrPZA98n2aN3Wn0GGtkKpP0KZOJHIHrvdOEM2oCmjUAi5GbRcBnRj0CmuydwGw32tHEjEA/zbd2PQHboA9MmG4HMMLhaAk0B+YZ3BcJto3TjuS6EjN/KIw1MN6lO+xdIUwZ5Pi4sjdlKcgksaeMhnBqTm3pA/ZkUjVuB9NA56VKVWF7WQEQx6SWwoS8RGVPjWVRIxEO3EUiGkK+nSkDdKogCzeANR0q/WAyWD9ErS+GgkJNLMR7jYNgIhLN8sSyyCtJafPXBGU4Fz5Jikk+FFsvejHYyW3ELELGZtWlbFj3akNdA9qB2fzGT0tQu6svBSbVl+IWp38ojMsWS881yVVkH6WGuQUaIl4iqjy6r1+563Q2bbxoHINlUR7cOohBrkD2keyBFm4OIZXSEvvujCEzd+E8QbkCU4F4CxJlJeq4VHl0Ru05PBYnet1YYDaSpQR72iG18nwoSymMj4FwbFw3AENsrkPqdNEOuQDLhuSAtJ3frZQG+NjudhdXfkdQvgRG654LYEHf+kAG5D5KDD5nTMHeAHuweWTa+TwYRZVGO7j6IKZ+Gmaq9lsD8VBBT7G26pcZT/Quk7yH7SXXnjGTW4715pPqZMZSIoHpYOqsO24OYJK0nYHBJ6soki1nKxtf04n8HGUilabnsOTKUd7h7PxBPMx7zC7jy1vuBmNez/r2dfT8QJ3sWHa7s9QYg0fvJ1ZIYQhgqjDcAeUQfkA/Iu+gD8mr6gLyaPiC/27uDIwBhGIiB5wTiJz/6L5U2hEfbgSoQjSE0htAYQmMIjSE0htAYQmMIjSE0htAYQmMIjSE0htAYQmMIjSE0nZwROmvAevqc505lwHz6TWXX1X+XVfsDI20+0h25oCcAAAAASUVORK5CYII=", + "description": "Displays the latest indoor fine and coarse particulate matter (PM10) telemetry in a scalable rectangle card.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm10', label: 'PM10', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:broom\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":150,\"color\":\"#FFA600\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":150,\"color\":\"#FFA600\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Indoor PM10 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10", + "coarse particulates", + "coarse particles", + "particulate matter 10", + "inhalable particles", + "larger particulates", + "dust", + "airborne coarse particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_pm10_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_pm10_card_with_background.json new file mode 100644 index 0000000000..a4a98bdbde --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_pm10_card_with_background.json @@ -0,0 +1,37 @@ +{ + "fqn": "indoor_pm10_card_with_background", + "name": "Indoor PM10 card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays the latest indoor fine and coarse particulate matter (PM10) telemetry in a scalable rectangle card with the background image.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm10', label: 'PM10', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:broom\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":150,\"color\":\"#F89E0D\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":150,\"color\":\"#F89E0D\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Indoor PM10 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10", + "coarse particulates", + "coarse particles", + "particulate matter 10", + "inhalable particles", + "larger particulates", + "dust", + "airborne coarse particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_pm10_chart_card.json b/application/src/main/data/json/system/widget_types/indoor_pm10_chart_card.json new file mode 100644 index 0000000000..c8a8e9f109 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_pm10_chart_card.json @@ -0,0 +1,40 @@ +{ + "fqn": "indoor_pm10_chart_card", + "name": "Indoor PM10 chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a indoor fine and coarse particulate matter (PM10) data by combining the latest and aggregated values with an optional simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm10', label: 'PM10', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'µg/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'pm10', 'µg/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":150,\"color\":\"#FFA600\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nif (value < -10) {\\n\\tvalue = -10;\\n} else if (value > 10) {\\n\\tvalue = 10;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM10\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:broom\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10", + "coarse particulates", + "coarse particles", + "particulate matter 10", + "inhalable particles", + "larger particulates", + "dust", + "airborne coarse particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_pm10_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_pm10_chart_card_with_background.json new file mode 100644 index 0000000000..fa74d5bb1f --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_pm10_chart_card_with_background.json @@ -0,0 +1,40 @@ +{ + "fqn": "indoor_pm10_chart_card_with_background", + "name": "Indoor PM10 chart card with background", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAC+lBMVEXFw72Uk57k5N+AfHgAAAD29vTLy8WYmJg/NzSVlZX29vXPz8qEeXD7+/r49/fz8/P8/Pz29vb09PT5+fn19fXy8vLx8fHt7e7w8PD9/f3t7Ozv7+7m5ufr6+zNzc3q6ur29fTl5OTg4N/j4+IoKCj4ng3l5ebp6ejo5+bPz8/i4uPLy8vh4eDR0NDW1tXo5+jo6Ore3dzT0tLn5uXb2tjU09Pv7vDS0dHs6+rf393v7ezX19fY19Xc3Nze3t3f4OHZ2djn5eTe3t/s7O3b2trW1dPj4uHj4+TZ2Nbm5OTU1NSurq3q6Ofb2daqqqnV1dXm5eXj5Oa/v7+5ubgrKyvv7e4pKSmkpKTh4eLi4eDZ2dm9vbzHxsXExMXm5+mlpaXr6ei7u7u2trW0tLQ7OzsvLy/a2NWwsK/KysmysrHCwsLl4+KioqGoqKinp6fy7+6dnJzIyMhJSEisrKzc29ogICAzMzMtLS321Z+Kiourq6uPj46gn6BWVVb08vF0c3RwcHDq6uz34bz37NmYmJjEw8G9vLmbm5qUk5M+Pj7e29nMzMqBgYPBwb9VUEc5OTmNgHjPzsu3t7d5eXlcV0yenp3Avry+uLRDQkI2NjbHxcFfXl6vqaWNjY2Eg4ZAOTUxMTIzLCuIfHNIQDabkYyHh4j3yoJnY1txYlVhXVWzrqqspKGjmpZ/f4CRhHtlVUn4qSrt5uXp5uWln5uWi4RjXU8bGxu1sq6Sh4Hh392poZ2elZOWjotubWtqampuaWBaWVj3tEePi4WJhIB9fX19enRjY2N5a11SUVFqW1BNTUyFhI6Bf3tnZWU6Ni+3tLG5t66dmpadk4+Bf433v2RQSj18cmeNjZl5eoBaTEBLSECnpqF2dINzc3yEd2z58+rQ0dXJyMXBv7d9e4qHf3plZnT2w3LNzdKZmaSimZB2c2307+aIiJOQkJL3266YlpT3uVX4oxubjoZdW2r56Mzw5dNtbXz4rzj048ign6jw2rX40JFkZGj35colEAiNAAAADXRSTlP+/iAgAL+/v7+wr6+vaQ0T2QAANQVJREFUeNpslPur0mAYx+1CBAVBdKOLUUk3uynZKUyTsqhWCrlmNxPn1s4kpWZsdErshzq5Lq7UasvK2Tp4DMqfpH4olW5H7Wj9YmRBVARRFEF/Qc+yO323MXj37nmfz/N93lczfNhIicN0WFYiUIx4obTahXatVmjlivFyvqHk+s98+PphYKDczsXvfblzP67wKCpEJFKXLulUoZgOJTkO5USGJDhWZggRBiWUYPk6SXK6f4UR6N8DJFFNl25cCSd8O/T6eQGPJxA434snfC7fTh9OOfbFBnP1TDOrroSSdSaSPHU83IP0UAnctTPgCexEHC+fjho6XDPsbjYLIGgWQ3Uo22y2C7V2f61QvBdPpVLleG6g9urmzZv9qXw+k2rcu1cW6hwhCCxKSmInMYzDUBTFOIEnCZKTeRjHSFJiCVYiSOwfDBSVBRT7TQW3wERK0YMxR4K2a+e99nTrd3m29NK0n8Z9eNi7L9Z3JMIIrKz+LEvV6qPk5yBNIT0Ol2vnFmD1O0K9J88eG6oZnc9mITSZVWfquEyqP9/qLxSefSgUy4CSLxdahYGrtUw+12xW7w/eqzQIlKsTJIthP3KROZbDAIZUSwYidAAmVXheZln0HxCSE3nuN4hqJ19/FL0RO4dvCVicr1/v187bvyvgQmiawvGw+8vBvmSpKuskFurMitXK3SMPYmE/1eOgdm7Z6XMlXHTYoTl79uQIzVUlkwUCNIuqi8pKu5BvFYvFgWu1/oFc6kU+3lIUpd1W4oPxbKZx/9BglJEEnpVlvpMkBxcro+AMUZWgwzCOxDCMzVD3eZFl/3WEwBie++UHiBTq6SMP+vYFd3q6zObXO/Ra7a79ARyhkFCP4/jR2MFTyRLDkpIkCaQg1KvRI6fOhcPBUJB2Jfy0y++HJrt49my3RnMz/oLQQUVVRyBuq11LKfFisfas/9WzsjKYS8WbTbEej5fLGYIUB+9ffsCQkTQvkqLcKSrUn2dRMESIMrBbWAmiscqLFfp0hUf/3SMMJxLsTw5SZgWxnr6bvHLISwf279hvN1u0Wv1+TwAJBnvc+45+jh26kixFeF5kmGqEqcPcvoP7gmEKcSA0roqCmwaQNxc1A8UmOPIDhGwCSLFVjKf6b169CZ/uP0zlFPGRUs4N5iQozI0bB/sqksiIFdjvnXTADJaRUZJlkiLLCILEyWTmRXzOzLsNXiBVRoyDp9OJAssTEgZdCOIgTrVaTUf7LscctEdvn7fQbNmv7wYQf9Dt2Hv08pXLfVeSjUqdqaQjj9KN0pEHpw7GemiEDiM0Qvl9LhfucyGJiydPXtRoavmMyvADJNNK1VLQWu3CszO3B9qpd/dyuUyGEfOphw8IjuOjH+9fibAiUW08EvlOYTkAETlIVDrF8H3ROsNywJGbNDVaJRgxyXOyTKo76DsItAcjkYBGAghfr5Tulu5eORQ7juDdWvNqz2uLR9/d7Qm46FBw7+Ehnx4/fzAYfVRJVyLp0t3kqc+XLx88TvspyktRCIUDSMKXQJ4cA0MARFE6IMmjbrfbcf3J06dP3/beunBBo3l7QXPx4rHeJ3DaUddd/nAohOD4zgAeRsJ4wu+nvG73XlVub9Dt9nrDUCDnCtOuxK1bvafPTpy+y0VRuMfv8Hq9oZDXDQqFcT/0giMEPR4Mhv2uLbv03XrjIpt95ozF0yZOmrZk0u4li6fOnjHTatmxw/n6vR4O4y1btgQCcCp3a+d1GTc67atXG6xWq8FiWD1z5kx9wh+mXRd7b13SFDIdR9wnT+q1MNe0cv3mzXtAmzef+K49K03GLqPJZDIuXLjQuNFssy1ybgSZuuZp9b8F/xrN1sVbpyyfZVlq2T53+fQZFptzkXmRaSF8mqfVwhSj2WCw25ymLojUZXLa7NYFM6ZOnTN98sQpk8aPGTdu3Ngx48dPmDRp2cTJy6fPWTx7/iqrxWKwrp65YNusGbOnLp4zfdq0yRNVTZ4Mb1Wr6R7k0q1LH+5oFAVAMKzRSWbhnyAqyeY9K9eaukDGnyBmm3mR0+n8H8gi69wpEyZvWHHAsG4TgBhsi8wqCHAsnKcFGW3W1Qb7oo3GLpXDbDfMnA/pTZ/WARkLIEACIFMmTp7WAVltNVhXLVgwHzgWqxyT10z8EwTUhVDnobN6v7FdL61NhFEYgPMPBLGZkKQOMwlJE5M0mc5kZsilQ26t4yURL7WpxBtWBREZSooUFCGoAXUTdKPVqIjQrRhXuigIrmJc6CKu7C/xPd9knCqeQrpoCN/zveecTAH5jmE/cZ0dJsYgIBAEJZOjKrEbxGsMEHJQ1RnEdVCagPimuBk9o4eimiZkmrk8IDH62CS9QWmKYrGSA0TFBzULpbiAa6ZLDngBYZHYiTiQ+RLiiC9QHOk0z7sOR+IvXP3g+bWDKXj/+vswvH7pKB2GurDqQEjCHAoIMMARi6lmyq4c7pVu+W9IZsa3xxdN6LrA+6cbOPMig9AtxPCG+loiLqLhJNxXareD8xFkLxyAIBCCpGcjC5DMOwy01TQc2YALodfMoQ87nh2M9NvX41Mn1tfPTiCKCyHJYp45CJJkEAVtZZp1ykVRSfIfSE0UD/J+fxBnNoyqhMaivsSvVKEWSmSagCSVXKUIB3ULQSgRSFgg2SxXnmaJHFuIx+N/GOUyc2QBgIlZ4K0cvYw8RiPPePiCnpWW7NaSlBSbEVYEYhAVaaAYlKZDMVOGI3EjYa3l3es9VxOX5zTOP1PT19bkFIPQRNHfQ5FEkSCq2SzMIw9ikIMSQcFBEJyPT7P1JdiMO8gCCC6bDTgQkoCbNq79HDHIixfrp1DXXMhEsri6KstHJhAKhSA4kmlDms0cjcnuSHDQ6NReLx9iEC4aqYn6Wp4gCiDYFLmSEIkDglmvN0txzDkYLmQKxQLxw0GQYMRhUBZQoGwIr4GC1KKzSufdBIJHRnzxOomYNuThDUpElh+3292nZ+72bwPyxYrFlj7dM5V7/W7PkJuIRCLdLojuQBo8x2nRGaGmH1EIUjepnQzRhiiqkiuIgusIeL1wMAZrLOYAJDg7i6ZyHFQ0ImVKjNd4Pgps7P61kWdna8vzEgo8ZziQKkEWH3YvrFIg8v32k8vd3sogfCZ5PNxPdqz+hmL2OyvhA0gEkZDEba2czgNyLoQZiWp+TdP4uVChqtJoVxXsETkRidRobZn1ZvF0MDrN7Q7EYfzrAAMOp1ggBIGD3iNtfgNktOU5hScfPIParZXE0spf7B3tXjiCYpCq2bNWBtZS8oHVR4dZm8rKQFK6NwyDQSTsVduBRHIiP7WPZkQMNbB/ucBJbU43TAk5Y/kp+bXlRiNUKiBLozC/EEQgLgRz7mOK6TtgtFoMwhzcP44yIBo5qPeE2JuN7e3tVz88+CeIHuKX7O9D5Uqve7E7eCzLE0i497G98WTQsZL9zbYkqdamdH6gqtZGCtMOiNNc+91EeECWQwdn+MDUrcA5IZM3sQqxxqurmRogiWKhUqkUT0f+dFYWkD2ABDgacmLMIotWsNVKp+FgCh9+UM7KAgWQuYiwsP/B9rOtz+8feYbj8XB9ODy7/wCb5eeDQftrtydT2ZDn11NPBufDHWuJQW6q5wfJpNUx6+RwIShAol6s32VdB0U4fHLPHp82JxpVM7W4ms/nZb3WCAqhBL6uSwmsXjcRtn29nB8NRUlEKIwWOe6UbQYrO4/JxgIk2BBCp6/0Pt8d/Xg0/k2WnbQ2FUVxAI+fQBC0YtOUJJKpSfTpqzYmL40xtjGxiU2QNkOtacDYJtVWg6BWq+BEHMChKgbrQkRcuHGhZOGAQxHHhQuL6EpFEcWF4MqF/3Pua57DKS1ampLfO+eee+6t7s21e5cwbm0xIADZvJAksa4ZyA6f2w1I5s7CiyrE7lpY6ltYWIJOxBADBUNc2Eca5jXYnB6/x+PpsDXMnjMPTVh2r/ZRH+yq1DrW6NdZjA7MHEYeTeoSQOY1NjQDQS23uxvdCgz0K6SLGfPwKRwaZKmxw2nq+/Lo5csP9+4R5MSJyy9i5ABkNVJy80mYNkUVAkniZqbnZm4GYr++cOG4Hbu1mCQN9XBFQubmBRuNHgnhN60DZGubLcUQ/K6KhILTL6WmarTAwRBtkcxvaLLaLEaz2eHo7OzW6zeQAwkBgoMhqwQEDvTENWjv0tm7dx88GJ+q6p5U79zbs+d81GWHgxb7lZs3b6MO0LQousJhUCJ49hTYDXj667PbWbLkbwjGX6NtXUpSyookEWTv/LaVni53BJBKRap1FNfpbVw8PAAiGjRJ4wIr0gEGApB/HAix5asBx7qOlEeqnLt25lq1uuexburO+OPqtkt5GkSWo0W6w8cnz65GYDvhJQ8KmicHPNigDSKEhIcoEdi6cVpwmqSyHFIUAdlqNUphd6t7U6VSI8dSm9WKfgMGHCzBB3kaUVh6ixlV1wsHZYzqSjjmIghST8j+5sVYIOaUB9P5uTMnrj6v3qvqqs+nnp+ubsurDx3vH/MVvXGihMOBLt7eI/G4Gy00wjPTzPsmOP5fd9hpgpKUUCAgh0JK0LIAXWttUQpTw0JdFdcstVEmeBdgh4gmcchoWqSHg0b2zk4LEqI5RBAEElB4fFmHzbaClUeQ23dQWuNTz79df/4kj1GQnrmbIJQBlM1qN2/zcgApcZMKNSZGYYQqWT4DEZWJw1IoHQik0WA9xra5e1es7ajg1b5NlVpxJbIhAFzmIuqsJqveKBzG//PBEFWCfYbHsA4TQXwordvj+/ad1uG+5eHDfXuSfMaIoLK6eFng4VMQgAW+QLnMqWGKinHxP7SMAOJNwwGIHJLMzfPnrbiRKoeR2y6pY6VtY1sbVRFqacbBCisCX9GYuZ0Z9WD85ZhNQRJuW4BswP6BH+aM3Lp69cvD0w+v6K7sPP3w+ng1gY3aSw9ebbwBUWBosvieG5wyOiqOvdBStoBhCELLiDh3MSSdDinORQ2NbStrFR8ygoTYNkIhQoMAwIsfnxYuLLOFOwHvg2DUHSzhBgyInud7LHUc/M7dvf3oyrHJi7qd38anTk9N9aXToCAhBFEkRFmmRW7va+WKCys1NAl5kw8nKgpIKODREjLUgnNXQDiQlKDFlLAWa7KPlkhqpZUZWNUkUR08LnHA4UTwUYtPgrQLggFHPYSkCQnp7EU4TXRMOHT70bOdFy8e0U3vvH5sct+vXChEa4FblYKdGb/U5JcDR0cGvhvowO5TUsViSpLDPm88Eh/kAoPjD8h2+3AW06FXheAk64j5luIl9FslDPYr1jeK+AtCBgTVlYkcfNZixx/pmKPmBMW1CpBuOjk6TdhFJOX4lwdHjhw4PKJ7N/3u2M5fewYVSLxY27Jcljy05LD/m6Tto+7saI8rk8yUXNGolCzkDQeGt2SPnIosyYz19Iz1uxITI6MDpS0DA7tzwxOH++Lullj/Znt/dMibjhw4GI7hHnAiL0sdtrYVjY3zKViiOQiBEAvdIs5a/+QDR0cNgsrq7AXEZAoGPR5/9v7u0paxsR7d9Nfpb9dvT2UUSAJeXxdBTFSqVhwnUjFJ9q4ec+XyA9na8MqT0exhw4S7FO9B+8rkXROuMXwj0V9IGkYMI/bhocxA3D0UGzXkR+MjuCWZMAWyuf6T0bDsKa5dsB4IDi4uXuliJHEgzPzFyGctHiPZoWWEJNyBVYiJ7yUQLd9GYoXClmHd5JHJydPjXxLIEhVXAJXlR44xm2L3tCRdniFDyZXJD1zwRNe0RrOjLT1xQLBSEirEnijNQLIEaRmNJaMtkX7c9xwOHS8Y+k8WZAkHlAXYvSkYUk8I0iEMZm677ED1cWFpEg4N0u3oBYEgTodhd0/+VG4wqvv6edbk9PjzjN/PEiSEIL1G/WJMyjZnz6lYaHDscP4UIEWpv3Bqc6m1FI/mvXGGTGSjEyNDhWTLiOFIbks2k4/Eh2KxhGG4tGtJa/yAb6gU7XcNSp7U0o0N/0DYAYiaCwvaFTuWcQVyw+L4B4LtUG+hlFDgda4D0VwmOZjXPX39+tu+Y/tG24MkgaNMV3vtDgvuafiRORUvNkc3ZnBzB3ZpvnaM8L2Wi0M97Kp7fWucrop4wsePxel0r3hMqaKtjSE0ajCkSTg4I2ZyEIMHezAIwmqhURkiIbgmAsThREZ4BcRj9LeUKEOmj03u3IyqC0ICByDt7b3GxU300DboHVKATkaylEL/Dbh5JsNbJIjdzg5AtPErAokKEY075E+ZjUuxRMRTZojWebHUEWDwRWLdoVlUCM8olBA4KIvICDsWBQqxsRjutXXvnj798fPp2Kd2hF9BSH5PMBhs78bhrKkZ/s5gGoNWWC57ajU6b7MEb3IJEAgNIjLSypAIIFDQDVjIZNbbrM0MmYsgCByUEC1UBhwM0QKv0SB0v0KOTkevU3U0K4OD0XyiL6GbfvX+x8d3X1vgoJQoSAg52o0C0ryhO5h20+4gQ+gvy3RQX85h59AOiHR/x5MAjZecDSqztORE4+B7aoZQSrA9w1FHQLG4eeZwzpBGhBBxRvCh1mSTleoKDtGrUf7B5EA+mcn26d59pPg5KiASJ4RKizKCgZkhXji4L1NrSxMFFjEG45Mh7KBMraZ7GEgiYOB1shI0661t7ABEpAQZYYdgLCbFzPU0CeDQIEKiliQqi0dLni3Z0eBI4q+mmUxS92PPj48f377rY4gf+fB7TIBwaa2iyZ8ggbRMUQbTv4QoKB1I+vD+EwQRC4QcEXJAwh6M84rfyfdXjWpCNAgkDBFnE3F1pVJUh7ZG2AEIKotGsnZy6NnRYM4lM5lcLvObUXP9absK43j5BzTWJppZZaWBcr8VReQ6rK0MdbTEWCpsspmsXEaowwQYxk1RidaImiWa6F4QWYzKskRi5j3o0BeYGMWMvWDLEuZEnfEWr6/8fp/ntGe0Mv2u0FK6cj79Ps9znnPOT0B+/f3rHtgAEKgOaQSQAgHpiVSGI+P1bMv3sglDQburCSQoTGV7E/vgwvANuxQDgh+IJmn4oZaWQCOaBBhyPRvZbBDNDY0pYiiIkujrrYSDkUWQFAdf641EyNHr+OD9h09/feZMDxOjtY4clICg+Y/sC4V3DcV29/UH+mr29vWhCRvv7CvvKQrcuyPy1Hht+9AkQIaG9pd133PXvdXMdOYTVgJwY4TcXmQIAyvVyiqI7Hb6IHBw7KltRKJYDFphxMDSVEe1NnF1K9/W2x/pBUinY/Hk7NTs6dNxcAAEQjlASYjSEYBE+ndEhmK91fc0DtcMjrTvKA2Ob0/s7k1U3XXjnqL2yHjZZNHUDZNFE4knbujcQw5JDIrZJm2gz3JI/dFk53oXkooLvyhu7hLEvPpKymAYDh8nHrPyyhWOa0N6NNfr+Oz55IHZOTrSnJcCAUmxW0G2P9e+Y1/jYGSiajgw1Lin3Ovdn1e9vzeRt7/+uRv7OnurJ8qmyg7XTiQmqyO7kd4gURBOq+QQQzTalYMgsETEBlEotSqxXJFD7XBCQkIO+T/aY7IHkJ07eaG7p7+nO9HT6zhwYOzlH8bO9KOdhEhiQKRqRbb3t0f31R8myMhQ1Z56r2d/b/u9ib197bHO8j07DvdO3vhj9UT1YHz/7qHdcEMWxTXSeSKSNQS08lIG5Dq7SCQHf4nnlSTNIUdxOoHY0zhbIJQDIInueKL7sV7HxOTUbDJ5uievmRFlLMEg3NwGzw2HK5ujscbtRYGqspHapkDQ46mrL2qqilc1u/NCjVVlidod8e3x7UW3PfV0372sVihXuqYp1f7JlyvnURRJ0uFOCIocSqh9mPqjHAQxHGqIiHklCxZx2R1P4EQ78ZhjeHh4LJmc6y4tRjWwIMjRSgrLsWgrxQPhujwMjqv+Jp5iusPR1kYpYBh8+bN3td/OjSPW3ztbABL0dLjNkW26zyCHglCaD4qhJJfO5S7XVRkgUiD0ZJcc6rIPIFDcgSslcH1BMs7eTSzJkyTBQLGPDGG4qMoEQfKWEsQLkNIQQYqbG2MtIKGwJoOMI4wsbwdCIMVxpeWQSqoQOrlsADFcNOQqAVEOBQGJaWRuSk+VuSWYx3BzDA4PDr/84xPVqAUeL0jIwdDiSAuoEFowAyKOFOBVrVEsgdw8Bw9w00I4hKSBDwHSWNfFXWpz8mz3DwzIxnkbcqY+e80O/GxBmDmaVakqd6lxubUQtjsBMjx5YPBwGYYoJKpWxBZBwuEQ4geVlKpTkBBaz2IPNv3B2CqWNDTU4/wWXy0ttzNBRpAhHj8/vSwOSiOISq8AIc0S4aBclJN0xhCzGyYYl/zfSu5BlxWVOA4/MZWcm526oVhImCcQciKI2HLTkGhdIMBWkjvsLKckiYYKEHeaJDGOvkV3gTAJjvC18MPPBsIec1oQ/eAzFrKGRDFIQRCFI4dZiqWKnOGQ117P0+8igPwwuzQ7+/xcHDuu3AYICgniCM03D1wQP63YbaMnTJ+gFyCeUCiEPc2dkiTctAAAhG86CZZ2BclBDOWwIKoMLygXSURpN0y4KQdB0hx4VpEJgiMN9uCO2dXVpSPJZCIqIJ4gSEpbq1A/8zxStNwhfOoyQoDoVQhhbvujqElskQQEcodcKg1y8d2hjZDkrg7Ocuj9pYM2HlDqRxrENO8iO+lQyqEg0oM75tZWl48cSZbAEcmSIFBw0t/Q0li889AhjNbTjDEajjzulcMPQPM8CZaABAInVwDgMItWw2EaDWJYEJVNBUjv7BP6k6Y//VBt4EiDcPkAGMeRi0vLa3PJbzC8cIgLaKDkNd5+W0MgChCQFESbJGIouBUVMdkBSRCISzF2zrpo80m1sjOdBeEgMjA4W2RLOUymZ3PYNwAI7ICQ7OvrS6vJ09+EoZBXVQqQ8prmnYe4HkGSsG1SkGJOm1jek4TZzq0yVWozABS2g0oXJEpzI4tDQbKlIIYko1xbDjiCpTdIHOPrOcurZ74mCEIG7RGLMM80akp38kyl0s39SVghHKAECkl4OlYQLlYQBJzZudXlhZ2ynVA6soxFZp5wggIyIPLAQqkjhsT0w9kYBKnm6RNCa9/KykWQGBAvEwXbPi23lQcAcitBQlEZKDiCyADZGeQTYmGxYEQFEJjmyJlXjFg/LIjNUQtCAPlHWS7b+VorLEa6RAPkRuxyMNlz1paX135fO4fJD2WVrX6Hp7jpznKASP+LROBAFUQyGeWXp3yQNSQUglNyVHsrVkemgcgGMU/ZuPpXWUNMd2+zzXJovTMgnNnXl5eWV1eXvykgiUdG6vE21ZQj2St50JWLjMbnz71yLUk64eMBJMnezNTxCkghqhUxdGGUAZIxCGBsIsNhOjMbUxtIhBbaUm1y5K+/1i/+vrp0juMDR0EHHgCkQUDkfAgzuY0st+6qoWZBFZxIuJ3H5MENqb4FHLaBsCBG2WZcsbkfCmEn8ixPBKQW2U6QHJCsrK4JSFhIOgq8dTUN9YFigHDPmC0J91qZA7wiASRyeAzGCg9A9OJJVglG1nWWIxtEIDZgXMHbBimGocgGyUp2TiLxeNyxlLO+nrO6fA7jA4gqSJBGBcFOkoAwgDwCslNAcrnJgklGYisKr2AT53N7QGPbqKwZUBg2is/YuGK1UumDTUk4s8fj3T09jrUVgCyvnCPHJiBhAWkWkAqsUqjcQ1zSAxJWNSM7zHwuhmTNexv8oIiRLcsBELvdaCeQrIzXphEg/f2O0yuov2s556SaGhBv3khLTEGuYbbDEtYmnsOgV4RgyKFbkUG5O9Evs0vTjU8eCshCNcP+DA5jR7ayOSwILdlgigWRq9Ad7x9ZunhxKUdndiXhjBgItIbEEYKQBCIIUtyHLxrCXzKB9Npi32i+1VeXcBzHz4/oT4ZiMxCTIHZZSA7riHqS5QgyPd4DRz6Yw0SyvKITInMdQmw1VaH7ZfTwEJUkUIgDJgV3nGGIbsUCQ05iL2SAmD91NJ8g6Wq1OQZBtqohG1KEIsYmjuQWlZQgtCKO7z47sLS6lqMgYTTghYX+Ni5LujwVHHJlJcsZfxnSfTFigIIciK2KAuFA7meAOFWP5gtIZpZvDmJLVooiI6wysi+XfkR69zi+O//e2Jm1FXa/MtZCyN/hGfB62/wVlEwbcmhpQPQ0nxw8P5IL9tgp/pSfv8Arw1OygQWQy2aHBbGGqGxnki2TfL54N07e7trlODUz//HJ5aUSdowEgSPCsm2b3+8v9JMKHLLqBZCeZKAlxIYzbogtH9OGIAv5+Reus91tOrB+ToFkY1ydxWENUYqUH5urIoGTy/HBScf09PyJJBdWEE/XAQGWO+7AvRL5O0ACCQiznSAgoWAJ5KvkEgSf/dFrM0AeBcVRgvynHeRgZIkh1owtudg6SY25owNvWxKjE7zpk9gy7WyfmBwDyPSJ83MEiSqIyOe7Q0QSZL9bhHu/W69mvxtxJY5cj78kllyP8Y5em2HIV+AYJYhNj/+bITpzdASLvUF9w5aHHqxxOg8+FHE6I/fYTtT9dO/eXVNzDztmpmdmzn+WLIlCBKEhiCmaYlA6kB2EUZRC9CG8ygf5zvoLKchvGO/f34+Ojv5pQcBw3GlBrrg8hwWx8dQaC8Ri+n6FNc8EnH0HSwIu59hk7J7UtRDezs9f/+KjxUXH9FkDoudZRPC3edra8IACSJuHfRQY6A4SB09K6aJ4l+vjXPg3xvtHPnV8NFWxjsOk/wdyFTm2Ok3Tm+Zw1lQna8vwdCyCiALIyQc+ud/tmjw5GUu9su3xz19/5935845jZ2emP148mSi1IB3cghgYaIMw7jbuR8AqQRQJoM+IFZpl69L58Gg6sL5yKshlp3OKIGYyVKmrN8YPxuO47xuLCMjBXS7cXDVjYzEz3QQ/f+2dN947MeOYOXt2+vziZwluLAS9bUxzDL0L4vgHMM138XpkdUhJlAVfSJlCX6Uolzn984WjF45ruTWB9ajTZUD+i2OrckCKoSBzgy8MfuBSEWTXwcIHIi7X2JhzzDQyb7/20ptfnjg2w9A6dZYg6NMNiN8jIAIzACheVgkQt1tJtvm3WfkrlOT630Yv/PQ9P0cSLWAM30tg/U8Q11azTspYPRW+8NaLAZfRJ4Uu18mHJvGosGSsT0Cuu7vupXe+/eXY9DQcOQWQxe66Om6uYbwAaRtAZA0Eg12wZMBLHoacscRCSOypJYf0wEICYgEj/x5TCDM9BYKxXi47dDX1bx1/xcHAVpiV1lZLTI5bbnny9Tfm5+cJ8umnn576bvExXnLcZUAwRI5zANq2DUQ0hCVZinEaQ0GYJWghLYeLlvwpvcmj+ElBNufQ7LAgFsMMnC+wGyz60jTHli13vvHKK7+cOHbMMf3qq6+eOvXh4wGe4wQ5YP3U+Y3fed+Ge3DgeMJa0iaweFpO+3U/jiCa3aPsTX5eoJg0fywsXLbsQtxWsVIG3AiiUg4q1SFfd/eWm+9rmD/xCkLr2D+cnP9P1HUcx+8f4Og85ej4YsBKSMyBthCLkVmzJHTenDO4SXaUXpke6xaNkNsRR8sBVgZl+IsxFLgCBQcDygE1cqsxGLaVm6zNsakbuoazrbX1fL1fn4+v+3w+fpr1xAHH+XGvh8/X6/16f97v9wfHaYBM/3Ihhs2AkuwXshAac4j4JSKGylDgklywT+0dPOcRQxhk6eajJtlzSF4ZQBgDICJOQoCwIbuLvVVlzw99M4ISOe24eml6+uzFCzFsxeJY1ZvsgZGEXiBm9EF61kEfvKhlrsEJWN4MvDMwMFDLIN1q2LIBcatPC385WY3zt8kQAZCsMnOwVMFohhTDkLJ1Q0MjRKJSCyDtpbSBiSJROYWsYQRdBEJR0/NA1O0JYk3ValB4tKe9MKuaYJABVeyNuv4igxobEfSyc3nBvbS05HbXRhuXaxujtY2u6N17INqeiBS1zvHK/gwBqWRDnqjITiNDytb90dU1NIQaGZq+1N9/4URMgWRTWaPW0Qy1csa3LBQ74qbHHapIq9kK2dNcVI0wmQ2ZT7g9V8XuhKLdzu5o7WJ0wO2ed9fejt5dXJr4O3r7puKQCzir+CuDOEMZzkxnyPlkKNO1ujCn8lW//4mi4CYypKqssCuO4fcb5Uj/r2d6fNtKcSIL4xbmIi/iZoTiJwzV47NoeCISb3ExHqMlKYjddABWO3Rxh6brA4uLE9QYG4XDBDKx4J5wN3a7a2ud842uAddSlItXQBA9MAQklO0MeZ0VzoqUkCvoqlxZ8NR6/ypfdjAHICB5fW7uj64R1MjxX/ovwRHf09tKtxYQCJRDPR0CBjV4ouIBynP48OHiYoXBFLRRyV9S/iQSVq2sMxhA3N3R2wQy3+jUQB7hsJlDQJiF/cCVB7zuT5wVq4KuEECeWZfrT/kkDZXuLQLJy4Oj11VnH7n0a3//idb92JTlXX4NJAe20OwkGyRvqjI5X1ZUfPgoSJQYIyVhdeDOPGNM/LnifiDu6ED33Wj09uKjyCy3gHBvEFH0j6ComUONDTuS3QfzDjhDoYrSrBWPP5OelxoiDkXy0Whn52i8a8gxdBaOAGQHneMnELVvxTx782nfHc9LPHueVFV0+PBRRQJjFEgKSXYnb0Zra5duGhepnQso+AUF0r28sIBXE8so94UF54LL1UggWlkTge6CiC4kVWC4y8wMpfE+VipzEMpHfZhsXZ+77ug6PX32BECw0V+6UYHQMgpNezEJJpC9GJPPnyNVwRCAsDijDPfW5vVdBmEhnOVaBITxlr649V7IkvDNFMyhXZFK5cQt3UMUxdCm4ZnOvtHrccfY8en+ntavDuI8qHIEHHRjxZNHkOzFQAYOJTgC3SxmEOJgBJZxM8oCIjKASPuW8PkquSwpKUldgpEaHAxSrGlvR0dv5+hg3DF1+url1tbAQTgCEPT2F4mCtYHHLzKEQYpVsTOIrJtZSaxrP0YIkyEcv/x1CwZkBNmtINKgFwDS29kXd6ArXu058SVSCzXC468CQa+AKdQUUSB4de4cih1mKukcRpBkAWEOW0Nk3ksyEsgVQiEg2g4pCLRB88WWjuHe0dHrjpGR48cv/vZjTIFg3khT9g2MUgYS+mAs+kwkDGL2w94QiQkfgqFAbDHcgpEIgoFaDnalKmW1x2YAMuqYHLk2deLMjdjzO57GYUomoVKHDYhcF7WeNdTakZvcQMQQ/CcdNRjCJJZqTeJchwTEJRwCIVckikD4mI2+IaeDdAx39vU56qamTvdcvhjDqR4Gyd9LHZATCgAizNeLiAQckDiSfF9HxA57DhmbpHpEwmAsEkbRRSCokU7Hh5NT17693KMaIqVWdr4iof5XRhzcd7wsjQSmCIns12rSOJwWDgOIzRBrD0Jvw0P9vv4eSEt7bJhA6saHrt3oaZ0pxTHdEtiB1S1yZAP7QWM1j9geCEQA0Rs7g6h/9ehR5rCCSFxWDuvfscEQS6wkWU0A6UNqjY+PX/vhTGvFRjxwtwXLPiSaIpIdRMDifOIuRFAMIqf4GEQyi4O0Fm0iiBT2A4NwmRiya2dTS3sHWiI5MvLDxdaWggLcV2H1ihexZYTSOBA2n9PBZLEYHJxZOgeAzCDGPgCZHTGPsjYc9iBMsuHkyRYFMjk5Mjl1prWpZBPa+s5cXnOrAoZX2YCw8cEHMqgTkXZTK+K8YskerqHSrUEllLoBg2XDYQuiYHJPVjo6egfjcKRrru5GT0t2PvxYry0leDl5IApd4+BWBOEH5mcEmYOlJrCGKE2OiKycePnvHDRuGUFOtncMD445ZsfGZj/86acDmPDmri8qwgNu6wtfDaUFg6FUXVwOybKTpIGZMGSSJRyWAoEsGCKBsK11bekhAaSpXTny2Wx88NbkbB4mJrRf8GRaKKsiNZj+SUpFiibjczXUVxnMIsaAIXaJZeVIemC5NRDJLFYuih0gg4633rry1ux4fLNq24jwsWCKb5U/3bfKp/7/2QQBYRIziDR0a4GI/i+HZBY4BITLPReGzGD51/H2oc7yzit9GzP4xKD3NU/yrmS/Z1cyQKDtvjwTiFo7NqeW6cSPpUAE5L9w7PdbDdFKZJfPxyA7W2LDvX2okfLy7cPD24dLgEHR+X3+nHX+tSvW7lpLcQNHl85BlSKnFYlBJByCYVMiD8DRHA6Haxqa/Ykc4ghlDJRV4cMMBTWyffvwft9MLEvvb6bjCk/cs1F4BEQQhEMK3QrCMrxtr0Ph8iR/c0ONoilwCgiHtIOTPCc2A5D4mOOgL9bSEmtK19KH18kSUEznXGXwEmgRc9gZYt+7H0p6CLJyKIEmUhOu2feMnOSSYk17Yf8w2iFAYi3+ysqmylzOeTm/akSRI/pClgiiL+hYOOxBhIJlIikP1yUWesEHgXD9vnQCkRlKKnpc9hu94Jgbc7RUhg78/ntojYyfrEQScUZIJLNkofOBOKx2iISlUDj0O/zMSCAcOZgAQq3Zs2l7+WhffG7OUXngwLG1H2eu1oOyITFPqti/yCtyiYDwpF3U/PWp5kPBYIkFRChEGkc1OEwgSKxdkUBbZBcHwhzegvIrg4PxsS5H6NjHx/LyCjMEwwXpLLYgimNPOPyeicNqh7++uqG+viYQrskwYQjIw9BDD+ssNhwc1MFIuC2yVvfD433nymfxsbGuccexzDxwvOTVQmEOGxL4YABpe29fILBVMBjEgLHl53CdV0WTEYjYcACEVafLwCEgnCbpe+rDbZv1x8lLB2fjXeNDBILf3PDSDg8HIitLtuklFb4nsGLlxghMEQxTo/Oeqq7foodT8u4pI4X4oXEEGjQdMU2YxRCOp3RPjmZI0baxODbfRoYcsKMQa1oe0wKfeMK6D8crbftWQmSKdpnZj/2BgD+h0oPhIN605agM5+Mzl4mNITJoaRUCkLm5uXHskDjw5DY9TuQxcuBCE4pi0DD4p98H2IqtMAUXWewI1iNDhANqrt5k5hCQ/ECdKhUjiXAYQHjo9WARYfOt2bFxyEG/EwBPFe1mAhc+DPvf63PpCMpjop3pmjLDb+NuUn37wRdtebgfIxVlaCr5NPxdCX9bRFJvfVmjXmd4WZ5Effu5h8VP72iiw0fyxLj+q0dysHWeq0qkqHT21i0Ue5ej8Hni2Jhqe7JCTDGOz5GIHFAsiIRPGcsYxSEzPn4Hf7yBr+0S60ggnw2BjJll9EMeYuDU2vr+kdnZMfQR+EH7oCm2IJJhKxmDf5AZ3pq4lngoECgRjGAgQPMLq56qLrd0EE6s6nLCuH9mCYdUiAJBbr3zNkjIkae3bcbCXMkqp0WcaTqISMG5AhGikNIoaQif0odcFIfXbkZbvcXIgeBJgYaHxRAbDoMhmiMZWwFyhED+ae1cepQIoijcvmI0aWxsFGP7QFmgYjSYKCoyMcYYzUQ0TAwxQggD6jgCEsksJIgu1DE+NibjD9GVrly5c6FbV/4Tz61Lc/tBCagnwwDazdTHubequrqrKwdDMmfOCEjYFz8Fq4qqKjBOW2g0LqgqdwVVrlbfHvo53JrXEZBwpie8TQFzuFPI4Mha//vLHwZmo4Lj4DbsY08g8bQy0QZXVPZI5ARMwVf+EMmhV5zSxBJJzQsxhhXiiLoVlmQIDFEg+V6pD0++GzRrEONy2+2hQrG1/Hio6nHJiUcN4ZABUZhy+/aqhkC6gxUPiNS8OkOikDQCnlRnkMzdXrtEIHCDTrZpQEBy+NFQjcbTfISVb1QJRMyw3fRY9SSHNk0OBkCePPwzR8IbWNx/Z5DdBNJtVfv9jwZfHKcDYbl58XjlcTtCetrwJseMsr58ERAqfachgSUkvvNzIAkZctYFKfz8+fGzoa4QuH6FQYRkz9JufhaWCLUXjUY7E8ms7Bt1R2bkQDmteOONJaKal53RcUCuIQQybNYvYxBRgWCVCJAYPGrNIEJCVxrws8SY0t4Wjm6+Po24ILMZYnGeV1Y67nxA/DSesDMQYfr7igwiGSKOLMIQaI4WjCCQQzgfDVPGgNhU0u6ta8EhzuWnKxn33QwMQODfUGfFo4bjORjxJYj4ERMOzpFbi4sILQXS7bVKzTXjEE5HQzFbRATL9i0fGUvezwDCAPRrsgTDByIzzlwQznV2ZL5QLfWNPaDA7I+YChPRwtEFO0TCb6YG4cITxERJ3yTEITWWcADk1LD6nQNHodrsGMQBkATvLzq6jYvpJQlzTaBgF6YiCXMwiMQVyQsS51prvovYgiN0qSIeUTtIoh+QEpA/2sFmzKBxHADxc1Cu+xy5N9+dL7SrBh1GMAgVPsihJxEQvRhlZgzId7m8P0NCjhBIoW3sJ7Ej+NG1cX4OezKHEMyCIX7I4a2PgyPLB9JF9YssGYKkolIETfls4Zwq1cPZLC/1IILBhgiHkDBInESO9CjdWwBRimq+Va0zs3GgpeBDj4kc4oeACAUwRgcj7Ei+W+j1Cu22DoRl6UEmZXqoqw4M9WpCYPk5xoEM7+3GIORIodUulQw1LiAgGU9hov7DtSPH1V/aZrPycTOV0nD4MUYkwgEqDYYkugwXCIeAxN3Qune3h3akaYDjNOSCFPGIJQFxIBqtgSQas2JWNOWYZiqXNI/HzSMV2z4Ux98r1s1cjrfGI4YNHAERMYVICIQjCCJ9rLAh4giD5O9S5VtqGrtBEQBZyNSs2lxtV33Osg6ct+q75jN1s5hZSGYqlSPHFuKV/MJ2bFnJEohTyaadGjbIZoqOUPhAmIWfJdv1hoTbdEg4/I50u4V2qQ8QVkRArBPZmpUu77eK1hCkaJUdfP9Jp5LOxZfM+lLxCLZ0ammAxNK5YjKH/RbMTE7iKgzC4ozXc0DMwSABjvEgLRxZrRnDi2Y8IE7Rqlko/xAkWt9Vs4qxoplOVpxMzkmbdTMWIxCniZJnMk4xlcZ+NTPHCeZBYAjLD8IkOg4xJOEbrZUMkcjiZEe1VWj2DXV1YHwEUn6djp4op63z6RPW3HnkSDGd3jWPN/vL6ZRTKSfNtINowpa5GDwyzUQ5mzWz6bqZKmcDGFJykUKzpgIRP6BghggIcqRXRa2F/jBYbgCENaYRQ2ixTL/k/etsmd9ZIkHwc5AmgPhq3lCqQy4HlJ+HJSUk+64HzgP82OE0lcPPqOXKS+H9F4deBPcOi/G4VZxgSDDRJUXEEG4QqR2pAoRlaytNa1yNyQ/uFMqek0DYkmkzPZwf4cgiEPQY0SIaO3cOaANbVwxLYHSaGoM/SM8BaROEMUapLiDUZWwhtNQVooOBPUU5ZsSYbIgZApFM18SVL7AYpNdCe1gyBtu2DcBie5NUo6kx9CDTtCHShHjiaof4AQnH3nwXSVJ1QcQRzsh/IpmEIdIaom8JBWS4MsPFXpe7KAAhRaR/p5Ei/K8gprZzEmoJ/SDe01rLtCQh+iiG23yaehC9J2Gy6T9g/HVD3gG5YIUVyBA2pF2ttuBIiUBYkVkuAjP/WoFDf5k37Z6qRTdDzTrChLQUhOn1fJcDnqCTVDf4hObmcNu7Y0uoe9sUWc0RiOdMjl4y1U4rmQvCdwYK7T0Y8PHqAwd9IxQYJVazai/dPIjlK+5cppWi6EbVWGP29eulpV/lchnrZD5fXi5CuNkyrRT6brGOxTZxSIWw4nUyO4aUa0oQIpHJgok/g0ChGxwNVKxgJg04CAQcap7zTXCo5f5OMgdAwAGM8vPnz9++dTHeLUL1e+AASJWEMz1rz4zARK0JYg4pM59MGv89KAgfCtepoxgCiPJDGZK8hMV9LvNqf64fbIfCePv+VrFYAwf0Dhh3eRSoBYwSTlh1Vg1H821KeYIg/vmnCe/+o10IYSTvzuSIN7CAQRww5BNWPFEcwDg8tEOBMAapBojFd+8W7xEGDqiqrQJxrHWedZ4Zm7hIPg69EmFg3hkSI2wZ7R5jyGBAgXWDAks4bn46g5VbXI7DikNRQO/fv7/14hbbUa/X7ykONXRCTXpzrd9ZXd1irHcSoui0ivgkRAnfNb+BLVTzMAAHJgQ9cOPqA+Y+YfL/p8yrq+cUh6QHR9Vzwnih1plGcoBCYRQoyynNKbBWn63bYGxcvzU6C0eCgstzVz+kO37RRzAHkbjpEdqX/h/ajvqWJzTCk9Mfrtz/hJW17iCu1DoHXFvBDc4NRNULzgw2A+q10HOn9Gj215rgeLl5w8bfdBPACcqnLMoAAAAASUVORK5CYII=", + "description": "Displays a indoor fine and coarse particulate matter (PM10) data by combining the latest and aggregated values with the background image and optional simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm10', label: 'PM10', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'µg/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'pm10', 'µg/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":150,\"color\":\"#F89E0D\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nif (value < -10) {\\n\\tvalue = -10;\\n} else if (value > 10) {\\n\\tvalue = 10;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAU8AAAELCAMAAABu2vS6AAADAFBMVEX29vX08/Pt7ezw7+/r6+ry8fEoKCjR0dDLy8rp6enT09LIx8bm5uXl5OTo6OfNzc3OzcvY1tXh4eHg4N/j4+LY2NfPzs7e3t3W1tfV1dUtLSy/v7/Q0M6ysrLJycnLysiqqquvr6/W1NO9vL3R0dK3tra6urq4uLjDw8TT09TGxMKtrazDwsGjo6S1tLUwMDD4+Pfa2tmenZ7c29rc3NyZmpqmpqXa2Nenp6jIxsSMjIwzNDKEhIZ3d3eCgYI6OjnBwcGgoKGWlpaIiIjJysw2NjbCwL5ycnLFxcSTk5Pe3NuQkJDY2NnV09LPz9F+fn7Gxsl7e3s0LSpaWVk9PT1tbW1OTU1VVVXDxMdRUVJJSUtoZl9iX1i5tbJCP0BpaWq+vruFg31fXFSAf3m9vcJdXV3CvLuJiYxCQkM6NC2Rj4pmZmZgX2BUUEi/ublGRkZraWKJh4J6eHJcWVGenplCPjWamZRKRj5QTUW9vLiNi4Z9e3WioZxjY2OVk465ur+rqqa0tLu/wMWur7XFwb9GQjmjo6qYlpFOSkGsrbGlpKCcm5eEhY6zsq9mYlu3t72lp6+jm5Zzcmy0rqqelZNubGVWU0ucnaKqoZ2xsbivqKR3dnC+t7SbkY+3sK6Xl6KMjpqYjYs8OTG6ubaam5+Ulpp4dGyIiZWqqrF2doCRkZahmJR/gIaLi5CLf3h7fIKtpp+xq6ljX1CrpKKQhHqCdWxaVU2RkZ1yc3pvb2jl4+J0cGhCOjBnY1WlnZyTiIGAgI2bkYlubnmIe3KelI2enadpaXOnn5iZnKaOjpNbVUZjZFxsXVKTlKF6eohgW0yfoqtuaV2YjYRoV0s6MTJgYWxXV0+5vMNrZlhyY1ayq6STiYd2aFxWUEBybmF8bmRjUEShl5CNgn+BfXOvs7pBNzlLQ0VRSzq6tKxLQzRVVWE1NUFYQzZZUVSqpqhdSz+ompPNuLbt0dLcqqmvj46fhIPDpqCkcmfdxsTgubfZlo/xvbjAfnOAY1CjW0+NRjoYsGlWAACwQElEQVR42oSZi09bZRjGi3N4QUWdl+1gZyuXwgo9iIMgbTnjclYQQuntHE7BVsBKS9scGKmUzSpeqp0K3iKLzkSDG+ri1BBADSU68baKIhYNmBZQwxDF4D9g4vO1zDmvX05LW9ov8Pue933e963kkzFj7/w8TaWSZTTSTqcaD1gx1Lu2trmxGd3YnJmJRjfX4wuja+Gl9l8cg72+nrno8thTY6c+/Oq332Ljc2u9g5PBex+9R3mgtd3vsplTKSY1lfMItJpKZe0d1tTzFs2qcZeKN1mtDHlCm3FZfxbNiV+zTKpaUNucHKemaBpv/a/FmKl//R3NioLJY9caDB0y6RPph7fdl5eent505wO5uRn79mVkvNzX9/LLOTk5mZkZGZkKhVQlVxZU1h5sf7fNP+xyuYzYmcINf4FTEERBZ9CW18mUSplcKpOrFNnZOYrMjNy0tJqaDNWAvOSe/ttvvOHKG26UjC82+11GmqaSPFMZBo9os9jrC69vbMwsrkTnFqMrkcjUyOzo1Gh8QtfVGxqci02/98nYqbd+HYvF5mYjo0PeYFd7+z3dnd3fDPt5hvw3To5myU6cm0vdWtTWqRFONGHI2SjWygDLz1YhyZNS02wqbgxrc7I4jv9Z7L/zpBmbKDjcFkO5pq40+/47ZdvvzEpvyKpuamrcnZaWti+jr081IFUoVKpsRWaOIlupLCmpKK5tffqzb4ZCviTPrSUKVs6EjeqKZHKlUikvLVWq8LEcHMS+fJyFvP/RR/v79lyZ4Dm2eMhnNFLUWZ5kURQ9POwKr61EozObM4szKyuR0R/ei6/NRiLBrmZvS/PCcnRl+dTY9FenphdHI5HJFpfL73B0th7s7DLbOIZiRJtancpQRIyMEzuehxQXFq1mzOS3aoj155+dZ3lCoGbKxqrVLMPQ/8USm9PgSf0bapvVygcs2vKyusoC6f2vSrfduashDzwbq6ura2r27bvjDtXAgEoql6oUQAJIBUWVZRqD3SRwThYHTm2hYAhP3mPRlxWXyqVyuVIqK5FBnTlE1jm4SZX9JfL9V2LdcOWVku9iky5gTPxd9B88cbnW41DnzEaC58xI572zkamFJe+zPd6JnslxvBYbj01/N70QCkeO9uBAz/xysL29u72HMyFSWUotWlkiN+z0ZwhqNa1mz7KlKQoXBaL0z7STSTCCsBinGaghUjVe+LeFbdVm1vkPPJMvsU6r4LFoDZq6yiKZ4r77ntj2wN68vIbqxsaG9PSatNz8O3IG5HJpgmeOSiarKKqtLdPodW4T9ECpt4KDUjMcZO6xW3TlZcUyaTZ4ymUyeU4GaGbmIOpzFFK5rESef8MNAHrjjZJT0R7CE+scTyzKOLwej860tKxPjUKWo8tfvRfdXJkZDbUMeSdanp2Kj4bDGyuxxehsPNw7ecBrNM6f0egPHew89K4lICYC3UpTDEH6J0URfZIbeYSVyAh4AfjJe7dQGP3dXsZsxqGw/46T7ItcYaX+kTQJdyvnQPIsL6ssKlFlZDRkbmvckbcrL72xuqEhPW13Ws0digH5gFSqBFCVrKSguLasrEpjsAR4Jz7PMGqKIrJC3uE5h85i0erLikqlYFcKeUozCU2FAmk0W4oc0D+wP8EzLQ08g67VefJPEYhbQsVDl28d8d7ctj6LNToaO/XVzMrM8kxL10Qw1NYz5A2FXOGNjc3NCHge6G7jANSua+/s7DZo7RzDshAPC0bqZNCekz0xIppOPAMQEVqgwIbcyIvkp7H95U4BQOn/4glgqbTActQ/w06YUUBn0Gvqigpkin259U2XNV29a2d9Q3V1enp1DXwkJ3sA8oTYlHJ5QWVxJXhq9FqdhzPTFGRJ4giOyJhpwcbr7EgctQVIn7KSUqRPqSJHoZJKsxXZUpwIXCp7T0Ket96KeEeorlJJjmd5YqmDa+A5FfFFIrNTU6OxsTdmotPTsclJ/1DbYFtviy8YDrvWJ9bW18Cz1csZV1OtgqHzYDdSkJVlnaLIEve2iRR1vj4p5o8gZQQ3T6eyyAnnEqsraCy5eY/B6bSy/5k/1diYozj6r9pM6p5xwovsWn15R2UB1LSvcUf6ztxrdtbvzatOb0gnhlSTLVcCJZRZUlJaVFdbC3WWG7Raj2iGGlhkHKdoQ+pxsiarx6DTlkOeMtAvkclg8dnZKqTSbEBVAWi/MrsmyXOP5MNYKMzZaPIPEZ7nklNvPL4ysxBfXwPP0chMbHwxOjY+PtLjO3posMU7GHING88EhV5vJNTzw2RofpVNdTIHulu7y8otVjVl9Xg4VrTRNidFn+OJG3iKyVCCCASt3YzkScGbWPIKTCrca+y7ZEeJg+fNxM/+3doFmrKmCudLGBsRIzPbYMgBgrOKmEj2vtzd1zRU515Wvxc8q9Ord6eh0FERrcnAs6i4+PTpE+BZrtfaA4KNkLRarRzPC1arwHEeh06j6agtKiEgySHgXpUNoqiaQFaVDbK370G8A+dDkvdWBsO2hD7P40klec7F1yPInrPxaGxsfGZsPDYSdI20drW0Nff4Vo3uM7be5qmpA4fa/MYzqZTIaA+CZ5XOZKNFk0lgeCt85VwCPat8J16kCEObSWu3pUKyQMAQjeJBOGTM33ZFpsXjsOGlRIL9Z31yLHhameQhEYWTnzAzxiwCBqLdYtBUlZEaR5Hb2HhZevoD19TvvTlri2cu9CkrAaLSiuK605qOE8frOqr0Fg/POW1mjnfwgsnhMfEmB++w6wyastqiUiV4quTyBE8pqixYPHgqshVSqaqvhshzz579kumVLl8S4594QjOMfy2ysjgXXwPM2dnI4vipsdiHb0QXguHJ7tZnvYd6fNy8xWQLdk3NtR5tDqE4gjR0Va2tZWUGh1ltdmLxDpOVpam/WoVZIFZOclzAYKcpp0lk4OVqnCEdDvv8vhu3X3CxxeEw28zQq4egT3pY8tpayM20k+ZYUgMk34I72AeUJfACcNh15R1ldbVJntWXpO/Izdu1t76hkfDc3ZSbnylVlhaUlJYUFR8/rXm946RGrynX2T0mFO8mLN7jDgRg61qDvqMcPAvkiHCUVQSnVAagcHYAVeBerhy4owbeDnnul8zEunrnk8XrOZ4QT3AiPruyiHifmgXOOBqir2KfjMci696R1u6Rifa24fnVX86shgYn5tq7D35DYbGsXXu0vQ48abXTaXNaHVqLaDb/jSfDsclnZpPGgnRaoeFsVjNESzPBUGjIf6lk+0UWjmOcIm1TZ5IilmYTxwJo7DlDAlGziYZAsZI8sYETYepwu+2BgLa8CjiLK5TSnLTd1VdUX9D4QEN9fTXKz93VuxtzczMRp/0lqDqPHTl28vXH33zNoNcj4D3QpgcHgnxhtyBjVNZ11FZVVVWWShUEaEEBoEqVyJ2Ep4L0AiqlXNW3B/IEzv2SzZWhXvj7+TyxzN71yObKwnp4dHQqsrYWXVx+b/HDWGwDiXTsvTdGDnh7V43z8+Kwt3do8pCFY0hUo97ratZrtI5UtY1JdTt4rVvkTba/lzLqLbMXtRankCpVaewWB0Orh4OrbaGWnmsLU3YZBKtZ5Gwmcy6rBlGwItAQ5n/ghFcwotXGgiIu1LUJ6ZMeU2cwGHQWfVVdZXExapzsjIvTG67I3QaUeVfXg2cjitC03EzwUUKfFRVHXnzp7ZfefE1vMLQfDTj4QMDiMZk8OBSdHs1Vlaa4DPJUkoZUiWgHVNwTniB6Vp8v51985a17bt3/EPRpDP4DTyo4tD67srK0vja1NDK6trYYmxlfHltenBl/742xsTc6R7yDJuMZI8f4hofeHRRIx66mPBzHtWn1Ok+iQRecnNbN8YL5b401QxM4NG3jhIDJSl2882JFic7JMK7h0GDzYNstEskuA8+ZkQt5bkeVNek5ahtN/+lkRLuNdvKiIAK3mlBW4zKTxOmGMuEtZXXFFQUFcKOcjIuvy7uicVvuzobGvfXV4IlVA54A1I8U+vCRzz9/ETwN2qe7mgMBj91u0OosOh1Jm3VlWEW1pMVSQM/EieDsiHop2k3CM9n4D9x+x603PtTX98wzks1Fo9/2Dzx7wTO6Mrk2OjW5NBtHaR+dWX5veXl6+tR0bHn61Pcz4y3+5mHuF0xHmv1ioh5kUINzHotBG1CT59Cr3i5wVu4vPAnrrXgXHCanVbzu8suvKy064B8e9k+863366esLJZdqTSbRTCBdwIMXKQdFgRzFH0ZuSi8SaTNnE9Q0uhnINzEREMgIBDxBobgI2bFUBp770hvyrqjetu/6vOomQnN3blNTE3hK4fDE4o+8+OJL77/2sc7w9GefWbQ6rUUPoHqttqqyuAgKryjBXQGxdgi0VAb/kRUoVQrwVCQrUPyi/57+bz+596sD3ZKZFVTif+eJ+jMcX4lPxeem5iJr8cjGxmI0+tVKLEYEOj09Ht0YCQVDQRsX8n521EExNmgOJmTmTYLDbnfAYeDfFgsnwiv/pcFBkrVBgJQp74ILLtyR9VhPuNc/1HJg5NnbCgt3lkO4HKoDfruOo5OCFBI+efbDjh0ZDtEZ4EWKJfW3mcZwRBQ52LpOD13V1hZVwDuUpPTOveiirEuqtzdeg/b9gabGRsDMTfAEH6WstADxDp5fB3TuHpNbp9VagJOYUC04YhdSc8KM4OJoh0gRj3YKu5JOkxSiqBP6lcpnXn75x2+fv/sRiWvRN7QKjOf7EdpN31o8Ojo1tTT5wwIcKRpdjkWnV5bHf1tcHo/FYtHwDMqCsMvooviDZQGbPpW2mgWW5i281RNAG8wzqGdE1uqwsv/Q3IALVGUmujI7dqVcsO2Smy9ud4W9zYfa25+9qrCQ5E+nyCArS5RWKJDG+4Q/t6504MKdBt7s1tmtQIxK10xDwcgfOq2+o662srK4oCTZnedk5l6XlXdh1rbqK3Yi3JuaHtgNoPAjBO7AgFxWceTTtx9//4sPfuJN/NBn2nfeefNNzZuvnTx24sSRI8VHCmSk/QHEHHg5PiLHjtC1NNFrJniiaOpX3r4f1edDe/peloQ3jMMJjH+uP/HINQwTGkUpP9I6MhpHq7S4GN1YjC1uLo+9sbyyNrOxGQoGjWEjbEVotYjl9M8/w6rVvJvnA46qcoPOwZnRhHM6/r9GGghgynnpBRLJBRfe1DrcO9jcdeDdo9cWSq7TWXkMJmDnEr2TUkPLtNkkCsw5nu6UHVU8E3DqdDa1mbdzJoHmHCZkG7TstQkjkoEn5JSZUXPdRVmX521Lv6K+/uqdjYj3Rtj7vhwVlry0oujYiy+98sFrH38dcLiPVhWdfP306ZNvvv76idOnjx0/XQx5lsjloId+PSM/M4fIFLpONEhErOCpgMEP3EHc/aG+/ZLwui8STPJMnj8ekIbFOOwd6hmKjE4ujIzMrsXjcUxF4oszM5vLC7Gl3rB/8hf/mQmXD0Bp9NpOkxW+gAJGZ/AE7KiDPeUWrZ23UU6PlQZyclDnClH11g/o12ek/DtTCiUp269qDfcODo60Hhi5SZKSZXC4HZyIsVUhqQbURJ+86E6OT+aNWB7JNbWck/NoedRZZDb3Ew9vtmu15fB1JD20mSqEpgqToLSsrKwd9duqL6+vRwpN+BF4ZirAhNSgFceOv/346x/85LZYEOZ6PeYir79+8sTxIx99dOTLhxHuMmlOJhYZPOeQuCczJpI5yedJQQ+Z3/7QjXvu6rur7wXJwvp6JO6jCM5h81Ywqlln0OXzD01447NLUyM/LABlPBJfi88tTc3OTS30hF0hnfXM6oQrGKRToR0Mb1FXg5itvE7rdljVHHTpRh418bw10ZWfx5PGpUb6NDmsmAsO75RIUiSSm1t9E13PPv30wfZrJSm79LwD+nQFfRKBUQMn4WnVJro4I3jO28ollxWjnDDoSbzjTK2CW2dB9jN0kKKzghg7zFeVnZmf24i55676C6uv3rl3bxbhWZNWk5ufQ3jIkUAfPnb8+OOa1z5+R4spElqq2royxDoi/dUnH374ycNy2WHFnWSgD6jQokqpJDzJYaHjlGIBJ/F32PsLfbdLljA37h1O8GTP8iRO4fKFenp64qMLC5NLcwujSKELowtTS2g+l5YmUCRZbNx80DjsSpiBmcFHyWCdsZS7HW5ezdp0fECH5RC4szzPLbyCCTzc2GRCSeC78vIUSUrKbd1B/7MHRtpbD91cKKnXeByOz7yucK+kGQ05yZ8ML5SREhQ8AfRMWeEVlU5R0JQlW3jaaXXrEOsaqLOoAL6ulJL+BTxzc3dflJXeuPPqhuvz6vdmETuCPPMzVInIBRvZsePHTp7UaMpRz2seP33i9IlK5M3Sw4cffPXJJ189fFj2YM6d+fkYxCcdSEkWPqoiPLGDDHsM/HjHnrteeOHHF36UjPiNs0wCJ4L8jzmv2TYcDLYMtqxNzS3NRaaW5jAEXVgamVqIxyFSr8/nt6+aVl1YZNSGsgX6ZFIx4eJQgwY4PNTxgh1fN2DaDeUi3v/Sh0NzKAdsiANqWH7R9pSUlKsP9va8e3Sys/PgzRBrncXEdTX7wn6J3wXzIjwFRxE2wV7zq/PGM5XgKVodGiRRol6YEQqlqqQTwUMSFWIONJi5L3/3RddVV2P0uTev/nrwbARPjC+Jtog8ZQXHTxw/2aHpKC9HXXDySAVYPlxQ+qr0weeewyU9jHC/MwMrk7RCiH7yGZI7QRMCJ89J/flQX5JnS8TYwxKIhOgf0xDbmd5QsKWlLR5ZmpybnYJAI2ujIyML4BlZmPP2TvgDqx6bMdgbZBP/qo1loU+KVYsOnhPQY1K8KDo8bgdMU1Sf/XbrfC8iiZfxuYaHB65PQcTv6PQ3vzvSfm/nI3slKTvLLA6heTAc8ha6EDxJfdplZBf1PFkOZeFl4Ok26KFPLNb6UyCggzhJhYOIlCF9Jngi6eXv3t2Y3tBUXd9Qv7cB6oS9Q2tEnARPwZHjx4+fflzTodEgVZx4+EnE+KsPH37uuefuf+KJJ+5TqGBpdya/t8skg2dyWjKQJM6ULSXzu5L+/oG+/S+A548/SkJBV5C0f+cPG8x+7xAZG0fWIE3yRRzifOGHybnRdYh1smXw6TZu/pczrl6vl0Wjx+BLtS2JixadIMKb1FAfX641cYLAB4M+F9n0HMzEBQiiOIxvqi7eLsHae2/P4LMHDt7b3X2zZPuuKrfb09zs84YkxnDiLwNPrRQ/oE7Ic96dWXhZsSDoUOKSSR/GTV8ju5RX1ZYo4evQjRTRTvInvuHJwHwpL+t3tq3FK806DKOtddlq3VcuC7OaZWhZmqGAlxiZ52SC4uAjCJQEkQP6iR9TmVPDoXNoFphZWaRktnWxhmcHqNPFzjJ3jFrmarqV5Vpn1r/Q80LrdvolShtSPN97ed7nfb66h2/cduMDj3V37+7O6O68885U/m8UbFO9xRO5k9P19QOHPy8rmxwZmuqdG5qa6unqGu1K31FXtKNzML2ubrArixZGO9MEdLkSyidNnZnFmBr6O/r3PUHpTnhy5p8jCZL8N5403DlDnhDrnF8JR1fOzs8AUxTP6PJiYHG1Oej12q0/y7VaM+QLCZqRErIZkRoS2CwibK9SUtSoxrZyocylMCqcTo+DmtG/8AT2mGdM6EuBm3h0Ht3Psvb2pta2pu3oR/Uune9o0OP08MxmIhwk0IlS8bsngCfiU5F179Ycl1Esc6kp37Fj1lWKRaie+RQ3NLlgGETL2EltecvD2x64sfuxGx++a/td3d8CUeC5sw9JnZ8PPBGf0+NA9PPJ3Jy53qnRqS+Henp6KDw7u7szUDaB5510ZdCSgCfiky4WDf8CqFNgZi0tLf0Hd+1J4BkIaOX/Qw0DnpDVb7BaQ0HguYKFxwwyHmzUHQ0HsZLzyOUIFHPE7QbpVli0yHol5vFs5LkMGa/MVmVjuyMWosqLLEvsktMRACT/lX5NUPMcDu76e+8FYdq+1+r3Unzuv+bepLuEFpG+vd1qtSYRngXUw7WiNBDkn+U/a4HoBv/eK0oaawrFLps0m/L9188qSiuEZbn8xAIYHx8FDjGKwle0ZdvtW29PB56PXXPXt53f1u3urtuZmt/bKxAAUkHu9Ozs+NwECJIgn9871dU1NNXT10dwAs+i9PRBAIrOPpiewBNBTfGJ8ATVKgaeZWUHWvqfePrJPXE8HZycODnOv3Q1syfk93tZiEex5Sit5HAwe6IphWNR1ukGnpDnI26HUa1tdNHOt6YgRVIglYIFGpUVCCiFDPxaoRPJZMwXSwYn919rQqIDpkB4uRp4JvGAp1Mztr+hrQF86ZLS6pydHXpPKJQkd8g3SwvwWsLzBF1GrVa7rkvnXSG0KISFxoQeCDwroQTl8cGxEwYF4AnNgjbk92zZ9timhzsfu/1xwvPburruusFUfm9vbzGOoHhkcnzu9XGQpmI0dQpMSvauwbpuvBAP1M7OuvT0zs50WrXn5WTmY+hPpc5EgALRUmEr3Ax373rqxe+Ap/zE/yng2QG302nVGKzO4aDPG1tdXoRmN7O8Mv/+2tpqVON3u6HWNTodnLlGnS2xSRMCGsLEpDbh48pMGG1ElS6IIWqjeMwesBuYxGxDECaeEAha1F03CzwRoFfvDXnswba9DfoHky6+Qcz0X72lw+tlkzDSyuNis0l2kKin9sT6unZdtI23vVLWKNRhFxCnS79+IyqEeJyFFKdAoupJwO7IyAChv+SS5Fu6uh/f/dg1jxFSnYOojnyBoFcwMjExUTw5Ozv7+iTwzM+fGu3qGSU0Owl1Ck9gCSTrgGg6cj4VRCyvpQMiKCV7vmAC4qlQ2Hqg45e7n356z3fQl4Bn9v94VQIcVpgGg8ZjCLGaWCwab0lwNax9pF9b9Yf8Tot2Y8Pv97iRx4CI5E8QINoJSbBlM1VtVgNbcSW6hbSA9WnYJZ+KisI/B3hcARPtErnreffy7r33wb0Gqyeo1zfsvz9pU1GF+NKtj968r8l+kZkoAInJNnGWHPmOc0K73piZdLlFZylVGDGEwdeg/OZjbCBzoPpSJybDBw715IxH7tl2xfZLNz185+DOum3XbvuJCmMXunf+yERu7kQx6NHEceif48UYLcE58dcEaScAxQGY4PIZxAgG0eOIHvV3dEAfQZRSbE5OTEyWCMv3djyxa9fTSPjveKRzJda40r9xBYV2algnazA4WY/T4BteXV5G0q/MB2MftTWF0fy5DfnP1ZpIxCnJRh+SqlXk5rDhvRCgChkGbYSjpbC0tMKCBdEXzOaA3WW0XXDQAHpqyhK1UREAl70PdInw9DuZ9v0NDe1XbdqaWVl+20Wbrrv62YWL5I4ISK7cbHY3H5SbHW4350FZPf1y0iXVkNSM1cYqhK7S+PHbokLsNtCG44d8NF0JPO++ZNO1W65EX0HUPbYbQ09P/PSOILgEvcj28fHjx2fnensJzi7gOdrThcqJU0SIdmcQxSpKHxzt60vt6eP3tyC9D6ah7uaOTEzm5k6WlAoPvPfEk0/u2vPECx08+nRx9gm15x/xybFhH/gnYtQZYoJj4WU0JDjCFmfW2ta8XMQdkZ9wFTo4tsNI+mNKFenpUgVGaZPSVFNZjVHLpG4sF5XmyhQKjnPKHU4pFnT/iE+6gDgpbs530700b17XwLn9wYamhtpdD96WIyu/P+ni5E1P/741bA3I8XpwifCz8ojH7ZA7OM568tWkS42VLlGNrtEmNWHF8cahQqEATImEH9J+0JX+xPORSzZdccOVwLivr68zo7OnZ5AGnyHBCNXO4omJY+PHXxkf/3IIBbEP6U5MKRGcg9i0ddXVFWV07wYjQIXo5WelCgQdB1pb9vGLSRkdwSgwXS5saoPqsLq6unx2kfC84GBI+YdZgDOEg2Gfwe8JeTR4xkTBmCDUR6PRtVWWM5sj2sZ1ccjpRHzS5VDnQP61IbtJCVJVKmm9huQ3isvKymUco9m82Y5Fl4leSql74aphQ+TxOG5C9eTxwOet9toDB/qb9j10t55pux4c/6JbT16yZ6/fDQeLmQvVvhZwkKrgd1uDbz1/8aW68urCSrEMHBeTwxsDQtoNZxGHx4O6/M5OZP49yPetWy+97BHIloLiPP5oD38KfL13bnx8rncOXQjxOXscz4eG+H2pKAUor12d8VbUCT6PxEchzdjd3dWHX+dndeXn9ed1dHQU52Bw6B2ZPnz4MPBsaG3p7/gwGltheZtRnRAAJAH9jSfKoEdj94U1LOv148lRFNCZ6FpTbGY5troaszrcnEqxYTEAb+y7keU1ApRHm8UWn1VsMvCbqhSdpECr1glLK5rZgMPMqqAyF/yN55/2IIfDz2JeRwW9psHJ2pvgKWtubtNrmP0P4k8vvvn0Ew8+dNBgRrr/HGraxUUiHAI1dOrISzcnb7HkykrJwUVrXd2hz8uFucUYBHGAJwUqwhMN/p577r7pikeuvOWOvnwo7TngRFA55uaOHT+OFC9GgM0enz12fA6A8pHnIAQZdV2dO+qgQMVjtA6A0qTZh2bey+8hGn/wjjsy+4uLEZ8T2DTXF1aMNbe+tudg08qi08qTg5NzAXkKWR7lf1ss5PicBuzZNXZW4/X6jno10eW1tZn5WHg1HDZYQ06Vct0y5rUGiJfD0ie2UdpJ0eThtLHYSCVRqbVVElONRdagMRegxhlrqrIv7NTwSwk8zQG/4fokyHW8+xtCXm8YFr1axn6UYVqvRdO/+LZTn26972oN8AwE2KZdEQfnAYdaOPXhU1du2uEqgRJfL64GnhbR4ckSCCHkOEBLIjypMeGriPDceuv2R7L4yNQDreW5aOrjs6iZs+PHRkZGJmjbAWwBaN8dRP5BDu7oRAuiQ3yJwrRrCmQgUWAxej35yJY9+4pzSkompw8XDgyIK8aGW5987d21xXnOxgtYWdbvQD5RTsU5IQ7wdKOHaxgNa7B6GYOGYZjl5eWZFURnOBj0+lnnunJjw2B3OrTwbUELwZ4DtlMUUvQnaSPt4FLgQIpro4oxyIHmzUqjLdH4CkwoneQHIbOd3Gytvfzii5KSeFfpwSSCte3tsJ/4GE3D/USiHjztSb7yMk0A/3Nue9suM4d0NyzEYkd+fHPrQQUsMvDJVOpcFlnhJFq1QJCXSVovTlaiMQHPu++59JrrtlyevjNT0HKgZa+wJHd6+vDrr4zPvvLKK7MjAsHcyNz43BwiNh9lE3AionfEexBOHFC0qJ7eiQmaplCBd6Zlbbnqqif5Obkl5WXlAxWHKkQVY0f3v/bawSa/U1nDcyx9wWo4tM0IiUWgHjRsBFLkHLifN4zV++KMNxqFYAfStDi/Gl1dC4ZnQhon93Ojim2H40ZJlq6q9fX1E0qFlrQ+Mv9IAJ0W0OL9lBaXdnOVtkClTPAlvD0e9DRFrYTsrhRtu+IyAHp3O3W+5ub2WsZgH7Y0PEB4PnrEfHHyxUwEgoo71rbr3Pmz88sLJ1dPf/L9m5fnukrLhLm55eQ6EgsxRwsAKB/LcCJLFJ/UmYBO0bbLrnjkkTuz0gQtLbll5eX4EkMv/nzg8OuzpBmPjyDxUVF7OqmbF+0o2v3I7gzASXhmgDCBje7s4/eCvvelosCmpd5z6a1PZrYg1BvaCmtFw3QaDj5xsHX4C4WR5176YkljdVo5mJwDUsITw6YjYPZQWIYXZxYBJg7wXEURjQHPteZYlHH6HRvrCvGGslpnI/cRiRQ0d8a9M/AoSWmnk8ATOjv82zaXEg7ZhMnjgpcJ1luJzaRIv/+KTRddtGfYw9p97c217V4Do3OVb0/gef6iR+9n3AF5tjuq33P2/JmvT506ffrIjy/17yysKMnJRdoJccpL4uMKtr8IT3IaIDwJT8ybRTtuSN5KttdUMBwElbC+vl78duHh+kOFh2ePoZBSY5oiqgQ0d184GUATP6gp4Zqkd/XwcVLxthCWXntyT1Zey4H9DU1N+vZhn8/u89XubS0TwwzRyDNhZ6uB/9C6DqKMMELkyAMwe3N+FgV0BrxzORZbJvpJqh1AXV0NxqJeq8FpdStlG+s6RRXcyHLAKRe5tIldY0EKgNOqaFFB5RRuY4UJzqqqv/AkfwwOsAf/N5Xc9cDWK5OfCDuhz9eujYW9XsZoLLuAZ/I7bSHCk4uuPbvy+6mTQPPIkbcKS0sqy/LBwfNRx0Bd8rApg7RLuzNM7YhNghNZDzCA5zWY5jOJ4pCLDqy4UHyocODQoYHp8fFjx44hPId6qJETnOR3wHeKT6DanR6XUNNH+/Lz0f5Hya4ElW/fvv7WvQ1N+tq14GpsYcGLNmPXuRoxX/NsMOroGjc2FBva9XUbnDAgOg6MPQ4OeghDGC4SqLFV4p9RwnIG3MlgNYCcKhvXT5ikUrUSEwtUc12jNl6AE744GwBE8kN+Um/OFsFDrdQSn49jGc8CIE8/sm2yzHtue+CKO4KclbHra5vDdrtG0VhyLeG5/a3zye+vcA7kOxcNPzNz5vQpwPnJW3qxuFRcRvt1PvxxOViP30l4khEmlXZlhCd+kNQEPC+7MXUnDMiITlg8IeELSyF2Hh44VD8LLk+dHRx/sBuiMdoQ4QmLfSI80eOxgUvfgXzP780Hz0obhNMeW/t9/fvbmvSfrB05jQ36AmZIg6axUQFHHg9rHpkM+zN4kZRgchJyepicbjNpmwZ7NLp49ty5lfn55WAMkMZWm8MxMCeNgTP47BrWun5CKzEZVfLAOmQ0t04bF94TRmP4wSS0+DEpdBIJfDdqMH7ATPZEvIiCE+Mm6CpeoGjreO3Wg/aIX8M019a2jwUZ4HlNPD4/+T35fSvndADPWPTH6NenTgPNHz/8XohTJkjlQ5wQgAnmpe7IJCzT8KBD2zKyZqZR9m+7Np2fCXqTWy4sFEOFxzfgCUn+8/G5YwQnyudoJ1IbfQiAQn0mPAlQjEVdfX2Dg31DfHrRFL8HHJ/+m3ktDXo90Dx9EsfL+lkv4yI8a3hGmQUS8IZrQ/vz+oZKVUUWfycafsDpt7J2UulA3iPn5ik4kfoNzV6slUKhEGv3ajROT0BpUun85ogzEjBzPiU1+wJaOEqx7CQ04fuuLlWl1JAXp0Ydh1F6waZM7iMpmJSuyuvTd7SFIiAU4WBtbXOz3WIUbo/3d+T7hyHOCjyt4cXTXy+cQit69ftXX8KcAMdCKj9eNgUQfNLR2bNSacZOwEhP03DA67dtx2tKSkqEZPGsrBDD5yk+BDwHpieAZ+8UDlh8RhHCk+IThrH4IUSLBkenpkZHh4Z6+rBLIhUvNQ08or9lr37tEwQnTB4IT6sn5LVbXAq4nniqahjzahTVuo31dZiNoA5JHEtLbqyLQ9YQAy/YfICYVORc5NwipPlWPePHIlmDIswM19oNjqqCGt16wO3l3JF2RoX0Ji+/VqlF6UzI/hKFCBop+JGphggTrUIpSvEXaqWpgOJVVOnTeH0hLIu8R32+5rHhIKNTFN53Ac+PQlYPNBE2uHLmDMwU73/63EvPPUdFMy8njVxaSD9a6PCz0tDV0whQwhOgxpc9+NdLr03jC8oxWJSWEhcAoqKKQyDih6dHEJ4onSQnEeEkkgQ7OPAEqATr7h0Y5qf6sALBIEq49/Sk5ZOCXNbUfITgxK1ZX5+BcoShp7ra5UI/UogaIXMXwhS3DrOKEXZStdXvRP10oih4o6uLy9w5QhOgOhaxix8Osm4rw7AMduVNvvmApMol0wasPhoWgxJqPrTrUFYBT+o+lOEoITAsm9RqApJaFP4Q+GZXQdUD+lIVFt8WI0DXGmUwYul0Mlxg4f2JfP86+X1PyGB1RPx2z/mvkexfPfPBMx0dyHFCE2iloa0TbnygmUV4AkmASqZCrOXIr7nlgbS84vJ6LDDpUMIX4gE4c0fQiUg5JmWOKDwFZwJJ+ob4xLYDQFI9GOwiWKd6+ZP1ZSBp+mAYaALMM2e+1nj9IcaH1YvOYuFZ4GST8ctgilNuIEoVJolqiXM4AhF8Co1meXU+dvasg1sxm89FEKUrPntwjDEAyjDDhPX2xbOBFJWo2m4PmQ3NYUa6WWWxEYKolARivINnk7lIBf+3DblNMh39o4UMLDVJSDQ1KatdFpUKS5MCpUWHy6wTwb5Zejnhef+pSPJbGisLyYDzc7/DjvbVp8+/178PAPKLU1MBKOoZOeChmdN+g8Iy4TcgayFVOkxMt2ynO7XQ1OFjFFVix5QLE+IA9hsToJ/YvGGvUQQ8qan/BWXc9kB8Cdre1BBieBA/MCKNz9XDz1Mu1I+tLnz9++/ncc6wGk/IN1wJQGUiXikWEjIX7qZrhMkCwptRqdIsWa1uN6sxhA0+7/AwB0E3QJKEnJM7MD57GY09XNsWCjLBcNQRyJZgMvWvmM+uMR6zeclYRWtOE8WlhMYDqqFxAI01UpOqCp09YS6UqKVgqBS7UkU1TEc6lw3+RaMRbbLRgsQR3hjP94WTySfPhUIeR8SjObvwyZEPf3j+hffe+w072yzMlVmkwcfDkCxbpCoBxXimk4srH6IFzesZN+YAQjR1un+jsrQMpbS8cGAam+E5rDaIKQ12E4O/EJ1IeMKUTE6Q7DpHe5DzowTrlzSnDrxRgbdoqAWe58+dP4e7hgxHGUhwMOZhH8gTlpZWkk6JAK2urq4xVttU7NEvOHMkxNgZTPAca7UfDTkSgOKBXutgvayvVtOsCTbH3NoCCavv72jDzXMejNl+ncVWUAMRVJqNBNfGbV/ZIPJxdE00SyXikxy3JpU63vBrZCg9Cp0OjmAIRRayWlcbRbfw4vPmQvLJFQMWLBGrPbTwyVsfPfPOu+++i8zGF/xZNAalxRsuYER8IloTaU5ECrtdAXYYmTsyynJLxEJEjoju76J7Y8qnJwB0PtBEtuPUoa0TlPhGBTRxEj2pm+b3UeQ7CiipUtNvi3AXzv79P55aOEPh+fs5K4OFb624sqKyVMgrRZGWlRaKKmCQqXYpJNWqGoOB1Zo9Bl/Qy3yhWXL69E3DjN2aEmCwDnNzUrPbyXFH233tXzTXDvvVpqVg27533jx55PxiRC5Xi0pEVSqtzYSEt9CtPKBGOOoCtdqG/VtBQk2mb1Va3McnIavOH0ycjVMTdBjH6c26uOv18q48CCJeCiYXd1DCNt1WzR1Xa4xttxdZTNbADUFoQuA0IwqLps3AlCJDwSAIqsvgtDIqjCiyEnp/tVfs5V/o8/xGLz9xA6Sl3z2v3+f7/CJWB8Ich46Brz8YlKiO5NqRJiTz5e8fP/eTrwNin0eH3v/qhY+fP7B3bz85GyRRzuVKL5R5CzsvIv4Sik7kG8BLBJDhDtNd/ig7s9RSqmNZy5z0dlpv0Xlx9pOKGLtRKOHqCkHgZKGGh39AveuBmk9pOTHinbueew4LHRvGxsuNW7dXN330ksTPr5t7Gr191RKeQ+BJUWb2m7X6iEtncyBGaAiDInjGh5q8jb45b317W1v71FQi4GuPRjsXmfjQj3a2drYEWugOp1xVi8faDhw4+cIL333zy/EKe3laqJKVE4r8Km1QClA02IiPat3k8traQumOVBWvNnygsLFft1l6C4cjgl2GIzwyZA4GMy6AZL7jr7pzP0cC3nV84OgrH331w9tP7u3v36CUWCJVyKJaV3saSkxHY6RECmKXxFTqfAMfhpJMjVZv0vHP1aGHLwVPGfruyoTcELqT3A6alJzAycOlK+/kXH/9nZdyVibD6KfyM5/+CAl96tWDoWFbiOLi0YfbziD1+PD99wLexFCiHbtEHF6aojdatI5gWAePrtPH/Jxwj2+x8prOOGWgj0TeW719S3uPd6pnqnqqtSVaCJcJZ4zWveUaJ6r9htP1x7bff//E92+8svHruopYcaa+TDoknd5jilTKHNkRxMvddra4qN9l9ovzC68nCzOqwq+MhcEzHHO7gw4zytFgLIiJGi4574Jzrv39t3M/jx6t7zweDQx9/s0Pzx/o33Do0CG16JcLEcTmNSpMqYsUUZcrqR08ZW6p+iYjv2E99Q49qUhLajehFiMQQDzvT0tTM2GgInICZbqKnWDJueGG6+WIpYKomnTu2L/n1KlnjqAcGx8zciwmW99U3Hus0eudatpYbQqVIyWzpOgs5coRzKRWm5nUao7NeXspzuNTmHGicXGxbeuW9r5Eop1lV2+guSU6UMZIvGwgWriCFY7Yz6d/btw0MTFx8vvv3/ilriJiMprLyqpWrNVbnXaPbAO5zG46JqR0leRztastNKhsczAYVRWTh4bX5YpE3K6I32aNOYNhO/5vvOmKS85f8/vv539yvKuLqZHvm/e//eHxAxue2nzf5mUqLm/duoJ1wlBkqkOCks/oQOUIQWlUeiajSRe22RB7YUOlRgkBjJV3imAGIp4xkcROBaZydmAETznXY6grL5WyHpcnfhI9D56YH54ZDilZvRYZ81Sir08KcWhbJNGE6ZRJiBabifrTEXbbwdNs9Tc21jMZQgTSiMvPBbZvbauu3sIgd/u9D3sXP2xujdaVVZRFB1aswMQ8VadPd52Z+GLi5JNfvPlXXcUfZr2fyMjauzCiOH5VpaeSdO6K1MLNiXvL+A6bFFGnCPPgTkhFdE8sgLFfTZ3hjITddMLW7Mtuvu7G33+75LujsDVdrfH3PznzJXhuvufuu2EpZTSk8IQ1Jq1z2LlQEm7whEgCUYg5oZ7KTVS1VpueohPzlDU3ogP5Oo3KU+GpeswkmiuTeN4JoMAp51ZpO2t27+/YA5yvHpmfngFPelXpsnhd/5S5L7GRgcdWgjJsV8r06PjkJFTLcGTJUxV0kAL93rlmomPAS0EEoTy36VHwbNta8ui99x/acuYltDetXS1rOwfUFK/wdMVP9U0TX+ydmPj1+U+OV1RFdOEqaABXpccus3H2cykxC8vsZqSeMhkRSOXOg9uoqmCbCQGVREsXglhid4z/f8TjCsoCv9Zw/+1rnvr9+CV/HQvQYPzs++STF55+/cUNm+9edXvBulX/4pklhLrgqap4JYgHTsySEoncYMKQdAhlKWL0nNLknlvmztzVHftzYTzzkj3mMpwrk3Di9MvPuLsM46iYTr0LnN0Kz1HtuNUGUmYB1Ny+sW3T9m2PaEBTo0mZHh7nB8ZDOhcbFeBJjR/zQjDTvDd5exgYx8vp/fVt9z52/7aS1PzHmj5sHGr0zrV2dZK76S6poF57YeJA/94vfn3yq2jd6T9YIfSwYnaNO6YLwjfResIus1nohChJpnvRP3tqad0BuwrI7UHM0c22pEgOdfYGmKmGKpfp3odLDr1+vO7Krr7m1pbjLYHmwA9PvL53w+bbby+4sQAaXeG5Cjwx0DRloHwInuLoFiPUsTTsAqjerBNv1wqexSX8jIRa4fKYrS/3mMnYSS76P57ET0lI4MlE9B0mJEfQ2U9SLQPm8mGrRr9lu+XREqnPBM/J0ZHp0RFqM3JCjDfSLnyTr6WzNeD1xnt6vH/EjEUWvMawOq0k/7LHHnu4fcuWPlnglGsy5NT99t4rjz+598De/r1vtdRVxUxWV6XL5bjN7Q/T8ogmET+nlURAW8kbIOwnsMKF8A3CZ11d4eKcGzUyywSkN7PZ01DlaYCMDTNe07QNDNzX6W1uacFh4o0/PP94/1P3PHgjp2BdAUqFAsQ0Sd02vRJgJjeGiy0cVcFrrVYKJEvISnI3MWsyyWUNwCn7rPxnq/7pMXHr/+Uihej/8MTfd4q7M2jqPjE5qjNLHQuSMAHSbxGTGQSK+JGRSMrk4cNAKjyBuTFhc1DVUwgutrQG4vBHx9p77OFizSCzLk122v2rLzyU/2jbdiqvud5EU7xTCdmPs/L1wttfPE8h80ZXRRUDTXOD2WlucDkjTODwaug5miDWtz1sZgmeaEVFestdF9DXKBR6AxQKLqfIlYN+B/HB01D702mn2VSkaWupaI8GAvW8v/GeY288/jrmCZoCaGre+tRVBexhKpkwR2mNOSVFkE/FJuKmnqyuD1mMUPJQdHqh+GQEys/ncoQoxjjFz5fx5JMkjApP+VgpCV5YegIoIyY2F8a1YJh0dp55uzjlRdQLiHHocFPGmch3jw4P63R9Ca/foWcfSm/u7eqNk919PYnGiL/YwMboiCFn9S1Z1x3SFDEj3PZI29xGNjhFncW9A1+/9NELE2+Q489EK376w6FH+762wR90RszwTVglyptrZIfaJeX7f0tEpHekttHWxfoAu7z4vDSaDkdtIXXVaSRff0TMWt3pimh0aCjQ2dkbbxx69skDT21+8MY1N96YyslLv7QgL1XZJ207sZMH6TxZGAY4wKNhVxc0WKhj+FczDMU4IZizZO7JIQJLamcbkUKTZ2WiYKmO2CgwK/vcsbuGih4TBVCt1mYjFynTtPLqElRYlpXxtFRrKaGxw5qxbgmwDq/XbzaxBFpuDXTV+3qOJXzkeL+jqGgwNDq2LyezOOfqQ1yzsX37I5lbE1tNiyuAE53B14zqzjz51sTJk0PRgaqf7RF3xMV6q8Me1MGuQMvh1wyVGpzOhsr/7qyR8WYl7g6gnYvEbhd4AmvYwc+6nVXCxv7htqPqiVZUb/Hx94n7jj37cv9mZZ9rBM/1qSvz8tjDFOm1MCBQc+AJvWwsN4VMxnLJwKq/VFM7vkkMKEnLWZWXzGaksgJyUbpq2KUqIslTzgOipHmeVTa6S8pPilTwpIEXPPWAWCq1gpVwbJIqCR1FmsymhdxKGRt554OR7vFxM42z3Up+1estpojn515vT5PXOzflcBQZBifdS6NZqzU5VxNECRYlGcXaEotrRSGtTkVrM0zzpolXvji5rb2z4janPwjxfo29UEdMjsFPu2Pko8oVGCqn8P+CGxpPEaUMVNSTj0BTCqawo+G2SpyfsjZiR0gnirotj2z0MaCJY5/9TxE/xTzXrE9PX5+eV5CaukoJ4aWe50laIyZ0GKOlXIcJsYNpYQRHfiLn82eM1FbJm0AjwKPgqUAUI1SIKgvF7+WZAzMi6Wh1dk0u3RS78qx2l7K8TSjhEJOpbyklDPmrs5D08cbmpIyGnjkx8pB2xlZqDYuHWGFJdEF3/dE4fGZ745Q9aCw5vFBYOZObWZR1VV6+xiIbjUZtSXGE8ocNtvoAk7o3vnj+5MltQyzaERY9Za4q1mB1pQ6tKeasqoWkk4xEKZpcxeAXR+kVK6NRyKveoJ1UxMBA8PSgNa7F351//IyJgmfLpsce2wTvOtX+7OuCJ9Z57bWpa+ROFRARPJO1EikJ/Qeit1I10ijV68XfTRTZQGoBTnKGqIyJu6mwnQC5Xo3ZwRM7TDLyAm4Sz5XKUGGZ0vNEHZLBe3EL+pqRWSkZtLxVHBuxmUKXF4bAVkRhTkooxFj/yOTkcPesPjRaPKsN+602NLG+xqnqoabGKXfQogHP2skHdpfkXJ1VUgID1rH7ltmMfTHSSlVnS7PPO3SmbeJFms5jP0XXqq1+0Xo6HTqI4iB7h0yVKOrddPSkJiz1P5kUE3o2aQY6WSRyS83EQ5gt16C7gaU3uaintpDkFbbk3/+oRcv9XJoN2Ydux9nTL7qIO0AuSiUn5cnkUlhjHJ5KSXpMMpG0QjLLpF/nO9T3oAHkSmJL0bqe9yFVAVrAZ+n84kPu+kpVyR44l1Fl84uqDO3SvsOiFmWXZsRKKuII20lsVoSLUAYwWoTuzJTR2SMHDw6Pd2u7x0y24bHhUX5My20Tc4mh6nhgqj3msBQNLpSdnanZb8i+elWGxmLI37njobFbBp0Qnfa5OfJW06ZtL2/bKnhWUGBKOSQJ3O7B5hz+2io3lLxT1jtplDzuZaENczuZLMOtXBOta2hgMxhMCaAOJ5uFTuJurd1JU4UReyL60kcy841WbpjZ0L/hngLsK52TelFeMn5KWs9XPEixbARz04cxVGrRF9MeSe4lABi5Oon9LnUnDZGTdyEVLMXjRQ0uoMoBThxeQanIJsWFZK3bsXqXKJlF2jjWPTKL0TvCfink9TD14MhqDi2ZJh/Ffn4a9Wf3iSMzS9OjoWLNyKiW0l5Li+QIzyW8sEdNTX6zRlO8cNYdqsk1dFydk22cNQzu292xb88IwuSyrmbfXKCr5aNNE488OrGtOsJMGOpIuGRst8oRYwjnlBJ+bQOjkAaaIsBWLu+GFhVcIas6B1rWrg0GiaDYZzhGt8/gLlpWyTeCHl6oMmLWmYrEl//M6O/f/CCGpPIRkIhNZRE+k5UScHKKUdkZqJioNI2yyWkAZkuxbLRRwlN35hQQJ9angyJnuS3g8GWqouv4UJ6eFIigBavBPA2HYZ8HRU03q8paxjI26A98NUnFyFJJVmp6blbKjPbgkRMzSzPzocP7QuR59ka0er8DQmmqfWOiaaPfXFw06D/rBM9bOi7OzSk27jPsr3nomT2DS2cry1oDc95AS/RrtGJntm86Zo64qwQoVbVjvU4nnY7IaBnCQdyp+MkHAItiTK6pq6uIdg60NtABsNgNDRJzoyuzO6FZKzHWmGtF1VpPmKRSgg0gTtpwKOvBNQJn+vIBT7U3KJMiDWByirCXIpEX0ccrPR3PBnWBSja/iZ+pYorryfKrZOdN0VSS8AvWr08HTYWnglN17lkY6P5d7HwROsdCDPGKk4FZIrNwARnJCaBEkhzCR8rk+In5+aWlmZnJ7lD38PxkSDs2O+YIN84B6Maenr6Iowj7LPR01+x8qOP6dfsRpO3Z/emeD04NLpxdW9Y65/UGRPL22TcBhDJ6mzDDwsVJBsepJbWDJ8m9TO3IL+chhapoxVi7RQBav4jIr2sRWYAQH3S6zeyJ1fp8wZjrNsSdZm25IRP5Zr6SxiM4vlHBSRAVQCl+2PC9RQpPoxEc8XcSsYqZcjIkL2t2SdVZQ40o3i6WiUXyHTkocpbxxGqxy4suksgpEfUuUIduYZUu31BKRCbLcSylJHY9XZEkOMBUrUHyesDU9HUpo8PTM9MLSwsLCzPjo8Pz08ikBmdtZhj5RKK6byoRNmsy9i2ULR1+YNdYx/U7Ova9e2rPjgc6nnn34MLZwjLn3FRijmm+77OhQFNfD8UEpLSngR5ThLXKn7FO0YywHUNQ/Lf2pF6CmYcpifbWR+t9XcB49Gjr0UBzV0sU3X5Xa2crYsmYvRKm3kYQzM+mvsxVsW/Njfi5ip+X8igXRjLlKJHC0yLcO2N2o2KSsVihkjrYGJQVTJZewBP0OCDI4WtBS/DM4WC46StXKjhVuuO1SXgMAditKSplKKrKeGsId5fWQJk+8ThH3k+5BE9eKDdlcnphYXphhjM9PYx9jmDR4OmIeXsSG5sSCYdZU7Jv5uzS7AP7Z3fdufPdZ04pPF995gh4Vi56+9obexe98Y+OUa8OWUmtIR1O6/Rgo8n7FZOiOiInk/3/3aYCyly3xj06va3MAlh0QiVR34zUgtFVi9xy09q76EPBw8YNBR+FOHjKXxks1/wfTz6DoicY4NXgaRAaBNuBA83ANJ9jMi+i97TdsqABaGLhSO4U4Zer/F/hqXAlHQHlf3hKdC5AbJOdyVtlknpTGkzwhIgnsVOG0xZRL0hHgbcrYiYlsrCEcYLm/Pw0vyePjIZGuh0MIMJMM5oSfX6zwYBre+ZrduzbdWfuoAHWf+ene468271wlm3Nqb52tHaiD43XN03hmeUhm7lUrzN7WHal3hdDVSGTbTgYkP9ugZRbFVz2yoFOdsO6WBxjOO1jcoq1IkCu72R1pLW3UednwV1L0WwpEp2XrPTnrVF1zT/+LkaUBUPP5A08lX0aLWpjm+CmhhpEt13PsdK6vPUBchIw+VwOACe/FMsHP16To/AUNAkNYA2eBomaNik5EUVAxRcLKY3DJM1bXla9W9jnwpIHQLHRYcwTf58f7g6NMv8Oi7tzYjZNyWDkrOdEzY53Ou7cveeh5zqe+/GBPd3vngBPzxy0/RRCPG8cH03EHbbScpNVr6FUcbv8DNRFtqDUYRD1tf/iKYqwMjDlTrW6aH3rAFFT1BMwHo1oe0+3NsdbehdRozVxYZdDDSTLizOylXw7D3+XSgc0FZ4XEUCzyUbACZ4SPwEUVKmSbgHP1SzGZK8G1Bz2sTAfGdmBIHAmfZ1n2fiiuyHNq3dJwJQXVmhiyLI5KxlNsQFmqCV1/8Py1qGAiL0LkvJprsLTvSBnBqJ0fngYQ+0eHXfEqLASGxly9IWtGYLn0sEdu089d+enu5lY79n5wKmDp5bx1Gt1zJXn4oHm+JzPrAvNanVm0Ra5YuUxCiB0dSsUnlD1xFAFp0r/DYDNFLQs2rvY0tuKgx896kNKGe/phW9qDLCx1NhXvaXdrwthdJKgxZCS+y8KT2VI8piaJdm9hKpdkFRH9SwZ2KbikZBw7UrbzbNaoiF15HBUapLDI5Z5ES9IUSp4KkDF7oFTYqxSoBCVcXOrIuqsxE5FU2UTjJV9AqYyT0JICuS4Y0Zy0vDkNDYKsNpRes6Euam9+m+mzq6nzTIMwBwNghqMOISJDTq2QbAsq7TB0lbaqpXUrKvY4YBYS0eYfGRtkUGoDGsDDiWjqekI6QFkYXwF0rNRggcLyUgJceFA5g8QD2SJv8Hrft5WfTaYsPrS93rv5/6+n0UpCPuseuMWPBNzC0/XPjw5ifN7bjKRS6wqni6Or0rBk9maleeHSavzwELtnMj2xoTbSquZdaDzIzBKFxg2KC+efHlORrxRoi2jD7pH6Z8Yev58uDvUhdIeejh2P50KPR86pI7g9VtRnuiqGmSh9RMk6V3xdVCdkrRQTFGfmCMTAqoEUyST220QNybGqKCa7oo1TlJ6k15OrZKnzA8LTYp0vlRRerayshamGs+yPE8RTqIFlIld+nCdKiGN8lTvqBkFhFAroK159cHnIlLIPm9mfX8vs763ubmX3c9iyLDv6WiUdtFIOhI1GA4GXxzPTcYW41cF58lMfG4td5I7fUGVCFfbOzAR6nos0wvdA5zKZfbwzef3pp5HdwnIDAbr9etTIw+lqayAs4XhDwpPDJEAlva824MdCDLeOzyT6bGRB10Rl2+Q1LIkE6xsdzkMhPsnOSfCJNaIykRxBUxFPjHvmCMWux2zLpVN8pHE6ogg0sdhlTep90ozNzLEjiebf0lIIVUAJS4qrqysrKosLhGaCqemPhkthj5RrEkpZbNIKCPyGyyjnUnPxtj5m/SPCFB5pRomaSyKRmyiEGYzm5n1vszxftaLvvWmk5FANPjHH8Hx4Hizfev0hT8+Ofc0cTV2Eps7ScR/j/8aXzxtuXzdT6+Eq30wRLtdz+5Ol4sqTZ/NZTaHRj+buj/UZXO3Lbd5Bnrujw5RxcvbIrpFOAHwc/910nicbkOWtBecneTrQqFUOvKA1tKgzyVdTGIAPGwuDCkJHAwwt0i0KWYDngBlIZ+4pqqDwQB35SMZDCaOpEF81NKVtV68KUPaAFUi2igPBwrIJkFRRUV9VWlVabEOe6TxVNqTvQB4Qi9RnigwkvsIKDERXU/MfNZQfKJcIvMKojFEbXBBeAYjHuLQR32ZdXhacEJtSHUwkkY6o5x/Pp4ef7vGMdEyOHMz9uva1QVwxhMnvyeW4rnjFy9OrRxr4BpwUYjuGdtNh7ySaYSnOzV1ZrQ/7PK06acdNldXcpSDwLBLUtvEtH/Ue7nd1+tt52AQEs++G6Ds7CTFlEzhLvRwQFZYNW5ZPbSu2OQAC3DyZut03GVdnmdxgScuN3lPxZEKpxJVUhQgE2ISCZXV4pTfZBpWeOIkQUndfR0LnsW1lVW1lZXFdfKk0MgsHSpFpFOdD0KSRZLT8OzjM5ZdTc68TfHppjZVIyDlJ/E83r1UFExz9mqf25Jhz6/P7u9teriXtOzzSHolEOzfCRAcdJw7rfn+91+PsO8J2iFPYrmlmdzx5cunLovD4fH5Q6jQnmQkZHHo7W02v8eSGjszejectlgO/m7e8N6PTrkGbzEFQpKerX4GY3Sm/YOO3uudt250cGIxkaXw7I0kpQ9lqCvYL4JJ7pCeTXg6mEtDNlsJujkIVeFEPlmCk7hRxUcsyg0qd4cpopYBf2W3Pqxv+rDu+7prksi8KAIKJdno6koQrC1lu5/9tEoiA12JuroO0IJTE0+jW2TTLDDFESOyZS4R6yi5PuEpp+XwlFl12PdwWGKnjYO+vgwxp1/Ob7N4kZM0vnwymGa/v21wtrccx7+o254um1zKrc3kjk6OcrHE3q3OYza02+ObONyhfRGo+NF2R3gn2B/e+eyMxeid3Xi6ltBbBsydTt9t6u8c/PoBPH/5LBgeGh0dkWreSPfjoaHewdu3n489p2silBoe6wr0W/qoozkRTbPFaMdzbjjPm8bDZhV2JUtEqU7Z4Br8zWbKcdCUwy6U53++jhQ+Lz77Wkl+zqBO1ZaJtUUX61iKJ/JZVVlZL/Zd9KYYe+Xwy0nTwNNL+xgs2fNi8JrpYpqhcwKJ/4IXA1LFaOrR6N69WHT3J0lrMeIkPPeFp8fsCaUiUeRzJ5oOR/vfMrnbzw1euvb97FpZ7CghPOOJxEni+MWtYytPzuMboBsHnl07bjvVm/5I+M4PgZFzHd4Mqns6vtbnN3a6fQgmxx/eJqDvfMyBLn+qCTIaxXdWQj29vfAcep5ExGn2SQXGPRZCOhx5whJDjZwng10HgSwQFXAq91PxbCD7qGbjSPdQGGtU4biURPAnr5RfUzzlUEUlzPBs1a7F3xajPMFZVVqm48XCRqXv8zxVe76U87UStChmJrp5IrTgajzl+cqHTr74+GKRUXJbKtjP7Lm82FTG8m07ySgHyaVTwWAgGbAbLTcu+xuvfX+Q+HAOb37t6GgmET85IolHq4TZ7Z1oZ8STxpOddJtdv+y4G+j/6U549KHLwEDePE1+Flfz9TZXZwujORMdnDTXnno4OkqL9BiR5ehj2viILqfuDT8e5iKcV9m9Eh7nDVH3Yb7IaSEyomtW+MjtFoxwiSxFt5U9rNrm1TgCOFWSE0dVk7WyCniypKQh+Y3zyrx/kv+fSypqq8B5Bfnk8Wh+vPLi5aKIpzqAQS3licn5lwtzss5LRx7wWbCUR6wlu4rs+ja33S0h/mY2a/ZYLWS0nejPdDC60xWIhpNB/CdX+/6la62PZsrmthMz8dxiAp74S6do3C14ToRCNJRGd9Jmg8jn+E/f3gmMfO18q2Zjc3tt4WjTc6HXaKOPBm/AzwnA7Q/u7d4bXgmv9IQi7AMCVk4jG2XGgQ4fiTvx43G7HHZuwG422xuoUoBHbp5bzkeECqjaaeJ00zp/kfvHu5H8meZpa+oBTdv02oeKp/THYmUQ0PN1OpxXdAUlUnGW3nvjbGVVhbqw0oJaBk8d1K+17tjFyOm1Th3tJAzpgxD42jOWwJ/3pCt5v0iBJ5giBYXnb/O6UbpgTSYx7+jPgFVaAqhj229OLs/UTs4zrLO4CM6TBEmSPWmNsg4MhO6HdkORZNRsZJJkPPzNT3cjl7/2XKjZWl9ai09vZmb8+raOznYpAHOIIZFlhFGj9C6J/bvj0ZWesV/IgnJMABH8cPfw/Wh43Okmry7y4HCbqKHR+oWtwOkUlIUFEFncPk636v08T6+y+i8cbSw01kXHyz8t18FTuuSQcXgSGOjEe4UnHOB5pbzpynulirDa7+L88EEhhdERHFo+TM3qdG85Ix2c+dEFXl94sIW39VKRXuI0aV6Ep81ts1K+onrnce0goRGmgbzSvy+u18bW7PL3N2tmErntHDxja3vwzGy1OQlOQ/Tg7HAyopNeQLs5+M2dO5EzU9ZL8Ufrq/H40ydZ+7HJ2ME8xyAJDrQnvVH3YHdf0EVSXbimVNmn7j0gZk2FelJ/jN9F99tN8DQZHfjlREZKaRZcJH7JJ6UAdQhoPsHTCILGCyqdKfYBWOo2K9/T6ZQ10k75EltUVlyrgPKIqirPNpU3vfFeveKJxJEbFZ64/mhPRJMRRoMdm64y0jwqcGLXlUYuUPzvKeuKTMKT4Qeg2foQTKmtWjwIKG5UNBmAp9kpnpdt05rpm59+ZEosb8+vMe2IPTp12dyOPpd/J5SM7qYjqaQZBAa37U6bI3juA+tbbxmebC/En65m7afNy4PS0cAYx5f37g2NjVHG4xR7Bo5IKtGWjyIdGu5mmjnFcHF6vF+VI8HZbDA2CgGFs+DCw5JV4PmScrzFeSdzxi23IpmCk7+TmBRiVfDUlVzT4mxQoTgqSgUoq/bs2ffKy8vfOMuXcEE8cfLlkWC2xLhLGqlBZTq1gJ8fAs/80qmwV66jffCMi0xGJNpA2hJjyjgeNhUnxSrL6wwmAwGvDfvPt80MkTIU4XGS9l9mWmyh+ZjGdzrzGQ1xhdJRSe5F2lCfRrelDSXwwRlr89vzW4uxhenV7HzH2vIAJeCOwfbrt8cePBilLCoZvlGGxu4TS42RnmfEjOxn13DPAKcEwNOEeDQ3mAwX8CPVvoVnbZ6nLD7neZ6X7m8VOb7JTb+bdwNEZqqLqys4XFF94xOxMipm15XBs5SHUwHPK5++8frrr71Rq11YtCelJPz8C9IOJXUpDhwzojpR4dRFuQj9jXmcHB4sT+SqitUkAC6pKCtqBqcJn9VhB6ujjRvBQhGdwNMS8AbDHg+DZb52j8nhtNAGRLE0m9miMpWwD7R0+LDCDpvPj3GPRvjlMOGs9W06lsU9ksT+7OLcwtHq3sbxzHLv5529nGPOaWHd3VNT97q7QodDo6TlD0NjU0xEkZtnJPQxWVA5mZug3SRFLsIdjLEmneBEqIBQkEyAsiSQkSobr6L2AY18ZhRLVF1dfLWY2Ee9ELEVnq3sdm5dGpBF3IvPlr/2+svl7xXn9R/Kg+eHicdd0PokqEYZKZtc0sIDcLcWRkF0VEJpzOFHcC1ZZRUlwlPteMloO6Ah0bKRnhJteeg7NxgsHZcnGo2Y3GWzdDK7QEphahCetOq1eXt76V/GH0hH2ijhbGxmHk03OM+1+PTN+tklZvGX9g724sunt2jvdA1Qbeoe4F/fGpzgnFBGEpgf7WjvfvwAmD2SUHb5PWSPZWJY+eYNNSJwstdZvGsFVHP4dIW0haTKFHQdkqXga6ua13O/V5p4AgqpKE9MOhfC66wtrS8triiuLH/9lVfKm/KauU6rJ+ExNfLDkVGpM7/dTN/eRfE0tSyeihJkn9cKzdoKuV5tqTxreOodRjXrZAYmlt0pDl8zHRbE/oqnz9Ksd3a0THA0lrtGZwgHbQSk3kx2j1O8b/iCYYuFATssV/QPqstuCuAbls3l+U8ufN7iam5sPtieWVjbXj/ILswPYo78vlDP0IMuP510MtUMz3Zh7At131/ZDbF2urwup57CMHtN2g/wqSEgihCSQlPxVBx1BflEKAWTpgHyMBWcanAiok2vV+e1BNKHaaf3uKoenvV4nqWlVZVNr71eXqnhxJnVEpq4YOIpYM/xfVX7CcW2vOsuG0GHYEpno+oe0551bUWep8HuFkQWaecNh8MeRvONbX2IqIfEXd+ATW8yD3408eZbzfrGq63f9JudJACdftyBy6PYDjkP2xchexJZCUXdyBVnaRrnv5i0fmBtaJ3emI8Lz6Xj+PLxrU56S0M9j3u6BqApHG/cln+jyOq3pu+HiB6Su6mVXY/XbTJh02W0SFbju3XIQkkFsqTUVMES/Zv7RWJYKiMqX/IK/lSvZbNXV1dfbXqlLG8xeO0nZcWl9ZCs51Mlq4p9X1Uuxp6l03hKrp0QlkPV4IiY1shoEzy16BKeuLVcv14t4VmhPW/5s8iBBjxgnsTrRShVlOfQE/YzpCCNEFb3gNVocDIefBFVVnO1lT1s3kjEp7FR3nMPu1NRl4/GE+zWSmS3Jy39J8sbW8bpyfnl6377DG0A07H44pNfTxfms50yaT8xzDTtIMnNCRfnK5MFgeeAL7CzEg5GAwGiMovT8DdlLnVCoirKaHurOM+zYI7y0SIc1G1qL+LLAk/RaaXV1WUAbXq9jFUMW3jiKgEUnhpNfqNJi/MmDvmEpNTVyJnUUAI0Gez0ztVg5N5kl0t7OW1oUl4t4foi5pWIqPamoKl4HvTtbT6b3ZpdX2fua31v1ukx3rnz43c/9hNrBqO7QY/VYdwZ/Xr4x6/eNm5Vfv9r/Gg2d+2LteWN2YEPHj44TO1Ekl3JCL5qMH2YhKfJvjU7r39T/+h4/Wjt6WIuEYvlni3tx5/ud57uZV2+HkaaBv0DE34XAxBM4LINQkkXTWtmEfs2kfAG8mmqMKMd5pe3Rdy04qlgiiypfY1RxQPHCAlDfrEUvVL2MrIjGu6NV67KEpuBg19RW1pamhdOaLLIfRYeknL3+ZDTWE38yx96A4a9lctj2DFG+cYSrBGNtyLhLB6H+olqSwjP9Wz22eqWZdPi9JCiJ20HE1PDz9+GI+lAfyRodTkchw85hiY81rlYf+33k9xSbvKL2Jp9w9dyhtRvKtnVs5OOBP6IRENJpwOvcSuzsTzZvHq6d7SQ2F46isVzq2vPFo72bwxmrS7/IS2Q2XWXTwwbY3ATVAxTUa/B3NZnIR9mV7NBF8Sfxs6K5yLYKpTK5zNI8pIEUggKQ2WToM4NaYtvFra04KyHp2rgRsG9qhk2VKdGUwPCM9FwSjOUmsRpqMEK2U1scynegZNVklc0alKJuQWhKT/mfzxFPrf2nmTXnzzZ3LRYKHtkn2Wyfe5vfvzO9EMgGOS8kbDVajT2PGRie+q3W6uV136P55YWY6RB9Y985OcPk7jxFDmjgT+idD94+4x0i/Y9mr+41jcIz+mlVXg+XY3Bk56JrJeSEjNw/iyFQthynKWLhul01KunBGtqbjPb5TBIlL9UZKRhQ21kGLAEFJ8LYabiWSL4FAkF6l+cgktsDhpU5BOPhj8RTFBqqyCfEBHDrJ6PCjUpW1C3QGvS3FWjTgwmz9+qsnF5za3NeOZ5spRdL2z3iiLL3uqzZ09mZ+Fp2XrCWmccqf8nZjqiDBqG+73w7B4Z+euvkZFbS5VfTJ7MLOZik2uJ5QNfy62JZDAYTFKI5PCHIFOJSaJ9Djp5NB+b2TzeS6zllrYTsbmjWXg+hWcmY/P4mX31Z6WQbfUVeAZ91NLYXnYHTjy1DXgClKA975iAQ4Dmo8SCt0SSnrSGfF/dT3F9aSnIED5JD1/5VDM2aMvXXgag2uJV74APfgK8sN8LPIGZDwjgqQp2WHjsOzKad5WEufCUJXKvSbfmE+dxIp+WzCoQZ59sZjKWjSUGGDKzKDK76RsnmTtP+K7NYzQejjAQP/rbi1/rP8wlZpZyv8e3nz468H1+w2e1BYLJVCSMJFMOTctEKwLYZroU2zzdr5nRHyxTDD1aWngyt7h/vEcRILOfpUaV8Vghz2yOy0UmKdD/TaNBRlTtlHnVEV8y+6asjFKLgrOw35U3rwXnKE9dmTDWFiyVT1kvNJuarnx69qza0Xwtqk7DpwkkyAs84StP5B+yzvan7SqK477TaAw+TJ1hU3waoHTJeFjYUnAUZCJTZoyR+RAwoBh16pShQ6QCrtj5MyUmShpNaLbW0oamL1sTTZomkDamDW+W+kZfNTHb/gk/33vvisZjH34tnVs/nHvOueeeey6aCUY1oLUnSZhaD3OcDKGGXLtousyr3UQnnBI8fAOn4vlMhj5ZhUI1C0+ukslkggkmETX7xYmfVmdm4j2vnb98jZ7SN2L7h3bhWamvlHYT6ZeffoWivXNTrN0Znjjo/r78jra29pUTYKNdSibdeigSyi1VgpWdq6lCKp9inT8vnmyOUP98rbXMzz11OKB9Vlo0x3KZhVjzHdxYN9OPhn+XLilAYtoIz/sbOKFmBvIpAT1yn3ByF0Q98Nhg6OjyuVP3kUlGPwngTZ0DsSbrSyRRbftUtJQwGJ4mrnURhXFuzhe1y/w6nJZnfJ2GTkl4bmW3YshGLh4vE94T2lMGND+nkiDxvGZ5slxcqdTrm2vrPfkbr7AgPDpIMP/mm1PImFatshNsBJ1QM42dsm8gm2mNLO1WItu1EuUS1EtsVdHOvN1b1TcBT7zQucWDrT0+Th4gQpHlUn6O9JyxnGaWieJZnDzcJp5KqUGUFxanPoVHtyMZSPcdOQKphjQuHeHGMyJ1RT9RUGUASK0o9OSXKjev7TgEGuIp8wlQ4k7iI1nl26XokhcU6SIieivz994QPQf4pvmdVEytBnPr62n/y6ypkcMLvLsa8PkY7/ijrw3PFcOTDprr8fyNl14cDLCPgmjpzSmoqnAiXmbBZEzL53gd1vMzbDrdjUVKwbWdq9VC1cvFKOpJeVrh8o9phZ3cx/zq4elQKDJ9uMWcNvLYQb4IPG0KBFAIA92qpx3vHUSJuHR9A6e6fDFjy26X0p060nXk/wy5aLxAey1NZ5ntWhIPHSb6xK23IXaRTRXhiLKvelBQphhWnsj+7bwyz03KhzwyQKtB9JMSkVQyt0Et/UZPeev9l/oMz3l4tnS+fvnyr9c+vXwjeap96SbPjUT+xntjo/EeCtt/ZKzDk9Vi1jsGKTQ93k+SeUeyVU7HNwrhXDBc3KlSCZ3jpKEUs38B7Yemn5L+xYXW5lDL9OlmzUOwXaQeFP9I0DuFJArmXWbMqCdhNzl24BJN2jk9Xwl94dOgOiXt/A87iXvtriTWYZkJgMsFSPMloGyEEbxvl1jsP8EMBQSecn/8BnktTXU8D8aTuQpuqEqsBE8saK48s7VzUnsfB+E5ONLr+/2yxvvFd5Kn9i9H6qVSnZbilVz21WKqHI/3UF9K5E/fuTF4Dqxn/KPKV33xXn4rlZek/PlEJtpbzXv8NV6Sv2orc1xFhf4xMq4E8IsDh5ZDm8vj03gCOi4o4AOWTJI4yeIZn+FEOYkOl8UkbtePuHFhvpyMIjR5BBf3PZ4Opmyme+tu/aZMwOX8DaPeVIDLAfGuywToh40ZkCy1VkPhifDnJZanRg/jfd3zknzJFNWKSfoI45Ho9JT1a400HVh8t2+s0/cRZ5df+/X8h97+9tpSfXd3CZ4bua0zxWx6nQ1e/n6c0o9vTvWPxuFJqooYcuDkRDFT9qOL/I+pfU4kqtVyOukly+zR3UqQe1EPihdVCtS52tna1hI+MR5sJYrHtWtHi9TBGk/NCV2eTuJKtfiExrp43n9AP7VaQrbd8AQnwoUVh1E/RG7iheejtx9wPBGA4pcUwBtn18gSSzcR5/VIoUicZ0PDDU7u9xueG7lU1UNn8sWUhzuqMODL6Zl+JYoxh6uzM8d9vo8unv+VkzFfLbS31+tL6Cfx/EbOO7Pj0dGZbEofubrPz8GT9Px6gKUKX7glP3Hdt5n2D3rU8eDQhXXLj8/ze/6t9LpZtRp58eSMeM75IsstK6eHpg+RXUQ5Za9cRgNkGu9cOqBurilHK5bIAXgeaLrrgPwWODGeIMN+WobuSWzF80hXl4O83+B8nj9+FwKzh9nU9OQJuyAixyMRRQN1jycEHU5pt3gaoM7Ew9MrVgsFhjtY5d7FszxD+0K2QXYOLF7q7Dk68NGn5+kMe/FM4fF2GkSgn+wH36h4Z66WB+Jsn+o7OTXFGhr+vZMOuoERrOjBcH6iuLIUT/vC8RlOC/W28lRLpFBX9eXyrXeqnphKHB1S3/mNL7gcjp4eagvCEuv/rAs7DdAGTzt5d2Jwg1MirqTllOZwg9v4I3tlHgB6qguryvvw3MOpXwgwwckNnHc8qcp63Lwb4pahgLoX2GekMVnVqJdywhKx+rlGOO8Jp6gmYxV2I7GpTgeidpIsmv2yM3DU990PX//959mLrxYev5/jL0qKl1bWKoXrxRw93AP+kyenaOCAGT0e156nTGJgfbOlOFHcxLNvT6/kEulQKJ3hXCRN2vsJaxNls+2xnz4wY2ze+6blxOlIEPsZXG5TZOnmmNIJx1PGSWIch/2mBxxKbkYefVTf0PHs6u464jTU8tQ7DzzQ3d2FnGpop4yFcKKa0HTShmjh3mkl4oAauPxNVj/t7F0+SaZTOB3PjVJFbRyKqQKxPI3tc/H1RD91NBqRPZe+9PW0+H78hMN3z178kPFeg2cpsrwciW4Udqq5BO6I+iUqNedHCVrjHB5mePb25q8WV5ajle3l4OZAT+RgOE5vJyJTEWWaNKhNz5ofKWade2p8qFZrGz+h/b5YRhlPcO7xJPnb4HlzYe4AMBxLYD744N1AEk9CzyNd3d3dD3Qz8LlJeKvb8tT7gG6o5wE31AWSQvKH5c4tT2c0rd35l4I6nganG+2OJwLP0jbbkCse5q1A8yti+0Q8McJZiXMLnQMMRVx1b/y1Ty9e+/Ozz14t7CfBVNvdrUeWyGpWr1ZzsQQ8SRb5310UT/mjnoT0c8UrFqPTa7m15cjmQCIYfWxg7GXkJGW6U2METLQ49JsI1N/jW+g5PRSsnR4ab6ZGAJzWGblg3mYr93ha2MijeH1HUzCPsOYrxy3lfEDSzdCW6EmP3HhX5tO5IofzDob5MfY0cUdLyYEqKceiBiZ8T8yIwKiIpwa50UwJPPWPc9Dhqa7hu9uVZBX7SR/2SomTQQL9xJALnQz4hUsDPS2d33/26d9nz74inuPwLNXVjGijeqZYiVXSMOHgoflzx41+WgVNtERjOzthxvrucrC+GeJYpgH1xbR78F8cK9KXj1pKzLQCpku+oaZgcKhpfJol2Dv+w/NxrczA05onu6Bh9YS3LU35W/F0qiec3fYOQqOZ4smr5wSaz+y/G5rieWuDJzSfZFcTNKWg+ENw2ukZiJAGV5lpxLh5M9AFVDytbWe9OBnbLiFoaDUZo7W92gknVNQcGF2dpUPCwuzR2ddU3/7SGfEcgudabXy5HiqlrheTdIDII/SDhszgiNqPs8sxnVkJx1LVlemVjVCNRnrbkXCwNzuRV0G/xjjKSU0fJlSJAm27Og1P9HPZ1LBoookyKN+BwFO68IJb2CQPIrRmuu7s5u2PgpOj8kULbkYzZSmljAIpuvqhEKPESjyRaXLq+bCOxTbblQ3Pu/iFwZObcCIgMiKkdtnEMGzYTPNk7br+VNstheRGBZ6xqgnnOckXyc148FxcXPy4NzA7d3ThpcskmM6cebXa3j60zHivqblTKXW1mKzEsLz5PEUPM8TnAcIleKYTiWg4Vq3WZT9ptrcSCjL0szvopvaSqsSUWbt2pI9QoKMDq083TU9rQZts2G2KpFmmkH66kAkjBU+Fy/pmjbgFkW46L6TBTF2CRDz1xE1cYUo9DddcMdptpANMVPMY8tXkZMdw8+QwXYg6nlR5l9mIAE8jTB8cTueUnLVx4mbu5lOqzOu4RaPc6GchFoMnJhT/RMA0E5hdnXpt7OTi3JeXXle+jtrNwk2e47V6fTt/tcouuWwxX8yrjQZdiXt6Q2hoIh2PR8OEDEvT0UqJWrToGg0jCKBMWxg+nR3sNyX92lbDLjZWENFNUyTQNCSYhpnjaeMi8bTJEOZ0Dqe4GEd0992KK7vF8x6IChxA732gC768NlpJqMR/jRQeJg/VPDb89gcffPDTG1cuSCYnL9CJqK3N1i9pOV+QnDSKapyT3BNpqmJ+68gsT4SUXQWc6GdpO5fjeLpBeH782kt9q988tfD6+cvMNp+54e13PE8vL0V3q1cLlY0c03GGu4qcOO+BPb5WP1fCJJPqtZWN7eiSeNbguTPmx2xmCUFH/QEKbymmGRmhzOqJw7TjQzCeL8hcuayREu1u4sMqul6Y7+R4ghOBJp4ant2wk1gXjvCa2z333ANgLlFNx9Ol5BnqhO8CeuUN5MqFKxcmL1yAZ0eHMneu4LaxFOBwuvz/nsi8GwU101WA3pIvxHI5Zu3VwkYOrCSYSkw/cRQjc4skiAPfzH576bdr5z/75JV3bnjt+CN4BrGfK7uKl3K5zNZWCoWj6p6DvSnoM0dipKNRz0tFp8mTRtkYAs/gSr7oZ6kZmUkHjtvdlQMjgRbyc0+Y6nMVWNnaJBdeGqiyV+IpjsBGeFc+36SL5IjQTwY7VR7CCTWhBSPCky70SsNert2tZ+KJDNBjXw1/8MGFQ29cmZy8cqH5wuTwsOoUVT56wuaUGktVLmIyD44k4i70tvyaeO5kCTvhiR3NxQS2Qs87ujVzSBJHDQZoZ3P4yz/+PvvJ7++9ovG+XKutGZ71UPWqV6rEkltZeKqaTIO3ZY0zq4i4Ikt+L7WEP9plq8rSWm36saVUfkZ9EzjINt6ps8TVYTbQQ9UAPE0H/Zs8pZ6EJs7qm2oO9k83JoCW5176TbPI54C2j/sD2Er00QLlZqlSnySjiisST0znHk9pKCzRTTPq4an65VaNdzetMAHqXU1O/s8TcTytfk70eSRExLOSE1fu8PSYweCPVgdG5uaeOvrXWU6Wev+tM47nGuO9zni/7u1Wkl6W2bnpkU/tEzrHjDPuW48sZTMzrdPh3PZ0rba0yT6dYLaYGcFwJnRgqDarqwEAa8PqtHNiaAig6jVjed5qmZmsjXU/LwDZKaww25llQ7oMQiHt4lKyb98+xxO08ER1FU4Z82nmAfCEADyH326efAOkV+CJR+qYbKWrCg3IVLkDR9ZEwel4GjXds5t7otDD7k+8ZeJlz1/VjLMgkLEkkmNPbBnHvji7sLDK2WizU6+zkfqtt6772x+vOZ5L4d3C9UKJz2fzKXgSL1EZAaQ1ppyhXvSzd/0x6WcwCE9OEHrMnxoN2P0majPTywPFc/TVwlq1NZkuhuKpENMqgAmI4ImJgic4nU4oom7wtNOh55z1NMYSrCC88859FiZk7wToPn5k9dMuGYET9UQ4Fhuewwz1DoX0T04CdpgtCSYefdimSpr2eJpFQcRluZ3oh/gjkqfw9HtZzd09MiEeND1y6JztGeicXV24dGlh7pvFxXc/ZjP8yfd2Mi80Md/cXGO8R6Js4JR+xug1xExnlIJ35vwcIdA7sB5qORTJHGppXn5iO8R4j6zAczqzRdJzdJRjGVWtdtRHHfdRzCg8m++AJwWv3I3dtzxN00ieoUfIrIEusNxsRsICVbQu/w3De/c1xrfE8DRXYiueTj0VtjLVwb0jIENHr3R00BPv2MO38WqYqOmOu4Sb6ScaynvWhhqiDe9u8p8AtZkF59+1X+bnj8dGaVmZShVyMYa9JFPm8PPRwAINFS9xWtq5c/PvMvSP92XS40PTwVpoN9LG6V8+r1jYLZGB5twGBjvxkuEZbtkmK3Ko9XjTE23Nh7dD6GckOk518Ew2Qw6ZxsUM94PNB3WsOguapufCQ7YRl3DaYMmJSb5D73YSoG4hydRxOZyopny5wYnYBwuRCwSUkn2gbagnNFHO+8UJXtyOdTQPo6aoJxaVuRI4VUkmg3Cb9POYuj0ZW+qINnjavCdANdiV46Y++pZfPu8fTZdJpVdjjmesTNsRGsTMzs0evclzfn5+0B9IsPoYXqF/CDF6NJwremubu6F42ZtBNZk4wjMcpp4u7ttsPThyX9uzzdFdXNF0fZPNaW0zW2kdBZNZjw/42DmuzhvUp7OR4F88WTnci5cd0H/IOteftqswjvNO4z3Ga5iK4nVcXuDG5oIG0HhDvLzQmDgSkcUl9ZKBTaOlluoMjdRt/KRKrRZTRWIsNsO2MYbY2lCDxhm1Jpqti0jnC9/o3+Dne85pQX3a/nqh27IPz+085znnqC+B9g4zLCEObZucdMHHJJ4NfA4md2vqEiBDXVNK8LTGLpwSGXwnKHeCcWfjE9ST7wAU2XHZNZ2d98LTTHByk83bX+5233mz5pe1U27LW5PZUnjoDvQTlHhQLpw61Wd4xlDRWMAXjkZ92bWjf738SOy+oUHOn+vpvpFFvfOfTjONxC46336r6hshaXAvPFlOs/f1m24a3HXZ1a1XTZMq/Xp4dgqebyzT+bx7sYtzBYlbN7Rdi6ivhXL42Q9e3+Rp40/jwf/+igZPN28unJIHGDvuMiQdT4fP6qaQOmPnPchVpyNVNcNM8bTmjvt8DUs/F57yl07gKeoCipbedts1Fwmk7eI1Jq+HE1ve17Im7I39Ko9OZOtDtC4tM7OjOxcOQ2cZTGyGc3mjfogSlmZyK8UalY/Hnn2UMgazaCwcPtg3SzPi9Ecc/8tAHAfK+IjzVdmHcLqt/cbBy885u7/769kD2oz0AHuSHjw4wLYz194wNcA5wSRLpsWTsRFrH+kPuLDB0+C0PBEcJ8EH2yIubZs3l+yymgktPSGO55a181KU9Q05T3DC8zrVPOUed3a+pq0FdbkGZojjySge5YSnrY0KKiJy4LThaDtP24Qqnlo528KRA/lafYxjbJaXlxWOvvrqU1qzaHQLhfyBaEgwE4lcMpnz2Pg9nq6n64UzE28dXQ3vu/3bAc6t0sZEg0O039t49M7hH7+Z7mptj9563TX9N309+/irv75yTNnQtx/R68tvcAB7H9SiiS6zBf+N/egnPBGzceS/kztZp3o+iEfnOJ7QNBXNy8kxlWUaa7ZhCKDnWQuXy3RGz1WDzku3eAqTcnlkpwT9cyVQlZXxlw6gSZXO5qWru5xlGyGFc4unbVfpp5ukjSmHfS3Z/Fo+XRu/Qzz7MHZ4Ug0ZQuEC/lDsPo6wQzlzyVwiUVxYWMghiXQ6PLb61OQdj7CY8KprIbpbe5wx4aR86ePZb77Z29XfHrj10rM7b5x+nd0eX5kSz0/mu3WcMrtmUVEy2+2bc781/Xbh9bc8iAinJamrTectT+ydJ/EUTTNvsUvpptVCqCLW3s87D6KWJyDdx6qQSKVdWQmaCjzglHLCT4FdYnneRlSXTuJmEVuig6cSV8fREeU1PG3PudbgU+Dpa8mXstlqiR2SaUc2if3yV28sP6L9MzlU0n9fKBAI9SZXFuaSSaOk6+vHE5teMnncq42OHmSdU5vlqVk4WE1P75398fvpttb2wOUXX9Tf/vorD79qefZ/OsCwo3tvFwOoLm1y3KYNZZlt72y91/JEHE9ACp9Cp3TU1cHFk7octQ9oGp8JQG5AdTzBiQinU1w3OjLDd3hKO23kPleJ59NPg9PZOUxRUnF2Nq/ysaM5PDwsoCobNo0Hc7JcbVsezWO92hD3kZZsaa2QzY+PPgTPZYAeXGYl5z19KJwviv8MBaL+mZw2813hlkNNE+ub3qmFU8cznFDVw/KY+Xl+LzTOM1/JioX5rh8X329ra+0M7znvIv6ZKfE8RmHzwPL8Tf33tr9Oxxdq3KuT3ghIWsnG7Kzs3QF1UQidMA3petfoDFRhTmmSaJoCiLVmyxORuV8AT4HUjy1QfkqqBE6nnlBCQR1P0VRNXmMguUvxNAMiQhLkuQ2fM8wfGr4FoC6FV5pkqjV26p5uXoNzYPBOlmq0rGWzhSwyqhWcRCXCNMeG3BmIRqP+EN6TcKRoFOGBzHnJyMx6IrkSiTB+GiXyq44ZJezHYvcF2VUdx/vt7r0dT+6M7rhAPNsfPjD1x6/Ujw7c2UOnb/ve3do7j7zWbFXGSFltLXc92NBPredx/QFqhlV9HpCK6kbQTsydMaUNQbC0PK0L5Q08zz+fdwifOLFTRnKeoNHICIC4TUZGr0FTxm6W1ri4zw2Yznk3fOcwcp202xmODJ6ApSS+88mXPrxhLuePB0ffXJ1sya7ptgZPNscwO95rteEdGrzP9EYCAT8n4EYiABBPjD6yMhPpiCC9obExll+O0pLDlwMxf4Cj232+WjCI580dCbbef9uTN1zVenX/1BSD1P5jfbvFs62nl2kU/YXqm2UXBVXDDU8DkAU9jW4Ws42xuNpSp67w1EwlpCwsQMLTIuMT3ptgxFuJG8ArV9oDTgQuxilqHKQE6W5yd94CUPgEFKQIJK04rNfxJ424j103Ffopnnc/+fzIQjLhpWpjhWxLqVBo8rxTPMHJSk7xRInAFAsrxM9EVpBcDhKWJxo7MeoLj48Fo+hygC+G/PyZeAqmYXS7nhuJdNDTz7r+X9kN5ebuvh78Jx3pPYuDcrv0lHfjPc3it7uudzwlZlZGOI03bbYS67pViBctcDVsvVlXusSGcyvumSEpOCX4QfE08agTnp2d5O6SHdLFLaaW2vAWT4TfhnEX3E2E32HMnY6Szteefn5kLpkrevFaPdtShSc462NsJYY8pDtzF6DR6GgGe6dRmY5XXGeOOB+xgnrNxJh05yaeAYQTkcO+aCZulDUaSKV84Rjr8Hs62mYP9x94uPtgD51euJmexUVtLkeydIN4apvIC2+5QtEcfi4imXeajrtMOby0EpZWLE8EcFi4M2jU1lHWe0PxfgpKEgZGjqebgXOtIOLJkMjmRuIHOSv22Zo3dwISNK1+wxScwm4zefG8+/n3UE9wptMl9HPN8dTsjtnwjp4N3z6fLxqL5CIhlO7NQxxgfCZYq3FsWwJVRSIdIT8d4WfQzqAPngAMG57hQDwajrIFeCyTSsejdDNqWei8Fu3hP1tZ7kZ5dH5xaJANxrWlPuEIe4cnBm59psvl3WzXhWpJegCB5P94XsLD8oSZ8QI8GjypHzdxNsxd2umiuGpLZJ5EHmhagAKHRxBP0bQ87cfDjqd8uHhS4N5hZo20hoYZkznMPZMuleoF/KcMvl7n4GBz9B+Tjw8dpG8eBY0kV2IzoX1vrj7x1NsvvLWxcaZQqAdNcSTWSyEvuLoUDEZBiG6S+WPvMnwJB+Zl4h63eCw2CNB9g7RCPTJwYyuLUOY/+Wjgk08XOUDv2DFVbsk24En8FlHDVCid6en+b56yd4nNhxqR3cZ7nu3V8iQREE5oumiEue/Y3gui0L6FUxwbXnJYr6SLyL/0E5zwpKdWOFVCZgHYyMIcx5d4lWo+ny0Q363B08GJpfcBlK7MsUkfA/dcbqG3NzQ+NsExCft/4tzOn38/cWg/Oyq+OxYIRUeXXjyE80QbxRON9HOVqsa8TCrjpYrpOC+i0ft2R4fAGn5miE5ugvri4keff/41+0a80619FLSV8WXopxOAbrFUzMXet/E0fQsNoKLpxH7QfMN3sHGACmYTJ2wMTwz+XJvDG/UEpxOwXckDlI6nAcrrJk87zYxAU5kn7csfghP1BGcWoC0wXUNFC2fgeYeOWOPqm3w3GAoVk8mFlUiIw/dXV5cKa2c2Thw9ffro/kNLk0sTnJHyxHMfvH1oEr8grfQTkIQTiaObmUwmFedFKpXCB8TjOJfw0fGBv7XXzjyTVO//OM1BY2a3SHViXEY7kBUHdIeE/ypgt/HkSrvCFk5n7U4jrcIirhYPTgSSiGjCU+5TIpR6bho7GtiEZj3Dlep5oAVFP7myYe3C6Xi6MRax/b0/55LH1zPwFNCWbOF0YW1jgzH5hGZ9H+LokHGfLxj2Z+K5YnJlZSboD/kmVwv1WpZHnY3AOLB8iQawoy8+9yIbVgSUouI7NdCXdgbi6CY8PUMznkqH9VRKZybGZzqYDenqYp6KHh+OwWttn2L5G7k0+mlp8rA5s+Vpa0oAJd4Ipxq5t9H8F0/ziT4EqMIRSrlnG058oInuBqhTTP4FsdSPHM5LnTYjGu3L4rc480o6bkZYKqjgf8k9cZ6nhLNcLeXJk1oIR6cL4klj0WgfM+T0blPxjMb8XjGT7OgI+aKheNzzikXPy8Tj2WylZDxu/sSJjXwhW8n4kRCpqt8/42cQgN+NpmTpKe7xODDT6XSGE10nR2MDAxq4Mx89zf4OzCkhphHjLHhqeZAdCImngUn1+LqzHrTxXTxd8imczSpnEygfOYGnUiTx3GPQoGiWpyFB2Uh1d9k5nhHZppd7cA+Er2ZHo9TRcHY8hxs85Td2ksA+/d4IPBNeuVQqCWgenoUNHQG+xKKCCRq2Hp0YZ3WWLwqVRDzZEQpNhEPFVBqgHkrnVUqlzXXPW69UK5lyKVuqeiFcp4D6Q73+MPEIBxrni/EUGA1WJRL1eHw83BPr6UI4p+Vje4boq0o+VZAXyC2eLgs8i9lgpooB7XCKJ6hcManJEyt3hSSJMfdG++c2DtJBh0JFOJ4VZyRNI7c89bgUgmZQJvXlR3y4Rz939t6sABDaF4jtaCcCz3ypJbtxkkONNwpLSyy4Znnrd+8Gxycnxmu1eCa3PjdXLEIElEXyTzlEL5/1Th0/fipxfC5Z3VgDJ65TOJXm+xX7wxSaSEPTEhQU0SsvNRrgW5p1n539+vCxG6fgyXJdrN0tOhBL7uLJUE7lCHhe2eCpEh2XXZbndnqulNz8QDxxnCjYv3kiBgVVOBfVt9HUEzjlISSi6dqcWIFjeDqTF2BCpZohKACMzEGTo94MzjxSYnz088mTJ04Wziz9tH8/O5o+9db46MRkUMoV907lisUiWJT+JHOYfTxTLa0njyeSOpGrXMiXE7FoNBYyI9KOIyEfom3ehmTlqVodM+dVHZ7F1Lh/5ciRazsOd3M20zsEIvYw6m9lWYxwusW6gkl1zlS9FeFNjczauybeeMLYDc+tmQ1ET81PcJ+2VVE8xQAmzvPBU6rPAN3GdEdzm7kjDZ7mSRrKd1Dahhs2PFn5DU/GRQsryWIcO81XKw2e+bWfT544cXLjzNKXP3zGPsi/HBobYzykGF3eJK1ar1YqlXK6vJlYL5czlc2Kt55IcE/ghEvlzXXSdsKRBkwdR3qx9vA+rd1gqFAv1eu1WqmWTo/iQShVzVw7ctNV9C8cbvuYRX1mo22zq4LpoCMKGZiIW7wloPzAjo92ISidG7o36SFN3eQTNyOnsdH9twITsTCtrdtUHXt3YYhw06DYAGpjmGXqvCg4HU8XjvQ3aBqPYebCXM7LbGLopWrVxfc16efJ06d/+42D8r/77ju2QOL4Q18xk6pugi6TKGU8/MNmZt0rlyvc17njSuG7WQVu2vGMwBNv62evINZu1Gr1OnWWUj2brWcnGLGGqUtHuj+Ep9kUSpvvdNpdFbQgHYhcEWvxABVPuVDmNuFpkk4RbbYlUffcBtKJUVWXPjV5OqIqvQniVs1I/tDg1F3fNGht5dnqqdwGV/4qK9Z7qr6vTojnR0YWFjDgjFHNbHbNxveN36F5+uRPP8Hzif3aZuro6pjPI2RVgLgJRfSzsrmZ2axU+F2UM9WyAJe9xGa54nnpWioW0plsEXj2Mt73DwywMTSBHaQlHqPjvhg1ql6QX9t9BJw62fWl9kZHS3NBoS6AbU5rc9euAE49Ta8CT66iCU/E4rRio1Mzx9+lfEdpp0RXOyrn2b34j607treqkVlK6pqaFdiksQ3kw83ZPKzdxKJisVKtEt0hanhmxRMN/e23z3746bsX9nPgwf4vxkbDJPxQ/Iex84CJu4rjOHFVrXtgFLVWUzWAGre44khQMa44IxAZCVG0yBLLkGCsYiCnYXqhgCKuOJATNVIjBG0kiolxET1MFE0McVSordTt5/t+7/5/Duev3PVAOfTD7/32ey+KOg/JOAB1FqXki7OzbagnbCdZ/OJZ2ipWTfBcTZm4peU4DmEaOy46gh+SGW1uPeKwCKID+yKrI8frYhI32WKnafuSsZrBejhd9b1hxPN0AwtSUV8jDnjyoCjv2YbRExVkS4mSBJoAEUsL05fzlHbmgFBCiABOxMzp6Uk8ZT1VBYmN4KnbwKkPiFJG9v7oHfF8gZP5i3RfDOH6QOemzpmBySix56dvOJ6KlmY3DTQTDBGHQhSZmG9rrCulQCqiR0So4m3u2QzTsehIbKStuoEkayTWH8k4TrU56h+RCMpJ1VN70OBpg6o2qwRN4bSrWc3fu/3V2i98Ihz3gCeWEz30PNXYkFCTp4gMTIvkYYnknOi1U7KCPxKtcVPNpEDJVroZUoBKTj4RrghMtfj5MJziKZwsd5wRTbU2VAzT6aIl55BS3pc/gufHH+ONujlJfrS8iw3DjQOdz8zMjLS0PNP52UsD0s3JydYW3E2pi9IH9EABZ/vqLiylwwTNpkikA6CxI5pacFbR2Fh1C+oa4wao4ykiH3bMGp21C1ZOWtFx7fAEpx/1tD1mJrbswwMp1DEiWt/THNEespJJPNXiUI9DclAOPHhAw0hBkchI7lwsNDSvxQ9PwfE0+YJYesk5CLG3QTlPlBe0CN/ebYWyAXCy3Dvkk8mM4Dk7OzuBQxofh+eL4OSa6Hdee9cdIEcIukG73ajOOZ4jYJ3pwzNNtrU2qDAHTnWN+2QhOwkrif2r4RmL9A8OxkZiGNLTRkZo2I2NNa3GVg6WldFLZZEfLZ7H+FsJZD41pBrsOfDTiQ4oAtCAJ3GSuplmOaWIfpAGnpDcC+3klQEl8iQp8mI8UU4FCkq+9W6iqEco0lbhlCvig9FHF5TlWLUPtmGBCm9mkafG8nr7h4ejbeQ2+JJZVi7qafWQdz79BJ4fvPYCQ4l5WFDccWUhKWdF3cBYAzkkUSSWcGxytqamtBnbCdChT2egSZQ+1iie5E7z1E6y8qF5RJPK90T/LHlKnFDUlvKj1MfUde3uKH1di+13EK/wA50ep4BKVwMFpSRvvQwBZU0DDpyml0bT87SuZo6VOg0nAk/UXzz3lbkk+gl5KjQVTY9TQMEZdp18mQVLfLBxd7NKWuuZ2SUlmE+UBjWjUiePDU/5I3iy2N+B58evQZP4c5p7ETjZprSikNJmc0tr69BM3/gXA+h1Y2tjQ1sfprNz6L3immZl+c0VxRWNbWOd2/r6+8cuK+nV/cGx2GmxkagMJ7oJT+gdlUVjQ9dnHGOf2+U4fmeWbbcGZ6ieNh8vgadYOvPoeSLebHqc4mn+STxDxdOatuRVPB1Og7nEchpP0kvRlASzUBYqqPDngy5C11RWuy12ZZokR6jopK7CnsBn45Dk31/87PMPWPDvvvAC6snVJnnlnE5L3b2wmOTxVI7cpWZcXz8wUFrY2kz9uI8acWNxbjv15A0VNdUVX8x0jo2MvfX0Uw/feGXKzieX9MR758idKONn9JeVlCFuAzRHcurAA5jylObOMLQjPW2bsyMpnraDN8CpFhw0feJj6xwJeUpLvXsXz1M8z7BIh8gHoWIE50YwabH7wpJySjdKyg/xbyaiMqUJoLa/Jkt9UWjmi2ecVDEK0qhf729QT37js3c++OCDz99+++2Xq7rvXyuPxPkALHgCxxp6kZfUVzxQtOGlJyrrS5vraBFXNzdWdHVVMCdWTC25cXxb5xibNp985Js3b9hxx51zFlbmbJ+LD7fETmuKlLEsEM6Op/3F5nIdhQhPPtdBVXLvgBTPVOOJwNNyz6Agf4rPffzIghlMJOBpOO1fkjYFItVLiHJG/pnxNFtgS16fh6O5OXg+6bsJ73cKfonfkeF0PDNlO/OROcdzUiqqx6wKIm+kTAx9++334tnNQWhV5Xk6TrJ7VF2NGvLwMwnOr/vq3gcaGxqfqLu/tKvxiVfrSuuLcknaSxuLm9u/rHhxfKL1pMeee/6VG6NZOTvsvOPOKTts//HHeDwe6civLVBv+pjzsrI4LZKAM4tNPtn0VzN1NcaxxtOfq+R5+pN9kngmupbIATSE4elxCqa8Eg9ZApdqnuhZqUoX1DV5O2OG+XRhuwWWBp2qoOmmtJPVbj+AD5uUyMlRN0+L3XZ/aeKevMj0kxU/OUxQHwftcHQeJU0Zn/j+Wy34l1+enubI8nXruNqlqr2QU2suJBHXrtiLvqMgit+hu+60tjxv7XQpdrP5pc6XxvmllFafcRx9ty9e7D1y8YeNW7aA00lvGbOABUcfc3SBZlRXcewbk6uZmfDUEIOF88bTZo8R0dRaB4Cf/Ap4+tKcrXOJ/78OtUk4aXAgoQH1nTTZTseTknsyT4PqlNNcETx3222v3fZyeu9sqHj60j59ezl25hC4rRme/XPxyeFYT7SnoyM6O7sJSZkYf+fzDz559+23u7vXFq2bLspbmzdd1U6To/BCJpguYctARX0FIVEj3r2+FKT1nDPfzvFJrz7zxtDA/NaJmZnWhgsIQt/4dmHLT7/88suWnC3bf/j5B2RhYX127ZrBNQWsdSfpfMBTh0XT5rD0SDw1ourF1NN4+oMA1MlAfF4k9TENCmFKbM5TqzPEGYhtP4adVNV4+kKShwrOkxV5ep4eqLPZOHjU03Bq2t4NLzCBhMCTJd8R03gX8eQsCWXKxATV+U/fffeForXriqbXcVXW9P3To4V1Z59dd2ZpK6n4+a20gKqrG09rqO8qpf4+OpV79dW33vbAS9uGtm3duvjj4u+/L27dtm3jqh/32mmPLT//vP0nUP6yZcuWn35aWCjRLpTBNDoDqKe7R89dV4b4K7a0jXAZz2C9B5s3nLsNR5QCCXHKwxvPHPQzCIa88gXqiX8DJ0G7uCeIwpL1Dk4rtOyx20477bTbTrvttseeSrj22//EfS8z7VSLw9STADvWPzc3JyuKnvbn98edCZ1vS3nmmTde+uyT1/KKuLFtrbtsrHtd0Wix+sIMJFxwQStd9brSmtmBWE+djGrd6AvE/XfdmgfPrb0LC6L3M7JlcftOO27c+OPWhe3bt3hZWCiDZn5tGqscfhdn+uE1keQlVHWmyj67JvNEgvXOwQrCKVZOknBaYpTAqTKJOMEzST/h5asaEvcFkiDCdJPT3d54Be5SfpkT8RTSvfY0B3+gN55W81TRU9Kf3+sEpLykAy8NnZxP6ex76aVPP3+36OU777hz3Z33PnrCvdPTee2FdcCDHiPfDa1qEE22xePVLZSOmXrq4oz/K5jV2bp1YeHXX3/+RfLDD7//sHG3nNPTS9K3//TTT7/+uuWn7dvRT35ibQGjGKjnqoszs2wWENHfaoCnptrmHhulE0+AGk07qobMyGhaMQmKoYTqaf5fheSQpwylBMOIT4GpF6eKaDJCIgRJP4BvMB3NHXbYAaBSUAor6j25UMni+DLsJh/Gs6x3MH8wH6rO1U/Cc2acZvG3d9z/8p1nXbNu3fS6Q+4k59yA8wEo8RCt9ZEms7hxdTmGqxsqK5sbL72A38M21vvWn3/6+ddff11c/P2PnzbOrZ+fT993+4988qtgluDeWfDZLHYtbxa65ymg/hS6VNuCJqICqnA+cO5Kn1VZ0mr3PGH4NzjhCU4ggRMJcbow3e1614Sy5hsEE/bonTBqQSNSTL0xMI0mAk8lCAfuq/hVVRBqSuIp784HPAkHC1h/ZXC1WJT8M+WL8TcoKa/tnr7/mhuvL8qbfnRt1XRuvVrGFeJJjQjdxothfYd7+Jbhti8rqpsvOW6sbZt4/rjQu3Vx8bfPF7ctLixs7Y3G168fXvxtcdvcqhL2mx19NLugFSM5a3lxuu3nMQUVTjkk7V05PDwLDPHG0zXbKS1Zvy2ZJ3oU8mTZH/APPBEAIjkgDXvNfsBRr8Jci/eEpfHkL89zX3w7Ip6aaM5WaoRC8ihBCAALLFnSxDGZUgp9dUrLrxZ1d3OT3FRR96NVRVVdWu5fFM701dRQcuuI5HegmPF4T7wjHh/eNFHTyomrp/b1zW6bH473jFHHe/+liSyZ4970lelz8+ObemFpQuR+Xpp4gpH17kZWQ56yn/vsja4mjqrDdoa7tdQ0Mp4oaJBkIgHQUD2NJ0Adw2U4pZAGMBzC9T1Svlsi/+NXOg+J8ZRzt1kc542cf4efk5Js8CI8S2dj0ShpUsr4jNpIXz7Qvfbq2+6ampo+pGrqgVcLK+hWfPlFX2ureutAG+6BJ4MQKOl8W1s1J9ZztPrM+5NRZIzeZ9umWprFwx3cdl+C9A6yf484My37PAWcmaafWQme6CgMl/B0pRHxDEN5YiV4MtltAAKcYDQBgIDKIVkojzcynmH+43CKoUnYDU0scuE0nglxKA3oXvBUsun2Iriqp/H0AsfMTMeTRqd4tlEbQT+/GB96sbhr+ubbr75oqqvqkKLy3FepMA3VP1FPJ4PWUHXzJhIqePbORec6hnFjlJ1aaXxWTAyDc/MIRbrjmo9oamyORAYxMPzA2sGCzLQC/UhtLMUdESLZzgk/3yagIrqrc5xQDXkaTjvVj03BwaCCaBpFHkGICErRBCcwc5JwouHC6btNHrvpuVENcO4V6CZ/9OzEefiDDnRJqusQQ5P1XiKCEv5SLp/Nh/Szw3UpU1jYQ0Pj9d0vd21oz63Ku/9R0s2u4qmiK8696Dau42A2u6aOehRdpPn5OKLsv6enp2EsqvmG4R7N1q/efOolZxxxwRmHDZZgX9j8XICstx+FfroNe6zwdGbThc/OkgGoPucXL56Sy+FpOEmLFGG7Qp1AOmymlaGYBRVqs4cnG04jyjN19RO11kXc1BgxRfc0HUvEaCaLV9D9LNtc4XCiGFpu+FebxuVJCprGHlo8/AginnQivygsIugcbc9be+8t9xfljdaNfnXbtd99d86Zbz29+bT6yvfp4KkhOjm/aZJyyjDJFs5JZHFR8VjH6ozzH7/vvocOw/vw+4NlLft11/sR9czsBM8s+CEEHuvdWTLiybkroXcnVrKlbmPyFhRaBUTa6Xna2gx42jKGJzgNpuGEpoyFVZ5NTEHtc9EMLEeIM5nnHtob4nlqYDSLNASuiOOpv2XX8PJoqAvzU0rrvgBocdGda0dzc++/5c47752eyi2++sPvODnlnLtuevaChicKKe3Rap8Yn5+fncdIRDvmXPaKg+oRTzZqHPcYV/jT0ajVckiTYsJT5ltrI0s80UceNt6WxUYAXmvKzQb/rM2pbrFwItoSY5M1ppcBUKPJU6CgCn6sRwzPUOj9uN2I3kB6nN4DmW7q3WSOQ+1MFniqBCieicHRXW3YEbRCmiWdBSc8FdE7ns2l8Hyj8oE77y/PK+KW8Ft2uZcLstq/u/quuy669Kavnz+3urC5bYKOKN3M2flojyxpb0mvsgISrXgc9YxE2NTFXCcT3IMlzuWxlQ/jafrp95kSKSF6RkGNJ/9xqfijkCdAHU9IIBZlmw8ynrsZT7HkYUDh6TfFKloKcSpaV4weFE7AmeyDTNt5+ivM0IAeIP0MG8X2nw9QOKrIoxcFAqpmJzjFc5wdXcVPvHxnVdW6e6typ6uKpnMrC88999rrLrrqto/evLX5gde+HGLyYUImNCrpyVfI1a/UtSdOorCGHvA9d4P0pMbSiU09Onqnl3/s44kC21oupDa77nnqE5Y7PP1+H8vc5YpODsNE47lbEs8kA3qA00yJNdFEUi/4qugZOEREPU/h9YZTIuXcEXz2ZC/spfPwJwdjUCBNdf+twuj2ybvFn40UqHusrD6lsZTpt6EvN+R2U2Dqas+7t2qqqqui+dIzr7r1omuvfv3Gm06q/7i0gb77/CbhpM0ZHY7lk2hRDujvgGc+R0WsOf7BB7nE+qTSur62/uzMAowJCYQiC9L3fHIkt3vXFrt4rl9PZC+ICZ7Ikg2FqKcPD62ehDZCIDSey3gaS4lU1L2yzR5eE8Nc33CKp4nHKYKCyAfCs/7YgpeC+tkdz1MqAUd3AoFEmupqolru2E94DhAcled1c2HjaF53eXnVVGGpbv6+9JyrTz3nws2F7xU2U4ki24+y2Dskc2Ws+LneOV7m6+giOhg6dPi0ViaVI6tWrcc2Y2F7yxDx5OAYpUZLeKYbXBoy2l5lr4NjLJj68vkQADzGJF8ULHcxMk9kFHkkWmp8P+SSQ3/v1EV3SaC0RCfhGRK1lNMVmShawVOdUgv3ELeR1gMVT+yn8++ljeJZWFletG5tV+VoblFu7lR7RfNJuibxzDO5mH9zcdeXjZObNmE3h+Pw66fo16+cda63l8UOrALd0ZxGr+0IjSlHONKgNwZp4wnt2kxtIU/1PLX00dYET+3iNU21RNNKSl49fYnCWHqaIU/feJeChpIwFdB0nszAG9AgHeIzc0rG0/FbLsZTP8EDtQ6ST+2I+PyzXJOAokNsQjL9HK/Y8Gr5dNVoZW55++jUFCO07GLjvCm2BG7OqKDH0RMlg493zKmU4gTtQ/qlfNSPVmoH+LFph0UyWlojux9K4xigynBJ4nFI/GQR8zwBio/yy11nyx4OUL0CKOqJczeeQYJpTiNZwoKI5ynNDGmCE2iC6SVM9k3shQVKYucRLsUqnj6CUOhgRxHIo7rMxMQUVH4XBY0ZzxmkovLVB9bmtW/I5ZrdXHi2HHfBJWyYPUxSV1zcOCyeMTFEMx3PDuPqeeKjz1t57NGDx2c0Fey+e/rqjhjm09nPAh0GqUDTeJpfQl89zlRUVAve4TzSrXeLcxK6tFw3d0jiaZmmwUQsKDA7EbgbJCAaWlO98nFnSDABljZYwFMWRZGYRU3mjuCojcj+hZCKZ4/lRwxpjtcVtxfdn1dfOVrItcWjxc0t53Mi2gVnnn8Ye1rYqtWkjgkREtlkCQ8Wcj6fQpPD344ucFOxuo2eHHPN4MoVu6dndMTQTspbPPSrTPgiz1PbVdgKHfL0+yy8d/cDyA5niCVJtIJ9OO95AlOSUGwrFwWCgRDQIOi0F8t5AtTzBKd4moUWzoCn7JUWfMBTQahGv/M1HTZmPKWg6OcGeI6W1xfX1bS0sFWQHcibuV+Fxm/+YCQiiCUC5DD19lOxAuygJmcSh7Ov1NWVex+8YmWsKUZ1UEdz8LP0cyFpIvPjQmMQInCUi4emPxfVcMIzdM6G85950uUITWdQy/zrt+h77P1CMZ6eondKxpMXWgVuSEJdPuffFYy4Gq7HaTxdIoiGaVbZ7GdfY11xF3nmhvJKkqOKxoYm9llesPm4C0/S5TXgxEs7nmXZvkRVIl2FZ60OzvP19VSuFoXn7ntnNZ22msqIokwnK5fyRBtXhjzdtFaqbdqHZ9Jq/y+eewT6ac49gXNJhSPpeyCa9IYepwCai7en0B0p7LXTCIynC+5WheINqHhmK+Ec6+xMYR8HIzTsZX9idHRDcTsX6dexvjO4hHkzF3myhzWN8VdmZAgi0wqsFJCJ2mUWkGjxNWwnTTXjuatuUk7blVuwMjIitZQJMn1rw/O0jis8Wf18GE7xxLX7oQPV0IMl6+RvcRoZ7448z6XKmcAZiMgKqN4vfDePMwyQEMPp1ROeDueBjqdt7DCPGgBFpJ7Ej/B8pjOFDVjsM2ht5r4dRsB4sEOL0W1NER+fcfwRxx913vFrMrURrBaa6VrAeqIPzbFa8My+WDzVQmdInzYwt+ftvmJXNeGyySAcRr/exQ/9FE/EPjegRyZwKvjUcg/rvMv/9/njl67RDPyRm6sHZ/gtyTl5oNZJ7xeE8skRU2A9jadtY7Kz6vdGGwJJOHnxVEDPFq2UhmrxbGuu4LAFGpnQpOQZYWMlfXK3Pz1zzVFZRDjHqkKskgrPVDeyMjMpcpJz0UbXUILA7E2XyJU0D5fmKoFgVZtHDHmir97Xm+2EJxXwBE4rYiThRJayDHHalCI8KSTbXD04jWYAM1lD9V4hbPdkQJNCJfPtoXNXJ8/z3MfCzwCnicWfsp9jUXiyuSg6VlNX11pTxy7YFga5Imtqs3Xy2FGZR128ki6Fu6wGOyFflkmug77zFoRCK/We4mmKdvHFbBFN3f3QXbPVhVNSBE9F8p6eKIqnWzj6ip3DL570xaWddhadD3f+ajyNylKetl/TmkGGM/TaQdpj4gspIe5lzJfF8s564tzhaTiN5z6+381zwBOcnucYPBsY166umfmCjRqXnJGhc7vQTqaLdLU8D7vXiWOGsvAu+l7X9UVNXR3O5eUJT71Kv6vUA3eHZ34ZJ5Wuz2Knz97gEzzxFEZT1cB4stwPpCivYUKVkBNtcHAm1zsNQZJ+kgFt9Ps5bNYBnCHPgMxSon+ju6EvWs7Tkk3jacmRxF8s5a9d47GKOSLVh+gC449aWph3J0+kC9RzGnftMumu+7Gkkl68weMd4AlALV5VV6WtsqXmbLQdcpXk0INX7JNOnJrgKcsqoF6cX4Kj4UQ74ckwBzRttdPfWFqbXLY4TUGFMygQh122JEfksJinCWU5TJPQgC5XT9Sf3r0dNBTwRDxPnk0/C7R3huyosy9FOwm02aWJHYMtR+gANEIk3fIbHNnEwAFatrfeiuUMT6WOZj5MP403jOysMn4u6ouF7s0mDTJw4pkwoTygqC/7UzqoeUo7qaebc1/SCuc5eXEGzh2UGzduDHGG3xUGQUYoGWhibS/DuUT4LMCpoio4bedRashTD/kKfyZrrYbt3JkXKU3I6khGREg59hDl1Gp3nXFriXMbmHQPupa5ckYESY0B1cOXioVJn2AdHdD0MnhCW3mQEgsbAfKGwXaV2lknpEWOpnhiPBM14CQvHIrhNJ4ARYFE074rGaeJpypky/gtV0+PHwm1c39vPe0yBcuX7ar0YL1frMPWa0neWe7s7UrRfPbqiCR/zSCzruxrSSPhEUs3NsxRfE6RXB7jY0nNPYPRxrp4gY9xSmqVjxU2tN9LQJ+J70oVN/M9ckG2TxqxBa9erMJ4fzgqaCyCDIEur5kv5ekb6Yj3RYHPXi4hQMMrhMvEgAa+3c5xsrNxbLm7+BmG/m5eiTs9lNOC0U+2cko/M4i9I2sYwokQYHJbjW5T8pfXCyZFXh2JZbP4Kq5YZgNPBZbwDE4l5HeHMcU7aWUQAPS69nQm/7oYIgIIyWCbmueJM5In4kO+fWnW/nc4Q+++UZIYFLNu8r/hRJYlQH9P1Dc6bLUz3nRgwNPP2Hme3rtzwT6h+SA4lb7jj1avlmLWMmhEMHms5HAzuK4/ppK5Oxb2YL0fazfgiT5aKVCxA3I4n3Ce0eG7spixpLumF6xXLiVrG+AMeFo/hi/yzggrHfEdCtXZ/gknPA2n57mnkCKhSi+NfXZG9OxFQEPSBu/vJVjttpGe9R4elrHK30ZtNMmw08CpWl2P8Ywcr7BcXTq0y41t2c2IXM3mB1u1PUA8JXB0lnJpOi4vZDzdXE0qunfoqn3Ss107VdGUPy3KURVL9NPxFFwXKtkFOz7PFBhj8/c8E6GnePJsfj5Q6FADIblMHMH/h3MvzIkd82CjpNLP4CYv4XGpu46uo6fL2lavONomnmpGkOXQDyFch7vVihgxYKXbIVLoKK9WGE+9KR/WpICuxCwov7VMLfhUFQ4wrukS13IHJDwlppp+n++KgCeq6dMiZC/rbSTzXO7cN5oQfxrO5KmEHf+RZ6Cff4XIn7DvvqfxPNHODJUk9NOckUU6mEcqG+CMsEFI3r2vM6U2TdPYqK6Gh+2I9RW4dJ1BEdyZrGOLTcH4SPVl4ZAnLPUETx01vM+++8IT8U0B46k/Er8zNTyPS4nRn5ydvW6cVRCGvwgQP/ISYHGw5RjsBROQYGUHZEFJR2FxB0hUlFQICckFBRISUQo6hEiBKFPSwz3Q5h72GnjfeWdm53zDQmCy7G5sx8s+O39nvjlz3tekWUWisXzctFM4GdqNJ2lWd9vU88YN3ExMP0MKx1FUBtHmME5c1rYbKmjytLzzQ3hG2DU2/X16//T0J+LkCK+J+1KZqDPRtxOrGYk0p0c80cRPR8oWM4vzJW/AA/C7gmJBZR/MCyvqJ1Iz6/lC6YSpqei5rMgz9ROpkl0/z87BoDmmM85TZfaw9KzplX+S0AizChQ0RZGpQNSf8Cgqs/gEa421CoOXtQMnlfOIZ0dj6ISZO6pL0M93PoYqEYnOt7UNlQjQ8J7R03qF0yZtFMVthfn0I0YUQMtJlZCbwIlM1GgDKB0o0cnYxRM2H2iBEzzZHReXxlM5g+Y8GC3IUpI06z9xmIFzmqYEKgkHmijT0lWCUi/+kqlSnLunoYoxaR7GDlPEUR8c6r1G6v4NdlQbzwcTJqK8KjJGU7PVbZsafpXmxV1RjQhUJwKGgibPPCxELYjM3qmfnLJBoVqTp2IR7/ggOQyebFwQmwYn3nms3B0lft55js6hWLpwhlSmbdGkUksop6nnyPMNn9yveckcA/g65E20chhOyA/g+cvEeawxJ/g21TKGTpAnR3JhLPmBbQmybQI+L0czoXC+xQt5/h/qdTB48LT1EdaralVgfsWjyXLM3iGFKFd5AU7XdyPlaaGo4ozCZ26QK9XOjnMizsozkY51J8EUzixaWa7kPOOE75vJE5Gd6rk+xWL9t2vSfGg8X9WkW62mkcHHXirdgye6NTjtzMcjxfw25mHE+ULZ8HLLlmDgx6JcXFnHT92Skcu+JdTMlVk7J/x5hY7ia/YWJ9LacZNEXpX4K8409iph+uIpaZdRtDFMC02KsRDPW5XnEc397BgT+YDzS6RKv9jkrukZW44DJ5UIyMYjqa8gHK53IPFj7JInpPLU2cnqkYV5s/aJp+J5mDw5Go5Pwtq5Q7OmkJGVd54qiQqoWAbPmnhWml2CpxR0gAkRz5elncmTCiqc5j5RxHiL3hMnm5MnDzl5+JAwH/0BnrRUJkK2UAFJcfTz06/wxKZxHLiAg5ayH9LgWSrh6xAoCifPmPvcf/E2MgWYN6tS4MmPCiJ/KZ5MknJX5XtLc4lZWefdDpwS4RTLQTtLWN/NM0P9TD2zhUep55znG8kTG9JwoQwH8J9hgOl6s+FQH9PPXzB4YQIU8tRCGjhTtkeO8NPyzdNvr0xDARGOU5fQdb4Kwd4Gz9durrCLHxU+BkT7VDWXSjxXwfNAO6s49gSL9ih4imUiMkoite2gJc3e5VB51lB07v/1qBQ87XdEF2RcM636eRhD9RTfWWNTG+2vZ2fsLDzBVU0MVKB+Yq7VRP1RpMgyD+uQXGrZslrjn98nTjln5WNakWscO1/FgDLnvIl5byzPxTzPT/yj0rAJ3nwOMlMx7+dYlPLcoDJRAs6OJYhZvGDmhaUxje/Wfo4bZSdPKShxelFePPWmMyCJp3CiCgKeCEebHx9yjiQE9v7nhLjuiiOeggmIUB09W0Kcp4BGbv60i+knr6HDoSKWo5rN0zYOtVQVzyIH5VitrA2plOEE/W0KaNpi8AxLr5fYpZyVJ7g5St1LBLTyDEme5TiasHbppykoL/uw5RObqown1HNz/dWD7xDZJRO1s+IkRIlqPizxIreV+efBv/KICRTVe6bsCD2cLMFveGDj7B/+er2AQp0GnVpzO/7nhXMsgHSexJfif8mPwHG2PF5ExVNERwfawnt0nBjOK0hoUAQk8tSRXhDaO7LPk2tMmcNa89EjRqTJtVO09EYTpya82IkNiE+2hUVAwQZ/ZPc8M8944pG+GItdPM0T54XTzskMzfQDhq0QvxDO6OBOG3dcydMdpu7zMuVYca+pksM8j7uqnj0g+SOjEZ0nnF2cEq83kfEoeUo/1+SJI6IgtHeEJOOZVmiH/dLWyZPCaESeeAn0ZeIzI0+w3CdPYBJPvhB5clFAR4wv4iO1fS8soIoncWqrr36nt7bzwR1hMipRHo/JszbVtpS/8Pyb4N7UUzwhM54LP9wneaa5811Wnl87z83l9b3vIJxIRZ4K7GnrtHEKwDpP2DsHaeAFsKc0hFQBKg+lsxl7jE8Ia6D8HNJ/4jzwQERbt/BGr/xKWVyCKE19t0RHsnA6z5Rd6lmd5/nOfCmIlloggtGYK5Gm3qVwvopmkG/hP7mvn+HoZLP5noOjMeeYQWmidsoSw9DF0+ydlmk4l/zI9nUEcDhqD/WaQqWJ+Lzt7x8aT+EMOdDvt48I2hk4Cany6RKqSzGc/AoZ6I8kfGfznlJKEW08k6gMQU3MNEW9Q4mCO3H62p3Ns+DJrdO22txs0DuHUzlAFHF+Ik7CpK3T0MsxDXGwA8RM4MJGHGK4pqaV6hB1esi3SdDl8OJ9ANXYuSslrdrUz+RIQvWUrnnYeUyektraEMW8ubGDmih2nsXca4lJHbqMj7RM2p/jFM9Yu6tZCUDJ0+ydGkqg0FHY+4MJypmb+yiqBWDDWfxFDdScZ5Cc6V25n9oyShVQFPFXxvOCMxE5FZF3PjXezDykRPSI4k1c9SpXx9kd527fKZ4Np3jqz1C6irrS/naAe6ontTN4fmb6ecfi0cnJBqeSYGq0rd9fjJkFHnRNlnlZW49qO0n9gh/Ah6jlPKce27PgiV9m61WIWNJzUu3jUiQbOVpYEbKUNOWOWt/tOAeefal5XnGKZ0pWlhaWK9nazVRFrtPiQ1bqvoVgTyX95x0oKNST+nmX+gkJnqTpfdaBFOLPNUsiDmfkJ2g8beS9EiPdWRxHGoACHFQYPPFlZFlK3HO0194MpweEYvuq8aYE8iLOsiunpBDs5i6erqAlFGlCjvpriDPK8hBvtaRyytrBE/qpBZLxhODgV/CEArm1K5KH8GnwJEZl9n42BmfgiqeZuXi6jaACjQzuiuOj6TzV9QGM0YOYOFMqT7kzAZ31HCT95NnT+FDPss4c1LPwpAw9JwvtjNEl4tXAUzhtsuI74IkxF5CzT9drKSh4UpAzPZg8rufOiEWKUZW4oRtZ+k6NFiZGX0rKC0sulgvjecF4ZMdpxbROp7nXKhkFV5VszhwkdLeHopRu7LoTzsbTF5qmOdh7EPppFw5dO9W9wUua33L/AHl+Sp70oPSfkntfTUyLXDnF0t+69jbL5vMAMRk7ocHg1TnhozpfpJO0Kgr4GU/8IHVU6gmIg3JWoju735JXAu19ht13KrjjNqrmbvUUT64zs18p7L3wtG3FwVPuE9a+hr2fwuRxHDN0FE50wsA7V81wbxLxpLj/dDFkgOQBnk77gDy57IGwKvXSgroM8raognpGd2xOPelA0zuOzAaZ06za2e39RnOdpZosKXVqqyotNT01DgFwc4/GpeCJ3tmviZM8mTAdc5EEonfvIchPuZTGH2epdw6OwTM0FLmTrZyYlMNtKw4eKBTt84BR8Vy+TGW3ZTB5LnFKXkhw1EPnSWnaKdFf5oGo83Rw3dYJc+AZr0uc2igC5eI0bwcqnn6ZuPOk/zwWT/ehH11/OZmlO8mEmQrK1zEp56vjVelwAVSJb2QI9m2gfsU023J/OyICPIOkHv4h0dzdgh0ICt5m61U/eVeJ6is1uscFjwjty9hBH2OA039qG5pwWm835WeG9/sUGDzG71+iKfnH3ydZerKMugN5muRcmHyCQA9hKFReL5qM/sYb+BjM8WPGE3jV+ubrxb4gemycXZ5KGWg6y5aF9uzTLEXOs+AMg4eIp/ST0Z3TPwnU97HeNzGe34vnS/KZNVpUnqGbMQNXCyeBtafUUqtJCTj6j3Lbr+pU8p7gmUXOBrRgrES32B4bp0SqODhOURZOaeeQeQpnTLusDrTyhIgneq+TJu6xigdPyjV5ZggaeWbCJJyF51I84zNlTUozvNTgAX7kCVFbkml9cZlNlAI1Kdz+C89JRCvUG+k+E+eYefKdMBZR6uFRDEb0n5oaQp5HwVNAw+BPAPSSPGHsBKmhL8kz2zAAKSTxalUfmRR1EKM6SFtNwuSJ50sTcPZBFQZ0ppb5DDLjWHHu4NlhVosPjHo2BiPBzFV7DCVAOBDO1YgTPNXeRp6fJ0+qpoTHbWADAnmCWbAkjeJATUULy+RrXyVPASVRBTUIeeIfJk96Z018Nak0dd95zqAJmx6rPPGPNKWcetSTmXqWjXaxLmLGktrpLcnqLVI4Ek/Dmfp5mjztrI0vp71gScmspoR4CmlKyNLBahg8aNrEPX3Z2Mn1Os+cqTm2zYlilY6zq+fAtPPsLjRZjrFo3MiE9yLfyQSwWnvy9O5L85/Jc40jSdzewVMBnjyVdybOGKMz5PTWC5wi1aWQJ5L75El29J7IXjUVcqnrGoazYjOavE9pOaekqmfB2Xl2F5pQu7UTZrneHqcgVN8ZnVrECQmcFo9e/4LFZMixCfwnTmC/xFlud6exGUj3FCmo83SYmQQoxYgB7VgBLcEthED3FlDNCEehnkatSeXZrT146vFfcUb/rHAWwF07s7ksBjDslxMohDOdp3A6T+IkT5EMIdBL8PSFdb1+OPI07Sz1DMcNI9E8XJi7bwBKQTTH98VT8agy623WT/Zae7PvEajgdN2sDclSTP1p1p7jxRbOE0ArT501lyNPFNy3GgqgZwbz+JjnEEk7Ly8/Mp510N7IE2ZLmomSEq0aZvIKRzGXtKoovhk8F21E3BMj0sI6Ic5xNr2cAU2MDnTqpGssclv3N6FUaes8LY8fcAqoeIKmap+53rQqPWoid+8Fz2dHyZerncDbGG2PvpufqZOP+ygjDKOrKhS0KWcjWstFnWHHKUgDr6BJ6aopnENgL6dKtMQzeQKnwpGWmxxRa3IHQiUVTqooynbT4DWfLDwpjPspubqRMxRPiXBCCDWGyfKqKLtAxLNrZm1d523guZtj4hS+qp95mwl/PGiOOL1Kt52ynmVP4ZR+iqcB5awPP0XjjDzXx+LJgHQCm58EMhWvAZ3hLDvJzR+QXJ27pQ89eC6hoIT7fOCMIJ5ox85Zuc6dKAupDq3T7KZecYZ65tjlop3kmTjJM8z9HQ6PRDyinIXJs8CEKugJNPSDaV4/C7RCSkhRJpmV0ulqnbfTDBPizXUXzmDkuS24Vf0U1SFD6pIYR7IdaFPOjnOv4DTvKZ5DUf6WrB04IYruni6ZsZMmYbIEGjw/SJ6SBBr5WZs4GhzC7s1deA4V7WlyoL6CtyMNnu2ldd432c2z89sNdBTRrDjT1mXs8p41U9IyM1dG4ilr93IIiRpPaSfsHf9BLid5zYFnma9DJRxwltpM2H0gd6A+AhY8s7uzqeff7u+Noub/pdmBSjVFsziqsHUZUOFZbL1Mh9O+dFk7zP3oiPZ+xxQUPO+Dp2B+gNu74Fll7MxIni3dLkqa3YPJU/GdPJHUK52fo6tsWz3+sddA/27v4tmMnTSF06czKpcXzwxFuTRy//kxVu+YWc6NHTy2LXwneCbQd6ew9c4zv9E2oyTR/KkSNFNo76ol909DzUMNp6QGcyIp+bkeTXbrZw3qlIYz98QQp1dCkmfHSSFP7jCkECd5Hqf3PCFRU9C/eju71aiCIAhHUcR79cYfhGAM+IMIRi9drxRfIs/p09k1NV30TO2ck13QWqNZlax+qZn+mT5nL8DDeaqw9mt7jgC12/i0XLS/rePjESfXdT4GniPOOeyo3a6q3H1aaPKH41RjQmMFuP2XeApnTZWAEzxxv64QcMZyV/UOczaeIecJfPrJhqnF0y6QqEDxM3miCChbL6k5UDMnVAGJZKEqnguf2ve+9HlEE42lpyHQPMaTOJl8fg91dwJnCUch4Ly5ueCglU1bVR1piBMKlc3hArTdsZQXvfliN6CkaTyBRDSpmSr+JLEKvqx5b4UzeCZOvlU83VmXu67tJ83k+b7xBFLEIorVJsz5IfJ5Oks8/do0M04BWj2aQImUl0Gy0rTbG3EDFdNK0/wJEaFYDp95gCLO1Cq0gydCEXjmBIMKo8QpnhHc6c/cPt8mTzkU7aVD8szAQi4iuVECVjjqsqv0xykCSlDxbEDFLUGKql7F7LnlTyG0AOWZEhNPrnam8YkTjTpvg4BlfIQKz+eMR237BNDWEOkWhT3J0/rkJDCtQgc6X6k7zBGrrBJPQpuR1kC0OBHSSZBRJVohHlj6SaZuRkCeiXPgqdSTt/GoPN9PPN8EzzfgSZyd5zxf6fFWOF1+WvjALmopubqkZySq1vGC53r/hOoppvzpiSdXu3jSnk+byvzCCyjtqVwpFO6MS95DV+0tbsWzN5OD5w0WPHg6TPfmJlEZtF7LovBGnAZze2ym4tz2Z0GcMFc4mR7zrk1hT72fQg1GNRoRaLCkruFPOpTV+8dgGor0kw3lz+FPmxyy6OGFirrjg0EVmXwaURhNHoncnCt/MgQlWI0sFJrj2VvyRO5JnOQ5lkYW3nP3FE/6s/VCuNyBs4WjxlNtHqfpOCtQH66CBNKS1205zgGh5L+l7rEVmW5P4nR7KhZNxREbn8AZatG9pfNc7xR5hjAFKp4G03haS9Gs4HOxDtOt6mNdMh0fK5r6Q/1iPBWK8vSNPPubzZXpGo4qDTjBUwbFrc6YLYVaOEKFVHiiuXQQT3V9/OTbYVL6vSHRkwzb9lIXT6sv9/0JjCVf8gHPzOIKT71d0ngCV1e7bkJLnMnzOaNRqJ8eISQFzWAaC/6CgYG+3IjqGRdc5Dm7dI3OnSlZQHd7uj+1bXpLqSbyHad4Eqc2zxBxPptokidw9uId92UIsdxEcCdP+BP1EUxk/jScigymatBCdIVTn9SHmkkp4+hQa5LE0YUNnsCpnvzMkzg1vWA8c/cUz7eNJ5P5LuIkT1DkxzJJGsODUx2B+rflCNNjEx+FpXN0moROoJL1F4CzTmRldOdd5b/mIQfnusVTwajPhUDPyRP2xN7ZDMrDDug1cGK9m3Zwrpe9fY3kZUxHuT19FPY4Uevazf2vGtzBs9ZGGKZTIm88X4Uaz5/imc267M2TZx523CADvVjDlERzDyjltEaimp6pccgvH9pXrTV996zLXSeH3D11pKk5+UdTWylEnqGf12h8sjpCMGI4+iie7IZAqI92cS5qPu9ECKhLpP1J9tHVmiv2dLk/7Z9gPIWzRKOeLOk6uDGysw0CmtB145np51XwBE4IGejrd+DZ2kuokS4eSoax4nT5hvrwFAmmoJ5qz+rMEafnnsnzD3jykKPWmTXxTJypa/IMsdK8ukx70p/AScGfWzzLIvT9zDa1AegOXIPIT2TPu8gqd+MZRBOneHLkKnjCnsQ5TYMUnj/xAM5SuV+JJ3JPKHFG/mk8FxO/0iqhtt7ODk/tmNsvtu/PbXuqTVeXe83lNecpnEqTwBMKc+a50SWLzeRJf75kdymCUcs/5aUVzu30TxpDwoz1nr+IS/FlQ5/wKO05Ml3b88FqtRNn8kyg41q/prhzqtS8CpitNnoJpu8Q4DvQA3iOLaNZZ1pFUzH1i65pissMr37q2iorijsV29tqVyo/dZV87wxrUtw8M1d6S569MopwFOJy/xw8BwKDEtRddby8L/Ac53olONhPfHg08kEljUvInv0mwfUqONEsob0UReDZwlDhKX+KZ5AMoBngDx9uzFZW8O2r1n3nC4v3LH96E0E1NHGqEaJpOut5KhipRZeJ0vs8dSdPGJSZJ9vyXW3a+xvy+dV/Tfp/TE9+sdVit7v/Cyd51h7yI/KcgxHuHV8TJW2f6CSr0MSMTRfH58XTaN47E+jJDI2lHLmrkabjLDyJk7G94HxkOAGTPRDihIQTob3x7EOKjSNiUZZHztPLZ4+w9qRqn51UxxHO0DIUTZ2QXmeGptUOnjatRJyV53MVmsGTCp5ZF8GYwTPnGc5advtx3uW017WQbvzh3zN/Jb9xtzVCrM4MmmrJTzzb2zqJJ2hqBsx40qDEGVSNZ73K5I7aM2g+Vwu4OlPtjAVRPs5Z7Q8gRSPDmS1kBfdy/MbZmuDZSvbvogkJZ6z2jEffqKCJ/vxgFnPMesk7TTfoXJbymTj6n+mrk+Z6J51LzJIplREgw6lQJHdOkZ2nb3n8BnN+7zun7MnSveMUSgr7px42xWYErVDZJupjHBUfPnb8+SleorN1Oc6aKHGKKGf6e2A3nMFzOHubeSoQMZHXsRF7yNWa8Gbg/FLWX+Y7J61xIfUQ719MZM2fkhY5cFKb/pxw6uy7HGpy81Qo0pS8cCoSabE3TTTJEvYETvLEpokPxvbD4csP7xgJg5txvfjdOYsvtvCnf5+qjpp07iDb7skrJLKrBJxzkYn3cKM9NTX7vo3JU8RZvFlHaN/1Q6MWhkDzc/wAz3qKvWLpDPXgczfOwuzmz5U9B5yVpgd34vRopNRz5KlrOEiTPNOaeVlM/Li9vNR0IsW1DolnGBNIwRP6svTn7v65euohbcufvmnKnfrMNtFlR57KiylCOuMQTrTjbVBJcb2fDMOat8EzgEYOzzjUeMKa7ICwwgRQ0IQ3v+Bj4c9t5RLEwzm57/xPrSMtiC7357qDLJxtsSv1rO5Ug06hSMfC5AndQpcsiXja3iMRWBIneTIWNWsGUPCU3J8ecfY3UI/Xa7J7MItTJ6LzAZzd3i+kxa6ifSzZNebJeW4tdZgT9/PtGXwI+yazpHRnpp2wZuN5OMCgP0o8unN8pzFF8hz5frItW+1eaNbFTm/mWq+zSlrsY2BnitREc4aIkzx7FMq4DjG0Y0QRaWc36I9fF/9Ka0bG9s5MHWdqmk1sOP8AJyNRcSdwjiNf5epM4sTN/tiZU/M4wxBhKuekOw+kCZ6/d6HoYb9xMt3dv3FHptI8yECPpj//hHo/vheZaiiJpq42aNa8BUzeypfWrNfEvGs8S32JAw6kSY1no7nvT2ewnzQNE1p46knTwMSBdqwn95roUyK9/wBEn8ynRcTpS51RCFEd7uwJ0kdoXOnfWnsOgjEbT+L80fTrL9TUmOktII8yAAAAAElFTkSuQmCC\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM10\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:broom\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10", + "coarse particulates", + "coarse particles", + "particulate matter 10", + "inhalable particles", + "larger particulates", + "dust", + "airborne coarse particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_pm2_5_card.json b/application/src/main/data/json/system/widget_types/indoor_pm2_5_card.json new file mode 100644 index 0000000000..946639a5c4 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_pm2_5_card.json @@ -0,0 +1,38 @@ +{ + "fqn": "indoor_pm2_5_card", + "name": "Indoor PM2.5 card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays the latest indoor fine particulate matter (PM2.5) telemetry in a scalable rectangle card.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm2.5', label: 'PM2.5', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:broom\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#80C32C\"},{\"from\":35,\"to\":75,\"color\":\"#FFA600\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#80C32C\"},{\"from\":35,\"to\":75,\"color\":\"#FFA600\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Indoor PM2.5 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air", + "fine particulates", + "fine particles", + "particulate matter 2.5", + "airborne particles", + "microscopic particles", + "respirable particles", + "aerosol particles", + "dust particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_pm2_5_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_pm2_5_card_with_background.json new file mode 100644 index 0000000000..5cc3267d22 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_pm2_5_card_with_background.json @@ -0,0 +1,38 @@ +{ + "fqn": "indoor_pm2_5_card_with_background", + "name": "Indoor PM2.5 card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays the latest indoor fine particulate matter (PM2.5) telemetry in a scalable rectangle card with the background image.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm2.5', label: 'PM2.5', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:broom\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#7CC322\"},{\"from\":35,\"to\":75,\"color\":\"#F89E0D\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#7CC322\"},{\"from\":35,\"to\":75,\"color\":\"#F89E0D\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Indoor PM2.5 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air", + "fine particulates", + "fine particles", + "particulate matter 2.5", + "airborne particles", + "microscopic particles", + "respirable particles", + "aerosol particles", + "dust particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_pm2_5_chart_card.json b/application/src/main/data/json/system/widget_types/indoor_pm2_5_chart_card.json new file mode 100644 index 0000000000..18ee71d5bd --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_pm2_5_chart_card.json @@ -0,0 +1,41 @@ +{ + "fqn": "indoor_pm2_5_chart_card", + "name": "Indoor PM2.5 chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a indoor fine particulate matter (PM2.5) data by combining the latest and aggregated values with an optional simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm2.5', label: 'PM2.5', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'µg/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'pm2.5', 'µg/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#80C32C\"},{\"from\":35,\"to\":75,\"color\":\"#FFA600\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nif (value < -10) {\\n\\tvalue = -10;\\n} else if (value > 10) {\\n\\tvalue = 10;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM2.5\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:broom\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air", + "fine particulates", + "fine particles", + "particulate matter 2.5", + "airborne particles", + "microscopic particles", + "respirable particles", + "aerosol particles", + "dust particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_pm2_5_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_pm2_5_chart_card_with_background.json new file mode 100644 index 0000000000..7694a42074 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_pm2_5_chart_card_with_background.json @@ -0,0 +1,41 @@ +{ + "fqn": "indoor_pm2_5_chart_card_with_background", + "name": "Indoor PM2.5 chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a indoor fine particulate matter (PM2.5) data by combining the latest and aggregated values with the background image and optional simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm2.5', label: 'PM2.5', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'µg/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'pm2.5', 'µg/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#7CC322\"},{\"from\":35,\"to\":75,\"color\":\"#F89E0D\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nif (value < -10) {\\n\\tvalue = -10;\\n} else if (value > 10) {\\n\\tvalue = 10;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM2.5\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:broom\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air", + "fine particulates", + "fine particles", + "particulate matter 2.5", + "airborne particles", + "microscopic particles", + "respirable particles", + "aerosol particles", + "dust particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_simple_pm10_chart_card.json b/application/src/main/data/json/system/widget_types/indoor_simple_pm10_chart_card.json new file mode 100644 index 0000000000..c5848dfabe --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_simple_pm10_chart_card.json @@ -0,0 +1,40 @@ +{ + "fqn": "indoor_simple_pm10_chart_card", + "name": "Indoor simple PM10 chart card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAilBMVEUAAADf39/g4ODf39/f39/g4OD////k5OT/pgDg4OAhISH/9N9YWFj/sSD/6b//3Z+QkJD/vEB0dHT/0oDy8vL/qxD/+u8vLy//x2A9PT3Hx8fV1dWrq6s8PDyCgoL/2JCsrKyenp7/zXD/78+6urqdnZ1mZmb/wlBKSkr/tzD/x1//+e//46/29vaFHg9VAAAABnRSTlMAIL9AEN/GQiaNAAAEpUlEQVR42uzPwQ2AIBAAsBMQc3/WYP/1TJzAJ5B2gwYAAAAAAMB/7dpc+xq15LO5vGvElbNvb2SNMvoBZonsR0iRxYisRuRlvw5WJISBKIruXsGjFqEoCNEoCirz/184tt0wNrSzTZzJhUC2B0Koqq0Gqa0Gqa0Gqa0Gqa1/AskZrxYzG3tgsh57Zg6gmwF4UBMU71dIjj1eBYawcYFRHwJSEOJxt2HaUvkt8xLifnYgEIAqLEUHLD4gnSrgzBB2KNo1xGWlHo4zZFOYxhmII+UJeyI4oWDXkF6ZJFBxhoRgnGEaFNPQ3QOykofkDaJqGTB1dmrTPSAeD8n6BsGRKdQoZ8gC30/BriFYuZf8M2Sh4gcC1T6w/P/7GQLjnpxpCUfjBv/KWJIAsA2ADIwZxbuAIJCGO3UFgeTyz6XNWneuQWqrQWqrQWqrQWqrQWqrQWqrdoj7X4B4iGQa5e4QSdzWdWOSe0MkDYegH5LfGvLNntk2JwoDAfg+LXsJCQRM8A2taItv///33SYxp3biFTrDFWd8ZkrCJu3sI7vGqRuWgGPONk8tsk/DLE2fWSS5PoecTZ5Y5I0t6Bpq6/lEJotL/h/1NThLn05kaU8Op1IVADe19WQiC7bfLesqsbnPAW5qa/Qik7d8k0AgrScAST37SFkBN8zSsYssKkbk4EnY0g3Ffm9DkdrqKZIJTwMebqdf0woTiUqFWnGIklT1nPIOlVOwBKLM2epbIiV6puARdvolHA/RqG6OqCDKymeeVl7L11N8Y243rCpWFUl3kRaVtPDg1UlkjVkkerJ/BcU/T+93NvdDAo9NqnRPFnlRs7yziMLy7jUV+oGI2crrjcCLOJdbILbSeJVS4Tre6Sz3Yz0jhV1VwGPmRfqRT1wHsTTpKHLA9f2dCCIZIhDlZdCIgkLORrr6QaS0KcozTUPjvJQQJcTYhffYRc1mFdsn0In3arbrJkLZNKrNQsUIiIvQVSuBF5GjqywKuZigJY0UMtzY18LE6+X6vVJRLKErSb3vJHJCz8G4dyzkcRGOqIwV8CLCJUsKPtbSBk1XiQcpNT5qke/STeSAzVke0XXKka5xEZrbXpBeRPot7pfCUmurrUFEvX7QIoOKEMa3vLYpCfNApKT1IGKFz3cinIapaxt+PpsHp8N8aJGQNOcCG2lLo5X8s8gUxVXkRDdRkUC8Rf6bCP0Eys8ize0TyXDaW2SWDiwyRXHJ1pyVQ6NWWZCL9ohC2VckZ8uBRc5ozxEuQhr3PdIAGGFFTtptaK0IJ/eeIvn3W73HyY72KSCPifgldCcMCjeXFC97iASPwUVORySEhJiIQNRtaBWaN1bkgLyPSPAYvtmNlByucG7+itCSMZyHT1XmjLjlqO52unU/xCnIY3iROEHkRm8NRIsCttkWuhI8RiRyQFGWyhZTT1bkMSYRLtB//OgtsoGfFuFZBjfI9TozMAZ+/xrVv4NeIi+R0fESGRsvkbHxEhkbL5Gx8aedO7gBEIaBIGhsEcl/2qD/9mgBiQdJNNPBFXBryGwMmU1HbpAOGuPKqP7/1vnZ3UdEnetnqbJ2CoUBAAAAAAC88gDG/flsHc1jFAAAAABJRU5ErkJggg==", + "description": "Displays historical indoor fine and coarse particulate matter (PM10) values as a simplified chart. Optionally may display the corresponding latest indoor PM10 value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm10', label: 'PM10', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'pm10', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":150,\"color\":\"#FFA600\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"PM10\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:broom\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"µg/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10", + "coarse particulates", + "coarse particles", + "particulate matter 10", + "inhalable particles", + "larger particulates", + "dust", + "airborne coarse particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_simple_pm10_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_simple_pm10_chart_card_with_background.json new file mode 100644 index 0000000000..e51c84156e --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_simple_pm10_chart_card_with_background.json @@ -0,0 +1,40 @@ +{ + "fqn": "indoor_simple_pm10_chart_card_with_background", + "name": "Indoor simple PM10 chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical indoor fine and coarse particulate matter (PM10) values as a simplified chart with background. Optionally may display the corresponding latest indoor PM10 value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm10', label: 'PM10', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'pm10', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 200) {\\n\\tvalue = 200;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":150,\"color\":\"#F89E0D\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"PM10\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:broom\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"µg/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10", + "coarse particulates", + "coarse particles", + "particulate matter 10", + "inhalable particles", + "larger particulates", + "dust", + "airborne coarse particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_simple_pm2_5_chart_card.json b/application/src/main/data/json/system/widget_types/indoor_simple_pm2_5_chart_card.json new file mode 100644 index 0000000000..97312fcefa --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_simple_pm2_5_chart_card.json @@ -0,0 +1,41 @@ +{ + "fqn": "indoor_simple_pm2_5_chart_card", + "name": "Indoor simple PM2.5 chart card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAflBMVEUAAADf39/g4ODf39/f39/g4OD////k5OSAwyzg4OAhISHv9+WQy0Z0dHSQkJA8PDzP6a/f8MpYWFjy8vLA4ZWv2Xug0mD3+/OIxzkvLy+enp6srKzHx8fV1dWCgoJKSkrn9NjH5aO6urq43Yio1m5mZmaYzlPX7L25ubmQyka17GyFAAAABnRSTlMAIL9AEN/GQiaNAAAEqElEQVR42uzPuQ2AMBAAsMtD0NUp2H9TxAaUSWRv4AAAAAAAAPivl831+LSa9+byahEln7G9mS3qHAeYNXIcIUUWI7IakZfduletGIbBMLx9gg9kgTTZzg8EAr3/K2ycdjgH2iFLcFq/YDAIDc+m3hqQ3hqQ3hqQ3hqQ3vonkFrx3aaqywxUnXGkGpDFVXCW2hTXuhNS84zvElPauUHpACZSYGtdc6CVvV9IxKsDiQDcoZYD0EzZOKO9Fidc7SZISKE3xxtkd6jnAuSFgqPKwJFQNQUudQtkdpokOl4hKSkL1JOj2nRCxBJa87qU7LjWHZBCnpI3iLtWQD04HT9Kc+jrTuBSd0Ain5LyBsGZOlwpDRLriq/mDag9QlDYJPEz5IOOBlnzNk2CMmFiETdc6h4IlEfySjOcLTtirfgwEWsVWAKS0QUXuwWCRCqe1G8QSBU8qX9yaz2oAemtAemtAemtAemtAemtAemt3iERfwESKZO2yNMhYtxL2WnybIjYl2A2i0dDPtk3tx1HYRiAvhkrDpdQIKH0AtNO2f3/H1yPgcxFYaesxA6Veh5Ca6LKR7FDWql7FYFwUPuHFjnnMJLnjywSva9DonYPLNKoI4CvrccT2R3H/F9T8KT5w4k0tVKpqNQxML62HkzkqM6/mrSO3nI/AONra/MiuybZRzCRpzt5gLzmKgYI1NZyEbLwPzjWikn8TtXIJT6fJRSorWUitnCIuiRvpfUFvueqQ/amQlcRBInq9MB5T5UTqwiCHNTpX0RIswar3Ka8+H0J30J4C0bdpcQKgpyGzPN6XJAYZjjJqkWnWtVxdLdIic4AFIgdCAXeJdJhFlpdQwD4+69P7706+EPJrEmdn9kiiVOV3CvisPQXhlC7GRHbGvBoJBDItMC0xo6FWmEX7vQxp52cD1/qGOY5xPlrspMOUnl0l4gtSzMkNjTGDTs9iWSI4xoBI63EIZlupH4QOW2OUsb3hg+gSusCQrxMe+wxVWmtzhHcxb5OXxZsv4SYDRWjISQio6s0jiKlTOeQxDTfcsghSxbghjZcL77rmzhuFpzwzwtEStRj51NIREwry/NGES3JssIQuwKQ49HgzRiHMy2y+nd2ybUffAoIicjrVkpKRMwwBXm6v3XFCuCCiK6baZH1RTrOaMhc27AIDw68CAv3n0RIYhWP1Pd25ulwWF2kHz2IO94YwzVi6KtIib/fRSxqCIp4gi2ytkg77bcZeoqvIpePK5JhuVgkzdcWIT1l0FeCQ1dlowgFe6RCs1QkUc3KIqSlMTyfe+QCYDUij07yvL6JEGpYKJKoBFYWuSE6LbQBEeQF4nHYELS8NhwvlomIx9oiGidMQESz5tW3CroLT2N3WiQiHquLkMf6iPUi1hhriaZTle0RW8Lq00y57y8BYvZYXSSMFwEPdSA9oqHNWliAeGxI5Ia6KCoppmWc2GNLIqTRHz+Wiezhp0Uoy+ADpuuybfxD9sd/RXmKPEU2zlNkazxFtsZTZGs8RbbGn3bumAYAEAaAYKBhqAL8OwUJjKW5c/AGXkg1QqrJPsudyAYlO8fdUq3/t1QzOo3CAAAAAAAAnhxh9Pec6lVI3gAAAABJRU5ErkJggg==", + "description": "Displays historical indoor fine particulate matter (PM2.5) values as a simplified chart. Optionally may display the corresponding latest indoor PM2.5 value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm2.5', label: 'PM2.5', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'pm2.5', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#80C32C\"},{\"from\":35,\"to\":75,\"color\":\"#FFA600\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"PM2.5\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:broom\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"µg/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air", + "fine particulates", + "fine particles", + "particulate matter 2.5", + "airborne particles", + "microscopic particles", + "respirable particles", + "aerosol particles", + "dust particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_simple_pm2_5_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_simple_pm2_5_chart_card_with_background.json new file mode 100644 index 0000000000..5be8e6c4aa --- /dev/null +++ b/application/src/main/data/json/system/widget_types/indoor_simple_pm2_5_chart_card_with_background.json @@ -0,0 +1,41 @@ +{ + "fqn": "indoor_simple_pm2_5_chart_card_with_background", + "name": "Indoor simple PM2.5 chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical indoor fine particulate matter (PM2.5) values as a simplified chart with background. Optionally may display the corresponding latest indoor PM2.5 value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm2.5', label: 'PM2.5', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'pm2.5', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 150) {\\n\\tvalue = 150;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":35,\"color\":\"#7CC322\"},{\"from\":35,\"to\":75,\"color\":\"#F89E0D\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"PM2.5\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:broom\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"µg/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air", + "fine particulates", + "fine particles", + "particulate matter 2.5", + "airborne particles", + "microscopic particles", + "respirable particles", + "aerosol particles", + "dust particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/indoor_temperature_card.json b/application/src/main/data/json/system/widget_types/indoor_temperature_card.json index c8316e3af6..0d51910d42 100644 --- a/application/src/main/data/json/system/widget_types/indoor_temperature_card.json +++ b/application/src/main/data/json/system/widget_types/indoor_temperature_card.json @@ -3,7 +3,7 @@ "name": "Indoor temperature card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest indoor temperature telemetry data in a box layout.", + "description": "Displays the latest indoor temperature telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/indoor_temperature_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_temperature_card_with_background.json index 28243c702b..5096ab3f6d 100644 --- a/application/src/main/data/json/system/widget_types/indoor_temperature_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/indoor_temperature_card_with_background.json @@ -3,7 +3,7 @@ "name": "Indoor temperature card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest indoor temperature telemetry data in a box layout with background.", + "description": "Displays the latest indoor temperature telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/indoor_temperature_chart_card.json b/application/src/main/data/json/system/widget_types/indoor_temperature_chart_card.json index 567cdbb73a..adeafa4762 100644 --- a/application/src/main/data/json/system/widget_types/indoor_temperature_chart_card.json +++ b/application/src/main/data/json/system/widget_types/indoor_temperature_chart_card.json @@ -3,7 +3,7 @@ "name": "Indoor temperature chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a indoor temperature data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a indoor temperature data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/indoor_temperature_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/indoor_temperature_chart_card_with_background.json index 21ef0a232b..133099b900 100644 --- a/application/src/main/data/json/system/widget_types/indoor_temperature_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/indoor_temperature_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Indoor temperature chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a indoor temperature data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a indoor temperature data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/leaf_wetness_card.json b/application/src/main/data/json/system/widget_types/leaf_wetness_card.json index 2c19b88b1f..8d860b4f1b 100644 --- a/application/src/main/data/json/system/widget_types/leaf_wetness_card.json +++ b/application/src/main/data/json/system/widget_types/leaf_wetness_card.json @@ -3,7 +3,7 @@ "name": "Leaf wetness card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest leaf wetness telemetry data in a box layout.", + "description": "Displays the latest leaf wetness telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, @@ -23,7 +23,10 @@ "tags": [ "weather", "environment", - "leaf", - "wetness" + "dew", + "leaf moisture", + "foliage dampness", + "leaf humidity", + "foliar moisture" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/leaf_wetness_card_with_background.json b/application/src/main/data/json/system/widget_types/leaf_wetness_card_with_background.json index 5c61b126cb..a063829404 100644 --- a/application/src/main/data/json/system/widget_types/leaf_wetness_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/leaf_wetness_card_with_background.json @@ -3,7 +3,7 @@ "name": "Leaf wetness card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest leaf wetness telemetry data in a box layout with background.", + "description": "Displays the latest leaf wetness telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, @@ -23,7 +23,10 @@ "tags": [ "weather", "environment", - "leaf", - "wetness" + "dew", + "leaf moisture", + "foliage dampness", + "leaf humidity", + "foliar moisture" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/leaf_wetness_chart_card.json b/application/src/main/data/json/system/widget_types/leaf_wetness_chart_card.json index 39692a4fce..c11a75bda7 100644 --- a/application/src/main/data/json/system/widget_types/leaf_wetness_chart_card.json +++ b/application/src/main/data/json/system/widget_types/leaf_wetness_chart_card.json @@ -3,7 +3,7 @@ "name": "Leaf wetness chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a leaf wetness data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a leaf wetness data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, @@ -26,7 +26,10 @@ "tags": [ "weather", "environment", - "leaf", - "wetness" + "dew", + "leaf moisture", + "foliage dampness", + "leaf humidity", + "foliar moisture" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/leaf_wetness_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/leaf_wetness_chart_card_with_background.json index 6a162ff6ba..99159a03cf 100644 --- a/application/src/main/data/json/system/widget_types/leaf_wetness_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/leaf_wetness_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Leaf wetness chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a leaf wetness data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a leaf wetness data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, @@ -27,6 +27,10 @@ "weather", "environment", "leaf", - "wetness" + "dew", + "leaf moisture", + "foliage dampness", + "leaf humidity", + "foliar moisture" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/leaf_wetness_progress_bar.json b/application/src/main/data/json/system/widget_types/leaf_wetness_progress_bar.json index 7193fd4568..2f8460c7cc 100644 --- a/application/src/main/data/json/system/widget_types/leaf_wetness_progress_bar.json +++ b/application/src/main/data/json/system/widget_types/leaf_wetness_progress_bar.json @@ -24,7 +24,10 @@ "progress", "weather", "environment", - "leaf", - "wetness" + "dew", + "leaf moisture", + "foliage dampness", + "leaf humidity", + "foliar moisture" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/leaf_wetness_progress_bar_with_background.json b/application/src/main/data/json/system/widget_types/leaf_wetness_progress_bar_with_background.json index 8e04636f0c..b341d8163e 100644 --- a/application/src/main/data/json/system/widget_types/leaf_wetness_progress_bar_with_background.json +++ b/application/src/main/data/json/system/widget_types/leaf_wetness_progress_bar_with_background.json @@ -24,7 +24,10 @@ "progress", "weather", "environment", - "leaf", - "wetness" + "dew", + "leaf moisture", + "foliage dampness", + "leaf humidity", + "foliar moisture" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/noise_level_card.json b/application/src/main/data/json/system/widget_types/noise_level_card.json index 03d2551fdf..d91fcf6632 100644 --- a/application/src/main/data/json/system/widget_types/noise_level_card.json +++ b/application/src/main/data/json/system/widget_types/noise_level_card.json @@ -3,7 +3,7 @@ "name": "Noise level card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest noise level telemetry data in a box layout.", + "description": "Displays the latest noise level telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, @@ -23,6 +23,13 @@ "tags": [ "weather", "environment", - "noise" + "sound level", + "acoustic level", + "decibel level", + "volume", + "loudness", + "ambient noise", + "sound intensity", + "acoustic intensity" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/noise_level_card_with_background.json b/application/src/main/data/json/system/widget_types/noise_level_card_with_background.json index 8b01223e7e..3dee42dc6a 100644 --- a/application/src/main/data/json/system/widget_types/noise_level_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/noise_level_card_with_background.json @@ -3,7 +3,7 @@ "name": "Noise level card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest noise level telemetry data in a box layout with background.", + "description": "Displays the latest noise level telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, @@ -23,6 +23,13 @@ "tags": [ "weather", "environment", - "noise" + "sound level", + "acoustic level", + "decibel level", + "volume", + "loudness", + "ambient noise", + "sound intensity", + "acoustic intensity" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/noise_level_chart_card.json b/application/src/main/data/json/system/widget_types/noise_level_chart_card.json index d267ffb8ca..0a91cd3f9f 100644 --- a/application/src/main/data/json/system/widget_types/noise_level_chart_card.json +++ b/application/src/main/data/json/system/widget_types/noise_level_chart_card.json @@ -3,7 +3,7 @@ "name": "Noise level chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a noise level data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a noise level data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, @@ -26,6 +26,13 @@ "tags": [ "weather", "environment", - "noise" + "sound level", + "acoustic level", + "decibel level", + "volume", + "loudness", + "ambient noise", + "sound intensity", + "acoustic intensity" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/noise_level_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/noise_level_chart_card_with_background.json index e263ea286a..c573028288 100644 --- a/application/src/main/data/json/system/widget_types/noise_level_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/noise_level_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Noise level chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a noise level data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a noise level data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, @@ -26,6 +26,13 @@ "tags": [ "weather", "environment", - "noise" + "sound level", + "acoustic level", + "decibel level", + "volume", + "loudness", + "ambient noise", + "sound intensity", + "acoustic intensity" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pm10_card.json b/application/src/main/data/json/system/widget_types/pm10_card.json new file mode 100644 index 0000000000..0d15c4b323 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/pm10_card.json @@ -0,0 +1,37 @@ +{ + "fqn": "pm10_card", + "name": "PM10 card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays the latest fine and coarse particulate matter (PM10) telemetry in a scalable rectangle card.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm10', label: 'PM10', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"bubble_chart\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#80C32C\"},{\"from\":20,\"to\":50,\"color\":\"#FFA600\"},{\"from\":50,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#80C32C\"},{\"from\":20,\"to\":50,\"color\":\"#FFA600\"},{\"from\":50,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Indoor PM10 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10", + "coarse particulates", + "coarse particles", + "particulate matter 10", + "inhalable particles", + "larger particulates", + "dust", + "airborne coarse particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pm10_card_with_background.json b/application/src/main/data/json/system/widget_types/pm10_card_with_background.json new file mode 100644 index 0000000000..8b677898c8 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/pm10_card_with_background.json @@ -0,0 +1,37 @@ +{ + "fqn": "pm10_card_with_background", + "name": "PM10 card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays the latest fine and coarse particulate matter (PM10) telemetry in a scalable rectangle card with the background image.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm10', label: 'PM10', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"bubble_chart\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#7CC322\"},{\"from\":20,\"to\":50,\"color\":\"#F89E0D\"},{\"from\":50,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#7CC322\"},{\"from\":20,\"to\":50,\"color\":\"#F89E0D\"},{\"from\":50,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Indoor PM10 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10", + "coarse particulates", + "coarse particles", + "particulate matter 10", + "inhalable particles", + "larger particulates", + "dust", + "airborne coarse particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pm10_chart_card.json b/application/src/main/data/json/system/widget_types/pm10_chart_card.json new file mode 100644 index 0000000000..6d3692826c --- /dev/null +++ b/application/src/main/data/json/system/widget_types/pm10_chart_card.json @@ -0,0 +1,40 @@ +{ + "fqn": "pm10_chart_card", + "name": "PM10 chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a fine and coarse particulate matter (PM10) data by combining the latest and aggregated values with an optional simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm10', label: 'PM10', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'µg/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'pm10', 'µg/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#80C32C\"},{\"from\":20,\"to\":50,\"color\":\"#FFA600\"},{\"from\":50,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nif (value < -10) {\\n\\tvalue = -10;\\n} else if (value > 10) {\\n\\tvalue = 10;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM10\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"bubble_chart\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10", + "coarse particulates", + "coarse particles", + "particulate matter 10", + "inhalable particles", + "larger particulates", + "dust", + "airborne coarse particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pm10_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/pm10_chart_card_with_background.json new file mode 100644 index 0000000000..54cb32eac4 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/pm10_chart_card_with_background.json @@ -0,0 +1,40 @@ +{ + "fqn": "pm10_chart_card_with_background", + "name": "PM10 chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a fine and coarse particulate matter (PM10) data by combining the latest and aggregated values with the background image and optional simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm10', label: 'PM10', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'µg/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'pm10', 'µg/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#7CC322\"},{\"from\":20,\"to\":50,\"color\":\"#F89E0D\"},{\"from\":50,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nif (value < -10) {\\n\\tvalue = -10;\\n} else if (value > 10) {\\n\\tvalue = 10;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM10\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"bubble_chart\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10", + "coarse particulates", + "coarse particles", + "particulate matter 10", + "inhalable particles", + "larger particulates", + "dust", + "airborne coarse particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pm2_5_card.json b/application/src/main/data/json/system/widget_types/pm2_5_card.json new file mode 100644 index 0000000000..0f30162aa2 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/pm2_5_card.json @@ -0,0 +1,38 @@ +{ + "fqn": "pm2_5_card", + "name": "PM2.5 card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays the latest fine particulate matter (PM2.5) telemetry in a scalable rectangle card.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm2.5', label: 'PM2.5', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"bubble_chart\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#80C32C\"},{\"from\":10,\"to\":35,\"color\":\"#FFA600\"},{\"from\":35,\"to\":75,\"color\":\"#F36900\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#80C32C\"},{\"from\":10,\"to\":35,\"color\":\"#FFA600\"},{\"from\":35,\"to\":75,\"color\":\"#F36900\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM2.5 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air", + "fine particulates", + "fine particles", + "particulate matter 2.5", + "airborne particles", + "microscopic particles", + "respirable particles", + "aerosol particles", + "dust particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pm2_5_card_with_background.json b/application/src/main/data/json/system/widget_types/pm2_5_card_with_background.json new file mode 100644 index 0000000000..f7b55c7aaa --- /dev/null +++ b/application/src/main/data/json/system/widget_types/pm2_5_card_with_background.json @@ -0,0 +1,38 @@ +{ + "fqn": "pm2_5_card_with_background", + "name": "PM2.5 card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays the latest fine particulate matter (PM2.5) telemetry in a scalable rectangle card with the background image.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'pm2.5', label: 'PM2.5', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"bubble_chart\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#7CC322\"},{\"from\":10,\"to\":35,\"color\":\"#F89E0D\"},{\"from\":35,\"to\":75,\"color\":\"#F77410\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#7CC322\"},{\"from\":10,\"to\":35,\"color\":\"#F89E0D\"},{\"from\":35,\"to\":75,\"color\":\"#F77410\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM2.5 card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"µg/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air", + "fine particulates", + "fine particles", + "particulate matter 2.5", + "airborne particles", + "microscopic particles", + "respirable particles", + "aerosol particles", + "dust particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pm2_5_chart_card.json b/application/src/main/data/json/system/widget_types/pm2_5_chart_card.json new file mode 100644 index 0000000000..8b549b24ed --- /dev/null +++ b/application/src/main/data/json/system/widget_types/pm2_5_chart_card.json @@ -0,0 +1,41 @@ +{ + "fqn": "pm2_5_chart_card", + "name": "PM2.5 chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a fine particulate matter (PM2.5) data by combining the latest and aggregated values with an optional simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm2.5', label: 'PM2.5', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'µg/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'pm2.5', 'µg/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#80C32C\"},{\"from\":10,\"to\":35,\"color\":\"#FFA600\"},{\"from\":35,\"to\":75,\"color\":\"#F36900\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nif (value < -10) {\\n\\tvalue = -10;\\n} else if (value > 10) {\\n\\tvalue = 10;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM2.5\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"bubble_chart\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air", + "fine particulates", + "fine particles", + "particulate matter 2.5", + "airborne particles", + "microscopic particles", + "respirable particles", + "aerosol particles", + "dust particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pm2_5_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/pm2_5_chart_card_with_background.json new file mode 100644 index 0000000000..bddaa13a6d --- /dev/null +++ b/application/src/main/data/json/system/widget_types/pm2_5_chart_card_with_background.json @@ -0,0 +1,41 @@ +{ + "fqn": "pm2_5_chart_card_with_background", + "name": "PM2.5 chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a fine particulate matter (PM2.5) data by combining the latest and aggregated values with the background image and optional simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm2.5', label: 'PM2.5', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'µg/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'pm2.5', 'µg/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#7CC322\"},{\"from\":10,\"to\":35,\"color\":\"#F89E0D\"},{\"from\":35,\"to\":75,\"color\":\"#F77410\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nif (value < -10) {\\n\\tvalue = -10;\\n} else if (value > 10) {\\n\\tvalue = 10;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"µg/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"PM2.5\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"bubble_chart\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air", + "fine particulates", + "fine particles", + "particulate matter 2.5", + "airborne particles", + "microscopic particles", + "respirable particles", + "aerosol particles", + "dust particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pressure_card.json b/application/src/main/data/json/system/widget_types/pressure_card.json index db557728f5..8f6523e435 100644 --- a/application/src/main/data/json/system/widget_types/pressure_card.json +++ b/application/src/main/data/json/system/widget_types/pressure_card.json @@ -3,7 +3,7 @@ "name": "Pressure card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAn1BMVEXg4ODf39/g4OAAAADg4ODf39/////YGDjg4ODwqLTsi5vdNVH1xc2qqqr64uY9PT3z8/Pnb4LCwsJ0dHTt7e3m5ub98fMhISGenp7IyMjumqj5+fnOzs67u7u2trawsLDaJkXpfY/409rV1dXx8fHzt8GQkJBYWFgvLy/iUmrcNVHb29vgQ13hUmnkYHakpKTaJkTiUmlKSkqCgoJmZmYBOQqaAAAABnRSTlPvIL8Ar7DvmsykAAAF7UlEQVR42uzYUWuDMBSGYbuNr2eucsZiScLmbgxJYHfq//9ti23phLSU7kJOW1+QIPHCBxIJFs+rp4JuvZfVc7Eqatx8LjFeHO6gOi0r3EXFvUBogQhrgUhrgUhrgUhrgUhrgUhrgUjrkSBv6zfI72EgZTlCxkF4FyDlel0mSBpyiSMiOT8uLkMO5RClU0HKt+Li0jrrgGIiGwNkdAmC8ujIIQB6jWpQDArcNUDFHAjwzMpBeYyXUSEc5rNmhKCcOHLIwPA6eDA3XhPpvu0YlbY2erDCeCmtDBKjjw5ZM0JQnnZAxRA67eEjYHVFFE2CkCOYaB25I4T3862ukDUnBBucgXhvLOB3LzrmUbHuGjgVtaIppDrMZ80A2ZwqW1rYQ1rdIOUsSEW0LWxUU0ijLbJmgqxPdQ4CZtt0ZLWhgdFHa5NgiNbrPcSN88FhkhxIH7DLjCOpyB6ouhhauHQzOFC6Cf3+OQqRDbLmgLyeCmK7do+I7dqlJbYHgNzNHvlL8M64+ojyz95rnG2LlIhD43eNaZ8/yPr6wK56OwE09c5oMCbhGP/LjhmryA7DULS7pNEgjAUOjqXCpQv//989KztvF7abZuNChyAUSw4cXASLxCN7rFIhhT2r/nD9WnWRnFHPtpYzY9HTFKwXcRGveuBaPT50sbpFLmpUszXLqZz+nvwpzQzHbJRgjboYHUyr53sfqZU7X1X/xhxMSv2Zq+4tklmmdMvCXPAjAsysHWeqwhf50tl4xfc+IXi7n9KlqxU2RkOe9Ynhw/tE7JqCofRbhETHSiud6RZJltIFh7z/S4RXVVEYOtyy8CPjIBrMlQ6e0jvaxaUC6A1piSwtPs+V5olOt56C+b9IniwuIoRusFFpiPGgZwZ0SkTHMNWDVZWRCAAb6YmSqL/TRMmQrddEmuGoABfd3fVdNRq4Vn27SWPBJ4ycSf7gh/h6vfAhik/I2npM40NkV0JkN0JkN0JkN0JkN0JkN0JkN0JkN0JkN0JkN0JkN0JkN0JkN0JkN0JkN0LkH/tm0/soCITx2xJeMgkXDpyEhAMGTf/f/8vtQOkIdddsNyl68LnIi9XnN4PQGno13SBX0wkgnHPAw/kgHpqyFSL0toznnCqK+rsdbby7nqoyI0GMjZsNiKzIbf0qTtjwslj7IxyBSPaSFDAGxKjIGhtAFtZfVa7dMRg2h3AM0pw4AkRgsFsQzdgkwDtqwhZscpYTp7Tgbc7JMUgSKJcyiRkAkkO3bDYMFm21H2kvkSMnHGvwajaHILrZ4zYCZBFQbNDIeZSCqkZh6nw4xC4FwH71BmIUV9CDoH4wJTVKgQf/LRDo4ynQKFkLOQVko5fZg9gySsU7iMXGZpaQ/IvTb/dArBTT3JbyQdndfMt3Qyuxp+wfQLpZwo4AWdEAgYhn4IMskezu70v3JoZKNuSkPEwPorHpOUskBUrmEwaA/LyBKEaiSPIYE9uMUkZMfbR8B+LLqeXhgzok+QkgnKG08ryJpKBlZncF8omnR46yK0MhASjl6bqngNT7qi0ldp6nvy6IBELaMmCQRk2ngTyop0mCwu70TyDT4psvOqgxILoFse3sa6m0rSOHIAvP8qbdpDsvy6CMOIo73jBsGSEkUmLMHYLo3XTtzKhnhOJOC57HA7wimhBU60BD7ROQtURoHIiv0yelYurXavQTKWP2AxDiHjS08IbFKbycCATydYirckD/tQ6fZUSa8rlBIArL0mmM21R8moQNq4v1p5aRWIhOy1L/8BmRzk0M5UaA0F8AJv72S2sxXZVp8wkIzodFMmFcvgYyz3OgSlgyhvbUYFPGIFJe+he1u0JbWOb5Pe5c5suCnec07C0KQF83sOv/Hxm4/uugqvNfB11TN8jVdINcTTfI1XSDXE03yNV0g1xNv9u7gyKAQSCKoX+h7SAE/xorgkvYyXMQBTGExhAaQ2gMoTGExhAaQ2gMoTGExhAaQ2gMoTGExhAaQ2gMoTGEplFIvhZWBud8dGC/qTQo2anMetbtMmr+pSNKc3AJjE0AAAAASUVORK5CYII=", - "description": "Displays a latest pressure telemetry data in a box layout.", + "description": "Displays the latest pressure telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, @@ -23,6 +23,6 @@ "tags": [ "weather", "environment", - "pressure" + "barometry" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pressure_card_with_background.json b/application/src/main/data/json/system/widget_types/pressure_card_with_background.json index b7d75d7426..b25d02d356 100644 --- a/application/src/main/data/json/system/widget_types/pressure_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/pressure_card_with_background.json @@ -3,7 +3,7 @@ "name": "Pressure card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest pressure telemetry data in a box layout with background.", + "description": "Displays the latest pressure telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, @@ -23,6 +23,6 @@ "tags": [ "weather", "environment", - "pressure" + "barometry" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pressure_chart_card.json b/application/src/main/data/json/system/widget_types/pressure_chart_card.json index db218a4160..b829652b7d 100644 --- a/application/src/main/data/json/system/widget_types/pressure_chart_card.json +++ b/application/src/main/data/json/system/widget_types/pressure_chart_card.json @@ -3,7 +3,7 @@ "name": "Pressure chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a pressure data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a pressure data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, @@ -26,6 +26,6 @@ "tags": [ "weather", "environment", - "pressure" + "barometry" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pressure_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/pressure_chart_card_with_background.json index 5e005284bc..7fd0a6e738 100644 --- a/application/src/main/data/json/system/widget_types/pressure_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/pressure_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Pressure chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a pressure data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a pressure data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, @@ -26,6 +26,6 @@ "tags": [ "weather", "environment", - "pressure" + "barometry" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pressure_progress_bar.json b/application/src/main/data/json/system/widget_types/pressure_progress_bar.json index 1c7c5fce59..4350226555 100644 --- a/application/src/main/data/json/system/widget_types/pressure_progress_bar.json +++ b/application/src/main/data/json/system/widget_types/pressure_progress_bar.json @@ -24,6 +24,6 @@ "progress", "weather", "environment", - "pressure" + "barometry" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/pressure_progress_bar_with_background.json b/application/src/main/data/json/system/widget_types/pressure_progress_bar_with_background.json index ac4fd7fd6b..eb7216ffd5 100644 --- a/application/src/main/data/json/system/widget_types/pressure_progress_bar_with_background.json +++ b/application/src/main/data/json/system/widget_types/pressure_progress_bar_with_background.json @@ -24,6 +24,6 @@ "progress", "weather", "environment", - "pressure" + "barometry" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/radial_gauge.json b/application/src/main/data/json/system/widget_types/radial_gauge.json index 7d793b2b87..d3da6ef045 100644 --- a/application/src/main/data/json/system/widget_types/radial_gauge.json +++ b/application/src/main/data/json/system/widget_types/radial_gauge.json @@ -11,11 +11,11 @@ "resources": [], "templateHtml": "\n", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.gauge = new TbAnalogueRadialGauge(self.ctx, 'radialGauge'); \n}\n\nself.onDataUpdated = function() {\n self.ctx.gauge.update();\n}\n\nself.onResize = function() {\n self.ctx.gauge.resize();\n}\n\nself.onMobileModeChanged = function() {\n self.ctx.gauge.mobileModeChanged();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true\n };\n}\n\nself.onDestroy = function() {\n self.ctx.gauge.destroy();\n}\n", - "settingsSchema": "{}", + "controllerScript": "self.onInit = function() {\n self.ctx.gauge = new TbAnalogueRadialGauge(self.ctx, 'radialGauge'); \n}\n\nself.onDataUpdated = function() {\n self.ctx.gauge.update();\n}\n\nself.onResize = function() {\n self.ctx.gauge.resize();\n}\n\nself.onMobileModeChanged = function() {\n self.ctx.gauge.mobileModeChanged();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'temperature', label: 'Temperature', type: 'timeseries' }];\n }\n };\n}\n\nself.onDestroy = function() {\n self.ctx.gauge.destroy();\n}\n", "settingsSchema": "{}", "dataKeySettingsSchema": "{}\n", "settingsDirective": "tb-analogue-radial-gauge-widget-settings", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Temp\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.7282710489093589,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nif (value < -100) {\\n\\tvalue = -100;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"maxValue\":100,\"startAngle\":45,\"ticksAngle\":270,\"showBorder\":true,\"defaultColor\":\"#e65100\",\"needleCircleSize\":10,\"highlights\":[],\"showUnitTitle\":true,\"colorPlate\":\"#fff\",\"colorMajorTicks\":\"#444\",\"colorMinorTicks\":\"#666\",\"minorTicks\":10,\"valueInt\":3,\"valueDec\":0,\"highlightsWidth\":15,\"valueBox\":true,\"animation\":true,\"animationDuration\":500,\"animationRule\":\"cycle\",\"colorNeedleShadowUp\":\"rgba(2, 255, 255, 0)\",\"numbersFont\":{\"family\":\"Roboto\",\"size\":18,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#616161\"},\"titleFont\":{\"family\":\"Roboto\",\"size\":24,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#888\"},\"unitsFont\":{\"family\":\"Roboto\",\"size\":22,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#616161\"},\"valueFont\":{\"family\":\"Segment7Standard\",\"size\":36,\"style\":\"normal\",\"weight\":\"normal\",\"shadowColor\":\"rgba(0, 0, 0, 0.49)\",\"color\":\"#444\"},\"minValue\":-100,\"colorNeedleShadowDown\":\"rgba(188,143,143,0.45)\",\"colorValueBoxRect\":\"#888\",\"colorValueBoxRectEnd\":\"#666\",\"colorValueBoxBackground\":\"#babab2\",\"colorValueBoxShadow\":\"rgba(0,0,0,1)\"},\"title\":\"Radial gauge\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"decimals\":0,\"noDataDisplayMessage\":\"\"}" - }, + "hasBasicMode": true, + "basicModeDirective": "tb-radial-gauge-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Temp\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.7282710489093589,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nif (value < -100) {\\n\\tvalue = -100;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"maxValue\":100,\"startAngle\":45,\"ticksAngle\":270,\"showBorder\":true,\"defaultColor\":\"#e65100\",\"needleCircleSize\":10,\"highlights\":[],\"showUnitTitle\":true,\"colorPlate\":\"#fff\",\"colorMajorTicks\":\"#444\",\"colorMinorTicks\":\"#666\",\"minorTicks\":10,\"valueInt\":3,\"valueDec\":0,\"highlightsWidth\":15,\"valueBox\":true,\"animation\":true,\"animationDuration\":500,\"animationRule\":\"cycle\",\"colorNeedleShadowUp\":\"rgba(2, 255, 255, 0)\",\"numbersFont\":{\"family\":\"Roboto\",\"size\":18,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#616161\"},\"titleFont\":{\"family\":\"Roboto\",\"size\":24,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#888\"},\"unitsFont\":{\"family\":\"Roboto\",\"size\":22,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#616161\"},\"valueFont\":{\"family\":\"Segment7Standard\",\"size\":36,\"style\":\"normal\",\"weight\":\"normal\",\"shadowColor\":\"rgba(0, 0, 0, 0.49)\",\"color\":\"#444\"},\"minValue\":-100,\"colorNeedleShadowDown\":\"rgba(188,143,143,0.45)\",\"colorValueBoxRect\":\"#888\",\"colorValueBoxRectEnd\":\"#666\",\"colorValueBoxBackground\":\"#babab2\",\"colorValueBoxShadow\":\"rgba(0,0,0,1)\"},\"title\":\"Radial gauge\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"decimals\":0,\"noDataDisplayMessage\":\"\",\"configMode\":\"basic\"}" }, "externalId": null } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/radon_level_card.json b/application/src/main/data/json/system/widget_types/radon_level_card.json new file mode 100644 index 0000000000..acc646531b --- /dev/null +++ b/application/src/main/data/json/system/widget_types/radon_level_card.json @@ -0,0 +1,29 @@ +{ + "fqn": "radon_level_card", + "name": "Radon level card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays the latest radon level telemetry in a scalable rectangle card.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'radon', label: 'Radon level', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Radon level\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:radioactive\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#80C32C\"},{\"from\":100,\"to\":200,\"color\":\"#FFA600\"},{\"from\":200,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#80C32C\"},{\"from\":100,\"to\":200,\"color\":\"#FFA600\"},{\"from\":200,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Radon level card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"Bq/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "radon" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/radon_level_card_with_background.json b/application/src/main/data/json/system/widget_types/radon_level_card_with_background.json new file mode 100644 index 0000000000..3ef3e93f47 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/radon_level_card_with_background.json @@ -0,0 +1,29 @@ +{ + "fqn": "radon_level_card_with_background", + "name": "Radon level card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays the latest radon level telemetry in a scalable rectangle card with the background image.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'radon', label: 'Radon level', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Radon level\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:radioactive\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#7CC322\"},{\"from\":100,\"to\":200,\"color\":\"#F89E0D\"},{\"from\":200,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#7CC322\"},{\"from\":100,\"to\":200,\"color\":\"#F89E0D\"},{\"from\":200,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Radon level card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"Bq/m³\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "radon" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/radon_level_chart_card.json b/application/src/main/data/json/system/widget_types/radon_level_chart_card.json new file mode 100644 index 0000000000..c9c79b1408 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/radon_level_chart_card.json @@ -0,0 +1,32 @@ +{ + "fqn": "radon_level_chart_card", + "name": "Radon level chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a radon level data by combining the latest and aggregated values with an optional simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'radon', label: 'Radon level', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'Bq/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'radon', 'Bq/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Radon level\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"Bq/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#80C32C\"},{\"from\":100,\"to\":200,\"color\":\"#FFA600\"},{\"from\":200,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"Bq/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 8 - 4;\\nif (value < -15) {\\n\\tvalue = -15;\\n} else if (value > 15) {\\n\\tvalue = 15;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"Bq/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Radon level\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:radioactive\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "radon" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/radon_level_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/radon_level_chart_card_with_background.json new file mode 100644 index 0000000000..9f77fe5bc2 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/radon_level_chart_card_with_background.json @@ -0,0 +1,32 @@ +{ + "fqn": "radon_level_chart_card_with_background", + "name": "Radon level chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a radon level data by combining the latest and aggregated values with the background image and optional simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'radon', label: 'Radon level', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'Bq/m³', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'radon', 'Bq/m³', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Radon level\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"Bq/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#7CC322\"},{\"from\":100,\"to\":200,\"color\":\"#F89E0D\"},{\"from\":200,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"Bq/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 8 - 4;\\nif (value < -15) {\\n\\tvalue = -15;\\n} else if (value > 15) {\\n\\tvalue = 15;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"Bq/m³\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Radon level\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:radioactive\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "radon" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/rainfall_card.json b/application/src/main/data/json/system/widget_types/rainfall_card.json index a231670288..9103680d8a 100644 --- a/application/src/main/data/json/system/widget_types/rainfall_card.json +++ b/application/src/main/data/json/system/widget_types/rainfall_card.json @@ -3,7 +3,7 @@ "name": "Rainfall card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest rainfall telemetry data in a box layout.", + "description": "Displays the latest rainfall telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, @@ -24,6 +24,12 @@ "weather", "environment", "rain", - "rainfall" + "precipitation", + "downpour", + "rain shower", + "drizzle", + "raindrop", + "cloudburst", + "rainwater" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/rainfall_card_with_background.json b/application/src/main/data/json/system/widget_types/rainfall_card_with_background.json index 1fe9cdb53e..dcc19b4adf 100644 --- a/application/src/main/data/json/system/widget_types/rainfall_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/rainfall_card_with_background.json @@ -3,7 +3,7 @@ "name": "Rainfall card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest rainfall telemetry data in a box layout with background.", + "description": "Displays the latest rainfall telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, @@ -24,6 +24,12 @@ "weather", "environment", "rain", - "rainfall" + "precipitation", + "downpour", + "rain shower", + "drizzle", + "raindrop", + "cloudburst", + "rainwater" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/rainfall_chart_card.json b/application/src/main/data/json/system/widget_types/rainfall_chart_card.json index 3a19b6e833..ebbc1e8cc5 100644 --- a/application/src/main/data/json/system/widget_types/rainfall_chart_card.json +++ b/application/src/main/data/json/system/widget_types/rainfall_chart_card.json @@ -3,7 +3,7 @@ "name": "Rainfall chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a rainfall data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a rainfall data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, @@ -27,6 +27,12 @@ "weather", "environment", "rain", - "rainfall" + "precipitation", + "downpour", + "rain shower", + "drizzle", + "raindrop", + "cloudburst", + "rainwater" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/rainfall_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/rainfall_chart_card_with_background.json index 75543ca962..272f96da91 100644 --- a/application/src/main/data/json/system/widget_types/rainfall_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/rainfall_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Rainfall chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a rainfall data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a rainfall data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, @@ -27,6 +27,12 @@ "weather", "environment", "rain", - "rainfall" + "precipitation", + "downpour", + "rain shower", + "drizzle", + "raindrop", + "cloudburst", + "rainwater" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/rectangle_tank.json b/application/src/main/data/json/system/widget_types/rectangle_tank.json new file mode 100644 index 0000000000..ad2c567168 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/rectangle_tank.json @@ -0,0 +1,36 @@ +{ + "fqn": "rectangle_tank", + "name": "Rectangle tank", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Widget indicates the level of liquid in Rectangle tank.", + "descriptor": { + "type": "latest", + "sizeX": 4, + "sizeY": 4, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.liquidLevelWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.liquidLevelWidget.update();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n}\n\nself.actionSources = function() { \n return { \n 'cardClick': {\n name: 'widget-action.card-click',\n multiple: false \n } \n };\n}", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}\n", + "settingsDirective": "tb-liquid-level-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-liquid-level-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"return Math.floor(Math.random() * 101);\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"tankSelectionType\":\"static\",\"selectedShape\":\"Rectangle\",\"shapeAttributeName\":\"tankShape\",\"tankColor\":{\"type\":\"range\",\"color\":\"#242770\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E73535DE\"},{\"from\":20,\"to\":null,\"color\":\"#242770\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E73535DE';\\n }\\n}\\nreturn '#242770';\"},\"datasourceUnits\":\"%\",\"layout\":\"percentage\",\"volumeSource\":\"static\",\"volumeConstant\":500,\"volumeAttributeName\":\"volume\",\"volumeUnits\":\"L\",\"volumeFont\":{\"family\":\"Roboto\",\"size\":14,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"volumeColor\":\"rgba(0, 0, 0, 0.18)\",\"units\":\"%\",\"widgetUnitsSource\":\"static\",\"widgetUnitsAttributeName\":\"units\",\"liquidColor\":{\"type\":\"range\",\"color\":\"#7A8BFF\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E27C7CDE\"},{\"from\":20,\"to\":null,\"color\":\"#7A8BFF\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":24,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"valueColor\":{\"type\":\"range\",\"color\":\"#000000DE\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FF0000DE\"},{\"from\":20,\"to\":null,\"color\":\"rgba(0,0,0,0.87)\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FF0000DE';\\n }\\n}\\nreturn '#000000DE';\"},\"showBackgroundOverlay\":true,\"backgroundOverlayColor\":{\"type\":\"range\",\"color\":\"#FFFFFFC2\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FFEFEFDE\"},{\"from\":20,\"to\":null,\"color\":\"#FFFFFFC2\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FFEFEFDE';\\n }\\n}\\nreturn '#FFFFFFC2';\"},\"showTooltip\":true,\"showTooltipLevel\":true,\"tooltipUnits\":\"%\",\"tooltipLevelDecimals\":0,\"tooltipLevelFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipLevelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.76)\",\"rangeList\":[],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"showTooltipDate\":true,\"tooltipDateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"tooltipDateFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipDateColor\":\"rgba(0, 0, 0, 0.76)\",\"tooltipBackgroundColor\":\"rgba(255, 255, 255, 0.76)\",\"tooltipBackgroundBlur\":3,\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Liquid level\",\"useDashboardTimewindow\":true,\"displayTimewindow\":true,\"configMode\":\"basic\",\"titleFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"1.5\"},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"showTitleIcon\":false,\"titleIcon\":\"water_drop\",\"iconColor\":\"#5469FF\",\"decimals\":0,\"enableDataExport\":false,\"enableFullscreen\":false,\"borderRadius\":\"0px\",\"actions\":{},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"dropShadow\":true,\"margin\":\"0px\",\"widgetStyle\":{},\"widgetCss\":\"\",\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"pageSize\":1024,\"noDataDisplayMessage\":\"\"}" + }, + "externalId": null, + "tags": [ + "reservoir", + "container", + "vessel", + "storage unit", + "cistern", + "canister", + "vat", + "basin", + "repository", + "bin", + "hopper" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_air_quality_chart_card.json b/application/src/main/data/json/system/widget_types/simple_air_quality_chart_card.json deleted file mode 100644 index ded7c3aa4b..0000000000 --- a/application/src/main/data/json/system/widget_types/simple_air_quality_chart_card.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "fqn": "simple_air_quality_chart_card", - "name": "Simple air quality chart card", - "deprecated": false, - "image": "data:image/png;base64,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", - "description": "Displays historical air quality values as a simplified chart. Optionally may display the corresponding latest air quality value.", - "descriptor": { - "type": "timeseries", - "sizeX": 4.5, - "sizeY": 2, - "resources": [], - "templateHtml": "\n\n", - "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'air', label: 'Air Quality', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'air', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", - "settingsSchema": "{}", - "dataKeySettingsSchema": "{}", - "latestDataKeySettingsSchema": "{}", - "settingsDirective": "tb-value-chart-card-widget-settings", - "dataKeySettingsDirective": "", - "latestDataKeySettingsDirective": "", - "hasBasicMode": true, - "basicModeDirective": "tb-value-chart-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Air Quality\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:weather-windy\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":1,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"US AQI\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" - }, - "externalId": null, - "tags": [ - "weather", - "environment", - "air" - ] -} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_air_quality_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_air_quality_chart_card_with_background.json deleted file mode 100644 index 0d12e00f36..0000000000 --- a/application/src/main/data/json/system/widget_types/simple_air_quality_chart_card_with_background.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "fqn": "simple_air_quality_chart_card_with_background", - "name": "Simple air quality chart card with background", - "deprecated": false, - "image": "data:image/png;base64,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", - "description": "Displays historical air quality values as a simplified chart with background. Optionally may display the corresponding latest air quality value.", - "descriptor": { - "type": "timeseries", - "sizeX": 4.5, - "sizeY": 2, - "resources": [], - "templateHtml": "\n\n", - "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", - "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'air', label: 'Air Quality', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'air', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", - "settingsSchema": "{}", - "dataKeySettingsSchema": "{}", - "latestDataKeySettingsSchema": "{}", - "settingsDirective": "tb-value-chart-card-widget-settings", - "dataKeySettingsDirective": "", - "latestDataKeySettingsDirective": "", - "hasBasicMode": true, - "basicModeDirective": "tb-value-chart-card-basic-config", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Air Quality\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:weather-windy\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":1,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"US AQI\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" - }, - "externalId": null, - "tags": [ - "weather", - "environment", - "air" - ] -} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_air_quality_index_chart_card.json b/application/src/main/data/json/system/widget_types/simple_air_quality_index_chart_card.json new file mode 100644 index 0000000000..73e0635a3b --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_air_quality_index_chart_card.json @@ -0,0 +1,35 @@ +{ + "fqn": "simple_air_quality_chart_card", + "name": "Simple air quality index chart card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAflBMVEUAAADf39/g4ODf39/f39/g4OD////k5OSAwyzg4OAhISE8PDzHx8dYWFjy8vKQkJCsrKzf8Mp0dHTv9+UvLy+v2XvV1dWCgoKQy0b3+/O6urpKSkqenp6IxznP6bCdnZ3A4ZWrq6vH5aNmZmag0mGYzlPn9NjX7L243Yio1m7USMHHAAAABnRSTlMAIL9AEN/GQiaNAAAFQklEQVR42uzPuQ2AMBAAsMtD0DXp2X9RxAaUSWRv4AAAAAAAAPivl831+LSa9+byahEln7G9mS3qHAeYNXIcIUUWI7IakZfdOlpxFgbCMHz2DcxkJhJCAkYQ8f7v8U9quuvfZXdhwaLgiyBJpzSPB8WzdUPO1g05WzfkbN2Qs/U9JBH+ktEfJo6EaOQJ+ygkAGMxPDOv64CXvCCVl6O6YPsVE2rvgozmIvZlVgApfzpEfODpK4QCQRWfDUzvhuxLjH0S2IDkQd55ex4vRzNPddtgkx82iLdBZHK+jVOf9G7yhDa0MAGP2XkE+XQghKQVvSvBds8xTu1McCyFgO2hj5yIXTsqiQaeKqSNzlGyY4cg6BCWINEgEgoTtK4y5khZ6EAIXCth9GVCLyiydkhCS1cAVfGEDIZ17ZCHUnK7npCpodt3R6btZlDlBUdC5tCTEVvG2Xl2G4Q+Ie4DUgkSdQ/x8WHukKHNDoz28cAiwlQxikMho+8t6G0/nfeQHK3tU4fUC+E/CHEpeIXYBklEBIQY6VDI0HN4prodfQehuCYnAcaZAtPMdfUBWQsBytMLxGKmzFRvyXkQL6pHQkh7krFlsgBwkkZBEsKjVJg5AZ5jELKVJShmfQwsXIC5k0chyIgkDou02brDcYJmOBkPguwb54KfIxXDt1XXG/odYsIev5Xwbb//JV3kpdE7/NCFID91Q27IVbohZ+uGnK0bcrZuyNm6IYeWchHRga4OyRw1hMIyXBuinA01UvZXhnie0Avsrgv5x57ZNbcKAmH4DnZAqQKp0FRjjB89//8PHujWVhJjzOkcR2d8bkTixT5lX7dNKZOkR/B4uyInRoc30WZFgkMQ+rJVkYidw8CIDYmI6Oc7TalFmJiX7YicNGOMv2PhXJKAWIuViggqrtMdRzTCmSEujF63WrJKEVcwY8dhbfQr3ZLxLNO3nXSMlxSxdu6w01ly4sNyZX8G55jpOCLXnNn7r0TSPwZUUGtVp4OPjem+PylzgPyATxvzMTXsLiIY3jj/pokHJvRZEVuDQ/3cp35jIHIAqAmiDHySt8QBcCB3uXDRR/hniz4K1ZHJV/xvuG9LSZ8RaQDK1Ab3gYgCh0VHA3lhSeEu9oGIYBlB3vqJnbDznIZkmnPG4izxMi90tkgB0AYbpq66oUgBxkDZP1v4a+vcH4gkvnyEc4pJ52QG9JxJeYpwLRlP5ooYuGp061IxFGngUIL5Wja4V0P+QOSCVaOBltHbi0af56Ax42+zRFKA7qNpML5IKKLcusV7C710BaCmRYa5ppI5Ykr+hTM/PhbBkgzG947IAYw/gQ90qr77MZ0QwWAMENGrIL9lWqR0IqkqcqjviBhfbenT7UWKmSLyNg//WeQAoNBHjYp0AC2exVMnoiUJWELEfCWhuBVB0dLhTyzMSDslkrAgoUuIlJBPiShAcJSYvgH/TL+1RPimXUIEa8bLmEjhivX4g/HWuK/c7oSIkGHUFxHxP2XrR7bxHVMEIjeTw+ZglPNoANR9EXoMf69dQgSLNnUO0H0GuwpEBvGu/JZ/ws95fzx3RU5aRyRkERHS+cLyDusvQhF8p3ksVq1q8OTqnojIbiffAiJIm7a4UIr0C4vl4w5uKbymaerUq/6pkFc+3VYr+xJbGWjs+J/kfKytViviIjPq4dpKkFvWLDJO9k5G2ZzIOLvILrIVdpG1sYusjV1kbewia2MX+dvOHdMAAMIAEAw0DJWAf6MggbE0dw7ewFcjpJpGIW2WO5ENSnaOu6Va/2+pZnQahQEAAAAAADw5GwP+5BKRDqYAAAAASUVORK5CYII=", + "description": "Displays historical air quality index values as a simplified chart. Optionally may display the corresponding latest air quality index value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'air', label: 'Air Quality Index', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'air', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality Index\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#80C32C\"},{\"from\":50,\"to\":100,\"color\":\"#FFA600\"},{\"from\":100,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":200,\"color\":\"#D81838\"},{\"from\":200,\"to\":300,\"color\":\"#8D268C\"},{\"from\":300,\"to\":null,\"color\":\"#6F113A\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Air Quality Index\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:weather-windy\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":1,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"AQI\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "weather", + "environment", + "air", + "aqi", + "pollution", + "emission", + "smog" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_air_quality_index_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_air_quality_index_chart_card_with_background.json new file mode 100644 index 0000000000..efc1b71eb2 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_air_quality_index_chart_card_with_background.json @@ -0,0 +1,35 @@ +{ + "fqn": "simple_air_quality_chart_card_with_background", + "name": "Simple air quality index chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical air quality index values as a simplified chart with background. Optionally may display the corresponding latest air quality index value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'air', label: 'Air Quality Index', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'air', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Air Quality Index\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 320) {\\n\\tvalue = 320;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":50,\"color\":\"#7CC322\"},{\"from\":50,\"to\":100,\"color\":\"#F89E0D\"},{\"from\":100,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":200,\"color\":\"#DE2343\"},{\"from\":200,\"to\":300,\"color\":\"#7B287A\"},{\"from\":300,\"to\":null,\"color\":\"#791541\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Air Quality Index\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:weather-windy\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":1,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"AQI\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "weather", + "environment", + "air", + "aqi", + "pollution", + "emission", + "smog" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_ground_temperature_chart_card.json b/application/src/main/data/json/system/widget_types/simple_ground_temperature_chart_card.json index 01567fb8a7..7e3acf21ff 100644 --- a/application/src/main/data/json/system/widget_types/simple_ground_temperature_chart_card.json +++ b/application/src/main/data/json/system/widget_types/simple_ground_temperature_chart_card.json @@ -24,9 +24,17 @@ }, "externalId": null, "tags": [ - "temperature", "weather", "environment", - "ground" + "soil temperature", + "terrestrial temperature", + "subsurface temperature", + "earth temperature", + "below surface temperature", + "surface temp", + "soil warmth", + "land temperature", + "geothermal reading", + "ground warmth" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_ground_temperature_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_ground_temperature_chart_card_with_background.json index 6bacc358a2..722c95c709 100644 --- a/application/src/main/data/json/system/widget_types/simple_ground_temperature_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/simple_ground_temperature_chart_card_with_background.json @@ -24,9 +24,17 @@ }, "externalId": null, "tags": [ - "temperature", "weather", "environment", - "ground" + "soil temperature", + "terrestrial temperature", + "subsurface temperature", + "earth temperature", + "below surface temperature", + "surface temp", + "soil warmth", + "land temperature", + "geothermal reading", + "ground warmth" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_humidity_chart_card.json b/application/src/main/data/json/system/widget_types/simple_humidity_chart_card.json index e3870774cd..32dc860380 100644 --- a/application/src/main/data/json/system/widget_types/simple_humidity_chart_card.json +++ b/application/src/main/data/json/system/widget_types/simple_humidity_chart_card.json @@ -26,6 +26,15 @@ "tags": [ "weather", "environment", - "humidity" + "moisture", + "dampness", + "wetness", + "humidness", + "moistness", + "dew", + "water vapor", + "condensation", + "dew point", + "steaminess" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_humidity_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_humidity_chart_card_with_background.json index bd2a4181b4..e5f8c1c079 100644 --- a/application/src/main/data/json/system/widget_types/simple_humidity_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/simple_humidity_chart_card_with_background.json @@ -26,6 +26,15 @@ "tags": [ "weather", "environment", - "humidity" + "moisture", + "dampness", + "wetness", + "humidness", + "moistness", + "dew", + "water vapor", + "condensation", + "dew point", + "steaminess" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_illuminance_chart_card.json b/application/src/main/data/json/system/widget_types/simple_illuminance_chart_card.json index 831ebac2da..f2490a6a1c 100644 --- a/application/src/main/data/json/system/widget_types/simple_illuminance_chart_card.json +++ b/application/src/main/data/json/system/widget_types/simple_illuminance_chart_card.json @@ -26,6 +26,14 @@ "tags": [ "weather", "environment", - "illuminance" + "brightness", + "luminance", + "luminosity", + "light", + "light level", + "light intensity", + "lux", + "candela", + "foot-candle" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_illuminance_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_illuminance_chart_card_with_background.json index 0549e98e77..bf5727d8d3 100644 --- a/application/src/main/data/json/system/widget_types/simple_illuminance_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/simple_illuminance_chart_card_with_background.json @@ -26,6 +26,14 @@ "tags": [ "weather", "environment", - "illuminance" + "brightness", + "luminance", + "luminosity", + "light", + "light level", + "light intensity", + "lux", + "candela", + "foot-candle" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_leaf_wetness_chart_card.json b/application/src/main/data/json/system/widget_types/simple_leaf_wetness_chart_card.json index 9dc2ce8fe3..f4c88ec08c 100644 --- a/application/src/main/data/json/system/widget_types/simple_leaf_wetness_chart_card.json +++ b/application/src/main/data/json/system/widget_types/simple_leaf_wetness_chart_card.json @@ -26,7 +26,10 @@ "tags": [ "weather", "environment", - "leaf", - "wetness" + "dew", + "leaf moisture", + "foliage dampness", + "leaf humidity", + "foliar moisture" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_leaf_wetness_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_leaf_wetness_chart_card_with_background.json index 9a2fc593e0..39fb317de1 100644 --- a/application/src/main/data/json/system/widget_types/simple_leaf_wetness_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/simple_leaf_wetness_chart_card_with_background.json @@ -26,7 +26,10 @@ "tags": [ "weather", "environment", - "leaf", - "wetness" + "dew", + "leaf moisture", + "foliage dampness", + "leaf humidity", + "foliar moisture" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_noise_level_chart_card.json b/application/src/main/data/json/system/widget_types/simple_noise_level_chart_card.json index 0e94d387e5..7679986f24 100644 --- a/application/src/main/data/json/system/widget_types/simple_noise_level_chart_card.json +++ b/application/src/main/data/json/system/widget_types/simple_noise_level_chart_card.json @@ -26,6 +26,13 @@ "tags": [ "weather", "environment", - "noise" + "sound level", + "acoustic level", + "decibel level", + "volume", + "loudness", + "ambient noise", + "sound intensity", + "acoustic intensity" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_noise_level_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_noise_level_chart_card_with_background.json index 715d0d46ba..f13f2ec236 100644 --- a/application/src/main/data/json/system/widget_types/simple_noise_level_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/simple_noise_level_chart_card_with_background.json @@ -26,6 +26,13 @@ "tags": [ "weather", "environment", - "noise" + "sound level", + "acoustic level", + "decibel level", + "volume", + "loudness", + "ambient noise", + "sound intensity", + "acoustic intensity" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_pm10_chart_card.json b/application/src/main/data/json/system/widget_types/simple_pm10_chart_card.json new file mode 100644 index 0000000000..1b0c1126df --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_pm10_chart_card.json @@ -0,0 +1,40 @@ +{ + "fqn": "simple_pm10_chart_card", + "name": "Simple PM10 chart card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAhFBMVEUAAADf39/g4ODf39/f39/g4OD////k5OT/pgDg4OAhISH/9N//3Z90dHT/vEBYWFiQkJD/6b//0oD/sSDy8vIvLy//+u//qxA8PDzHx8eCgoK6urr/x2CsrKz/zXBmZmb/78+rq6v/2JDV1dX/tzCenp7/wk//469KSkr/x1/29vb/2Y/dngZsAAAABnRSTlMAIL9AEN/GQiaNAAAEoElEQVR42uzPwQ2AIBAAsBMQc3+mYP8BjRv4BNJu0AAAAAAAAPivXZtr8akln83lXSOunH17I2uU0Q8wS2Q/QoosRmQ1Ii/7daxiMQhEYbg7AweGsVAwkRAkCHn/J9wkF26ysNYa1r9Suw9UtLcGpLcGpLcGpLcGpLf+BURwl1R13oBFNxypegBTAeCdqaB5dYjsjOk7c3RuZYLSTgEpcOEaa1zW2P6XWYdEksHfEABm0HiuaTghkxngmSGc0Lg6xPMs/YKsBrVQgDBTPrAPggsaV4cg8EieW0tZoOYMS5xeApHAkkk63BAzzYCa52S6vASykhGSNjwguFKDKeUJSfBMaFkd4kiDT/gTkmi4ITDbHNvfv5Uzkp2HsuBbibiaV/g9I0U5VSsAiQwZzTshlUpsv2HGE+W9DUhvDUhvDUhvDUhvDUhvDUhvDUhv9Q1JFhhUXg9R7rPTwPxyiKPDkexhezXkhz07Wk4UhsIAfHf4J4FAEkgQlbKUis6+//stJhS2U6FwwRRn/C80RDqTD3NIqAGLfCPN4qeGnNk7+RRZ+syQt5z6HNj5mSFZNDbjJ4Skh7T/Go5E49x6NkgaMcYKN3jmB+9Rh2eDRCw5RndJkMdfptn+Iek5OaZfb7kJy6MsC4gm5tYqCDdj23DaLH8yxsYfKyMWuM44fxsWwXFurYfw0gJaeUutAXtaZLloQ98jBazgU6ve9UCH/HPtziemkFsT10O4BrQFBHVRgLVAY352cDQPe215g5haLFI3Tg84T174DxYFRGmSs+wtWAy5QUsnaIk4cDEUAupnSI2QvsdITgQ9u1hEvgbyfGbjxeJrxuIkylmyFAKcqItFSXcC79pi4pKaStIQDe4bXFbUpZLGn6QEanqUd3bsa6C7zmkxt88NijguAqL7addgcbEPkBKNv9ggl9A3VP9mAR0CTiMdFlACgOahBVA6l9BaTcyYYLjgecaSpTeI/LgC0gLt8FWEAP8GcfUjNHrIDaGDWNenYYVF12W4IWpg5vdTQRIVB1qYIL8uhdTqBCiah3BAmA7QQzSMg2jfdyHitnuVaKS0mCiRrR91NYCGz0Jcu+ra0kOkryzv7z+6QBCVAGz9uET+bA1pQ6Wh+TxEwdIIuaHtIeP5J/fXvG3N1CPHphAf7or9MgM5QY8QA00TkLlHju0hbpzuZfKuVcKOkBCntZAgjzaFcCAkXx5OYNy8aQYIf1gjAnItpGDBphCyrs4rty4aoHQ21UPcsdFA92rdOC93CIemlZCEJbQt5C9gRQNX7FQCQljX9hB/DPgTtWvLrl+thBSdY2MIhRpd+h2r6tsDRAP2MpQKbHmHNODrIJFzbF7slZRm3PVJPhqB7tgYzj93VaYFKj6MmLsnGfe5f9vesf4J0UNoCK/J1YimKqxoebxjR5AGWikxvcWfrY89QbiG336shnzQb0N4GNJ/kXUdGtpBfv+/KC/IC7LvvCB7ywuyt7wge8sLsrf8a+cObgCEYSAIGltE8p8q6L9AWkDiQRLNdHAF3BoyG0Nm05EbpIPGuDKq/791fnb3EVHn+lmqrJ1CYQAAAAAAAK88ZP333TfpRkYAAAAASUVORK5CYII=", + "description": "Displays historical fine and coarse particulate matter (PM10) values as a simplified chart. Optionally may display the corresponding latest PM10 value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm10', label: 'PM10', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'pm10', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#80C32C\"},{\"from\":20,\"to\":50,\"color\":\"#FFA600\"},{\"from\":50,\"to\":150,\"color\":\"#F36900\"},{\"from\":150,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"PM10\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"bubble_chart\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"µg/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10", + "coarse particulates", + "coarse particles", + "particulate matter 10", + "inhalable particles", + "larger particulates", + "dust", + "airborne coarse particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_pm10_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_pm10_chart_card_with_background.json new file mode 100644 index 0000000000..59e71a6fa3 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_pm10_chart_card_with_background.json @@ -0,0 +1,40 @@ +{ + "fqn": "simple_pm10_chart_card_with_background", + "name": "Simple PM10 chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical fine and coarse particulate matter (PM10) values as a simplified chart with background. Optionally may display the corresponding latest PM10 value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm10', label: 'PM10', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'pm10', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM10\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 100 - 50;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":20,\"color\":\"#7CC322\"},{\"from\":20,\"to\":50,\"color\":\"#F89E0D\"},{\"from\":50,\"to\":150,\"color\":\"#F77410\"},{\"from\":150,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"PM10\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"bubble_chart\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"µg/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "particulate", + "matter", + "air", + "pm10", + "coarse particulates", + "coarse particles", + "particulate matter 10", + "inhalable particles", + "larger particulates", + "dust", + "airborne coarse particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_pm2_5_chart_card.json b/application/src/main/data/json/system/widget_types/simple_pm2_5_chart_card.json new file mode 100644 index 0000000000..e4c1232dd4 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_pm2_5_chart_card.json @@ -0,0 +1,41 @@ +{ + "fqn": "simple_pm2_5_chart_card", + "name": "Simple PM2.5 chart card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAhFBMVEUAAADf39/g4ODf39/f39/g4OD////k5OSAwyzg4OAhISF0dHTv9+U8PDzP6a+QkJDx8fFYWFjf8Mr3+/Kg0mEvLy+/4ZWQy0aIxzmCgoLHx8e6urqv2XtKSkrV1dWenp7H5aOsrKzn9Nirq6u43YhmZmaYzlOo1m7X7L2n1m719fWQykb4eF0NAAAABnRSTlMAIL9AEN/GQiaNAAAEq0lEQVR42uzPwQ2AIBAAsBMQcz/mYP8BjRv4BNJu0AAAAAAAAPivXZtr8akln83lXSOunH17I2uU0Q8wS2Q/QoosRmQ1Ii+7daxiMQhEYbg7A2cQncIiShQJef9X3GsWcndhmxQbDNcPLHSqHyxmNDNkNDNkNDNkNDNkNB8RInjLqroUoGnBi2qALKaCg+9TXHJfiKx0+bx5er8zQ2kAEilwa1tjQBdt4BBHMoZ3CAAzqOtvGimZBf10TLjsrpDALv8K2Q1qsQJxoeCl8SgVqvqAS24LQeSL/Pxaygo1b2guHRNxHl1ZlxoN19wSIpF1I+nxDjHTDVALTKaN0jsUp8qAK+4J2UkHyQUnTxzUYErpIWFd8a1koA0Z4klDyPgzJNPQQ9aYUxLUhMQq5nDJPSHYfICy4lQdDsuOsG7ITsR1Fc4D3tEEl9wU0lWX8RwfsaI8ygwZzQwZzQwZzQwZzQwZzQwZzQz5d6F53+TxIWHhQeXZIeK4FEAWOnl0iDLhUKI9OeSLPXPbbRwEAujbZITBFzABX+vNxWnU//+/nZgs9taOam+1riPlPGAzUIlTGEBxzqL+97L8iUUCHft3nTyxiAjAE7H4aUVyVoAnZtGTidRF7lcWDEjEU4nsEsaYKIYrq0/3JxKJhY7yQrC6y4riryadbVgkP4sq2A1Tuu502DlIPidFpuNviCgO/5GAaRowO4LDf2qJs0onx4enynKRxiDacpbLxSgYI1O06cO/j1jkPrfWPrCDxyS6/keRPWmQiplhwrGdjNpTiekX50Ssg35CHkPN+i2+3YcTzVjya74IR7wqCBFP8CUNhjBGSQ6AHw/Pidyv/hkTQiYBY1WlWZJFmWDVbq7IO+KBHim2MIU6SPAY5Hd7eQDiIJXrtE+xgWn8OVGz5GZSsAC+IM+Sc+b0j4JF8TyRELvRXTD1dbfg3MMiGgp1NrLrg0jDpigPLd7nkafG7GEace7PCBFECatiWADNjyhmiSh7Gww3VI5FqLSpwbtIiWEnYruYoSaLFFJcAbSopgfCjv37WTOx+Bv9TlTzkr1BvJQWWzUW4YipIoG7iEHViRgXu1IHS6XEVkqLMEX3JfXbzBNRJd44wFgkdGHpRCSW4JYW+KZuRZ4Q0TYwSVJRsY5Ii6YJSUaORKiw0IuU+D4Qcanltl3+/q5gGpbBt1mU7Fc0Y5ESP3oRRT0eiDymcJvvGiIXbL3PZ5HTcEZCLJeLCAHECiL+v94MRPhkjqQoF4tEbs9aRYQMQgBlBkvr1NWRStuN83IT4dRhoUic3W+AK4i4IaepRWy8iKujszTdu6T4fqHIrvIea4gAL9Ftn17EUPXqUwXt6SbSIl8mUgt9BMcqIoSSkg93MaorxfmfW5W6Xce4HzHnikrX7h6THLWowbOGiMeLgIc3bmMzcAgPsIRoeG/9eZEWzX6fusW0iIxl0PPzItz4/Fko8gYjVhbhYQgDZNOECjbGVn4Oeom8RLbKS2RrvES2xktka7xEtsbvdu6gBkAgBoBgacMl/aED/wKxwPOumXGwBlbIboTspiMHrIPWejKqB8yD3r4i6j5/S5U1aRQGAAAAAADwywcmOfeID1PhnQAAAABJRU5ErkJggg==", + "description": "Displays historical fine particulate matter (PM2.5) values as a simplified chart. Optionally may display the corresponding latest PM2.5 value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm2.5', label: 'PM2.5', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'pm2.5', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#80C32C\"},{\"from\":10,\"to\":35,\"color\":\"#FFA600\"},{\"from\":35,\"to\":75,\"color\":\"#F36900\"},{\"from\":75,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"PM2.5\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"bubble_chart\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"µg/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air", + "fine particulates", + "fine particles", + "particulate matter 2.5", + "airborne particles", + "microscopic particles", + "respirable particles", + "aerosol particles", + "dust particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_pm2_5_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_pm2_5_chart_card_with_background.json new file mode 100644 index 0000000000..20d719cfb4 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_pm2_5_chart_card_with_background.json @@ -0,0 +1,41 @@ +{ + "fqn": "simple_pm2_5_chart_card_with_background", + "name": "Simple PM2.5 chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical fine particulate matter (PM2.5) values as a simplified chart with background. Optionally may display the corresponding latest PM2.5 value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'pm2.5', label: 'PM2.5', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'pm2.5', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"PM2.5\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 120 - 60;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 500) {\\n\\tvalue = 500;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":10,\"color\":\"#7CC322\"},{\"from\":10,\"to\":35,\"color\":\"#F89E0D\"},{\"from\":35,\"to\":75,\"color\":\"#F77410\"},{\"from\":75,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"PM2.5\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"bubble_chart\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"µg/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "pm2.5", + "particulate", + "matter", + "air", + "fine particulates", + "fine particles", + "particulate matter 2.5", + "airborne particles", + "microscopic particles", + "respirable particles", + "aerosol particles", + "dust particles" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_pressure_chart_card.json b/application/src/main/data/json/system/widget_types/simple_pressure_chart_card.json index 5813b377cd..0fc417e8f3 100644 --- a/application/src/main/data/json/system/widget_types/simple_pressure_chart_card.json +++ b/application/src/main/data/json/system/widget_types/simple_pressure_chart_card.json @@ -26,6 +26,6 @@ "tags": [ "weather", "environment", - "pressure" + "barometry" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_pressure_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_pressure_chart_card_with_background.json index 817dd610e2..7db7606182 100644 --- a/application/src/main/data/json/system/widget_types/simple_pressure_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/simple_pressure_chart_card_with_background.json @@ -26,6 +26,6 @@ "tags": [ "weather", "environment", - "pressure" + "barometry" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_radon_level_chart_card.json b/application/src/main/data/json/system/widget_types/simple_radon_level_chart_card.json new file mode 100644 index 0000000000..772b3e7b51 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_radon_level_chart_card.json @@ -0,0 +1,32 @@ +{ + "fqn": "simple_radon_level_chart_card", + "name": "Simple radon level chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical radon level values as a simplified chart. Optionally may display the corresponding latest radon level value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'radon', label: 'Radon level', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'radon', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Radon level\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#80C32C\"},{\"from\":100,\"to\":200,\"color\":\"#FFA600\"},{\"from\":200,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Radon level\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:radioactive\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"Bq/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "radon" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_radon_level_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_radon_level_chart_card_with_background.json new file mode 100644 index 0000000000..666a71acd1 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_radon_level_chart_card_with_background.json @@ -0,0 +1,32 @@ +{ + "fqn": "simple_radon_level_chart_card_with_background", + "name": "Simple radon level chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical radon level values as a simplified chart with background. Optionally may display the corresponding latest radon level value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'radon', label: 'Radon level', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'radon', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Radon level\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 75 - 37.5;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 300) {\\n\\tvalue = 300;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":100,\"color\":\"#7CC322\"},{\"from\":100,\"to\":200,\"color\":\"#F89E0D\"},{\"from\":200,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Radon level\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:radioactive\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"Bq/m³\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "radon" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_rainfall_chart_card.json b/application/src/main/data/json/system/widget_types/simple_rainfall_chart_card.json index 2fcc6ca760..57f8b346af 100644 --- a/application/src/main/data/json/system/widget_types/simple_rainfall_chart_card.json +++ b/application/src/main/data/json/system/widget_types/simple_rainfall_chart_card.json @@ -27,6 +27,12 @@ "weather", "environment", "rain", - "rainfall" + "precipitation", + "downpour", + "rain shower", + "drizzle", + "raindrop", + "cloudburst", + "rainwater" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_rainfall_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_rainfall_chart_card_with_background.json index 9b3d56233b..35ea16355e 100644 --- a/application/src/main/data/json/system/widget_types/simple_rainfall_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/simple_rainfall_chart_card_with_background.json @@ -27,6 +27,12 @@ "weather", "environment", "rain", - "rainfall" + "precipitation", + "downpour", + "rain shower", + "drizzle", + "raindrop", + "cloudburst", + "rainwater" ] } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_volatile_organic_compounds_chart_card.json b/application/src/main/data/json/system/widget_types/simple_volatile_organic_compounds_chart_card.json new file mode 100644 index 0000000000..5729a2166d --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_volatile_organic_compounds_chart_card.json @@ -0,0 +1,32 @@ +{ + "fqn": "simple_volatile_organic_compounds_chart_card", + "name": "Simple volatile organic compounds chart card", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAilBMVEUAAADf39/g4ODf39/f39/g4OD////k5OTYGDjg4OAhISHdNVH1xc08PDzHx8fmboIvLy/j4+Px8fH64uZYWFiQkJDiUmrsi5t0dHSsrKxKSkr98fOenp6CgoK6urr409rV1dXaJkXnb4LpfY/kYHZmZmbfQ13wqLTi4uLzt8Humqj19fXgRF3tmqjcQRJrAAAABnRSTlMAIL9AEN/GQiaNAAAEn0lEQVR42uzPwQ2AIBAAsBMQw5cpSNh/PxMn8Amk3aABAAAAAADwX7k2V75GTuPZ3LhzxDVm3V4fOVKvB5gpWj1CE1mMyGpEXvbrZtVWGAbD8OwbBBKS0kJbrHTS+7/F4w9nOXHtqXHvPoiCo7wYQb2ZId7MEG9miDczxJu/EZI7bgTDyTz9kv0U0ql8hqcGQKjAIhGvADoTcYcXtyGmglJKTb0FnCIDyGRglj60w3RYr+rmodyGhBqLxsgtfwZdSAAeWPdr0IZEBggLJNZseNxtCIJqAYyoX3fSsVmJsIkVg3EwasIRj7sPQWJsRsVHrGgK5DOE9+PQaYEJHvclJPACdNJrQiHjDCQKe0hEZpySUnS7WoAQs6Z0lQQdJIDsJ9N8FgmtwSBV8bhvIQuLjBxix3+NGJvK61rVELTKWhnr1pIZj/sSIrSc638RbthYJjryrBJFO1arOn5HkgEoDnZ/fmu91QzxZoZ4M0O8mSHezBBvZog3zkPMwi8ICUmJKMrbQ4xplJKY0stDWAW7TPLqkH/smeGOqjAQhf9NJqVVoFCqKCyKEM3d93+9O23XCd5AJO7NihtPsuGUNpvz7XTKiht+87zdvjTISQHw69pXBoktN73IXxhkNShDFr8eSPrxEYz14XlvvRrILhZCJc6p04Au3r8YSC5stVGOZBfOLN5biwdZ5XkFLGX992XqlInt7VG8+q8geuhLuCtj+jsP70yQVHKbN7FK5SmweG89AlJ+GhmcLLqQ3CDi9WbRIEYF3BHinSUqrii+UunXUMGEbJw8AlKeXWjpXEEu8hwRGX+XdERsCOX4TZCV2PCrf1JFwwklSlVuZRYLZZPZIJQxRJbeeJA1Rhp0hx156RMWtOR7IHsRrnHG3xxPkwiVKRHvcyvi3VwQNJ/nANKsZRtAEC8BofZQnndYklLW7LXzAYS8hill2fU5kQOkey7IqDanzO7S0Fg2mbm1fGLpXUjNY8QeoMMWSK0rT6jW4egq5+JHeDTOaw+ydr6dQElFzqWJs5hG80TgqpoFwsGdGKTm3UJheSYYxI4iN5rmnO+IpAQg23R0w8CoKrFiazO7gtlK1PZRkDOiHoAU/4JIv4T4Il+Mwu9E9P5Is1Mt8rgeBemnQdgYd4nwAOAu7bXZy2bieNtmCwUpED0I3wogrqUmWuQJIPIW5DgG0k+AGDQTLfIEkJpPrQuHbdFMVqS9D2IVPAHEEfDtNXYAnJlBWuwGPWIYZLxHdiL/YRDuZO3/0Dx5QTzzqVX7oh0cQaP9XH89tQpaN8axhaeA1A1GpqF8gQrNH/oBBqFxiB1dPYTniPdjnzyy9DkgICOX6+K9XiOpLYGXDJ7spnUs2oNcIu9HOCzAj4CA1mUwpb7mqGVd8rSUzjMI/39FPeIW8u+opR6rx344XMxL7K+iMcg9WdfnvwBk7zl+A8gOSEsEkf2Z/bmXMEtLBFmC3iBL0xtkaXqDLE1vkKXpDbI0vUH+tnNHNQACMRAFSxtOACouwb8/LBC+SjPjYAXs68aQbgYNyQHpoLWujNptTpHf3fuIqPP/WaqsSaEwAAAAAACAVx6ocPyABDUGtwAAAABJRU5ErkJggg==", + "description": "Displays historical volatile organic compounds (VOCs) values as a simplified chart. Optionally may display the corresponding latest VOCs value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'voc', label: 'VOCs', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'voc', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"VOCs\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#80C32C\"},{\"from\":500,\"to\":1000,\"color\":\"#FFA600\"},{\"from\":1000,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"VOCs\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:molecule\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"ppb\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "vocs" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/simple_volatile_organic_compounds_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/simple_volatile_organic_compounds_chart_card_with_background.json new file mode 100644 index 0000000000..d98b64afc2 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/simple_volatile_organic_compounds_chart_card_with_background.json @@ -0,0 +1,32 @@ +{ + "fqn": "simple_volatile_organic_compounds_chart_card_with_background", + "name": "Simple volatile organic compounds chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays historical volatile organic compounds (VOCs) values as a simplified chart with background. Optionally may display the corresponding latest VOCs value.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 2, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueChartCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.valueChartCardWidget.onLatestDataUpdated();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.valueChartCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.valueChartCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '300px',\n previewHeight: '150px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'voc', label: 'VOCs', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)'}\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent) {\n return [{ name: 'voc', label: 'Latest', type: 'timeseries'}];\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-value-chart-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "", + "hasBasicMode": true, + "basicModeDirective": "tb-value-chart-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"VOCs\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"layout\":\"left\",\"autoScale\":true,\"showValue\":true,\"valueFont\":{\"family\":\"Roboto\",\"size\":28,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"32px\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#7CC322\"},{\"from\":500,\"to\":1000,\"color\":\"#F89E0D\"},{\"from\":1000,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQoAAACACAMAAADESdfxAAADAFBMVEW3y9S7zti4zNa90du5zNa1ydK2ytO6ztfC1uC0yNGzx9G/1N+80Nu80NmyxtC7z9rB1d+2ydS7z9m90dy80Nq3ytS/0tu5zdfB1+K3ydW+0t24yta6ztmxxc7B1eC/096+0ty1yNO/0t3A1N6wxM2/09zA1uG4zNfA1N25zdi0x9LD2OK9096/1eC3y9a+1N+5y9e2ytWvw8zD1+G80t26zdjC2OPA1uC+1N66zde2yNPC1t+xxc+70dyuwsvE2eO1ydS7ztnA1eC0yNO2ytLG3Oa1ydHF2+XE2uO6zNW90tzK4OrI3+nI3ei80ty8ztbN5O7+//+zxc+0xc3E1+CxwcnW7veuvsatvcXX6/HI3ea5ytO2x8+ktLuzyNGntrzZ8vrY8PnL3+i5zNSdq7HM4+2yxM2ouL6bqa/L4eu1xs+1x9GQnaPb9PzT6/XQ5/HK4ey4ydGtwMiqucDm+fzI2+Sjsrj8///2///R6fPO5vC80Nixw8ytvMKqu8KWo6ru/v7j9vnj7/Pg7fHE2uWgr7aSn6X5///V7fXl8fTR5eyzw8qerbPf+f28ztqwwMff9vvm8/bO4+zH3efL3uWOmqDz/P3v+/3q+fzb8ffP5u/Q4emoucGKl53G2uPG19+ap63y/v/r/f7S6fHp/P3a7PHW5uvM4enJ2uDC0tnAz9a8ytGgrrSXpazo9fjf8/jc6e6/0dmqvcTm+/3i+Pzf8fXU6O7Y5+2ltr7c9v3Z7vW7zdiyxtGUoqje9Prj8/fP3+XI3+jV4+f0+vvq9/nc7/W3xcukmpLi+/7D1NuZqbC1qaDM3OK+zdO4v8Kwpp7a5erI1Nq6w8fCwLyqoJju9/nD1d+5x820wMWms7jHvLPu8/T49OvUzsiuur/Mw7uzubu0srC3rqb8+/i/1uHM1dfo4Nbi29PKx8K7uLPBuLC7sqmuqaTr7u307uTS3eDu5dvEx8aFkZaek4uRiICFe3Th5+nu6uTg4d1vaGLa4ePK0NLDy82akIh6cmv39vJ397y/AABIQUlEQVR42mRYB2wcRRQdn2/H3gUOH3gC1mFgE0eEBR3eGAhZThjEccQECNgYOyS2gQQbbEtgJ4EAtkMNxYjQm2x6h9CLRS8CRO+9C9GbRBcgxHt/djkBf2f+/zNrJN7b9//MRe20006zMWHMZmNwo2E2rQEBk099Q0OhoaEBAVYo1ItlsEQoZAqZTD2eDBLYwStXHrjn9tso5jTPc32TStfusfec7efttef8fY455pijjz58n0Pmz59/yLmPHrbVbjPWO9btb1/T0dE+3rt48aKBtDKREzmeM+PWi2dMrB48o33ACQLfcYPAdVzX82kO3c5ZGCJ8FERZJo6sMLmH4OP5n9XJSP5MMmV5oLcsCBuJJUwICYIeGUAXhAjO2Lm3P50mDZypi/Y9Zf9tU5vssEFl5R41c+btvuf8+fscss8+hxwxf6/ddm+urlmnetOaph0rd2xRLb0jHWOdnR3t7W1gYEmkdeQ4gevhKbkYnps+/urjZz6zbKgN+4HrBo7rOzA/8l2QQaSAj6WgkQVzn0BJgcO95C13iJ8m78s5LKAqysIoExETgEjw9AyWDutf/v7NkQL44Hjk8asPOvqIWpFAffUpRx11ceXw1NTwosodanas2WxW7RZzt9B6iy02nLH+rFkbVWbah/u6unp6lnWuaVs8tERpxy85LswDB/jyHiKfAM/MKxbefWGx/6aOjA89OJHr1mU9xCyowQQc4KSrIy++BZt88KgMnUuZkQ2yLylzrgIVM1GmIPEWPjyN+G1ALBC+9/h3X38US+OlU+46Yu8t9959jpfx1NaXLH/inoOnjS9btmak38sMtFRuuGNt7UylS8NjfUe+3dM3uqYdDCxq0RrYul2iBg3dQOoFJARIuVFySqiGux+enj1x4ZKZox3A7ZILRN93syXQgIzgkcGQ0QKgrQMzRBmjrmPGKbATemLP9/Bw6r/lgUAa7LCVgZQkcGaEExZI4fcvXvuoIeNBCM8dtXze7Imx2UvmzNt4n6P3OeyAmppZ0264fb8VO1TOUsVS59RUV0/fso72trahRYsW4bMD/K5AzIeY6WzKV0GypO14xXl5f8VFquLYnhGqIsCEY21EDlA5htgFaZ141AeQ0+Jgc5l01pff5Opo5CJUUhTCQpz9o4i4NjJCAxyNRLA5wLe+9cJ4QZrlu1fMv+OZtUu7hp2ZBxz26AHn7H77tFLv7Dv6JiZAwDgUUNSQgNvtiQIChqQGAE+iGNokSZAZOMzNww+fGbmVK2vcyiV9BddB44Qg8Nr2C2dg0ZDjA7STxYgi4k8KhJMKwCRPEu1OuVWUlUJT1IQlIqkOYQGQGRmsSatEQMwIG8gKGSbuUXc5z0xOrl7a1RHNWq++c2xsDE1gaKio5ppFrnYscHiMchAxSJoY6gEQSU6pBFa8wCntftyKrOvqCw4u+jXjd+BMKYENmjQC5/lPf/vt05v6dRRZTRAosyjWiWwCNJIyO+XCsNVhsxBU/KdZYpAA+HKTgEckCTbK0VnAhCFdcMp9E5M//DB4+c197VVzW6ZVzJ3btOKNKvQNWq/napLBmUCnL5sVC0nATIykeOr4u+938Oa0hcpRTRM7kYSSTzaiEni54d1P3nvvsy8+agOO8gen3JkhcMkIS5zdYWZ9DsucfaPkJkEOEkISFhgtEUyYJZYhGZYJwbvyqonzf5hcfejJfWP9M3eb1h95O+x1ppsBPkLsbW3F/7ugp7MTH72E788JLXACpbjAxacPJHcPvvJSg1C69uyUU6o4dqqVZYFz1EBqkMIv++773YcvPvXNWxG+fFQX4tBkBmRRSC447ShDlwQWd4hEGPQqOT3orAkNDMKBpYGDxpsDAxL42E67ePjB8wcvP+Ptnp6OadNb0Uk3P8B4AWkS4PWFVjcSMoQPnBqJOTID2xiECz6kgxsVx19zv0O79MIK7Gxe7IukOOA1k2/33ffzH//6+amPXBa9g2k0O0NEyPLEQHM+F9ZyOcGdkMEdvKQwVFkMuGNKk8C0WrAFwdbAULCjIROrQWRR7wH4YxdV3bxq7c1g4sgjh1sc4N96hZGKKNmbQjTQWsgQoTVsEilcskU+8F52SYRY6fSrq7XjQyQVK+fgb3VTZyf3I8c4RSbff/LeVz/9/NOPb/dHoMdWSERS6AU8QxJRCEzpEZLIwQlClFUEmbAGBsAIqbCnBRkp4BSFExKsL+CxObi4beU5nUuXHtkDKg49dESDgj2asqQioAzwFzwiW9taHY0IrPAO2UCAR2QrlGWsDJrvrnfnwjR2YOrC65iktuob0VlIgncJbfRN73/49YvPPvvNB06kfFQFSTDCRp0JpQXIDOWbC1p6PsKDfWsYxBSvE2QCo9wr6ZKiyBTo2SzpyzxQGMJEy+vHL6/pufntvtHRnqWrBztqPXed5rQr9WGBeQHhtqJriLKxG5QQLWjfUsEN2SMhYguXz0BLcDR2TrtGw5zaqp56R+uiE2G3qKNXXv3qq6++fKEf5yigAL4GcIfosjETSX+wxs2kR1izJFkubIGQBLp6hH+dnsRug5ABWigGoYJMSDjxssr9FvbffPIH7UOL28ZWTS7VuqbakIbyfQGp5wf9vf0ZwrX7wFki9JgHkYYUitYkY9bV9yiHTLhF/9pbFA4O7U9vm0ChYDOy/eLJF1544a3FftaACxPVaY22aYjTjtCYKJfLAXCZjUQEZSqSXJWv2YQvToZtETR6e5fi0ZGYR1UwPvZGf4WnT7956eiigSjjtXZNTt7R1BTJGdktP6mIPXBL3USf6W+1eoA24iS2ouhCEPrYVQuX1xC06GjFBevJG9XUOYzIfToeLwORMdlIZw0LIwQPWIaawhAyMElGGNaFdZHIJGdVIElMhfxRqMhD+XZp75UyxRdYF3joxTz7wJDTrr92fD1sHDu0anQxMOOpX/rDMxXKTeq+RA0Egp17qBPIwcT4AyLE2rdLBnrAbLrz9BTf6SJATztljjYao2q/vnrtFx3yoC0nWW18HfKtYX1EOZOrU2HORCEAqkQElAZdDpSkCd2ucoghE7bN8m+N2BfKR6d0CvKAmFisBU7agms7KhC6d35udYfPWzXHHYOTY1XSM8vHRRGlwN/VQN3f2u8BsbQJAg9sozDI/UULblxCRlL33VpJYoQNX11wHZsDrHLBlOdHETJOJwsnBWPIC6jQ0EUujKACY4A6NECJCS/ygKNSQq44kcXvbIHwelkWRQEDCY9NEYXlgZNmYzd5oDpaTmhfwLPC2f30VaPxNQLPel0/rHUgDFlZbdBhOkj8MGj1KHwsi4wBygMD0Bf88u1vf7w5oPXud17HTgHqKAH2TVBVAtr92iaMVkigrCxYYo6GqUAKUyJDeSiDS1ZILoiekqCjMVhaEhLCWDQq+YeqRBgkAaMgtyl4EPE/Iw0whBPbhozX7el5tTee3EMJoBK6Xa+mpn3t+VMpYAVOIuWJgQEufDggiAYGHKMEvxYiABjjpX2P+uyrj9+KNrr41nXBAuBKGfi8b1oCUk2dO/mOMQoFgUNUaR+TLCijoAETmjoNURiTy4bgwWQN+Ejgc/7DSkxTwlQYF0iZBzukNxQSJgpeIVGEh2GN8bEbxnGByBSbdxhJvXVkwN9QASTiNtVE7rLJVUCCBRmISaFpz5XgDEREGRTtrlZcnbjvJ+889doHA+feebByjNCkNEhYcWGFIV5YRWVfQYcUgaMMvCnq2EyIaQ2kwEI6wgYpoIPWmDBhu4dEvEbMCxVlSWTQKtgsSQKfpDboHhA90CWt4pHz1lSgAPRJTa0meP5yL4hbg1M9PUS6dnJqE3QIMoDNgF40AfAaIjG5gf5+reTEjJulfvnXz5996psP0g9dXEGsVvRwtSubmBjAV9PnTjiyaafhgGXJhApVDk9o4HMGnx2O3goglEpolFaJABMybG4UlZBctCUHATR6KiNplAl8mTY8fW9nFZjwm+fgUPBuXNXqulyWXLdplmF/mDj/wW6FxLFT+/YGwRSVoX2TDQYGsmSD2Ais+OerX3750fghdx0AhuSoMHig/sfPAWK1s2YdVLffoZlopRTeWSqKhp4loYAZW425vFI8RkUdDHW2JGCJQmI2LDNKJJHUBnsEExRE+QB9gCwU6DjYGcmG6y04sfNYjx2zeoS/JW4cbJXLAphwmzc3lIHrHjrZtaXLj87pkwRJNWL8wbNBEAFVbKr45CuvtK370H0QheFSK8vGadcoKEJzqnTT2E4IoVHJf0RSZJo6k2KGggB60KaAkeXSmEAPlVDBZTIbEbCleKGoj7slqwP4KQxJYiskeqBPLFhywniLz+rYoTegGq4fHHHZNR3kzdOBWAqh8/xV3Vpo8DWjvUFwUcSSILMmiKJoiWI5EHak1SVnNfNz02QP/tpbUklNKF0xbaoVqWA3MSF1wC8bKVFRCHVwGTbGXYKOwPNcMJfdsoV5ldy3y0cHuwUJsD1BpgSXGVVh520tbWZX1zmpqdfpZiu4bPWwBx1QIHr7GZETmz5jcqrK97WrdYkylj0KpMh2WLTYgshkEXwgQZGs89CpFQrv4peGtKy44Fhl8CDHM6PYV0QkDcQLB888r0zeyAKSCLmDYsknqMmDIiN2wWmlQQ9VwOz10p4XBTgPWdIlynS4QgSdG3R7j122JoUa2GrmCI9K4L9sbSf0L23Sb55uirECgnT74OqMRmb0zkDvggMEEYn2NeESY4QrUUuKYDdY/6qHqhGxX55qvVPmEKyxhZBqQrsgDxgpnVLWkMYujxepPCuEqsBjhQDwSRrjZxdNxyslTIggaDwrOGxrsNAFfblEAv6wdK+/tv1Y4N5qXi/QYsMp3X7oskCDDJhunp5F5hh8feP7LSdPHslv7musiJ0NQFqGNskpQaWnYdOPOWv58kvSInqKQNROu/BROMG+BEnVjqM7KWtax9E6y0s+RPeUToGHpZOXniBBqBAvGYeYsvdtYQETUW7aHIEwIOC9B5IO4bJtsmWOLQgCf6sdWiPH5QPAy7rkBzdyvRsLxF6cqI1U++rBhhQybRyF6WuaoUPHY6ThKjA3PeOglUctb0rbL443TGDGnHBNiqhNDLyycsIl6rLlLA8GMy0bIZkQHeTTqjG3HU4UkUNjo5JQV6ZBMh6m8uBWJV0zMekUMmggBhxQEaTDXXDi+IKdXT2neSSiCIJdebsePwOXqJ1RCK5p3sDYK7PPDgnk6a7JkyFdR86D5MYQkgnbCogCcYu5A87p9106t0X9x1IGfVMZmwsF6wyNWVaSPXqbIqbx/ZVYOq/SwAnLpcBBbjvpnbZOwE9e3tl7hfBgf4JaJrxCogaM2OFuXYJ3QQVmsOuJNy3WgbvxVrO59gN7Ktx0ecll9J38vDO1w3oAVEqAeNtWDTZUETTNqkMyRSrEECsWnt7vLe5Y41nYfJe8XHFBrURow8bqNcNUQLJHAqzlVSpknkpDFiQllW9UCngJ25YGwddhMvJJc49U0BriJvFAfYE8FBJhiBQ4yAQHbwbXPt3WEjg1J/VKn/TRKAC7dNODHgqCDTI1r5JNwJAMHdozU5u+889QciIWDTfs7wbxSY9MnXPFhXtFo11dwwkuRDp4/E5PMaoEfkX1stl2lWhBIifvm5hbYBOawNOoGvPbNaZwaCADahr8djErwk5eCRH2ik1H/DRBTpdMGmTB8Mgj7WlXb9w04mpQwYrweSRcttqV+0PRpJp3Mb5RATYxjCYlANq/dnC41ighQikBjxUBiNMb7HXg8ocOS3eM9g1XVVakVAJOspYLrksW2uKdWTnhIMimjZa0JZADNSFLagRMzFWoGHTlfLoxHebZlCwZW4gqrMVUFCwbXsKFHBVCAmMGJEAdPDmA/W8urbS3jSqKzhtPPE2oSTCevArMMmWZ2C4jBmPSCYttTEhDYgEpTQsEaCkESELagFgKpWHfVdayr2LfxCI2EfYdBIgPbJ9AICH4B0h84pz7ZgjixvPefW8M5Jx37jJD+l5ad2ynv//QJKOhJc9ZPkPkoXfGfJ/h4Nv1pdYAPemnhQpz/NsePKNDiwaSpjlRNBe6f/NxIz2HXtC3euKo4eWDV/dp6J7QPJMJbnjCsb00DGxade4VOoYCDnRTQpLR250zkgSxIkac3UPQQxqoCjOLJapAQLxtHrooB0ZHmiLKZIBPm0YPLfTZl151y3DH0f2rxjp9j9VAUgXgdjw9vwYlEW6HU2kCLu5KXkR2hESoBjxsnL1j21JQYJjBIIYbQf/o6Kp8ZOm9e06ec+zcknOOa6/UvJmCe+M2x04XDs4e575k3RFYpF9wNtpCEUekB3wrCDk4zBqhYzshljb6iANjkYSQQGFgh2a9zbZKWPjfQxcHtFJlsIH/8XsqSmdnueWXoxvmNmbLK+pbsx2SGWkNH2ijhx9Z60cNSkHVFUoFTV4r0IlwwoJ87Y4v4XlCgFg2wLD34MhQfsAjpH3iaSLe7fRNm0Z7E/QcmDcJc6PJGLTMfg90GeypLFJBmB8xcw8SsBAcIWYJE2NMFwfWanSYNs3L/EU6JDbKoEEiBARgBh9+WR60y1c9O+GVDxg8qAtF0hcu0i46d9o2EBL5nqfqGfZM0honzw0+Zi6RKM/Y8UBG6oBtbcwKqt1GR07ae5ddzPEuV9MCXvds3rKlnREoHNBv/gdaKKBXbtzWIRtOApsCMA4nx7Fr2AqgiANDrIJaGBxYww/GWsJELXUdyzyJiy2+j8CbKMBHTJjieSpipFXm0PnhV6sd/8j21DQkgVaywclnLPhR9qZTQEgE9Pl6bPG9Cq7I1Exr8WHBs9bOfHmqTc8cYKE+clKf49mJ1DO5Lsw0VblkyyWrMtoctvPR7Q5nQc6BtmRqnXhCjGNmXHRBCqg4kMsANDhWMKwDRAORi6Vu4ITCj4V3VcyXhgfzQUAYAxdMFy2qosx4aD39xlq3Y0V7jy6/wRaKdEAdOO5dkBI+fR7wj4L48w/FAlvqpPnw4mgeHp9/cBvULmu33r6jxxn4NxtavUt3+ffw86s2zV5SyRuWbjgRc2KOGRz10NqD6BsjdnMLDl1uwRUvhBeAC0aHjfQAVoBfhsBQAUWkT6EGPykBeNZPqoEk4GKROKrVe+VNrr/ijsnObKPVQTGADKkTPhKj/9wjnkRFtlBdoAq8EBJhA2xyg1BjzF0788KpPL3isjsGqzVsG1Fz2DXDEkkqNJb7jW6ZPa5fwQuevM1dZCIlK9O3rdNJiUnvpj7dwDhhGDB2YoxBENugg/CNSmpYYbZQPEx/zamTTxsIDnkxBxbEWDB9vpvySzdMDfsr2ocd5kn3hKwQMTPiktTwxbXSUVmQfDOFLW2EWdjgBmNgIfHZG6/Z8WZOH9kerTd3T/VgVL/rnrt4hhmDaqfNs+PnrIRz510Fh9ty0pgMAz3HbstSBcNcLFIiNy0ySDGQEnywC0GEMQsLFWEuksHJSpNllwjDxIYhAVOLGYKvJFt8R5u98us565jBsQGvkfWxROFogIMIc+RBFw9fOy0vCbzDH2pGdOTZyDN9Q7jYLQlytfraeeuOSjdcY2nEZ5b7Ef1U4ra75L7Z8ZGVTu91h2KDYnEMXDNUJs8jfPEX2aCBMtfhSsvNA5E2KYgaLGZMYDow0EFMLhAlpIIcvE1hADyo6MTcwptJpkr0DC0ESJltVPaNhyesFSN7TLNI+FEHRiQEX/pmVgbr4Zkx8yyZqQcmGuSdGtGbYdFwQitXXbjjTYe+6IEmrXLm0AFuJIEvQ66+aXzL4DF3nc6F7Mm28XPVtZOyJ9QlNznI5XKMqQqUUjuOayAkxheJng0F56Am8rAoCqYJM7JeUBd8i08KWj6aar9c9jDf/+TW4WPa03gT2cHeGcbAgECyoSep8elr1wA/1LBbPS9ULJqHligBbJriY65uX7DPmnfe6UxjXyyAu7THswjFYhAYc+3C4JYNW75/Ik2IZk4sszfShesYs+nxtotv6JQXG5ugAFdQA/wAzVcMq8VNMgIuak1RBVNlmSNJgBAws4Vgv4CwaJEKVInGD0/cFB8zMr2HvG/BZd4wk4NsCNiYvrhmrSfv1A6uxAkRSaeMrGXRC+GWEKmFVe32oQBbOH/HNW4i6pSLQjW2ZGlGbRs4+42O33NbLseTxhaNoAVo1VnncU4Dg7M23GizEfwrlZibQcAYqdmsHRo0xDVSYiE00hf6EAUiQ8oFHjUYGI0GhhbyQOQX3oMmBjunAD5qeF7D9yIPrhWBEZ8JIcq655/PoLCsg+sOdqiA1P5tBbmXZ9nQWSJXU/Pv7FwCXjGHqa1QqUVwh3myWqeKx9Vz4t3LzuxRZkfLrmHEraw5TxxRxKI+ZJQrlhjRmkxYWvQQOzXtiCaSoUkqqAq0VWACVobxHQRfw3gdDXSZjTKU4bw2t/HgzdM785GbxiiRbjLkm9WkUP50ITxs7F1R/32opCgC5kGSo9Uho4NLmlkrNPDzqTC0NuGuqrGXwjf8aMIANZnr7hgf37zSRRpM+RgWL3fouj2cRRP8iSr4CVx32CJR2nWxjGP4yBAB5IAcETNAaFaqCD5vMFF28WnjVARHGVyADQ/hAVU88fDEbqPemNX79+9fd0ZRBO1jCBkBnsCHhV8/z2MPreV1N8mTmoOU9qQjdnsG2/Uc9pzQKtmCZ+KRa4/I2fYwoVEK/d2eYeBftUsdgUQ+eqq+acPs6H4ExChxeZv4ejLrOhR50QLfNU7yBeYNLf+IG5s9rWtujKhoOmQjsdjamcXDdBGgogth0YImODV8zObPAPwb779p+Ui2K2t9f/xff36z2jxmRrg4RqQBDNgPPyIEhDtJuJtzD8kOKAkCRsGKwdGhPsmb2i7p5NzVOrzUUaj+mmS49YynUyaIjLsGwg1vOJmh2fWzgwW57ZIIztqpzCFEgNdEiYJDb9G0iRRhqeawlMbgo8Yk4dQC5otmzeoqMzTKxrr8Fkxayw4fvXXk++whvDuf2NrXzk55vrruol++wx9KeqG0C4wUZgGPMRBaX80PAHJo71WhBHBj0ei7K6GI5ZYHVqB3DW5IBzXccfbMESowmPUhhQGHR066XOIzBv/b24Bl+cj4uZtWgQxSIEbw1a1HkAVXcNNLdWEIc80eP7GG16y5lAOuYAHNBv0FUlE2CZNtRBlc+C2+g2i0ssyOvLx93lvdu9kaY0r8+4/PPvvtp108+kmWAAehh8G2n0aPhQmqcGxwknQM8DUbvV2vbg/1DXu2U7IDOW2cvQJ83i7cMnOz5WoRfKVvQEJFeCBgjGAMizvvVg5WK88c33DJslyCTgvevfvO6xJqRCZywwyyNBtasmqsECexq1Wt6cSKYaIgCcjDKpfZUVEWIAEJooG6QU1AFOwnG41spN6be3kkO8VykT3qm1/xJ3FIkiQAfIQmPQbyWuSr+TG7BBL2rMasgjSgFjdYevUonjYs3Ccu/s4lqZOEX3JKTnzzzAN5rbA+pG8XowrXhL0SHCSk9+KVBnj1kvUbzllisCaE7ZNZ52mueF8mw4CSPVmrGr+MYSF2wEC8HcpwVIwfUKEWLKYIefhqoWxCGUIFZOG1/Aa7SiTGT5459kxnEq1jI4rCgbm5OTKB6hl6GGEBIkXi4Yeb10jLvFMlRlksBZomz8j5ZaPtVcpLi4LmPXxDsRNSwocTr5n5MrsdmCv7eHKaCrJeVLum/9GdCsepXDd/9Zb146O7KSeFDHomzuNKLKFDySS0yi1dgxfHbpp+FmLERZPGxoJUSPlkxfTN67lGC1KAGwl478T3T97sjjExYIPZQaRAFjAEIVzTQIV27pR1oY2ufokJEKKW1Ogua99Rz0WAjAV/feqiSEmAEJMYRdfP73il4DrVfSypehZ2hAz8JMd85eu8I71Drj27/vrRjGKJxAfs1CcPw800GjgZ19yGGBR26SrDk6opFTNtBLUF5IrtlryaMg9e0lt50AQvvo7CT+Q99frJx8Vj7JkiosaIWT5iYRCSBSkY+uezeNh6/4o8HGsYp50G20MZrgQ7HJmUVrqodYnSpwPQavLaFzoL/T0WVi4ZMEeLmSu4eE4HNGJTrkL/ee7sYIZBIJiXL1k74C6aowganDnJhigMkgIFWKHPAgvsMWpN2vamBfzSX2KCKPihIUlAANRB5bWTn3Imw/RlJAVgnMDSodTLIET5wABCfrwmKJWC4Mh6DDUQLjLkbneMDi1nCiUBlD1N6VIJC65VUSkiV/xFjz1j5pWdloAUEbcpjgYXV+5Xd+WIRg4a1nPchvUoJnQJbsmx522UL/MbJCvGkIQPvYSTpiwkRSBZxAtNBR4UqOhqtaR2NBoNaIMsgARWjlAah8KLJx+ntmqLS4YDZG96JnmkYM0EeFIh0f/sI8MBjn1ZT0w9BKiVuw2NDu5jW6qUJEggRqJg4cCsXRBCD/jww5q3dPX8vBWjJUpQJEGPNTfwnE5NKJXcUNX71q/fVM25Sv4N9aPWcJeuUhhp6ddVkkMXuYEU+G/GrGo1+BaDgyrwW+SAcvCyJCTKsqNUr718Qi+iA8beKULRJAdRGAWAD7Sh5L/AYeHQ4bPzwyVwUD80KNlEeHi9PdSPrj9QgSqVQBpiwtFFTI5TKvLwi0XXAT/mHMGGymfw7F5wCI0hQSjEUXLz9D+6U3AYvJxzV295d8PmnrygzDw0NU0HlxL26OKj+HHgmaWroYx8zW2SI0wwqKLb8jv5/3UgC77C98tkJQIb/PtYYD/xzuHcalsUQQ4kUUYhzaYUoAXwwIuEhPrhGcvGWVeqARgpLq2PDp7geogFgMaIuaTIA01+wSLThSqJr7lmceifxrN7t1t0i0CPSRSTd4gHeZN7BCVY6fcOXn/rhtGenIL19awZSOSgjDTSFTc4JD5WSagoMLIQu9sZIOiuqQivnPVYMHxcoZeFg/i48caJo/eQCiFkBHQCWMgB3SDYcALIQAdi+s75o0t2SbWrQFZA/azkSA1YQGJURQgCIVGEAgiEUigRPGbizBsqtFpR337KzJuCRUxgOGZ68j1XjCveztPrGxm/dbzdR79S2OoYxPkUt4KlBMDMyjEUxdRa3m2Cj+3K8tlRNTyGSEOevBEaaDDlEXzorYkjxmxSIAnTRkbgEGDAJQxA9XZaLUr6grMnA9V93IZK3H/I0FA9MwwiIH+wwagAfnaLtgtiqASKvijH7XILd4tut8rvVqkVJubfObUg6CkXOoCNGX/3Tp+WgJJ7Pcfde+vsUAbfeejksUQBnHJ5szDEKHEd4+AmAiSm4NQC5AFVHN1osXru4jE/NNg2QBwWZGFFPS+ePDklzxiRFApJm3BwcQiYBfkK1cgCZTH44fk1QenER68Y6+zv3y/v2awTIKuoKX+HMuD50lA6ikYHyiVLBl+e4lhejbXqPWvmFOjIEOA6KfDMxf30cC0GAC1ffezdWx+rF9Te1alOuQnL8X5KjPmkt8RtKg5Mm92UhQUismwjGi1GRiSvsRtSMIr3Hrt6UofgQHhgReCHQwADSioCpcLURubE/S67TC17/NETTtm2dc2YBcBFwCQgXjV8pSiLWlEDNM+qm6dSxAA0edwCNd14HRgrN3Py2e/sXMBOd3LXEPXRSQkHHIBVqFIFnPHVs6/euqni7lPd6hVSFYkaElsMk8XEwZGMbMdP0/IbeOxCjCAwvAiMgI2IL6W84K366qNs6SmFDodKQC+hhQqWRJssOOyZkCCKS7uXHr7iudOWja5/6oGbT1s3aSkXyLqBHWa6ZaFE1phgUhWANb9d5bvBBISSx8nXa05e5Yu9l+04JS/fQBwlYPJXnuiCnTzOMckUOZcjLdO+93OQMdiHP0nIkKVFFiQV4d8t5F0qGznebrqGC/wCpKJDIoNxAQtDllCLZDz21MSAAwokJKgJqRdgg2oIqAKEfQn/gcwxK1b29C9bVa1XKs9ec2i1On3hNWetnYzyRe0yCmhA3g0fEzASZzFfxNqIVn5NXOCDMAv1TMAvd/fGZ1+7b0FKg9zk+O1tLumCx4+ANRxxud8H715+9z0f9+yxbPPgfnmgpTFhJAZHKHI5C5vmFskAFf9Qca3NURRRdCcdTTQzTpxpZqkR3XHiauJGLU00CVTc0nLdNYgJGsCAMQ8TIUoSxRBIUEmQtw8UUdD4QIgKKqCCKPh+llpllX6wLMsq/4HlX/Cc27uovdPdtx8bck6fe7tnNsscaEJuLRAemBI4WlMJ/V134ekjBFFnDhDlYAJE4CSFF2hwtRM2NzdlMk2FQjaTzVbWVKfT0eFVlq6svXP80SUP3zsnWVx7ixUXH8U8rrPRC7LoWEgQQWuxHTyMgAHsjrNr9XiZLnLlciG/eB5UOEXorBzQcgaz07B9/eLFv+abC/m5gUPJQAQo/p8cR7i4wbtBWiy9GyrcBLZRbqGg4krspnJmSDb1v3hs+p4WDwyAjDpKA3soRYCdwLYbL21qyuQLWewRnYXO6nSglBCMfAhnrOZc5e33JuY/fP1ZdQgVCAFIHGRNfyEjgq4oW+InQ9LHa3NNOTormF1rYPUlyrvBTOTJYVtThWA084U6vsthiQHdtW7x4vUvOmedLaJANpXhy3hIqYODRjPIUMWVIomLxSnkEJlY+836dev2tr+nuWkiHsiWUWe3tt44t9CUz+cy+XxmwYLa2kA59FlES2RulQicezYm5s2rnlzUYnnzL7nkvIRnCRGoXI8Rok74IBmu50IYsDzHSJ3TPEpVZf2rPa0tDGm0Hl69pUJTCNolgK/7BRslQCpROWRDbIJLP7948bqDF7700hLwySEHvP1HOVKQNU7egMwTuKwKVcE4gQL3HPCNy/q3rZ967ZkHb+nUPE3iZzTP3ZzJ33prPpNbnl1QW52WmOTVMRTM430Ulpp7Q5LrvmfjXWCnYyIN8Zed+8ntNyV1BfcG9waPNVXPhMW0PddGSxaWFUskbp+FKAGiLBdINIbVltXX13PhOc/d9DrnOtpxyQ/ha9E8QaKpaqa3Pf/6OeMD7zw0RwjjbOGNEwlfJnMIlxnDumxwXA8niDkMkhImQMiV8/bunSjc/cR40IAAkFs42P9sLpfP1JAB/pt46mKZoMn1TspCw4QhgfDQwL1g5IGRGlnw8nM+uS9huSACo673FJ2FeLV24TKkxBVCigTZrna5koX0ZUIWqSBV+t5PB8oUYweQvfHNbZCMLKvBwxJN0hNmFw0O7f72g51Lfn9nfEm5I2FSnwFP1GIYeZhNWghkshLYQ8ECfQNHCVz59S9ev2X16u6Wzmz/2oaGBYHSmvMRJsBBUk5MUIGcJEgAfb/OQxdOi671Q88yxIEHRua6AA2AZfhaRJl1A7QP3ChYaxpkwXbBiIZJ21JcZ43A7mRrEpqUaAfJdsBJML51jfIE8My2Ia01Oh2i50uLtzhVuaHBL9ee/Pz5dYuPLvl95a4VnrPBIVkctGAaWTgV6DD76waGGXSRY8d1EgwVKHCixBMIbJW5sfOOPPfycz/e3rkgAkCgh5sk68zBkbkCOgAzKFDJQcEzjHgovV0PAd/CvgJXnYAr5uCPOWXVSYdNMlBryB9EkAWN8wgoAGLOB4/aK1SWETTWU1MAGHbUXRQGMNhfLB4r2ECvHWRdxKcyC0c7CoE1s2/93m+Prut66JG72o1qPGFDCmPQE1ka3zH9wrnHaHl28Rwl9xpq+7KtL+M/5nh/QcS7CmwfcAdsHSID4w24uaoDCbiRIBEsXGTwgOu7bgTDRUvztgcuJF2LL0OWUQvAjoXWZ1wBl+vAdGytaGtta9vztZOtLKdnaBeLr2xHAa52a7s/fb/ZdzS+aHcipxGu2K80YNU82zF664L2dqd/7LV9OxvU7vXv3dmuPU74N1klg+cU02TlifTOUGE+3CvjbVcSfGxuH9i49bnV480BjpPUAhLjImygBxsuj9NJxgLyQom4VISJaz88AXC5pc/CNKsMJZTho+ikBhNYYhxKiz6BEuKw0a8AWdtgAgJBpTMNSUXxyHpphxeK+JZPf0wOdj2/bf2B7x9QHCMXlYMTo3lnRbsVLJ9+bd/JSmjk9PSaW6Aj6OsMAZYCVKMJqcWk2IQt2YU9HrFwpsKpgbficqhM6mteWrly5Zr6gouIcBkihLkkPsihiUJwKQUXpsdN0kgbGOcd2g8xbO5bRF9AN8CRgMTNl5eh30YiJa74BHHjAiGofFSggq7vXlfZorlj2PQbANa2Unxn9tEf1+R6v//+yZHBWwNAqP/y4MhQ7S33tG/Qau2xqX1dCxRYbT6+Z76jDYlnsmL2SKDAZ1FSi8uQgsxYIarAVYePM0hJHR5ktlS42Y6CC1GYBPDYOS2qQPjgVmDRLwAYa4wQSQOtPRst2872PUBclnQzOcnzb7qpHPR4tkmuIkeeC4ieTSZMhQxVZDMtnpgAJmpBFvtk7TXhZF/f5HW3XdFQufPgwbUbVtzTTnm8cvrA1LcNmIL5J0+UEy99B21PScQU5CIj+paSmWe8RpkqAde4gFyIKHiXAfi83Spvm5xYZFMODJPwD4ZIEzElMpgdkHdK9ARmSTNHbrHduX1DGhjRhdIFEOTknJsSlhYelIjA5sXoYMSiDXhWDa9c5kEg2rF9TV2ABF+cJL339OjExEJ9yZpryt4MVrzdDqR0qO0gIhtopTC3eWxmvoKlTJOgHVoETFsqY5FdYcRQIiTIXbi5+5bbTVQg5KqOkcFmPJer450UIwUZQIIGeDoQA/wU9wYYTG8OPOjaDUsHgVeCAbNn00t0Bf5cyUO3JvZWZB8rJ/A1VIFCie3qyqznKQ7YyleghpVGUs7R9d/3Tqr3tzzx0RrIQStirj44O/XBojTREvfO4x9LkCF+A9yAF+zIJXIUxiyZYARDKmTr4CWf39TJgykkcKFG+zrqCd5i3CzePRA6KfAYLDWbQgUTgXd236Htqr7JIhEEwiRB00rclCgHXpLh+zZ/H0hEaZ9cKFhSat2Q4dFQyFEhplAUkVKeVn+smzo1dP2PW7eu6rlfi4Rqdo5NTfdHiomYaqdPzgc+Bb9gSRYUXwLfo1i0WAiktEoMcUYiwTsNyuAySbJVoJBPJ1o7ekfnFsUgEcI1ipAMu+QWtoHNM0D85zLtN/dN+qJ5BgFlG0LISwW//gIOIq1cn0N+xGUylPjUCQXSVKAqpAMjmmQRlu+8um7dVF+me+vLz63qWQGpqPjFE1PTu2s1eUCB6btnWywBFhCrkCIFs8xivUG8R3qkbdhIJMQ95AG+PJSYZ4IkObEsf7J3JCteYcIka4mPNireUv17SnAJHeZvPa4bL52opxCocSYt0hek+OPuci9SHlGCCXLloyZkWD6XzL9xs4/JkfJ9dqlAa4yrSEW/bjvw2WhL99bnNo7v0iBiaHpqbGe1IjBgJ6nRWNd8Q4wuAmTiiHELqbVxHTTM22CziQMmPIKpjAX3B2QKQW4k3cE+Hpd4cLC4gdLysIGSBWTyQBMFEXtovTXu2OmlEyGDIDaIUvI1EcOwym6GMBQ9gZfPF/CqUPshOcFIdT7wUPsBWriomVArVXv0aH91tuGWlftXjS9rD6Llxw7MdtUE6j/J6T8QWcSGFBicRSoEfRCYlmGoSAdLDboZK4qPqJJ8kQaIgok1dLBouO9Lxftqnq8lHJgDkrG4AZR2AFMeHlBu2/btoWlp5VMPkmTtAd/DHy5a1AAvRglBHCI4hpGPll9dAJ42X5KOqAfGkJlvDm8Zf+SO9hW7Vj70XbvKvzA725UlGJMEZfpY13yDvsSQLtklTpySKT5kGAkYQuAgPFXRHZCBPjmPR0q8rqUyeC3q7R26zTx2qXM1hSCHIgrC08TrKoFNlLAOHXF128hSrDBx+y6yoLX5G9GCIsrx7Sntt9LkCCGriGUIOkK/OldrqSgCMTa50eRizzOH3ll17wag/WHFg28HmdOzB75dyxECC0rw+g/Elix7MQYYIoKANk1WpOB/CVTISEJ20DqhgskiE0mSgMzC1fm+3sF6+gT1jwughQQPtZwMuBsySdl/pF37I9trRNcS+7QA5gqziih5XXbOTRa7I3awByXAsx36VfnYU5EdhpGCKEI4T+emr7oH7lBR4ETqw/d+a9h+fPaF5bXpgFwV110T0LHTc8xmYpTxf9jCTmmkxA5LQw9jhRwpESctiEIeA/LJA4UhOwZ8I9N3avJGikELE8iStFDBwCdab9Wwlfpi/wrfH+2rZp8iE3j85VMZktgTAnXQgi/GVdBUHESnookOaCHOVTpihehCrn13x7Ijy6ATTmh7962fxmaP9acDSkKQoiJjfrT8QINVXPpIpBAgnXGfkmWMEh2mpYtUQBC8kvy8qg6iAHqGTbqECY03Lj01cam2cSsl6LWcj6kKSRIAWNPx7T3771L2ZF8VVYEuk1SIIlKC10COdAW+AeDEIVlQwC29NBv9OF9p+RHmgwsQ8cYzj++/U2tohOCrN7196MTu6iDwg8i8VBypwI8w9sEH80kCmQlQw0r/j41AWmIYPYiYStEjIXEiySDBe3A+1UFIoDA8xgQW5GL78EhT67868DVtn01owSx/EferPUt8NTnc1NYmi6hYkAcTD/giJACPVTJRViG0YBgFHCQM2ax/ttKld0QKvV88c3hVTwv6MRiEzR1Pv/b4e9WKQENhwEeFRCqWTzV4JdyCGBM0zSIHMiAGL2k4JZKoCioCGVpg8nDJg3lzjiIhngv49ROnlmbbtEu7xAEqHw0uM01tjg5Vj99p2x29Gf5u5AAYhALY6CJSxTbF3+aUJRKEyxRjOsQRx+jIN1REgA4u1+74auCdFX6gwhhvqe3/bHZs7yP3CC0BHAgQqAaDK/p2eo6CVtiZLsLnUMkUxHyD9JvO0qhRBTfNa5GReHTwzCn6KWTyYCKj1o2jw0vzbY2lSEmVS9IKBncJahwUhertlb4aHM6SCjMlgua5qKZlE2QcimJSquLssnIsL4HGEEUqjCLwlOvUIXXS+di73U/cFbVhCKmm/9js8a7MjpVeGFL/YDTAZEITQvJTr3j0jpBDICMi1nSRj4hVugTfdBqDg2k2EvQOz+JxwhUyTCpumQwV2kigsePJvlyj2NIDFkiHNudlW1ZdMSgc3tIWLuzNAQtwI8zB/WVv4DAgMQveULER4c/eK+yUBEkpUgBdyHooa9/dtGTVEkWiYrhD7vTx4y+sjaJNPYq+kwrgL0zpdJQOwUV0GqIgOqEGHawFM3NscJe6eIkhhSJLUAVZ4I4hDOAlz6Vtw4U8nAUPgv2B4d5bq7CHUgT0e/TBMLoHaix0Yxi1+XsGlHqgN5fiJPymbRGBx3EsXhHFYUzcYX0YQQLEqfFRvQYDuJAaAdzP5VWYeuPo20fuxM/EfLwti/3z2PKaOCQV6Ri6CmK+JR0xujJSZqf6ryUneIUESIOaMEXEHsU4akiQZokHqaIElAAeknVyp4XEO06QwGRTF1QEMre8heCiWUIURaEUC7+VxyBYEWxijGb2O+Gtw89GArQe6EQKDHNkIQIf0m2QK5TKwpegVD24SlEWqLMZ54sdhwZ6rFQoQSLKHsT+ubsWXpRufqwnIqcRxJCKWaVSUQpIu6bLuNroUgEyeICP4Cr5BPto0xnYH6FiIUoSB7GK/sDtk09eTcBkcCQDUrutrVpunHLDp4aa2+QOSpyBNVPxpGg2gJmNLY253oVcYdkZImGDsYBMBT47YAdRTD5SaMQK34Kw0Afbp2zyMzs+7H7nnnQUC3FNoydmp3cuqJE3ZH9+iHqCyuKaOEWGU6kUttbsgTfLI1IDvOkIdZyOjRzQBQLkgmEyaDJyMd3SmZCjFHgwTyvNk+lSRBCLa85TNKvNfcMdTSERgoPWNmBVZqcELvoJ0cw8MT/MDS9EB1eeDKQIiFmwsyP2MYCEpkyJFL4S6MRcZvRkdjzWs+pBRAFOSV3U8fTxEycbwEsK8+M9fz8SwgTaOE4jg2X5EV1jFwRpQARuaAfLzRkKVxpWEJ9BTjmAJ879t0/BUAkTK82HdHKgFDGUkvbRUKqVuwS9Ye5npzqq2xgyJe4RPclgxGukKCDWtd13hJuHh0JwQZemHkIeg0Ligj6AR8SQZhmnkGI5W+Gz/qiqJkxVv7vpt/3LVD3mAVLT8heOj3W9ElMFmFwVzvzyOH5iFb2iip4CVmJMbNq3syUdxOCC4geLEfEGoEswsx/Ai2JghUuZIemhKqgHy6WP2Hwsxcrl0zYjA25+rbZP7OaO6aKRJyeam+Hr1AN8QLD5UQpmIzrQaHhkV31huAM9GAN+KgGoUrQiIwTMqiIw4yJVMcax0OBCp1JffXN41Z2dDqfFcdXCz//4469f3qsl2phvjD986w5OBjPpmhhcR4aKrn0tKpVOpdMcoN/AimuRpY+Y0xg3ZERGDtSNkYlp/cPU2YXGUUVxPLJCF26KF1NLycNMmMvGgc4yD126U8oSGAxtd9O1okRNFWNpNUXSVlJr/ahGY6HVBhP1wSZQbUTrB9aCX/TFL7QoKlp9EB/1QRTxQRB8EMHf/yQBz8yce+7HDP3/7/+cnd1C2wML+qIhMzHgqQurVPQaHfbBqW+SCKDOi2fIGmIBahrtPnmBhoiYNi4uTfUPTe5y9AQVnOaETIxgTmIQDoEg4+kncWCf16x59eRXp37csnO/LXYf33n4/hv4R8u/W+uWb+QhFy7t5rGsBli8nmcZMZuef++agVS0JAB3NLEkQTXESydyEIKBW9ygCWIrmLQ6e8TC6o/0vDJaVsAGoamit2XloJccaQO0xffGg7OjobCUaLQb/W3J2zYeOqw0vH4k3jz+YCqFaC5YRjiIcQDkkiyw2AwYThjFTXxGX0B3N4dGR7cWzg2feOft8zfc8Mvv3/z0Q+BWVvCwmZuvVEXBUBa6MoaSJ5euHkj7k1oaeBzAAlhBFxIFaQ3WzWyQPCJM8ZYbAxpS28OXL7FBatiXTqxSuQoRwEFvo6XiWFFdbDQarbb0AYaDF0d9v3K5wTZnRNp9hcZI/xen4ubkS4E/MECdKZ0DM8+4gBsC5+JieSowVp2ZOTZxY6X27PjS3PDIwonZz08/88Iff//+17/fXOKeEBw4i/mp611wiT0yTeMkII+0efi9axPVhTgwUEMdsAA+cZKkYNYHCm3t/7VDZ8qSyrJcpIpeMcFf0fCDsH6TbUkafVYohR0SkEKjBRdWHPjimC3Mjm8qlCFIASriIoODRtyfZf1JFr/wYmVw8qViFbCcsNYgK3BY8QvLM4zISy3R++dvmziWRNETB96enntwdPad0wsbQ3L515+/+fK3r4PQG87zUxXhVxdLiBHHk0vrBqwyBK2iFWhGLCHUSdfXJJZECrEUMSpMFrYGrqgVGGT08eEhRXC1Wq12q1sBPaWgrY+GRhsiMt4T2sTQkXUmJ7dXXB/kFA0ogI04K8gIlwFw8c2H3J0HmskKBxwuEXQlienaKbYJM9hwBT/X7T22Vls/cvjo0vjCyNiY1xNq//z5/Z9fJ0GrjY3zdwykIYgCKUUfyDSf3trjGBGn9mQ0wTmQ1mIHEYza9psRpUaLkZFaP1HVEBWrn5sWkBHdRqu3Cw2cLfHRl8EDh5qu6kOWtffPTT67tsxi4iyJMxjI+vPM9smdm9jiRkd9sbxxDhCJyxPN+NQ2Ulw4+YAPjhXPnfzo+JEdIKS3ffro3IF9O25cG2xObwSxS7klAq1rnrw75eY0wFqq6QBL56apjqIhSWPughQyI3jEEBxIaUANI8ItE1OSjHGgIFHYs7b3Kn1i6BdZ6gMeVUBEt6+dSQ8tGMkyOOjnUyPD0MRAVhS8eJ6rFHGusQARedZfxIKXRIt7d0NFqV5gCq8wYk49H2vA4xiw0w3NzNx+6h6NxD4a2vXBiY27Roevr0ATBlpbpdyi2XbhWOKlB1bzEOjBPfbyNUEBuGEpdTW7LU0hDSc60+D1KUvPqBByCJBjTCFtzzr7lbIFAzgOhNDq09ntNqDCrm5Gm4mRGI8RDt95cd+aEiawwpEZ9ZWykN83dRdUbE3i3P542ssi0Aqr2kQeMnBATaoXHr9l4sbYmNsw3Ons3zmw5Zm3P7gJvHYPqC2IrLfn26fB6RLFofA+cOyfTteFRAvNPPgTNFOjERXUDk8XyOtXwNc81SIljWBEC3WQIOihta4lDnCVdksVAiXg2i3lhHHAlYOYSN468ebTswtbijzPszx3eeaEPAZhseHS08WJ8U2qAN5UEZelk6XGRYQwtJkRnun351978ZbeiDuLzRDR2X4TOzh8eHofjwKplAENCbF1F796KqTGg3nHM5IP3+3RItMQJ1kG/phc8bxgKaakgBzcsOMTrgA/iEGVVrV2WRk9K3+X20UUraxV6TbakkILEtR2EYRx0ZXPjQrgOxiIBw9MHlxTuLyeuwwaCldkrqApv747OjC+EQo4JGEjIkCBW903w6CSsXj+8otTFRvbPsL/QzTkEy/d33r29FZwAVRTNBZBxYXLtwVaFmGxje05u7XirFxiXsWVO2sB4n0KX5QKl4olSUPG64aV0hR+gkgwl0LFOgTR2610u90WgLtoQaVRflUSecNZUIgMVADiXDZ44PMTD7UH87rLC8eUOJK9dqR44OJmRblDxInJ2y+7iAsrfQwZz51cPH58iwdQc7gDEZuSUDqtSUeWlnYSgZSuFRYalZuX39hNSJ/DIyzAv/XuDkdr5SEKYh1d6QKgjwhiLnLBIxgPeIxCaomBschaaoVerqkMMjSAHnAA58BjOFkBBxIEId457X8++MDs6NUVDyvOw4aBh5j7Tg08OLcNlRQMmtVpo8iVXNpSV3JEZx6feWTvbQK8YXh/Z2ybT0LksQio1Q/OvsRaLcdhgBNHYebS9ZEPWuK9TSVjZ89USnHGxSqTEUmSelf1GkghXXRAjeWFhlYtQTNqanI95IWsCxPQYGqwnBAbmLzxgCKKOi2KkM+ADDcHJ8fXX9F0TLnC1XMQQsqeicrC7LZ6aUKoW6EgVMfQyVVd88LjT008TA2obh451Bm7aX3q2XdWBC8EC0cPb0JBVR+WSQzgl6jmn17rxYk90Yh998MdQbPcxKjqhJizIcEnggqfShg4r1ByoeeNAQ4GOHtaxgUUdFeKZFf4Bd8MuPI54sfT1EVB3ZRRZ4AXjOLKZr1ez5scNJyLj67bNTsiqbu8LKO8Wfq8qaTwtnUlgJuvzL8+MVWL3KYnOoc626rrE4FjAkVrjRtaOttB/1EV1EYQNGniw6k+KPMrSiEhhqfPXBVhoopRnV7FCBdkREEhZTr11EwZQ7ianEgIGCW0pwsR4F9mgaudFcuJkYsPicF0Dg8gNyMSDZkNuH2zkxt3NEsHQ4yWkNJ8Zu+OfbOderOsNxlgirG8jAYHo6ofjEqOc5/yc10lhI3DI/s7230KTuakgipR2QT9Z0dPE2MMAdCIoDd/t5FmbGh94Bd/kWBdZ970g7ZorQQTgtZDsmkFWTCAWSsiCEVKj16ouKSJ1cwQfqA3cEZBVhgLwNeeg6yol/oQWca4c+7i2HUDg0xS/Zp12j2339uZ7eT1QTdITS11NMvBEg4ABxdj858cOb672RwaOXRorErCls5Q40hvgq1c/Cukw/RNKeQJM1Xwbjg5pf32Sh0rFtumn7tCWthKTN9YAba6gSCJYpCyPgkO6EkANJcDvCKdZoG5/6q6qlAroiiq6MfI/AwWg2BgHISjCB6dUQa9eMFCRcUubNQPsQMLExsTGxOxE9sPu7Ab7O7Exlxr7zuo597ZZ5+9z328tWbtfcYnj5eHxaFP1mJZB2IhCRYE+wImHxGAJBW4y1IQesUmxsPWoTrVDFnChVzdOyMaTu8Vx9hnYgjGQA9BRUNCvGzWjhu3fVr7wIxv0L1X7aRckPXIAcApaKEEyKMxE/tkNSPDCvJ640YKaQFx4z57q4/mLY/Wo59F2M91XuiFAuHweECTF2qAnpSIksCDJOUjjxCgTPx7XLAAtDsAPzsEIuQGsw/7qKKPKslWNGDAH99p+qIC+cKKWXIEyOHx1nNONjFZ5EAVBoJ4wYmzduvkqd1mlHeN+qJX4hHRM0bAJyyEXEWICLxVE8c4xFQRiIpte6EVdwhZHPVGz63FpMBWTYEi+mwPAaMiBzJdXqsGCx3lU58HCwukSgWKgr0ybZNgoBrIENzaKCl+2AoAhgng8SJsXZhKUcu9w+oMDwE1joH40baOjaYvMmFMJSD4iGzEJMVjtxxVyDbs3uSQK1MM37yDDpznAJTYrJdg7TuWSu3RKxoJB4pabrm35u1U5nzEBCd+jlea9GGNqO+pxyRevpaR5jmJRvwyPGRPPX68rbzwQYMTpwSo0INDFQESVBZwpDmqCKQniA9PDCCSCvGgDTvp5KR2jV1sll1cX9SvuGzj+JN9QuNTCKwRAw5LxL7psvlMt44Fx/ftPrstKiMOTQkwBYAYAAATWE46wi0T9zEObFpC3LVrbXspBoagnsz8KVXFZYST1g015Gu1lWFQepAk07H29a1bT99v0N4JATEGVWhVsEtiUAmETFWw+LUlcOZRQPwsCdG8QZ8IFamJJk3v3LhrsPjIm6fPLuXr0tNOX2VDYOUIhQ8Tth27u8eExnP69u1bOykfxCVMXCK0UQnPWM8znkCxLoUEM3vogqUqB40x2mZdV3q4xLRZsL9MwjRjdFQtiYIHyYjDUVUAdUJBUAr484bvnt59cAkLkiF9FVTo03U1VoUenrlzE8hBAnyBDwPMPmlQ+HyFFR9hElJWTe/d+NLNpg/f3X5wbkq3eMekEBUCGqRkMGfGjR3Qs92c7t171UuCOPZCz4M1jmVjDSolB88KevEWTFwER4cG48kbqvOWyyaLHVPympSWgC1CdslpoxTqKUsvkV7CDKbkc9PfN058PPF8WwBhIIUOTFVog8C/LYmfKqAj/cGvZEQUhng5k5E41B4InJogLwDbfW+nZb+bvrty5fT9g9NK7ZgUmVg4CEODa+vY9j2bNWzSpGG9IAmNJxnAB1skxTovFrTO5LiwJTzbZsgWz1rgcUIEzYHjhekwxHKZXxgFIOIPcvJxiVYUVYILadEJmKAVLuAlj9/dvvLp26cTZ6mIRIWRB42BjxLoiRWUCr7QdLflq6ZSgDgehXRMJQEAl4OWS53IzOwd0yc/Of/rI6iYkH/mwhADCVqzeNbFaSPbDuvetnmZLD/CnOMjFzZkYws2bBiEpAID99wK9EbzVjQkQ6GQBL5sfHRGUakOUhTgJ/7V41REWlXNVT/gw9dnkUSwIk8G9LBNsLh2++7pEyeu3C+KGLcgm4AKVAXbhBaFHhaDbn69fflc42ppHagIqIcwXemAL1gNTYO9099e+XD6xvu5I5vNXBhJmOkus85M6zCnSfelpYOYu53up1o8MGJDYOXC8SiBTyW4EOExQ9oIPwxZht2CGej/cEU4U+bnLVmC8f+qSBswXZmcyEVPJ1hWEcGv+3H3xo3L69kplAqqohoqQ2sDMhBR+JkjTR++eXLj/qWAupDmAA4UGS3eMgzI4SR+FIYNd0w/fPny9/JdpraeObOeVEZk2uI/NzaWb9KFLcJyp1WC/moG1gMRFsRYysJ6YIitYNHEoxkBbUmIhSyOtgqc+EhHC3bXd5JODTN6SXlIETWXBd2gecBAAqX4QH5q3bprkEQSUCYM5qEkpE3CVAByNoTdTfH3Y9/dPv/qejYVQHrnQx06R7lARV3YEL+4cmx9+Xq7N0zYvWAOQFtTb/XW1j279mqEMwM7uJtWR04b6tLzJAzk+CQJGD9/4mwHAlA3irPurFY54AjPnle+JP3mTGKLykNY02VAD/idqIKc6EgpIwUopdyFAuEDM4qCA5bHZDy2adMv50+cf3n+nq9SiHPfdLpI6UjnlJOo7pjRVw8POrJtWt6FwzJhmNm9s8WmZofaBgn1obsj7FZCIoqEPigAesSUCBsaIKVK9g1ZGHmkggARajuuRWwt15DF5tX5UVFsoFyzuKy62oUZJwOMl9BK4Z4kTRC+UgEPhqrQ54Zq+vxo8MpeeHjr9LdvPx+cvleN+BWF0Vuaeggzrrj0RVP3KhQ1JO5QOW7SZ9WkNu2Xj1paL8gaJIlWrA4giv5+RQYcCXFI4OsADTc2GDq/tgVMouM8e2sz5QFm9rykmicJ0YAIAiuGVCS0CDASMKRBl9BLmvMZAzSAGw7ykaeSiMH3+URIHoj02u0Hn779+nD6wSUBrXqITBRpjSgAWuWBQSUDgS78nfB622vmqVatRs1N3Rq7xIXKEvdyYBK8woomVBO0LkIqsl4mchne+SGrMs5GvOdUy5SD/TwwIsUwZmd1hphQ0BaGlpBtcxi801LgQjwHzLnKED2wYWo78fLwAYJqIBUc7ITZDa8+/Lzy8sblbbkWIarm2+pNTaERAH3VhiYgi5W2Zuuyxft36DmyeeBQB8hnmM2EmPihlEW4ohPuID+yF8jF41g0ZGAG2PXtwtXLutKlotasCErj4NWVzVhywZwTyDIzp1phgM0CyJlNSEkCh5JoLqzAy+OzKOR6ZML0aSH5cfnFjbvv16kmorQciBpWAoqHAfpcqLFjmw6ZWaH/ku3b9wxu5f6BLYOTUoChTGhU9aE0ZBgBGyCh7rx5vSJnM7zfWB5bn9fL4GYD44GdRZQVYtf2wX1YAjQXHjnM5LosB1wtJZSHemwliRg+lv0BE/W094nhhR4AAAAASUVORK5CYII=\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"VOCs\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":null,\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:molecule\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"18px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":true,\"decimals\":0,\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null,\"units\":\"ppb\",\"displayTimewindow\":true,\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1697382151041,\"endTimeMs\":1697468551041},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"timewindowStyle\":{\"showIcon\":false,\"iconSize\":\"24px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":true}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "vocs" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/snow_depth_card.json b/application/src/main/data/json/system/widget_types/snow_depth_card.json index af275581c6..7f7867190d 100644 --- a/application/src/main/data/json/system/widget_types/snow_depth_card.json +++ b/application/src/main/data/json/system/widget_types/snow_depth_card.json @@ -3,7 +3,7 @@ "name": "Snow depth card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest snow depth telemetry data in a box layout.", + "description": "Displays the latest snow depth telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/snow_depth_card_with_background.json b/application/src/main/data/json/system/widget_types/snow_depth_card_with_background.json index 1505e705e7..a241428c02 100644 --- a/application/src/main/data/json/system/widget_types/snow_depth_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/snow_depth_card_with_background.json @@ -3,7 +3,7 @@ "name": "Snow depth card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest snow depth telemetry data in a box layout with background.", + "description": "Displays the latest snow depth telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/snow_depth_chart_card.json b/application/src/main/data/json/system/widget_types/snow_depth_chart_card.json index f63e6fd7dc..7442ecf6ec 100644 --- a/application/src/main/data/json/system/widget_types/snow_depth_chart_card.json +++ b/application/src/main/data/json/system/widget_types/snow_depth_chart_card.json @@ -3,7 +3,7 @@ "name": "Snow depth chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a snow depth data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a snow depth data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/snow_depth_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/snow_depth_chart_card_with_background.json index 3be7f02c98..d2b9a6f342 100644 --- a/application/src/main/data/json/system/widget_types/snow_depth_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/snow_depth_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Snow depth chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a snow depth data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a snow depth data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/soil_moisture_card.json b/application/src/main/data/json/system/widget_types/soil_moisture_card.json index 05204d5204..d5053e8a87 100644 --- a/application/src/main/data/json/system/widget_types/soil_moisture_card.json +++ b/application/src/main/data/json/system/widget_types/soil_moisture_card.json @@ -3,7 +3,7 @@ "name": "Soil moisture card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAApVBMVEXg4ODf39/g4OAAAADg4ODf39////8jTMfg4OB1j9zk6fghISHl5eXy8vI+Ys5aedWqqqo9PT3I0vF0dHSenp63t7etvOrIyMjCwsLu7u6srKz5+flYWFiRpeMwV8vy9PuDmt/Ozs6QkJC8vLwvLy/V1dXa2trW3vWeseewsLA/Ys6RpuO6x+5KSkpMbtKkpKRmZmZohNmCgoIxV8png9irq6usu+qDwwvKAAAABnRSTlPvIL8Ar7DvmsykAAAG1ElEQVR42uzPQQ0AMAgDwDII4YMA/BudjUJ6Dg5uD7VdmMMwuV7DEJ0HzEPlCbgSKUXIKMJGETaKsFGEjSJsFGGjyKeuDlsTB4Iwjr97Qjuzynajy4U5W9YNSNuVNHd+/692s2qMEYK9F5H0D5oYNpAfm8G59R3IK35A34Csiw/Mv/uQj6IYk7A3uGQ8jPPQDJvu0OUZE6eQu44RCQsRtehyBKYKWkX2dBB0RXchbdH1UIg6xiTO1iipvLjqHkIeQLqCsOnvQtcjIeoYlTQJQLmFaW0KQCU9RFqASQTwYqUGXDgvK2MULhtAP15Kyybo5ckhu6Jvh5sOlCqTQXaVNyZQDwnRwCWntNj6Rn9YB2d9SVXdRK+nyJ+KUjAu3+0nhjwX173gplqIApgOGTOA1LGCPTSSL8KoMkNUwCYDekgNQ4E5uWkhz4sBZPGK2zhQ5ckDIQ4g3MqWWOQ0ETZkCDuK7gbCYMrJtJCnYtgXBtmQv9zx6Zs0hHhqHEQUaMCnHakZq1jeQgyFSYe9f7HGXy4XK9/SAWL97YwwEnnIaUbayBkiqfa6uo3e6Kxs7QkCidVWtpNClvrom93LVyY8LQptiUEhkS0BdtEGoLRgu4K2sowyqbTR80RSA9J2yzhFNg2Jk+M6GBejMxNB+g1ZA9io4zwvL5ht45C3QvsEsFcHcNyYN8y2cciy0PbPWKujG/wFZts45L3Ibd47R+4PZtsdiNY7NMy2O5DOsV/83B35e+X4PA/7Ev+X+YXR+FGQ392f+dNxxv+xYwYrkoNAGL79m22s7WJIdSyE3hGJi70DHnbf/9lWzc5MT+fUh4AHP0JSVinhiyQS33ZfLXkYGbHDWzTU3AnYbdyMHQeuIz9O9f348xO41OYv3MERBWfayYFmqpGrB/3PVhFVuCWUtFK7obRxSpuIaps452rqqJW9mXxv58vva7n8xU4kcmBHbFmX2bY5qMccEkNLyUICe0o8UWkZVCQCSaSK1OoKn0OOJcX+GJHT9dtXrqe9iJJmsyY1ihmfIopsgi+hM7RyywZaw7uIyXC1+1ZlU3KTlJQ7RAQvDyIX7EV88tkgCtMXEYJMEmuYrG0itgT+Q4SxdedSbb3jaoFMx4jg7Xo/Hw8e4JXIpcllEz2CR3ueq8DWGaFMiy2hZhcZPpSCI30XcZmoimjGypDFpWgyKeMgEZw+f0nOJzwgzDzFJDKRiBAsA3CJw4I58Apq4cI2OU01SJuInQDPwigsHBI0JY7wic1BIk3l9Xy73c6vL3iGmfAEkypP6HLvVxyegERW9CnyJGM3foh0zBDpjSHSG0OkN4ZIbwyR3hgivTFEemOI9MYQ6Y0h0htDpDeGSG8Mkd4YIv/YN2Me50EYDG+HzACSB7YENiIuilS1uv//076T48ikhH63mSHv0halFQ+2eWnrvMvmEGI9kMME04I01iiGBNM6Hgim8tbOFbxhge3+OenWsUDsMWlsRkhLw2EOhZFAltm8gURnTnpfeEc9hsFRTwUJBwDhZu15A8in9lQfEBdC4umyqBvE8v/4PzwCVhsk7Nm+RBmyVdZY1yZXOtqMNmPScVFQBJGJprYRHfgFth3DcIB4Y4AHXoqpJVk0tWNS+BSwjyCZUk0XxF61o2EIlaeUK5CtBnG0FLogyfx3NWezz1u0cPnbvXq+f0HVt1+3ByTmENZrnnwUjCjufbhxM8ZYwsmKIJJZi027k/jca1+zTRxZEyUaqBviSpOZ+7f9oOfpXpMk2r6dVQeZTK2zYbxKKTNPtxHCVgogW4j+EQXY1WGZHvTsaeucIrn+PNlCBjhr7ZP1UVogUwNiwH4uMjsKyFZ7+FPWupTCMelsSmIhMSPqg+TmlQhBEq4VW0hMM0dOF8SeSv/naj/w/cTKck+as4OA7Jvx5TWxV+nApgqeeDV3LQHBvmesX63YQpDetIcOVX0EuxFpE07EFkKg7jiUJSUQiYFMeZWDez3asxB68JJoSiDxdLR1nGjlVBUviVprIaOA7AWwVF8M/VE56XT3Rt9CBOSlBSJ2/i1f3gMlnBwgkcIEHQvhtXgKmQaIhMG4B2xGZvyg5/MDoHQNYprZO5GhF5VdSzRd3GAdN1NrzpfBDGI07CNOx0dakkeU2hH5z4Y9hLOTLDhad4+nwY1P+PiHD5jpyvil/iO2RWxXM2bMf13jjPkXQx9kAN0go+kGGU03yGi6QUbTDfKvvTsoAhAGohj6t4XOXhCAf6PYCDt5DqIgNIbQGEJjCI0hNIbQGEJjCI0hNIbQGEJjCI0hNIbQGEJjCI0hNIbQdHJG6KwB6+lznjuVAfPpN5VdV/9dVu0PZW5XiUVBWpIAAAAASUVORK5CYII=", - "description": "Displays a latest soil moisture telemetry data in a box layout.", + "description": "Displays the latest soil moisture telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/soil_moisture_card_with_background.json b/application/src/main/data/json/system/widget_types/soil_moisture_card_with_background.json index ba153c1ba7..a5d42b7593 100644 --- a/application/src/main/data/json/system/widget_types/soil_moisture_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/soil_moisture_card_with_background.json @@ -3,7 +3,7 @@ "name": "Soil moisture card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest soil moisture telemetry data in a box layout with background.", + "description": "Displays the latest soil moisture telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/soil_moisture_chart_card.json b/application/src/main/data/json/system/widget_types/soil_moisture_chart_card.json index 5931b661cb..501f62b8c7 100644 --- a/application/src/main/data/json/system/widget_types/soil_moisture_chart_card.json +++ b/application/src/main/data/json/system/widget_types/soil_moisture_chart_card.json @@ -3,7 +3,7 @@ "name": "Soil moisture chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a soil moisture data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a soil moisture data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/soil_moisture_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/soil_moisture_chart_card_with_background.json index 69aacadb7e..d7179ebdc1 100644 --- a/application/src/main/data/json/system/widget_types/soil_moisture_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/soil_moisture_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Soil moisture chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a soil moisture data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a soil moisture data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/solar_radiation_card.json b/application/src/main/data/json/system/widget_types/solar_radiation_card.json index 812fb8d846..0bb644cae5 100644 --- a/application/src/main/data/json/system/widget_types/solar_radiation_card.json +++ b/application/src/main/data/json/system/widget_types/solar_radiation_card.json @@ -3,7 +3,7 @@ "name": "Solar radiation card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest solar radiation telemetry data in a box layout.", + "description": "Displays the latest solar radiation telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/solar_radiation_card_with_background.json b/application/src/main/data/json/system/widget_types/solar_radiation_card_with_background.json index 474d056fd1..14bed780e3 100644 --- a/application/src/main/data/json/system/widget_types/solar_radiation_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/solar_radiation_card_with_background.json @@ -3,7 +3,7 @@ "name": "Solar radiation card with background", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAC91BMVEW/cAWSRAPLewq4ZwHBbgKPQwTOfQjLeQPAcwP////67tD57M378NH57c/46cr358r78tP46Mz35sb25Md8wyL89NT35sj25MT46Mj56sz56s7999b///n14sT568v++df++9rv1sT89db78tHUhgT///Ty28f578r14Mf//ubx2cb//+/25MnViAf//uP//Nz57s3z3MPShAT//eD24sjTgAT468j//+z+/N/468b99tTx2MTw2sPalAz//+ny28SMyjn14MXRfQPblg7s1cPOfALTdwb03cfWiwT03sTakQnZjwbXjQXVgwTt18LQdwLnrjH68cvWggzz38LKeQLSdALlpinUeg7ZiBXflSXnrC757cfkpCbbjBrcjx7YhhDWignUegbWiATLcQPQfwLosTTekiLCZQLjoSPPcwLEvqbq1MM8OjLYjQzhmim9ZAL89dDdmhP7882iUALlqSvbkwvEbAPRgQLjnSThmiLsxX8hIRzoszncoQylVgKppY/GdgKEPgLtyYHqwn3GcAT89dnKawLpvH20YQPflByrWQLRewHSiQTn08PYnga1sZruzITgmRnGZwLl0sLjoCvuzCPcmQ7YkwnXhAi/aQLqvYLpv3yt12ye0lfeqQ3BYQKdTALw9eGdmYXvyo66XwHUz7PerHuOiXfptTy5ZgKZzkzq5MbinR1XVUnTlwfVfQevXgLv6sri3cDe17vQkAXf8cerq6W52XjLgQbz2Znx0JGExy4hHxvqxBbirBbmuxLOiATP6au64IrsxIjy1ZPv6cDKxqxKRz6aSAKLQgLMzMTCwr+zVgL4+/K/3YD47C7ktRvisxDn5tvRonqpTgF9OgHy8tS/v7W0tLDd6anisnpzcGEvLSfn57Xwz43GnHqBfGzY4aDmt3tybV/03izv0ivZ7rnF5Z7K3o/x2oTy8uzT086goJnXqXrm9NXx9Mj025r39dL5+eDirVVlYlX4+uj691by31buz0qvfFMgHxveyLaVUhoSesfDAAAACXRSTlP9/vwVv7ewv6/8oWFpAAAj8UlEQVR42oTUsYpTQRTG8YsRFTWYJZAlAbstTRO8D+CFgI0gbhCvxERkEmxMJVwXLAQLWawEC9HSxmLBWlt9Dp9ByAv4nTNz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", - "description": "Displays a latest solar radiation telemetry data in a box layout with background.", + "description": "Displays the latest solar radiation telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/solar_radiation_chart_card.json b/application/src/main/data/json/system/widget_types/solar_radiation_chart_card.json index 00af9cd2fc..0ae573af1d 100644 --- a/application/src/main/data/json/system/widget_types/solar_radiation_chart_card.json +++ b/application/src/main/data/json/system/widget_types/solar_radiation_chart_card.json @@ -3,7 +3,7 @@ "name": "Solar radiation chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a solar radiation data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a solar radiation data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/solar_radiation_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/solar_radiation_chart_card_with_background.json index f3b35139e0..fdc8d33b07 100644 --- a/application/src/main/data/json/system/widget_types/solar_radiation_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/solar_radiation_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Solar radiation chart card with background", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAC/VBMVEW8awLAbgKzZASuWgCbTAG/aAC3aAD////57M714sP25cX68NH358j67s/5683679D46Mv78tT46Mnz4MP35sr46sz35sb89dX46sr78dH25MP999b89NP///r03sP04sR8wyL46M325Mf///T78dP35cnw2cP14Mf++9ny2sb24sX579D//+j//+z///D24sj++dj++db57cjw18XSggP14MPr18LQfwL//N3ThQP36Mbw1avWiwby3cP25MX46sjz3Mf138X57Mv68crMfALKeQLy28Pv0qv//d//+9vu1sTq1MLUhwTHdgH//uPOfgL//uXEcwL46sXQgALw28Pu2cL//eHPewLm08IgHhrMdQPe0LX57svx2Kv99tXj0cKwXQO0YAPUiQirWgPWggjTewT68szlpynkoCHhnBrSfwO+awPXjwvmqyvkpCPglxnVfgfMeQL++9/k2r7nrjDbiRXXhA7QeALOw6pWUkelVAP79c/13bbJcgPBcgPf1brcjRrepwvekhy+bwPm1brDbgT79MvahxHSyK735Lrt18LDu6PDtJ6+ZgK4ZgTlqCS8YwG4YQHszqr89tvayrE7NzHlz7vJvKO+r5ry2bDaoAjCZQHr2cO5qJfUiQO9tp6cTQTSdQLg8crn3sGu2nTflCLWmQfp4cSqoI3hmiDhrBUuLCbRhATz7M1+dmjcjxPy4sWNh3VJRDzgy7jX0LWd0lnekxXQkAXr3L/IwqiyoZPZiAru5cjs4MNjXVE8OTLhoRfbmQ+GPwG1rZbpvxSKQQL899Dz58myp5KLgnHuzR7JgQTv9+KORAP3+/LYwrDRvKqmm4iflYNxbF726Cnz3SWUSQXJbAPP6ayMyz3isxHPgQ7gxarJtaaZj3zgmCTkyKu13YKDPQHBrqC+4pBvZFvZ7bj14zK4spv57zQ6Ni/v1Cv57rVwaVv046+He2/CeQnI5px+OgH89bil1meVzku94YrZo1rjwJTpxpLnwin3++royZ7FjUspJyKJpBaoAAAAB3RSTlPPvyDPvyAgC6rIiQAAKVZJREFUeNq021tom2UYB/B6oabm0DZrbHqQ2FpBjIcWqnVOK0jFCWqVwSQEvZCJWo9rnHwBMTInRlLwwoZWLxZY1VVr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", - "description": "Displays a solar radiation data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a solar radiation data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/speed_gauge.json b/application/src/main/data/json/system/widget_types/speed_gauge.json index 2c70d27cf5..e6853629ce 100644 --- a/application/src/main/data/json/system/widget_types/speed_gauge.json +++ b/application/src/main/data/json/system/widget_types/speed_gauge.json @@ -11,11 +11,11 @@ "resources": [], "templateHtml": "\n", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.gauge = new TbAnalogueRadialGauge(self.ctx, 'radialGauge'); \n}\n\nself.onDataUpdated = function() {\n self.ctx.gauge.update();\n}\n\nself.onResize = function() {\n self.ctx.gauge.resize();\n}\n\nself.onMobileModeChanged = function() {\n self.ctx.gauge.mobileModeChanged();\n}\n\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true\n };\n}\n\nself.onDestroy = function() {\n self.ctx.gauge.destroy();\n}\n", - "settingsSchema": "{}", + "controllerScript": "self.onInit = function() {\n self.ctx.gauge = new TbAnalogueRadialGauge(self.ctx, 'radialGauge'); \n}\n\nself.onDataUpdated = function() {\n self.ctx.gauge.update();\n}\n\nself.onResize = function() {\n self.ctx.gauge.resize();\n}\n\nself.onMobileModeChanged = function() {\n self.ctx.gauge.mobileModeChanged();\n}\n\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'speed', label: 'Speed', type: 'timeseries' }];\n }\n };\n}\n\nself.onDestroy = function() {\n self.ctx.gauge.destroy();\n}\n", "settingsSchema": "{}", "dataKeySettingsSchema": "{}\n", "settingsDirective": "tb-analogue-radial-gauge-widget-settings", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Speed\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.7282710489093589,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 220) {\\n\\tvalue = 220;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"maxValue\":180,\"startAngle\":45,\"ticksAngle\":270,\"showBorder\":false,\"defaultColor\":\"#e65100\",\"needleCircleSize\":7,\"highlights\":[{\"from\":80,\"to\":120,\"color\":\"#fdd835\"},{\"color\":\"#e57373\",\"from\":120,\"to\":180}],\"showUnitTitle\":false,\"colorPlate\":\"#fff\",\"colorMajorTicks\":\"#444\",\"colorMinorTicks\":\"#666\",\"minorTicks\":2,\"valueInt\":3,\"minValue\":0,\"valueDec\":0,\"highlightsWidth\":15,\"valueBox\":true,\"animation\":true,\"animationDuration\":1500,\"animationRule\":\"linear\",\"colorNeedleShadowUp\":\"rgba(2, 255, 255, 0)\",\"colorNeedleShadowDown\":\"rgba(188, 143, 143, 0.78)\",\"units\":\"MPH\",\"majorTicksCount\":9,\"numbersFont\":{\"family\":\"Roboto\",\"size\":22,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#616161\"},\"titleFont\":{\"family\":\"Roboto\",\"size\":24,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#888\"},\"unitsFont\":{\"family\":\"Roboto\",\"size\":28,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#616161\"},\"valueFont\":{\"size\":32,\"style\":\"normal\",\"weight\":\"normal\",\"shadowColor\":\"rgba(0, 0, 0, 0.49)\",\"color\":\"#444\",\"family\":\"Segment7Standard\"},\"colorValueBoxRect\":\"#888\",\"colorValueBoxRectEnd\":\"#666\",\"colorValueBoxBackground\":\"#babab2\",\"colorValueBoxShadow\":\"rgba(0,0,0,1)\"},\"title\":\"Speed gauge\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"decimals\":0,\"noDataDisplayMessage\":\"\"}" - }, + "hasBasicMode": true, + "basicModeDirective": "tb-radial-gauge-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Speed\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.7282710489093589,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 220) {\\n\\tvalue = 220;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"maxValue\":180,\"startAngle\":45,\"ticksAngle\":270,\"showBorder\":false,\"defaultColor\":\"#e65100\",\"needleCircleSize\":7,\"highlights\":[{\"from\":80,\"to\":120,\"color\":\"#fdd835\"},{\"color\":\"#e57373\",\"from\":120,\"to\":180}],\"showUnitTitle\":false,\"colorPlate\":\"#fff\",\"colorMajorTicks\":\"#444\",\"colorMinorTicks\":\"#666\",\"minorTicks\":2,\"valueInt\":3,\"minValue\":0,\"valueDec\":0,\"highlightsWidth\":15,\"valueBox\":true,\"animation\":true,\"animationDuration\":1500,\"animationRule\":\"linear\",\"colorNeedleShadowUp\":\"rgba(2, 255, 255, 0)\",\"colorNeedleShadowDown\":\"rgba(188, 143, 143, 0.78)\",\"units\":\"MPH\",\"majorTicksCount\":9,\"numbersFont\":{\"family\":\"Roboto\",\"size\":22,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#616161\"},\"titleFont\":{\"family\":\"Roboto\",\"size\":24,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#888\"},\"unitsFont\":{\"family\":\"Roboto\",\"size\":28,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#616161\"},\"valueFont\":{\"size\":32,\"style\":\"normal\",\"weight\":\"normal\",\"shadowColor\":\"rgba(0, 0, 0, 0.49)\",\"color\":\"#444\",\"family\":\"Segment7Standard\"},\"colorValueBoxRect\":\"#888\",\"colorValueBoxRectEnd\":\"#666\",\"colorValueBoxBackground\":\"#babab2\",\"colorValueBoxShadow\":\"rgba(0,0,0,1)\"},\"title\":\"Speed gauge\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"decimals\":0,\"noDataDisplayMessage\":\"\",\"configMode\":\"basic\"}" }, "externalId": null } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/temperature_card.json b/application/src/main/data/json/system/widget_types/temperature_card.json index 8986d46d23..0e3c7b0530 100644 --- a/application/src/main/data/json/system/widget_types/temperature_card.json +++ b/application/src/main/data/json/system/widget_types/temperature_card.json @@ -3,7 +3,7 @@ "name": "Temperature card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest temperature telemetry data in a box layout.", + "description": "Displays the latest temperature telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/temperature_card_with_background.json b/application/src/main/data/json/system/widget_types/temperature_card_with_background.json index e6743fbe8a..c7de39d536 100644 --- a/application/src/main/data/json/system/widget_types/temperature_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/temperature_card_with_background.json @@ -3,7 +3,7 @@ "name": "Temperature card with background", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAADAFBMVEV5d1NTWU+/ytrn5uu/xdtgaE9FUUlxdFvm5eu6xdsqNi/n5+/5+fn6+vr49/n8/Pv29vj29fcjTMf09fj19Pbz8fTz8/fz8/Tr6uHx8fPt7OTZ29na3dvv7/Lt7O7X2tjk5One4Nzy8fDp6eDn5+Di4ujr6+3l5erw7/DX29rt6+bc3OXq6uzg4eHu7vHs6+vm5+fc3t3a2uTo6OzMzuDi4uHm5uTd3tvx8PL29fHg4d3P1dXu7e7l5eHg4Ofj5OPU1OHt7fDl5d708/Dn5uvj5N7q6ekgICDCyN2/xtzY1+Lg4OXKzN7q6ebo6Obh4t3Fyt09Ys3U2di9vb7k5eXO0eHS0t/o4+Td2+Ln6OnV1uKamprg3ePv7ebj4OPS19bo5+jHy95tb2FmZ1peZFpYX1Tm4uXf4N+lpaaxsbLCwsNoa2Dr6eJZd9TQ0N/e4N7O0NFSWlC3r3zEzu3h5ORwcXF3c2Tt7OGyrHdvcmXq6vDY3NxVVlZZYljk5ud6e2xgZ11gYVJ8eWRLWVPX1t9tbFpQX1k7Ozvg5fTQ0+LV1NbJycrX2eTc3dvb2tynqKe9s390eGjIxNLb176rqHJiZlVIVE2GhnLJzt+DfGlkbV6amWbBv8x0cFtCT0iquufEwdCgoKC5ro+pq7uqraspR0entubY0drMyNO3uLdraFIePUCKjI1qcGeEgmY3TEju8feAf3KkoW/k5u6PpOG9vMmvsL+WjW1xdWBZW065t8a1tcO0tq7Ku6Cgn2uPlGJYZmBBWFMtLi708/Pi5O6eqKN8gIFceH+Oh3d0jtutpIijnYDc4fLn5/CcruSvsax0d245UlBMU0jCtJdjY2RSWEkvRD+0tLWhpbSQnZ/S2fCBmN0wV8qqpneNhG5zjdq+vrOrraeRjn2wnGmLiVi4xeuMod9LbNCbj4S7poKvnHmdmniLimhdbGOhmZGbkHe+p3WcjF2AgV3o4+bLy7nHyLNISUgwVspmgteFkqeVna/c1c17ip9LbdExV8rGxMvEq281AAAADHRSTlP+ECC/v7+/sK+vryDTNiztAAAk+0lEQVR42pSXPYsTQRjH15dC0Tsi5gWRhGlmR8gQIbvFVUuELTS7xYG6xBDENBYWwTqF1TZKsLDawsIypXD4CbQVv4mNX8D/88xMxo1Zg799ZmZ3uYP53X+e3F1w6caVJxGRpooKQ6kxhlB4EkWqhBB4AFhdCSkxeMlkImWWJXsMhzQyLEMwpgEwEZvNdDqebzZzQzGfzCfFW8vTt0+JGFdVxTmxJM5R56iHhkdUjwzXL18KLr/UxiOCQ6QWKp2lpYQEk5Vw4J2ziGN3K3fAJJPYvEdiQMPDPoBENjzNPZMJHIrCaDgTaFRVDuLlsiKVc3jggsf5I2h4LgfXtH4WRcKpQGGxFWLIJiJVW8VrShq74X2kkCiLj4UVMprtNfYuLEKRkIhVmU4mMIEGBwKVYgWTVRxzKJxKlXMqDHsAysVyNQg1TISEBru8kdm2TDJBHinmCY6WKYF5F4wyQ3oNkBFJYha6UJRR5i0ggZnB4doQCMOFguNFg+OIIYIVgTzNY7jEyKaCBMvsDHwoQRjpSD+PIsRCqPE2USC1VUTUN9wygnTorQDmDZC4rAdP0LFKfG9jAb5RAK9kMkc2cJlSlxAFBwMXFERiIodJBeJqmS+NiWsTrxKsVkVRzDJNIotpWWxnQiYqJRSWAkuaLRTBEuSB2WYjUUldJWEFgm4SJkt8JlyARcwZgwc0MJwHgMkKOmgUNqnIhUXg4UPx0QTZLEuHX7ZF/unjtkzLREXpTM4Ei0QqLS+ocSRLKA5HsIxDPhFfEpFBZZ9EspA9bsMaHAnYmBM2BXPbJpOdyoQbHhd4yiI4X9wnLONScSLrcCZLHUX6ifxWTiV3ygtKBCsoJRaRr2YmIcVwJBa1SsSu44Xzef/41WvTNTTgQZE0yEAEPggFJkyBC4msyAODqZgc0NniYTxwGZFyNh0PdQSE0EpyxzOpoklssOYfMoQD3OEiGcsYHmyS/HnA3v34+ZhMbOcnPCV1EbqcCmcCIMMmxAoerMKp7D69qEvgYT6IUVYlGISz4QwNTy6DzqjT6aF6mA13dKebrjt3Oqg7mAEWXJb+AwysZ2c09ftnZ/2z0ejBr7vv3i0Go1G/3x8ZHjxY04zCrZnWeLemqcZ3YJeL7xcAK26+4eLybCp2oU5BImGYRZo97rVOT2/uc0rcPMRpnd1zq3Wr3YNvr92+1XKvGH5ybzDq3L6NqtF1axd1kM358qElGOg3b7SGR1jb5smfuz3iUad1CyI9pAqPlvcg6l9XN2GVZg6rfKaWR2GiX4gcSXSn+efe6NEs8pVEbjWINKkcFLB1SKPbHdu/WjgRnS6EWOjezYM0eBwXaVMiTR5esCbSOiDyz0y+UetjkEgIxBv9XyKnxxIBzS3iOWrCaVgJmnwYTgRxMMFgEOp1GN7X7ZMTdAbKcoJn4mgitEXepG/2Nnv4RBpFqI4cri5PvOzLQATnCmVEdMhABHgPVFMmB3+stUigQR5HAmH/I23Cu7ddQlOdi9z9rsfRMujeiWEXCKqh3ZuOhxOxuK03aTiT44l0WQL83SP4T4VcciRiPHwiDjw0fAI3H3PzxnrwLps0/Pej6jT0O8v8JZJXOZnEwULDBGVEvIThj13vi/hOxpZp77ziLT/5e99BjS777Gl4Fbqpi+QxHS64BL85s38WqYEwDOB+AAmZJHqIGmw8LRaz4bawWFAbp7AS/y5p7AwLtyxoGhmshEGF7BewE1aLFILYaJdiq9MqENDCzvsGW2jj82YmN5tL7oI+d7tx98Cb377vm8nuje9vmxlpSU52Sg79dhDqInTG6s0hh6GY5SuAqktjRpAK4g93BgZysNaWA+l0sGb+D9LXXQBoDX03ICMlGeFa66mPEfEDQDDfbcjekz1LL8ZAbHuShml4Lk0nPRLN6If0VAW3iqJTt9aIILihtcaPLmxv39gO2hWh44ddx3F+7qkF1XshFWLKVQRDdF1cdehxhIvw6LNXf1HU0VRkpCG+718a4C6oTr+t60Y4kF2zonqYJ9M7JRd37szrpRsJgodHQqZ88e8jr5evHBuQEQLICJAg2L4wqCAn23niOPvLfcd5ghUZBuIhZ3lCh3RVrFKbZVFZFGm6EjFj02SeiNhGoqLAsstkisM0EavQKgsuFtYqsvA4tLIsKnas+Qo/aTvaMQ5TEQogwTU/8O/6aK0Oh7WE4fsPx1mq11a/8q5LgNNpBUllnkg5YYKLIs/XyZrHLOZ4jke2veKJ4KWV8VyWKGAm5aAUBJHCshZ8agnOZRjm60LK3pGn6L3koCL3RqBUw05thfckj4ZnuvY7gvxyCKKji1FDTntewlOW8oiJnLkRj90JTwBBOURuT4GxhAAkQlkytXZqLQPJMTBChnh2WkmamobBq0ddY1xAVDlww7CTBFui17VrE8TeI0hdDM9EVWSdJ0mCxQvJ3JhPGcP840jVSDMuEpQGkJCGY5WIFkTiB6hfUnA4e0/D9aWjnv0KMpuN8HXicuUIfH/LvGG1dRoQphinieAiakZcF52FxATxGpCMIEWCKMiCJ4ukGyITpFQXNO0cgpirLoKoT1YVJMB34G9hCFpbdjUj3wBhtmIgnqdNqAgarcixleB7A2LHvKTWwjHCfzNQECE3W2u9AZE57nb0r29rXNtANq8hcf9VMe4BMr75yH9+C/116qBBmQlBvt0mCJZM5YDDZWre3QqCDUXGUV4ShBHEBmTBZYQ5twcyj2JRKEjCs0hi8ue8KPUDDYl4EWf5vH4ZjzsTa4e+I8hLDdnxb/r+86Hvn7ERc241ELQWQagc5geuB4hcMaQUXGa2nQiblRItJQu81qt1Xgyw+SV5LkIrkmH173UmMfUrXlih4HgwtRJhIfEacrM3dnXXJqYuDCAoyOz+DHNCb6zG/ngY+FcZ02clEwOhZ3VXaQgk3ZcllmqadtTbTas3dkdz2V1X9tRa+ERyVkEm6cRHbg6vYEXGYSA/f9E+os5WbsvR2sAPIPVbMnxph06vg4rSpjQ3RH1N/PU+GPfp7kSQXsQZ+Mp87jOdDQcgKssGw2M4Wx1WbK4RO/vJI2P1FkZJmpbubREQ/E2IMCfSd69evHr/5eHgFGtLvE1ItfLDF7rdLzY90yPpYfTsKFQN0uzgbyL37gGD0++fx5fHl/3xm1uMNSg02c/2NWR/Ty+8hTCLbkus/8S0equNYWpPqSoyw+0lIK8vj4dXPv3+SAA0PxTE2NpC7XadOru6jcxcWMd+ulIhjilMf3Op33EkhYHiuc/wN1QaEVTk/INP40uf3366dQqrp3h0hAOSpWOybDiO+WDFFIpuOltbHZYm5syZtub4DsNSnl1HSar8pdSMdZyG4TCeB3BNTipEEdABiSgDoQWE1KFCsJwETOAOR7N04pwMKBJMDEyZEqlIzCxWO1weAAZ4BdgRIDEBjwCtkOCzjeu2aRv4fJfUiRv7l+8fJ47rnO9nxfRlPnly3kPrjU7LiQQPhlhLzOgcUg3M0k0Il/oBdlpZEpYskTrr9FEaUCWWbOmGacOLr/eYTNEszsNHi5cnz8aDyw88f1MWAzJ+aAzbttW6GG8EKWKyoiiJYwuyPcDonpeqCC2gQDed6asXL7L8RtA7L6dtVrUBYt9W2bYhNvySFX3XPWZp4Z6diVKCRCWlk4JGWcEK2VqWVYlcpRMSVXHpkXGaFhqkmCiQiBV/QXopK9SGcoL1M+Q2SNZu8tdG4NAgl/qT8Kh77dXLXDf/stRfkB8rHJ91b6YdQTJnkM8ynrjDuEzjYwWC/WUsd2NVsbgkvZixOIEVJYsjBdIRDB+JRok7lBaqCIUCwTKRmQ2BLJhpZ7b44ipHQIHkdE+uXXzzevFrfltjaGmQnysgPw2HeUjWIH7Ud0t+kInAPTuUoWVBSCkISQWpZsq+8ZgQUYIHOWypKgMSUFLhWJUGiShNKpVhCY5H3VLUnyPBoWme3hlplJvOi+l8/gua53WQrysgH9EzL0FcCPVIZYIL7vZZPIMZAMFeUqKxEoSrSyJhKtdJBI81SBJDyRKEoIhx2Gecw4oZUyByO2JP1rkLRP4cB2nkzOfzxeLDYj49Or8mH/K+LTm+HWjZIa8GOY6P4YiLwoUoKeOSYxUki3G6W8jBBo9wBQKPOpANLdhjQAoR0CShlQJRxmSxT12d6gIIKG6Cxnm7+DB9/Xoyvn/XImhhGnBJ8s2VshgQ40VRHA/jLOKclqLX4ylNRUSotCGb8AQ82bnnDLni3HOAiHGpHIk87I/SbAWkFMWEK5BMRBE+6Q2uLMgZNVGwBSS/OZKWwJFB/6gofp9MX+f+kkBDQO32uy/f733/9Lh+0z1IOZSiylnJfQ+51CO9GSdSjCesapUC60GrlQrkZGglVUq8meiQciaSv470OEBoKr+gQwufgITvwBgXBVnf3Tl7CkfyUZ7n0pFBGPbC6Agv5U9reUu1IXsjp+ZmXJu6ITW1lMrnraVIi+wT3ZAfUZ+z1Rv81jd4ABnBDflbFqd7iMFIePigd/6MJQCD1nLCpj6noDE0Yk0WxJLg36iRBuEleKCrsiN5usWROzK28pu5E3aG3UvDoBd46nHR8yyAXuqOatfZI3scGYz/GUQeZMOSyLd+7Jyaf4q4uiP/7jhh2IEpV8KuL6/hNSPcjSf2Gob0YocnrU2Rhuiiu+eK3eVyS68lSbCQIOGg2x0eDtp60syAuLXH9prWam7gAEkDCrRnEI+FodoAQQIHQKBuMO6M28SSHJiG11h2qwHESO5s5qizWJw1kKtXQQFJEPRb4+th2FaHUiTmsrAohsXy1QYgDRhG+y0huyB0klJZ68hVQGiQC+GF/qUoDA/UkUyjTcNsYDZ50kwBGTsah8B7gKQsCKRYnCi4FA7G3ejkkBiStgExLI0YkKFoVpMlZCuCJVgPLfXrO8g5yrLfb0+yl5faqg6U1I6YVtXG4msyrv0Hxd6rRKctcneCgOQqcBxEVniIy+TCgW41XYLsPoF7e6pTTSTAaFDTOyKrWzqyFMgfTu1YtXEoiAKoPmBYuRHbpVAlWIghVQo3S7r1D6gwYqv9UX/S/kDuvGF8mbyJx/KN9WxMEt7hjmQRMi+4ScGhEK/kQEg5EFGBFBQRHE9RDglk9X+MBASVHF8UMroEISQmAzA0FN3IUxZKCFnf3tZfWAYUAouO1jg2Cb6fELzFHZFym/avCuujTs2QxNFbXlZEC1kBQdQCiG5bVOIQ3VZ7lxNjBAqCo1Pn74hRSov0w8WbR0J0vAyCwyA+XPgSr6TFnm1HqcHbG7uOSKlnq27FS+Foaf6saztHWgixFkVsb474nkIqa0sENaaWwNBWQjwDCBwtHy4NG2EMFqPaGyCV5iCR2/HETUsPOU4qwcMhQcI+mGR8RhN0lRV92Lq/FlbyeoGhHcPyVzux0aoroYSKhjVzW/dEbC2SStrj96VFIfPp/4RCbLRYCU93ZOSXMqwDhIVZKTho5bjVGinTQeza+qqKZhl+zseTn+yUWCXspI/1wBdsJ4xdreAd2P5iFHL2Rqb3+YQcA4QSbpCltCf3JGNHnKWmCHu5Q8ogHr1qTcs71h/cTIT0e23hqGVOnjY7Ut+F3YeAQoiGkFiJKbJGaCPGRXsgeyWLGs6bQj5my3IYQyViDrl9VGQhKsZ+QteHDeJX5BoiAYJsl23LG+Gvi1eufP+cL3ZHkL1RS8Kn411OaOR83rYNlGEihOkhhqkSNU56tBN6kPsQcYgi2jFcr8ogpOvECCXDN81XPNrjkU7Mo89lJQ7xaCNXQqLEKZyuIty44Xne7/usd09hCZDr/DGnECRAuitUTvGt60rV45di3kpiqf5cDMjFHP8+WTl/3aahKIznAVogUaOKoQhVAjFUQiwIJCaCGGDyVAaEOlli8OStTxCBxNA5UiIhlQwMHlqGdoxEFSnyCjiRMqV9gAzpUuC75/jkxL1xrkn4XDu2g+n5+Tv3j+trlzqQgOSgFC4iypiSpw4VZtCOpLsGAwdAfF8cqXVq1Wo+CGkhSDRqxvEomT2OFth/1AyjvJYkjOPk+r56E4eMEmZhTxx6Ai8EZLtmOcLKgOShhEGF5XXrM4fq/iCZxxF6dKe4vq6KjgbyXw3r9IvdHABhDh+pVattU3Kt2SkCLQaJuhXV71g5Zvcf2RwjCTlaF8UGQ49hCjeIDwZwMIgp7R11RGVf5/HeKcdFJaOmHNfHxiISD041Y0+/whFZDYXECTL2x0ABiMEAC0AcJCKtwPi8D/pHfY89ifiwpuzv8v7QNmRoisSkMkgtOeLwJ8Ew8Hi1TyRuENIYjtSMtqudmoK4SZgj5PNN67GsG3m0rqwB2znVUco2rFS4lDD5BQMnKX2Ri5TtXSbZNY4YVavsiC0OwO6qQwHHy6Lc8NSQKz6aoUJpIKd5NDKfGCKSSKqBIxLQgOmNnCC7jAJHRFrYnX83YZKoYmTqKt2iVcSHSM2aWNXPGgzSrkktxK+GeHWthidEX8QReEHTrhtEiXTSzApuirwp1oCRWHU62XKZxYdHA5DEsUdFBbqimmJdFUgpgdyOjH0sS09rmAqB6CUfb1Id2s2CROINQocE63emZ8PVr7pArCgtqibn1loREN+A+ABRR1YTVVtznLrSBNTL5BFhB/XZsGeUBNDQfbcOIGOQsCNkyNOVQdSfMOtUoCDTrKQuSjOZbUOGeV1Id2rhx4CQVnfkimsnqGmD4AuRoLDo81JbTZvEnVpccf0vkCbXvg4QxTBrmaLdzLtNt+5yhEDIkZrR05VA6gNOILcjBkGJsiAG0KZwg/jj3RTELFYBiaQtd4CQDfwhRJjnOmIwCjvyXECKplbgiYLsfk4sF4hILYHs1OIet0K4QMABEOIo6ohXESFqVZfbBCdI9k5emkjqiJ1RN2i2NixHcEXC1a9ZLA9CXdeB4XA7ohQ8Q+xIPKUQySgqUlkWWW0bik+fvnz5AhBoaRDlSG46Qda1bc9oSAUsi6Dhl82UpwfvHhkKBYGWLezg0D7iggZx/qW7NoiKIaJQQSEL2ZYZ2iEIBaktD9Ikjpg3tJsYSCZxSxnlUiByboOUonwrpPokz4YNCAujFKS9siN6caWKOPWkKAxM4i0cMYADoN6aGhHTudC4c/UCEO32AWZp2ZcESQbKIQ2EKUnqQUIxKcA8UfadCwXEO4Awn2IzVXXzbps4Dg5a/1TYrcagTjH37ZzXvhMVoTinSdBntOFaryzqsUXXw58SVKe6dyAqnlp2ry/luLT+aEVxRbTO/6S+lv8gk3mSzqNs7AkHbQbT0y/xK0YWpNUSELTrzgZRR3OQNEgvqc9IO08XJvr6BddIAjCLAAARlzTvcB/r++cTMWQBgYK0iKNVAoUO4dAzPi2rC+7RXlZshaYYhLweBMCgmAhBJeMmleRcmicPFKRzxVACG6QFkEYL4vFaOvJBGIoomAeyZhRn9h1mEWacsEkg4dhwUBBIGyAkM1yW9LBsDRtZGgQk+lTT5FDu8M9FkLHroVdReWFaMKqYXCBILJhSAgKrU/BGjK4NPVthOl6zN/Q4pPN9LhB5ENq4HQYTJr8MnTkF3TZ6zYY0jo9LeLvAfcwPH25ohCTHiMR152jX/TBM9nkA9K08I4hC1cMhPeMFu+GggN42GoBoNRoH9FqqHePI5iyFxbLkyBcIyxwvFjd2bg7ojQHBdHJSug8O86rclx0NSJ/DNQ64Cawhe5n3Vc3tvooTlpjCpSlIq0WeHDdKO3ug2Hu587gqUZRZhCISMPcz9awy/wiF0wyU7cIU8tpOPA229aYBMwil5Psv9nbGe3v+E/0d9DSMQWFJdNlGDNt2HtEX6UQELojN66pu2JHP1xb06vTk9PS4AZU+/Pk0xiAI/+2zTdZtUhUsmUSwwuBtckEIealiQ5RAU4pMuI6A2QmhGKQ3J6LS1++/frz/+bHRfvngCbS1RS9QxctVwbKpfkPYEE6ITCsuK5cycgW/ZdIIH7yFddHbxunp6bdv3z5/Ln0/Ozv7Cv36cCd9+w4JL3/degAaTKCDgMar4MSXZtOgFcNZRGF5ILHyR75MKHDkoH18DJq/jNy9a1NRGMfx+18oMVqCpS9SbYKklWgJFZvNBiSDoYjZ4hvEISIitkIli6gUB2eTdhAM0qEVGgvJYJVkMCFLHc2klNSliy+Dv99znuNpetX6rb3mrXo+ec69xcF679AGDysjpjTCDzcdwHeXyckzk0hwuMN4kUMi1amRY/sfRy/CzzglS+xZsBzYbgQfuVhZWTMzAUSrpKUwmg3zllmw4E6eBE1v4ZlZQ9XBQKM5Uo/tr/8s8k+CDI6cndib7yFAVtZWS6sl5M28nJl5uYGZvCBBGIw30po8pvfwVD6fn0WwcE4nhrADqTEd6M1ncAh1KME68FZjCyBsCDYpv8DCZ2/ifVBZBaRSWVvx1tfb7XX2Y1qiIJUSiJO5UnnbrJkL/sIztEhckUtl/nxj0MwZCISOf0CjyEUSYQQ/xvWqsipbiwYDOW+iZmzMEMBCYymbYRzHB0rJmBIjowO4TADDTvna5/szLh+uocOGcXJ3FgWW3/WA+wqM0qaHeSjkGKJEPZqwbKSohXFw6URiFIGiDZn0tptVT0AgPD40dMKFryIjfS6dHhwMDw6mUQbvlWnERpL2oFQCorS5SUi7WGwjQJjT+FE9mBTDvM5TYnOiI0wx/knBwMQ7iXiULxodwX8b5hZmdotnpqczGmi7J3V6s1QpicQrfimanirDlx8VdjOansZjeJEy/B05Q44RuXkdlqOsfBQ/bNjuF7w+kQnjndLiqXg8NeYSlni0mzRgJt9+em0mkMClwDF+uHDHlwMhMujQEn9IOfAApFOaJAJx4XbXjLIEGGEwjmvRaDQen2C8ZZKNYLs5M/PxyiZm8t0rau2ngV1dYoFLoAT2m5NFHEtYXVjLYEM4jsu8/QO6cIa3OMEymTBmAEGWCQVNTU3hGIv9tsGkPdxGTz4tLj73inWVKIRDEQl/8eDvbzA18DxC+E0swPgaIcIoUibR8CykIxcx5WARSDIWC6EcE6I1Xetsf37//vP2dserN+qNRqNerz+9IQX2pBR/EIOMnGNMDPF8HLsbiQW6DANJb3DNEsypOIrqixnuZSORu0wk2VgyKYzxR4+CzBoN6sXyxvLc8nKn8RUQKhykh7MPChOzFHVgRfmo3eB2eb1Xch2XouNRLc5493iWDhbEcrMxRAcYhw4dGh4evquJ6kUTkLnlzuvXXr3e2Oo00M5Rtq+GgbCnG+e5xgmuRBAYv0q4ZiFoOgKNDrtP9F42BwgX7CTCIKKv74Kpr69vmF0t35prYibPml5jqwHK1lZjp19ymoMoIJr9w8vH+icm7Lp0H8uCFSDp9YfLdunLcUsdQYHo5jLz4Dig8LVYrTabC3eazbJ3fWFhYa7TedbZOSuphhkMDgFMBzf/DcGXyTp1JHo2QuIM5vkkNj7KJpNRls3mEOEWYicS5KmgA7GQy5cvn5YP6cLbQvXOQrV6v9z1CoXCfOFet9vZSSan2B4NLf4CTnVQDjcOHu23FGPRrc/vA6KwEJy6uVwoZCwoG8O9ECUMEI4EKSRkThCeHoTA8Tto3lar5XKhVijUvGa5XO6Wu9XumxD/9KRwfLOR8fgwPeE1SkFi0HjfOQQSYpTomTw+zrNBNyVGEiRDHHzpOCBGohAXJtKtFlo1QGqcSLla7X4YZ6rxjUZzCj3aD0koVuNvijy5mGp6RYogSoAQCCUoIoXwFBwIEh2J62MNtV7Vlmpe4XqhNT9f6M4vBiWHcRqph+LrtlJYv61HAQY+7VaKqAWNR2TVIskhOBzkEQoyJwHFQVq11tLSUutV6xel9a/aNhSFAVzvcQumT5E90BdRJDqoQzy0RoOQqMBbKBrsgIZCIR5aI0yndsjgDoWObSGBbPWmofgZ8p1zz+XjIsifTwYZSVjn53PvlZK02Lf7ZVvtr5zGMHFrqHmYQ00A0QGGzIjXGFkyWvBH0xHqxhkY9QjjJCYBJerK3Uaz2+2SshyytxhdP346hp1ha57HIQZRCRyIDiYtH4EFe9yMFAjlCEvBs0Oi33U1s7YgCtluN1tI/iRDkf0u5mU2XPmrZ1jmzHJxIRhy2Bty3jzWGrv49PSVpxhEi0a8Q8qTRzUHkZtZ7AEowVGz4KjH3G19NuhI27ZN0Q/tB2VYVGKWoEGAiZvzpM54CRKaIhDZBHJiEIkDxtYnjZZr8ZjoEpwFxJI0y79NmZZNcXAmiSn0CMZ6o+FIexgTUdTCdQs/q444dNgIQhQDCauSav9d1vvdRiF19rVqhqzoPk8ggSL7GBONNW+JNAtsuqOFmMiiEKs+hiDewSjFJrBfzA75Ku267305T9IGL11lnxXXMUQlMDBGsQgIlgmGC7KPaWhRCseYQBwlMSSstee6UXISct1X63WVz1d98j69adfLm/6dnyMMBfKd89+iFmImlgVDysRiPXGODiM5SgCRWFOkmhehggNe4ru0XLV50q/G4va2P6uzczoICThSJMSYJmoMJTHFNEYRjFFUYhTzOA0o1pJAkZkiErv5cRx/1XiLv+ySj201z/P/376cHQnR0BFJPCV4uAR4CiWLKNO5TwqaYhK2RW7lb24t0cQ9eTn7NB5HfNCW+r4Qc+lZGojCMC7UxL/nP5hLos5qTJzYxKadaQaX2kjbtKRdGF1YQwls2iYEL4mG6ALEgHEB4RMWclEuUdeeoq59S85MKRnOM+/pdKBmxKbp5M3jKkXW9we9JzduXAyfDC/eDJ9A++DNmwdvHjz4BN2Li971W4uL6i24vOg9G15cDIfPhr1eb9F7cI69Ye9H72K4eDYcLha9xWLx49F/9OPHj5+VqriomgWMMXzypPfkzZubz2CE63B+AUnAt37+I7hS9Ydv3tx4++GVIQZfvoIGnVqI6NTUteZyLZCIsG2F2kACYRwoTeovHcKpbfMWo3w0kihpvxox3/ZtZrquQZBl2kZrIBgx7AEjpo0ZY4ZnGwwWEIxcS2W797dvP6yOh9CedW7g7O7d2xAas9ms3+02Go1Zt99tzLa7AsOvilcfPtSDL++/BJ0OMlp3XsJW3ax2Ve1X7XF7+vwp9GkbHumvIIfBF/j/oTaRlKSDTMUCjYn/i3TeZ2qzn6twHg5wy6LMiBKfGZYgkc3JN9iVMRo5PHIRIwhHaGRTHbgtZAISNgpvFBFCTM6QEQGJqwWiOhbZbpu/n83OqUOAWAXoN+7ehqPR6Pb7faC52+iC8iz6Bpm269+iIOhEruFaxsuXrotQwZwkmcJj4xXsFD9M4SNSaWWhYFArqZOU6TxLBXfo/N09X4X5YXNcZ0KEwurwsUdZO2lhynxazXk9MnyfEEToPQciZqNIMWogTMBHF/J3DcMy0cg0WYQFYVahhWFILLEIM5VvZ7N/KGdBHyDOhkD74kWz3531G43+dp95yfOnr5w6KoqOG9kvmeEGlQaa+dPp9EMbtoqOHYZhrE673a7GQToud7ly/XtYSD+Vy8PD5Xrzbh4PwtJk+0FMEIxi2oQZgEKoyX0bJXXfNrFj0lZi+vUWVBUCEgMHgikS4qQVYGwwjgNpM89HXgsjjIRGUsVQb83urHH3LtRXVWd/qBrgB5RZo6JpAhvU2zYzE0i5biPLhSMEjNBSro5Vx7bt9gfHt7EQcVqkhaoN5rXJ/Tjre+OAoJGLrNPxAFqu8/3Hd/Mw22/2mehgzpk1dhxqM0sTp163KffNTodQ/sFB9Tr3J9zEDEtmUJcnJRkR7OJxQl0PAEyCKS25gbUnWapLItM0FFm23QIMqMKB118e8KO5qmj6fQDanmi7PX1lZIUVBFkwKIpgv58HquCOU/dpKVScailprRZ7OK2tjmOYYsaRIqflcnlYb5bhZj0P95v1ejPPw/ALeKpsFg5sOsIvE3CCoyQidZ4kBPsOzI2FWk6IiM2MielzXGIqDcS0EBTFIWLCImPOy7LEUnpISY0LmUISscrzvAtAlTFnpAqm2+03my9erFZNUL+5KygHb15FwZcg0mqez/PMhfk0icmF0mns0drlsdYyTtOxM506dBLK4/J4XB2Py81x011vHj48HDZ78QUJ4iGzRYk5UNw2UOIndUIdjhHh3KzunsSxKbZfUuoTGwlZIuYLgdlYSKXUXGjNXO0p4WFGDSo48YFUaiVxKHWFlOX70+0ZsJyNgVUAjKlowBxwBzqnSXs69V0ry4KiUNk8w4REEbEjnSp1tXYp+VWeskla0xZ2Xien5XFVq6XVcry+u4TpWR4bjz/O34uONQ88mtyzMeGybZhm0vYJN5lHTYkpJtR3JsmYYo/TxEMUHKNtjqkIpW1IuCNjjYUkGMd6UkrqcVhFyolOvLTUWFMPplUDjY5P+S7PZ3e7OQCdC61iqfTidHrxovAmXuQVbhR5ehcoaLXn6aIIL9UuXbo29bIwfvzuXYjHk9pytbqfjMHvzeHhenk4rORp83gdczrhRAwEoq3AKia0ZBLhsW1z4ZeJjwzMuVWOWZ1I7nhCYrCEJ5Sb5cRKuJjEaRkLgWIjVrDOSE5CQj1PjtsTHWOhwngsdSmx1GkqvVQCtoTqyXdbcKaqtObZnD/eQNipIioQswrilz6N/CuXLv0Gg0q19Ht4Jq0AAAAASUVORK5CYII=", - "description": "Displays a latest temperature telemetry data in a box layout with background.", + "description": "Displays the latest temperature telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/temperature_chart_card.json b/application/src/main/data/json/system/widget_types/temperature_chart_card.json index 8debe15925..235a24eb15 100644 --- a/application/src/main/data/json/system/widget_types/temperature_chart_card.json +++ b/application/src/main/data/json/system/widget_types/temperature_chart_card.json @@ -3,7 +3,7 @@ "name": "Temperature chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a temperature data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a temperature data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/temperature_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/temperature_chart_card_with_background.json index 54bee4076e..613a9d71f1 100644 --- a/application/src/main/data/json/system/widget_types/temperature_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/temperature_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Temperature chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a temperature data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a temperature data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/temperature_radial_gauge.json b/application/src/main/data/json/system/widget_types/temperature_radial_gauge.json index d11faa7ab2..1f5de24fec 100644 --- a/application/src/main/data/json/system/widget_types/temperature_radial_gauge.json +++ b/application/src/main/data/json/system/widget_types/temperature_radial_gauge.json @@ -11,11 +11,11 @@ "resources": [], "templateHtml": "\n", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.gauge = new TbAnalogueRadialGauge(self.ctx, 'radialGauge'); \n}\n\nself.onDataUpdated = function() {\n self.ctx.gauge.update();\n}\n\nself.onResize = function() {\n self.ctx.gauge.resize();\n}\n\nself.onMobileModeChanged = function() {\n self.ctx.gauge.mobileModeChanged();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true\n };\n}\n\nself.onDestroy = function() {\n self.ctx.gauge.destroy();\n}\n", - "settingsSchema": "{}", + "controllerScript": "self.onInit = function() {\n self.ctx.gauge = new TbAnalogueRadialGauge(self.ctx, 'radialGauge'); \n}\n\nself.onDataUpdated = function() {\n self.ctx.gauge.update();\n}\n\nself.onResize = function() {\n self.ctx.gauge.resize();\n}\n\nself.onMobileModeChanged = function() {\n self.ctx.gauge.mobileModeChanged();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'temperature', label: 'Temperature', type: 'timeseries' }];\n }\n };\n}\n\nself.onDestroy = function() {\n self.ctx.gauge.destroy();\n}\n", "settingsSchema": "{}", "dataKeySettingsSchema": "{}\n", "settingsDirective": "tb-analogue-radial-gauge-widget-settings", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Temperature\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.7282710489093589,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nif (value < -60) {\\n\\tvalue = -60;\\n} else if (value > 60) {\\n\\tvalue = 60;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"maxValue\":60,\"startAngle\":67.5,\"ticksAngle\":225,\"showBorder\":true,\"defaultColor\":\"#e65100\",\"needleCircleSize\":7,\"highlights\":[{\"from\":-60,\"to\":-50,\"color\":\"#42a5f5\"},{\"from\":-50,\"to\":-40,\"color\":\"rgba(66, 165, 245, 0.83)\"},{\"from\":-40,\"to\":-30,\"color\":\"rgba(66, 165, 245, 0.66)\"},{\"from\":-30,\"to\":-20,\"color\":\"rgba(66, 165, 245, 0.5)\"},{\"from\":-20,\"to\":-10,\"color\":\"rgba(66, 165, 245, 0.33)\"},{\"from\":-10,\"to\":0,\"color\":\"rgba(66, 165, 245, 0.16)\"},{\"from\":0,\"to\":10,\"color\":\"rgba(229, 115, 115, 0.16)\"},{\"from\":10,\"to\":20,\"color\":\"rgba(229, 115, 115, 0.33)\"},{\"from\":20,\"to\":30,\"color\":\"rgba(229, 115, 115, 0.5)\"},{\"from\":30,\"to\":40,\"color\":\"rgba(229, 115, 115, 0.66)\"},{\"from\":40,\"to\":50,\"color\":\"rgba(229, 115, 115, 0.83)\"},{\"from\":50,\"to\":60,\"color\":\"#e57373\"}],\"showUnitTitle\":true,\"colorPlate\":\"#cfd8dc\",\"colorMajorTicks\":\"#444\",\"colorMinorTicks\":\"#666\",\"minorTicks\":2,\"valueInt\":3,\"valueDec\":1,\"highlightsWidth\":15,\"valueBox\":true,\"animation\":true,\"animationDuration\":1000,\"animationRule\":\"bounce\",\"colorNeedleShadowUp\":\"rgba(2, 255, 255, 0)\",\"colorNeedleShadowDown\":\"rgba(188, 143, 143, 0.78)\",\"units\":\"°C\",\"majorTicksCount\":12,\"numbersFont\":{\"family\":\"Roboto\",\"size\":20,\"style\":\"normal\",\"weight\":\"normal\",\"color\":\"#263238\"},\"titleFont\":{\"family\":\"Roboto\",\"size\":24,\"style\":\"normal\",\"weight\":\"normal\",\"color\":\"#263238\"},\"unitsFont\":{\"family\":\"Roboto\",\"size\":28,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#616161\"},\"valueFont\":{\"family\":\"Segment7Standard\",\"size\":30,\"style\":\"normal\",\"weight\":\"normal\",\"shadowColor\":\"rgba(0, 0, 0, 0.49)\",\"color\":\"#444\"},\"colorValueBoxRect\":\"#888\",\"colorValueBoxRectEnd\":\"#666\",\"colorValueBoxBackground\":\"#babab2\",\"colorValueBoxShadow\":\"rgba(0,0,0,1)\",\"unitTitle\":\"Temperature\",\"minValue\":-60},\"title\":\"Temperature radial gauge\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"decimals\":0,\"noDataDisplayMessage\":\"\"}" - }, + "hasBasicMode": true, + "basicModeDirective": "tb-radial-gauge-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Temperature\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.7282710489093589,\"funcBody\":\"var value = prevValue + Math.random() * 40 - 20;\\nif (value < -60) {\\n\\tvalue = -60;\\n} else if (value > 60) {\\n\\tvalue = 60;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"maxValue\":60,\"startAngle\":67.5,\"ticksAngle\":225,\"showBorder\":true,\"defaultColor\":\"#e65100\",\"needleCircleSize\":7,\"highlights\":[{\"from\":-60,\"to\":-50,\"color\":\"#42a5f5\"},{\"from\":-50,\"to\":-40,\"color\":\"rgba(66, 165, 245, 0.83)\"},{\"from\":-40,\"to\":-30,\"color\":\"rgba(66, 165, 245, 0.66)\"},{\"from\":-30,\"to\":-20,\"color\":\"rgba(66, 165, 245, 0.5)\"},{\"from\":-20,\"to\":-10,\"color\":\"rgba(66, 165, 245, 0.33)\"},{\"from\":-10,\"to\":0,\"color\":\"rgba(66, 165, 245, 0.16)\"},{\"from\":0,\"to\":10,\"color\":\"rgba(229, 115, 115, 0.16)\"},{\"from\":10,\"to\":20,\"color\":\"rgba(229, 115, 115, 0.33)\"},{\"from\":20,\"to\":30,\"color\":\"rgba(229, 115, 115, 0.5)\"},{\"from\":30,\"to\":40,\"color\":\"rgba(229, 115, 115, 0.66)\"},{\"from\":40,\"to\":50,\"color\":\"rgba(229, 115, 115, 0.83)\"},{\"from\":50,\"to\":60,\"color\":\"#e57373\"}],\"showUnitTitle\":true,\"colorPlate\":\"#cfd8dc\",\"colorMajorTicks\":\"#444\",\"colorMinorTicks\":\"#666\",\"minorTicks\":2,\"valueInt\":3,\"valueDec\":1,\"highlightsWidth\":15,\"valueBox\":true,\"animation\":true,\"animationDuration\":1000,\"animationRule\":\"bounce\",\"colorNeedleShadowUp\":\"rgba(2, 255, 255, 0)\",\"colorNeedleShadowDown\":\"rgba(188, 143, 143, 0.78)\",\"units\":\"°C\",\"majorTicksCount\":12,\"numbersFont\":{\"family\":\"Roboto\",\"size\":20,\"style\":\"normal\",\"weight\":\"normal\",\"color\":\"#263238\"},\"titleFont\":{\"family\":\"Roboto\",\"size\":24,\"style\":\"normal\",\"weight\":\"normal\",\"color\":\"#263238\"},\"unitsFont\":{\"family\":\"Roboto\",\"size\":28,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#616161\"},\"valueFont\":{\"family\":\"Segment7Standard\",\"size\":30,\"style\":\"normal\",\"weight\":\"normal\",\"shadowColor\":\"rgba(0, 0, 0, 0.49)\",\"color\":\"#444\"},\"colorValueBoxRect\":\"#888\",\"colorValueBoxRectEnd\":\"#666\",\"colorValueBoxBackground\":\"#babab2\",\"colorValueBoxShadow\":\"rgba(0,0,0,1)\",\"unitTitle\":\"Temperature\",\"minValue\":-60},\"title\":\"Temperature radial gauge\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"decimals\":0,\"noDataDisplayMessage\":\"\",\"configMode\":\"basic\"}" }, "externalId": null } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/thermometer_scale.json b/application/src/main/data/json/system/widget_types/thermometer_scale.json index cdc4a2268a..0dfcdd3a42 100644 --- a/application/src/main/data/json/system/widget_types/thermometer_scale.json +++ b/application/src/main/data/json/system/widget_types/thermometer_scale.json @@ -11,11 +11,11 @@ "resources": [], "templateHtml": "\n", "templateCss": "", - "controllerScript": "self.onInit = function() {\n self.ctx.gauge = new TbAnalogueLinearGauge(self.ctx, 'linearGauge'); \n}\n\nself.onDataUpdated = function() {\n self.ctx.gauge.update();\n}\n\nself.onResize = function() {\n self.ctx.gauge.resize();\n}\n\nself.onMobileModeChanged = function() {\n self.ctx.gauge.mobileModeChanged();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true\n };\n}\n\nself.onDestroy = function() {\n self.ctx.gauge.destroy();\n}\n", - "settingsSchema": "{}", + "controllerScript": "self.onInit = function() {\n self.ctx.gauge = new TbAnalogueLinearGauge(self.ctx, 'linearGauge'); \n}\n\nself.onDataUpdated = function() {\n self.ctx.gauge.update();\n}\n\nself.onResize = function() {\n self.ctx.gauge.resize();\n}\n\nself.onMobileModeChanged = function() {\n self.ctx.gauge.mobileModeChanged();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'temperature', label: 'Temperature', type: 'timeseries' }];\n }\n };\n}\n\nself.onDestroy = function() {\n self.ctx.gauge.destroy();\n}\n", "settingsSchema": "{}", "dataKeySettingsSchema": "{}\n", "settingsDirective": "tb-analogue-linear-gauge-widget-settings", - "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Temp\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.7282710489093589,\"funcBody\":\"var value = prevValue + Math.random() * 30 - 15;\\nif (value < -60) {\\n\\tvalue = -60;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"maxValue\":100,\"defaultColor\":\"#e64a19\",\"barStrokeWidth\":2.5,\"colorBar\":\"rgba(255, 255, 255, 0.4)\",\"colorBarEnd\":\"rgba(221, 221, 221, 0.38)\",\"showUnitTitle\":true,\"minorTicks\":2,\"valueBox\":true,\"valueInt\":3,\"colorPlate\":\"#fff\",\"colorMajorTicks\":\"#444\",\"colorMinorTicks\":\"#666\",\"colorNeedleShadowUp\":\"rgba(2,255,255,0.2)\",\"colorNeedleShadowDown\":\"rgba(188,143,143,0.45)\",\"colorValueBoxRect\":\"#888\",\"colorValueBoxRectEnd\":\"#666\",\"colorValueBoxBackground\":\"#babab2\",\"colorValueBoxShadow\":\"rgba(0,0,0,1)\",\"highlightsWidth\":10,\"animation\":true,\"animationDuration\":1500,\"animationRule\":\"linear\",\"showBorder\":false,\"majorTicksCount\":8,\"numbersFont\":{\"family\":\"Arial\",\"size\":18,\"style\":\"normal\",\"weight\":\"normal\",\"color\":\"#263238\"},\"titleFont\":{\"family\":\"Roboto\",\"size\":24,\"style\":\"normal\",\"weight\":\"normal\",\"color\":\"#78909c\"},\"unitsFont\":{\"family\":\"Roboto\",\"size\":26,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#37474f\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":40,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#444\",\"shadowColor\":\"rgba(0,0,0,0.3)\"},\"minValue\":-60,\"highlights\":[{\"from\":-60,\"to\":-40,\"color\":\"#90caf9\"},{\"from\":-40,\"to\":-20,\"color\":\"rgba(144, 202, 249, 0.66)\"},{\"from\":-20,\"to\":0,\"color\":\"rgba(144, 202, 249, 0.33)\"},{\"from\":0,\"to\":20,\"color\":\"rgba(244, 67, 54, 0.2)\"},{\"from\":20,\"to\":40,\"color\":\"rgba(244, 67, 54, 0.4)\"},{\"from\":40,\"to\":60,\"color\":\"rgba(244, 67, 54, 0.6)\"},{\"from\":60,\"to\":80,\"color\":\"rgba(244, 67, 54, 0.8)\"},{\"from\":80,\"to\":100,\"color\":\"#f44336\"}],\"unitTitle\":\"Temperature\",\"units\":\"°C\",\"colorBarProgress\":\"#90caf9\",\"colorBarProgressEnd\":\"#f44336\",\"colorBarStroke\":\"#b0bec5\",\"valueDec\":1},\"title\":\"Thermometer scale\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"decimals\":0,\"noDataDisplayMessage\":\"\"}" - }, + "hasBasicMode": true, + "basicModeDirective": "tb-thermometer-scale-gauge-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Temp\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.7282710489093589,\"funcBody\":\"var value = prevValue + Math.random() * 30 - 15;\\nif (value < -60) {\\n\\tvalue = -60;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value;\"}]}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgb(255, 255, 255)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"8px\",\"settings\":{\"maxValue\":100,\"defaultColor\":\"#e64a19\",\"barStrokeWidth\":2.5,\"colorBar\":\"rgba(255, 255, 255, 0.4)\",\"colorBarEnd\":\"rgba(221, 221, 221, 0.38)\",\"showUnitTitle\":true,\"minorTicks\":2,\"valueBox\":true,\"valueInt\":3,\"colorPlate\":\"#fff\",\"colorMajorTicks\":\"#444\",\"colorMinorTicks\":\"#666\",\"colorNeedleShadowUp\":\"rgba(2,255,255,0.2)\",\"colorNeedleShadowDown\":\"rgba(188,143,143,0.45)\",\"colorValueBoxRect\":\"#888\",\"colorValueBoxRectEnd\":\"#666\",\"colorValueBoxBackground\":\"#babab2\",\"colorValueBoxShadow\":\"rgba(0,0,0,1)\",\"highlightsWidth\":10,\"animation\":true,\"animationDuration\":1500,\"animationRule\":\"linear\",\"showBorder\":false,\"majorTicksCount\":8,\"numbersFont\":{\"family\":\"Arial\",\"size\":18,\"style\":\"normal\",\"weight\":\"normal\",\"color\":\"#263238\"},\"titleFont\":{\"family\":\"Roboto\",\"size\":24,\"style\":\"normal\",\"weight\":\"normal\",\"color\":\"#78909c\"},\"unitsFont\":{\"family\":\"Roboto\",\"size\":26,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#37474f\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":40,\"style\":\"normal\",\"weight\":\"500\",\"color\":\"#444\",\"shadowColor\":\"rgba(0,0,0,0.3)\"},\"minValue\":-60,\"highlights\":[{\"from\":-60,\"to\":-40,\"color\":\"#90caf9\"},{\"from\":-40,\"to\":-20,\"color\":\"rgba(144, 202, 249, 0.66)\"},{\"from\":-20,\"to\":0,\"color\":\"rgba(144, 202, 249, 0.33)\"},{\"from\":0,\"to\":20,\"color\":\"rgba(244, 67, 54, 0.2)\"},{\"from\":20,\"to\":40,\"color\":\"rgba(244, 67, 54, 0.4)\"},{\"from\":40,\"to\":60,\"color\":\"rgba(244, 67, 54, 0.6)\"},{\"from\":60,\"to\":80,\"color\":\"rgba(244, 67, 54, 0.8)\"},{\"from\":80,\"to\":100,\"color\":\"#f44336\"}],\"unitTitle\":\"Temperature\",\"units\":\"°C\",\"colorBarProgress\":\"#90caf9\",\"colorBarProgressEnd\":\"#f44336\",\"colorBarStroke\":\"#b0bec5\",\"valueDec\":1},\"title\":\"Thermometer scale\",\"dropShadow\":true,\"enableFullscreen\":true,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"decimals\":0,\"noDataDisplayMessage\":\"\",\"configMode\":\"basic\"}" }, "externalId": null } \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/uv_index_card.json b/application/src/main/data/json/system/widget_types/uv_index_card.json index cba061819f..25b150d79e 100644 --- a/application/src/main/data/json/system/widget_types/uv_index_card.json +++ b/application/src/main/data/json/system/widget_types/uv_index_card.json @@ -3,7 +3,7 @@ "name": "UV Index card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAnFBMVEXg4ODf39/g4ODg4OAAAAD////g4OCAwywhISGqqqr5+fm/4ZXj4+Oenp7P6a/Ozs62trbz8/PCwsJ0dHSkpKRYWFg9PT3n5+fv9+Xx8fH3+/LIyMisrKyQy0ag0mDu7u7f8Mra2trV1dWwsLCv2XsvLy+8vLyQkJCIxznn9NiYzlOCgoJKSkrH5aOrq6tmZmbX7L3H5aK43Yio1m6jslkrAAAABXRSTlPvIL+vAC9A4IoAAARXSURBVHja7M9JEQAwCAPAUA4PvPDvsjYCk3WwCHuo7dwChsn1GgbvPGAeKk/AlUgpQkYRNoqwUYSNImwUYaMIG0XYfGbraMVRGAyg8NUhPzTKQogYHaUUs9rqtLPM+7/bpo6zinVKb1ZyQDExNx8RyQuQvKsKou8FSKrUkej7z5C3Kz8UEUTLG5AZJz1wGu+YjGXW8qSdIIcDY0fV5dzLm3QLgvVALzpSyFGpZnoqvhyVUsUWJJEShoEJ4szvm23BtdYMAVLerHG0LZiEud0gRaXUgUUXpS5sQZy0YXD9hmjJkluwGd8asWFoksxSStmKZm43CHk1bUlRTJBLsQnBZiSiZ8jbeImBwd5nwlvHLfMti/aDkH8UcG46paomD8O0YBvyS/RgWUHG19Zi5Z7GiWfZLpC5d/VVdWadlgSQHpw3cl1DnCQj5DboELQ+TCzaF5Kq77qcdTY76X4U9N67NQQ76DKzXCWhTMJM23vH3K6QvFL/qlmnBxGfECrF8AA5ZeKthfa+KqhxvmduV0iqFh15yGmepd20yvHYLpDzZ13XZ/hcQv7Aex2K8wS5DWlUqIF6CTnARYVSYuyHHblUVXUOoPWOhPk6J8YC5IWfbyj2s/xzSNHNjoqou0Ne25I4v6hXIRwmRvdB3P1lzwxWG4ZhMHxShgzGkhGkNFATu5htp63v/3CTGxGWlhV6yJpDfoJi2X+IvhhD4jwCObZVcTg1jMvB0iflHPwptrH/ePu9TI2Dvf2eF+OJboru4U4h2lj65cvTLWlcH8Q4lpWfbvLe20O30OMC6xpCnMZGsi61CYaWGIgZrbnSF+Ln0WZkJjvegQTEAB1SZfFV8xj0YCkyAAtihKFgTqIpIfYAkwWCFFSQdiUBowo6DW4FEDifp7K/3t4N6PQN9yCcBOoA2fUIM4h3LKy9Q3QNE0ZqR0cziDKVBjImkJRr82AHFF6wi2IgsVYPiXCABUgrlUYIUQ10BQmCOIM4b2skY5Q+hnaxZ7W/DISVwkNOLGkGqdcZ8VyVKSaB/gqSSd3zjIjNCHbazKSe1hWH14AgosNSvMtYCJy0MjpfREFIk4QFo0MiUW9wFSXPIBlJxmmJSaeeorBYiNcE+Xi898stOG7BgUX2YB2zwVlqssTOiTM15+Z24xXkGbmCJe2/FXaQbWoH2Zp2kK1pB9madpAf9udYAAAAAGCQv/U0dpRBNyI3IjciNyI3IjciNyI3IjciNyK1d/c4CMNAEIWdH2cLS9TEElZKUkRCcP+7YTpSpptdvVdM/51grrbt+ZxLyL08rORz/iD1aGbmHrK1p5l7yP7+KQJAilkkSPtEgLSj5pt7yKvUvgEgPSBA/gICBAgQIECA9IAAAQIECBAgTgOiFhC1gKgFRC0gagFRC4haQNQCohYQtYCoBUQtIGoBUQuIWkDUAqIWELWAqAVELSBqAVFrSSmHaEljiMvmdUpDCiBZO2MepsV7aRzmL/oPrqtS4mUjAAAAAElFTkSuQmCC", - "description": "Displays a latest UV index telemetry data in a box layout.", + "description": "Displays the latest UV index telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/uv_index_card_with_background.json b/application/src/main/data/json/system/widget_types/uv_index_card_with_background.json index 73b0f89692..3f9da213ec 100644 --- a/application/src/main/data/json/system/widget_types/uv_index_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/uv_index_card_with_background.json @@ -3,7 +3,7 @@ "name": "UV Index card with background", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAC+lBMVEW6o3DUs2IAAADs0ZTfvGTnz5Pvz4/20o+4qHP/9+D/9d7/8tL/9Nr/9Nf/9NT/9eH/+OP/+ef/993/883/8sj/88v/9tr/88//8dD/+uv/8sP/9Nz/8cz//fj/9dHz6tT37NP///7/++7/+/F8wyL169T//PP//PX/88X+8dXv6djx6tb//vr/9tf27db/1n/99ePz7Nj879D57tb57tH91ITz6ND88NPu48v679P789zv59P+2n7k28j99d7/1YPz58z61If67c38xU3r4s/n2sP/6q//3ID36sv778Pw5c7/1Xbi2sv98tjs5NLw0pD/2X3j2MPr4Mv68Njt59b/x0v90XL/1Ybh2s3x6tj8783/3oXrwWD/yVT26tDe2Mz/7rzd1sj88Nf504r/02r+0Gj00o3/2IHx5cb/zF3n38357tPl3cz/5a//4Y7903//1HD+zmT/1nv80nvg2cj06Mbv4MP/5qP/5Zzb1s31yWn2x2Dt0ZL10orp38nm3Mj47MT/0WD+zVXa1cn/45Xs3sP+0G3/7LWno5n/34n/yE/p3MTu4sjp0JXm4NGynmDxw17/yET/6ajxxWbCqGL+3I/3xlusqaH304z80Xbe1cP5zW3lvV8hIB/twFr/0FngsUJcPwPs4Mb/3pj+xj36y2barkzitlH+zU35w0z61IzTqEbbqjn9+e+4tKratFbLnj3+xjP65La3oV/878jctmCtml7Rrli7pGHHqlnhvGjpwGa+pFzDv7TLrWDSpDTJo0xAPzz40oC923Tyw1Tqt0XmsTSemo7zznx0cmyPyj3wuzrBmUDNyLvVtWhYV1XirCj91orXoiLO4Yjv78dMOAyTXwLz7d/k496e0FLTu30pHwX59erJrWr9wyTMy8XDkyaHVwDf6a+2kEX/zD4+Lgau1mnQwpovLi2tgyrutSWEZCDP45iQj42JdkPy8e3F34q93HrVz76gj2KceC6hbAfo7LuCf3j/2XZqZVtvVyXa5qPZyJifg0jRlAKlAAAACXRSTlP7IAC1tSAgv7+sbVSmAAAhlklEQVR42qzUP0tbURzG8Yui5cbEaCNNjLZQBbsEbpdsl16yGDIZ6JDBJRCIkw24tIPZhODQxSl7NsfgG8k76nN+589z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", - "description": "Displays a latest UV index telemetry data in a box layout with background.", + "description": "Displays the latest UV index telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/uv_index_chart_card.json b/application/src/main/data/json/system/widget_types/uv_index_chart_card.json index 44e789ae80..b9abca1467 100644 --- a/application/src/main/data/json/system/widget_types/uv_index_chart_card.json +++ b/application/src/main/data/json/system/widget_types/uv_index_chart_card.json @@ -3,7 +3,7 @@ "name": "UV Index chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a UV index data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a UV index data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/uv_index_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/uv_index_chart_card_with_background.json index 629d12aad3..30ede11c0c 100644 --- a/application/src/main/data/json/system/widget_types/uv_index_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/uv_index_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "UV Index chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a UV index data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a UV index data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/value_and_chart_card.json b/application/src/main/data/json/system/widget_types/value_and_chart_card.json index a868a8d810..93300135bd 100644 --- a/application/src/main/data/json/system/widget_types/value_and_chart_card.json +++ b/application/src/main/data/json/system/widget_types/value_and_chart_card.json @@ -3,7 +3,7 @@ "name": "Value and chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a single entity telemetry data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a single entity telemetry as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/value_card.json b/application/src/main/data/json/system/widget_types/value_card.json index eb676a517f..9abfb9a2f8 100644 --- a/application/src/main/data/json/system/widget_types/value_card.json +++ b/application/src/main/data/json/system/widget_types/value_card.json @@ -3,7 +3,7 @@ "name": "Value card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a single entity attribute or the latest telemetry data in a box layout.", + "description": "Displays a single entity attribute or the latest telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/vertical_capsule_tank.json b/application/src/main/data/json/system/widget_types/vertical_capsule_tank.json new file mode 100644 index 0000000000..39abea9b47 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/vertical_capsule_tank.json @@ -0,0 +1,36 @@ +{ + "fqn": "vertical_capsule_tank", + "name": "Vertical capsule tank", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Widget indicates the level of liquid in Vertical capsule tank.", + "descriptor": { + "type": "latest", + "sizeX": 4, + "sizeY": 4, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.liquidLevelWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.liquidLevelWidget.update();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n}\n\nself.actionSources = function() { \n return { \n 'cardClick': {\n name: 'widget-action.card-click',\n multiple: false \n } \n };\n}", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}\n", + "settingsDirective": "tb-liquid-level-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-liquid-level-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"return Math.floor(Math.random() * 101);\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"tankSelectionType\":\"static\",\"selectedShape\":\"Vertical Capsule\",\"shapeAttributeName\":\"tankShape\",\"tankColor\":{\"type\":\"range\",\"color\":\"#242770\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E73535DE\"},{\"from\":20,\"to\":null,\"color\":\"#242770\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E73535DE';\\n }\\n}\\nreturn '#242770';\"},\"datasourceUnits\":\"%\",\"layout\":\"percentage\",\"volumeSource\":\"static\",\"volumeConstant\":500,\"volumeAttributeName\":\"volume\",\"volumeUnits\":\"L\",\"volumeFont\":{\"family\":\"Roboto\",\"size\":14,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"volumeColor\":\"rgba(0, 0, 0, 0.18)\",\"units\":\"%\",\"widgetUnitsSource\":\"static\",\"widgetUnitsAttributeName\":\"units\",\"liquidColor\":{\"type\":\"range\",\"color\":\"#7A8BFF\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E27C7CDE\"},{\"from\":20,\"to\":null,\"color\":\"#7A8BFF\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":24,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"valueColor\":{\"type\":\"range\",\"color\":\"#000000DE\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FF0000DE\"},{\"from\":20,\"to\":null,\"color\":\"rgba(0,0,0,0.87)\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FF0000DE';\\n }\\n}\\nreturn '#000000DE';\"},\"showBackgroundOverlay\":true,\"backgroundOverlayColor\":{\"type\":\"range\",\"color\":\"#FFFFFFC2\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FFEFEFDE\"},{\"from\":20,\"to\":null,\"color\":\"#FFFFFFC2\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FFEFEFDE';\\n }\\n}\\nreturn '#FFFFFFC2';\"},\"showTooltip\":true,\"showTooltipLevel\":true,\"tooltipUnits\":\"%\",\"tooltipLevelDecimals\":0,\"tooltipLevelFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipLevelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.76)\",\"rangeList\":[],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"showTooltipDate\":true,\"tooltipDateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"tooltipDateFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipDateColor\":\"rgba(0, 0, 0, 0.76)\",\"tooltipBackgroundColor\":\"rgba(255, 255, 255, 0.76)\",\"tooltipBackgroundBlur\":3,\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Liquid level\",\"useDashboardTimewindow\":true,\"displayTimewindow\":true,\"configMode\":\"basic\",\"titleFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"1.5\"},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"showTitleIcon\":false,\"titleIcon\":\"water_drop\",\"iconColor\":\"#5469FF\",\"decimals\":0,\"enableDataExport\":false,\"enableFullscreen\":false,\"borderRadius\":\"0px\",\"actions\":{},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"dropShadow\":true,\"margin\":\"0px\",\"widgetStyle\":{},\"widgetCss\":\"\",\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"pageSize\":1024,\"noDataDisplayMessage\":\"\"}" + }, + "externalId": null, + "tags": [ + "reservoir", + "container", + "vessel", + "storage unit", + "cistern", + "canister", + "vat", + "basin", + "repository", + "bin", + "hopper" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/vertical_cylinder_tank.json b/application/src/main/data/json/system/widget_types/vertical_cylinder_tank.json new file mode 100644 index 0000000000..a2bcad3b23 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/vertical_cylinder_tank.json @@ -0,0 +1,36 @@ +{ + "fqn": "vertical_cylinder_tank", + "name": "Vertical cylinder tank", + "deprecated": false, + "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAABU1BMVEXg4ODf39/g4ODg4OAAAAD///96i//g4OCHlv/i5v/e4v/j5O0kJ3AhISGRk7fg5P+trsmQkJA/QoLIydtaXZN2eKby8veqtP+Lmv+foMA8PDzx8fHj4+NbXZSKmf/IyMieqv+srKz6+v0dHSF0dHRYWFjw8PXV1uRNT4sxNHloap2st/+Ehq6Tof+Wo//39/oyNHmCkv81Nz1/j/8uLi7j5v/M0v/t7fPV1dXq6vJOT1hISEq0vv+YmqylsP+Ehq+7vNKCgoLo6v/KzeOdnZ1/gY/w8v/v8f+bqP/09PjV2fFmaHTS1//Dyv+8xf+Onf/Hy+O8wNW6u9Kenp5mZmZPUFnEzP+6uro+QYGjr/+wssdydIJaXGa8w//d3unFxtmjpbqrq6tiZJhWWJCPj48pKy7V2//T1vHX2OWkpcS5ubmLjZ4yNXkxNHhaWmaXmLtJTIgyHu8DAAAABXRSTlPvIL+vAC9A4IoAAAa4SURBVHja7NbNaoUwEIZhT9uPrmaR7WQgBJI7yCKQleAdKLgudNX7v4COtSD9o8sznpMXNYlufFDB4enyMDyfvcfL03AZPE6fV8bjDThUoq8VbqLhViDPHWKsDrFWh1jrbiFBjuGXJOAK/YS85H1oFd8a2z6SO4ZfcoQrpZCf91GT4FtxPiNEogfCFOr6MfVREFYAb5McED09iR6qwuO+MgeJFPBKzIURdCoUkRjI1MoBES6ZJuSMba+lcKkWIbwA7Qsk0Aw5IKkIxuJfyW/XuW0egxChGchfII48cEAaO7eQeIov2zE719gkJP4DYU6aR05LhlDWxWgQ4kv6hKyoOyRupgOyFHXpNpWi5pJ1IYYgWav7x54WYvjCI+8Qz5zaAamFXW6AJ1LOTMvIdp5IcFtSnQAxucyApLS6ircZkDGFKezi8LF0SsAUoa1jmoHgcJV2yJ8p5DTdB6RWnKa7/Y03W4dYq0Os1SHW6hBrdYi1OsRaHfLOjh2rOA4DARiuphoxiJElUKHGRSQLQ9yFrew27VWpEtg0u7DH3ftXN3aSu3CQYned2AH/nYSL+eRKmlv3hWDna5uLPlv7LsJVzwPBumqSbb0eIsqhYYtw6XkgSVn8n6YYLj0PhNugqiJb6qttTlUT8vNBUFfkIBpNZCUi/QPB1R86wqlngKC3cvptUinXpM9RnVkFCg3nATN3yIDI3oDkjCebw5C18k8cSMbnHoMzhjhTcxMEcarsW/9tWII0YIJi27k5QpwvKm7NqlxvnVttXqTNZrO6Spb9ruy5rbBMm1ShcV4QpOLn8ddbP/+mH3Ndwq1KkW7d6cu396NKHucCcaJ49XsRyPyfqFyLZ+9fVdI4A4gp1NHjdg1frNyiWAo9LcRR9ZteSvhm5f59xxongwgjHGCkDmFHq2kgh10wMGIYdnoKCDUdjJxmejyEGGH0kP3DITsDd8h8PByiEO5QVI+HENwhmgCiIoxeVBNASHkYOV/RBBCMnBBGzBQccQoIAHHRjcdoyMFEEEDNbM0YN7IqCQMmg0imZVWQcV9HnG5kIE0KkVDbpFKmLrpPEaImy4qtR1nNAXI+2DY0/UNWTdqYiHAjRNNpqm1i1STrzWCfEeRyyMaTDYEbpVTFzMW/kiwr2W445f5JJZ4Js4RchxiNpM8ZKSJeT/8kkBstkAWyQBbIAlkgf9ipexZJYTCA410wNk95Ux1hUg4jTAYtHJNiRFl8YbW44uYFtlmuWNjvX54xWHgJM3IsJC75gwkEBH+ERw9ZFWRbQtO09ywTgkRjQaB2IUSWtW0TQrl1GVKGyX0XvQaLeiXinsDZNcg5ycgk2Px43u9gSmTJ2RFImYjZLTR4Qc3sdoTE2IVs2yiYR7AsxrP0g39fi9rSIqTMAi2CtUwiEmhlpS1IYhpsMr+B2GRREL3WDqQJTBFdoKcgeokViHgAiZ9wYjOEWIHsH0BkcV7JrepzA8kM2VuBbJ5AOP01rAWltJaiJZCNFchPdHgEyZmEcHrNC1osghyQLQhSFDOkZmyA3GiOMTtp/19iYCBrENnxYIZcKJeQ9B3LRRHUtJgghyNCViHKMmA0CKvxCGESQtUd8RPmc4hCSIULkEkzcggAyBlnuQa5VWmupgWAjITJ4BJk4kQg6+iN83fGq5QBQEpB1t8+0gpU0SRwFILQHmScqrqaVgCnE6iKouYwtkfOQ8IhkA+wVIqucKE1jHXXa//ZQTi0EoiKpcPySSllnTp464qP9E+4OsilH1f+pr5dWfpwfRBzHuIh/wfZfBcI2i1x7JD7EHQMnnZEa4AsyUM8xEM8xEM8xENcg7x8PeTFAuRve+eu2jAMhlHnIgJSCEKWjT04QxZfA+2iydDgRZ40ZDD4BfL+j1BZFTRZ2tKY+LfReQDBQet3pJzg0T0iOcE2PqmQjEa+D4mq4OUiZIhWRDSiBkaoYuSlItaEUYRwOYrLe601fJaQSWIxykyq1nR99JRE22FTlr7Fk+V7NLGVqryp/vwPh3PZNbaPTS6TBpVEu2SBDbsb3NV9e/yDwLEta3GTXyeYVDlE0yeuvq7Uc159r6pPEmMhlFLlA7VSnRC4kSdkIH5c8aF890MAiaslvR6KbJ9nfFiUp+THS0wvVHfuLN+z4oMSUPW0xTyNECQZ08txlnFeBBr75oOm4Nysyu2m3CjA69kfCYlZk8eHO2JKr356Nyqfg8hvOBEnMhecCDScCDScCDScCDScCDScCDScCDScCDScCDScCDQWJOKhRbDz1sv4snmznE+0t6vNbu5469X2E/jIZcQWRBJVAAAAAElFTkSuQmCC", + "description": "Widget indicates the level of liquid in Vertical cylinder tank.", + "descriptor": { + "type": "latest", + "sizeX": 4, + "sizeY": 4, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.liquidLevelWidget.onInit();\n}\n\nself.onDataUpdated = function() {\n self.ctx.$scope.liquidLevelWidget.update();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n}\n\nself.actionSources = function() { \n return { \n 'cardClick': {\n name: 'widget-action.card-click',\n multiple: false \n } \n };\n}", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}\n", + "settingsDirective": "tb-liquid-level-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-liquid-level-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"return Math.floor(Math.random() * 101);\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"tankSelectionType\":\"static\",\"selectedShape\":\"Vertical Cylinder\",\"shapeAttributeName\":\"tankShape\",\"tankColor\":{\"type\":\"range\",\"color\":\"#242770\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E73535DE\"},{\"from\":20,\"to\":null,\"color\":\"#242770\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E73535DE';\\n }\\n}\\nreturn '#242770';\"},\"datasourceUnits\":\"%\",\"layout\":\"percentage\",\"volumeSource\":\"static\",\"volumeConstant\":500,\"volumeAttributeName\":\"volume\",\"volumeUnits\":\"L\",\"volumeFont\":{\"family\":\"Roboto\",\"size\":14,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"volumeColor\":\"rgba(255, 255, 255, 0.18)\",\"units\":\"%\",\"widgetUnitsSource\":\"static\",\"widgetUnitsAttributeName\":\"units\",\"liquidColor\":{\"type\":\"range\",\"color\":\"#7A8BFF\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E27C7CDE\"},{\"from\":20,\"to\":null,\"color\":\"#7A8BFF\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":24,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"valueColor\":{\"type\":\"range\",\"color\":\"#000000DE\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FF0000DE\"},{\"from\":20,\"to\":null,\"color\":\"rgba(0,0,0,0.87)\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FF0000DE';\\n }\\n}\\nreturn '#000000DE';\"},\"showBackgroundOverlay\":true,\"backgroundOverlayColor\":{\"type\":\"range\",\"color\":\"rgba(255, 255, 255, 0.76)\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FFEFEFDE\"},{\"from\":20,\"to\":null,\"color\":\"#FFFFFFC2\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FFEFEFDE';\\n }\\n}\\nreturn '#FFFFFFC2';\"},\"showTooltip\":true,\"showTooltipLevel\":true,\"tooltipUnits\":\"%\",\"tooltipLevelDecimals\":0,\"tooltipLevelFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipLevelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.76)\",\"rangeList\":[],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"showTooltipDate\":true,\"tooltipDateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"tooltipDateFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipDateColor\":\"rgba(0, 0, 0, 0.76)\",\"tooltipBackgroundColor\":\"rgba(255, 255, 255, 0.76)\",\"tooltipBackgroundBlur\":3,\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Liquid level\",\"useDashboardTimewindow\":true,\"displayTimewindow\":true,\"configMode\":\"basic\",\"titleFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"1.5\"},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"showTitleIcon\":false,\"titleIcon\":\"water_drop\",\"iconColor\":\"#5469FF\",\"decimals\":0,\"enableDataExport\":false,\"enableFullscreen\":false,\"borderRadius\":\"0px\",\"actions\":{},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"dropShadow\":true,\"margin\":\"0px\",\"widgetStyle\":{},\"widgetCss\":\"\",\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"pageSize\":1024,\"noDataDisplayMessage\":\"\"}" + }, + "externalId": null, + "tags": [ + "reservoir", + "container", + "vessel", + "storage unit", + "cistern", + "canister", + "vat", + "basin", + "repository", + "bin", + "hopper" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/vertical_oval_tank.json b/application/src/main/data/json/system/widget_types/vertical_oval_tank.json new file mode 100644 index 0000000000..55da0eb66e --- /dev/null +++ b/application/src/main/data/json/system/widget_types/vertical_oval_tank.json @@ -0,0 +1,36 @@ +{ + "fqn": "vertical_oval_tank", + "name": "Vertical oval tank", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Widget indicates the level of liquid in Vertical oval tank.", + "descriptor": { + "type": "latest", + "sizeX": 4, + "sizeY": 4, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.liquidLevelWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.liquidLevelWidget.update();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true\n };\n};\n\nself.onDestroy = function() {\n}\n\nself.actionSources = function() { \n return { \n 'cardClick': {\n name: 'widget-action.card-click',\n multiple: false \n } \n };\n}", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}\n", + "settingsDirective": "tb-liquid-level-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-liquid-level-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Random\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.15479322438769105,\"funcBody\":\"return Math.floor(Math.random() * 101);\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":true,\"backgroundColor\":\"#fff\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"tankSelectionType\":\"static\",\"selectedShape\":\"Vertical Oval\",\"shapeAttributeName\":\"tankShape\",\"tankColor\":{\"type\":\"range\",\"color\":\"#242770\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E73535DE\"},{\"from\":20,\"to\":null,\"color\":\"#242770\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E73535DE';\\n }\\n}\\nreturn '#242770';\"},\"datasourceUnits\":\"%\",\"layout\":\"percentage\",\"volumeSource\":\"static\",\"volumeConstant\":500,\"volumeAttributeName\":\"volume\",\"volumeUnits\":\"L\",\"volumeFont\":{\"family\":\"Roboto\",\"size\":14,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"volumeColor\":\"rgba(0, 0, 0, 0.18)\",\"units\":\"%\",\"widgetUnitsSource\":\"static\",\"widgetUnitsAttributeName\":\"units\",\"liquidColor\":{\"type\":\"range\",\"color\":\"#7A8BFF\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#E27C7CDE\"},{\"from\":20,\"to\":null,\"color\":\"#7A8BFF\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"valueFont\":{\"family\":\"Roboto\",\"size\":24,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"valueColor\":{\"type\":\"range\",\"color\":\"#000000DE\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FF0000DE\"},{\"from\":20,\"to\":null,\"color\":\"rgba(0,0,0,0.87)\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FF0000DE';\\n }\\n}\\nreturn '#000000DE';\"},\"showBackgroundOverlay\":true,\"backgroundOverlayColor\":{\"type\":\"range\",\"color\":\"rgba(255, 255, 255, 0.76)\",\"rangeList\":[{\"from\":null,\"to\":20,\"color\":\"#FFEFEFDE\"},{\"from\":20,\"to\":null,\"color\":\"#FFFFFFC2\"}],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#FFEFEFDE';\\n }\\n}\\nreturn '#FFFFFFC2';\"},\"showTooltip\":true,\"showTooltipLevel\":true,\"tooltipUnits\":\"%\",\"tooltipLevelDecimals\":0,\"tooltipLevelFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipLevelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.76)\",\"rangeList\":[],\"colorFunction\":\"var percent = value;\\nif (typeof percent !== undefined) {\\n if (percent < 20) {\\n return '#E27C7CDE';\\n }\\n}\\nreturn '#7A8BFF';\"},\"showTooltipDate\":true,\"tooltipDateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"tooltipDateFont\":{\"family\":\"Roboto\",\"size\":13,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"100%\"},\"tooltipDateColor\":\"rgba(0, 0, 0, 0.76)\",\"tooltipBackgroundColor\":\"rgba(255, 255, 255, 0.76)\",\"tooltipBackgroundBlur\":3,\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}}},\"title\":\"Liquid level\",\"useDashboardTimewindow\":true,\"displayTimewindow\":true,\"configMode\":\"basic\",\"titleFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\",\"lineHeight\":\"1.5\"},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"showTitleIcon\":false,\"titleIcon\":\"water_drop\",\"iconColor\":\"#5469FF\",\"decimals\":0,\"enableDataExport\":false,\"enableFullscreen\":false,\"borderRadius\":\"0px\",\"actions\":{},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"dropShadow\":true,\"margin\":\"0px\",\"widgetStyle\":{},\"widgetCss\":\"\",\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"pageSize\":1024,\"noDataDisplayMessage\":\"\"}" + }, + "externalId": null, + "tags": [ + "reservoir", + "container", + "vessel", + "storage unit", + "cistern", + "canister", + "vat", + "basin", + "repository", + "bin", + "hopper" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/vibration_card.json b/application/src/main/data/json/system/widget_types/vibration_card.json index 5afa70f0ee..9b3149c406 100644 --- a/application/src/main/data/json/system/widget_types/vibration_card.json +++ b/application/src/main/data/json/system/widget_types/vibration_card.json @@ -3,7 +3,7 @@ "name": "Vibration card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest vibration telemetry data in a box layout.", + "description": "Displays the latest vibration telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/vibration_card_with_background.json b/application/src/main/data/json/system/widget_types/vibration_card_with_background.json index 92b82633f3..fb31375edb 100644 --- a/application/src/main/data/json/system/widget_types/vibration_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/vibration_card_with_background.json @@ -3,7 +3,7 @@ "name": "Vibration card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest vibration telemetry data in a box layout with background.", + "description": "Displays the latest vibration telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/vibration_chart_card.json b/application/src/main/data/json/system/widget_types/vibration_chart_card.json index 32fc30dfee..9fd9bf282b 100644 --- a/application/src/main/data/json/system/widget_types/vibration_chart_card.json +++ b/application/src/main/data/json/system/widget_types/vibration_chart_card.json @@ -3,7 +3,7 @@ "name": "Vibration chart card", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAAAulBMVEXg4ODf39/g4OAAAADg4ODf39/////g4ODYGDjs7Ozj4+PCwsLOzs75+fnz8/PV1dXn5+fb29shISE8PDx0dHT64uaQkJCsrKzx8fHIyMjHx8fiUmm8vLxYWFj1xc3si5v98fPwqLTdNVHnb4IuLi6CgoK2trbh4eH41NpmZmbzt8G6urrpfY9KSkqenp6dnZ3aJkXkYHbumqhLS0uwsLDfQ13aJkTtmqjfQ17jYHbJycnwqbTgRF0ZGRkViV0GAAAABnRSTlPvIL8Ar7DvmsykAAAJIElEQVR42uzWCXMSMQCG4XrMRzf3sme2gVLKKWBrrdeo//9vmU2gWFrd6ogE3RdalgzM7LNJgJMXz56fdI69l89enDw7KXH0lZbx8h9wWIldVvgnOvlXIJ0WElgtJLRaSGi1kND6/yCEIOgegVylNgLfqgKKuRwhze+xFii7QdEegcwJIUUB3zgFegUqC5ElQEqCUgKLhMASSzcGicP3ALJYpACqIoWrGpWkS0gXadLrVqS7uspX8wSrbmrHyKiXSHSTXoKDtwsZF4WH9MYEdSN7iBqSI0+tCQtp/1dJPTbPcdVDVyKAVbYLSe8g622Sj3vFGlL07CPyVbqGuDWXWEWIkPwOkpeok6Nu6SCpvdeQbmW3uXSQ8djOSKAQLCoPGWNdL4WDrJKEuBkZvR0tyqSeHbJK3pJQIcC8qqqrAkfWI5Aitx3+Erc/UY68FhJajRCu8OTUg4EpGvprEMVig4fpR8QxJtjJoKG/BzGA4hqdSFJBNacsUlRLVShAUqq1hGQSmhnOJvyWGQAdrXmHGgFMb6OONlyaCA3tHzKBjSJWLKofpDIqBnXDLBIMhlNIRdGJBbOjTAAsVjCItHujmlLFmh37h1COmDuIAIVkKtpChGCgXDuI2kIiZfgdREeyfmtT+4eIiWaQdOIhfKJjBzHKQxyOooZwwz1EUiNibYSDSDOZBgE5mlpIaLWQ0PoNSIRNnLunQdQEYQygDHUSvskGpGIFgPIYAdQImQCGQZoIMZiuMbdaI+aRUhbCNbMQzvQUUjOOg9UMkSqWjCtBQWFgagikokLFNiUjToW9YcINtMDBaoZEhgom6JTC34AJ1HQD0QI1hGEiNFjQEMGksBpmthBpRMy0gyjK1hDQ+DZkCK/vHIILcHcDhOBAxF0Q3A8LqMiEvEeeXsym+IXChfxaLaSFHEstJLRaSGi1kNBqIaHVQkKrhYRWC3nYYNaf4V5Zvz/ADwoL0n9zjXUXZ6e268vsznV+XY8Mb7DT5em2ixAg/WV9pvCdn64bzuDKvmxGvuzMyllQkMH5+nzguqkPzz4Na8nAX3c3P25kiXu9CwmSnW6Ca2gB2Xpizt102YM3lpTVp93H913bl2TrBiFArpfDDeTCHnzerJvhZkIy/8rdKbEDr4BANnt2vez71X63jrZ7JfOX/Qz3aJtmboqeGudccKwrSwCE/EmIz0P8sv8I1yt/vQduibmW9nCAbX33/KmJKCojuEg6qoC8twCqxV4g/vpvr/eNP9ub+3Pk88sQg1cX/SdpSmLj/rDqVViksgTGBSn2Aql39nbznHvIxRYyg2vz/L3/xLvM0JiK0zjmAKkIYCF5Mk9K5FayL8jlzyB9bFue3jVslhA5l5IDRbpwkPFrpAVA8oIcGvLGfcGcf3KSARoqXr8tUg6XhVgQVhWQ58gPDZl9OFsOAGRDt4+aSr+OJNaNpf1bvQZQyqvFYSE7H19naGws0dB+N3szBO/stgcO/6PxO8hw9+N3dh+S4WH+azQwyLf2zkU5aSAKw15/3Hs2mzvhkgIGaEut1dHx/R/MJosSKDFaiwk137QDk8uwX3ZPztllJuwS4tgmRL8+Ie647Z7I7H6Q2MZ+sVljv0Sxkpb1xcWPSn94MLTKewAmV8u2RGzzx3uV1a1Vs30zOwjxCeweK7scr5EVZc0VppmP6cc1jiBj9bPNEkDOnBOITD9ss9vHH80e/yh6Zz8cs1ubyT/cKy6Lc263JfPF+uNwfTVGNsZwPVxObMccIiSH4pwzgRiK5+Dy6UVsRF9cTYa7dF2+nVwVL7d7N9v1u2LT5KqchJVHwp8hyzADhhMf62yJB2gFycHAiXakBnOIo8gJRKoT8TVK/ItqIWJrxa9b6d2eiog/AZbL2zFqsCJSO1rCcdgJYsQysQ0fLrHF37rNpnb0Xfy8j2Wfd3t2IjMf0+GXoV8rosGhRU44oLh6UpGp7/uVMM6ybK8Z/jrL1tPd2tDy+B4fmGI6zXDP79T2ol+gOwt6ka7Ri3SNXqRr9CJdoxfpGs9XRKgBJFcYxLyciJ0LD0Qk4eDQJEYsGBjOhQcikKWIw8Dl2YvEVkTEW5GU5WiHiKIGwlSzSM5SqDJGOAoYWoIadz4KkgjHeMQqikI7ULOgl8Fo7prVERtxNrdfajyUqMvFvY2XnGkeoWaFCok3N546Q5HIXEfYJ1y5ZkNPJXKZoJko2IRJQqM/8LizHvvQ8NodhfQUIpFxF2jiZn49MsZ1DcXvcmdqrOnCuN7l04sEhpqG9iXGhFbaMw19ooItK0NRS+IZs3hiEToPgcANUAtduUEES3TtNcT39ciyog0DevPEIt7d9prTuuCYj2jVe4Nf4Jm2ynjqUtvehRvUjKpkf4OboJbQpacVIbWsVmTLjTGKHKBG88WA7OOZAalBmYD8AfIJeySpXELqHXRKFLjHRvpohBpGq9ZmiMZDhdBUwyHcH1XNYRIY2pZIePDR1PvZSDWqDetLVx0PtxBtiZjgoZpHbex7EepYmKimd1sSCc2xrGFC3MxHCeqJrhfHBlb0L0QuPcsiqWav8Hg5cjffNGfRAxJX4V+IJIHFc+/C3TWsaeZN1Fx70cOUHuBUIrUlm/HoXwfn6u5BSj+NiFBO5clfBFXCUTlZ81Z4PNF+0RfOKRp51FQ3lrEA+HscXXxQnms2LsVfoNwN/YkyDUH1+MUHBu3sDN5z50EcGA9/xY1bwXuEBte/1SOlyBmtz9WJcMKE8xxEkBOQzjxO5//+WuFc6UW6Ri/SNQ5FhINalESVHCACXeFQRLLCRpb/ggmg+BN2A5OQAgMFSFu4gBdvpD2kOKMV6kUE0wzvdUo+OYB2JHfeqxSpDqXSqYgZuC50GZeFSP6NOeSbKs5gaIN6EWiegscSDFsRDSZiMEni1HG0CFkoASbSQkRypjkBc3RLjzyrF5EcqchFakVyYkUYUpmCFyIMEgBDXvpIRytHMMLBBFqgJthjzsEYh4oVlAYEU7mTco2cc5HHMRHp/YsuFAEuAJLy8pl6UFyhLaxII45uOiCONVrj90Ug0MCj71h9QuxFuk4v0jV6ka7Ri3SNXqRrDF68wLNg8OLV8/jJ5rfP50e0X798Mzh3Xrx6+fo7LfF7nyiUwFwAAAAASUVORK5CYII=", - "description": "Displays a vibration data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a vibration data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/vibration_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/vibration_chart_card_with_background.json index 04e3d5ed24..1d69ed9e86 100644 --- a/application/src/main/data/json/system/widget_types/vibration_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/vibration_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Vibration chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a vibration data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a vibration data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/visibility_card.json b/application/src/main/data/json/system/widget_types/visibility_card.json index e71ff3ab3e..83fe6c5e9d 100644 --- a/application/src/main/data/json/system/widget_types/visibility_card.json +++ b/application/src/main/data/json/system/widget_types/visibility_card.json @@ -3,7 +3,7 @@ "name": "Visibility card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest visibility telemetry data in a box layout.", + "description": "Displays the latest visibility telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/visibility_card_with_background.json b/application/src/main/data/json/system/widget_types/visibility_card_with_background.json index 86d6ce56f4..0a30559124 100644 --- a/application/src/main/data/json/system/widget_types/visibility_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/visibility_card_with_background.json @@ -3,7 +3,7 @@ "name": "Visibility card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest visibility telemetry data in a box layout with background.", + "description": "Displays the latest visibility telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/visibility_chart_card.json b/application/src/main/data/json/system/widget_types/visibility_chart_card.json index e3c8732989..00d4626132 100644 --- a/application/src/main/data/json/system/widget_types/visibility_chart_card.json +++ b/application/src/main/data/json/system/widget_types/visibility_chart_card.json @@ -3,7 +3,7 @@ "name": "Visibility chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a visibility data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a visibility data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/visibility_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/visibility_chart_card_with_background.json index 6bd2ee1cde..d36cdcebdb 100644 --- a/application/src/main/data/json/system/widget_types/visibility_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/visibility_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Visibility chart card with background", "deprecated": false, "image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAACgCAMAAAB+IdObAAADAFBMVEUsKiGrt78wKCC/x8+ZqrM0MSQkJB/AyNCaqbbx8/Tv8fLy9Pbs6+zr6ejs7/Dt8PHk5OHq5+fr6urp5ubm5+Xr7e3p6+zo5eTn6Ojm4+Pp6urV1M/T0c3t7+/n6ern6+3u8PDl5ePk5ubq7e/p7O7EzdTT087V087V1dDm5+fl4uHb2tXZ1tHZ2NLa2NPm5eR8wyLb29fd3Nff39rX1tLj4+DX1dDh4dzi4t7H0NXp6Ojt6urh39vMzMrt7e3d3dnj5eTAytHR0M3i397f3tjh4+LQz8zX19Ph3dzOzcvj4eDBy9Lk4t7Y1tPZ2dXu7Ovf3Nvf39zf4eDj4N4lJR/c29bZ2NSZp7Dm6Ona2NXk5+goJyG/yM/Gz9bI0dfZ2tfb3Nnd397h4d7X2NXJyMO7xs3d2thSRjA9OSnh5OXb2dg1MyavvMU6Nyfb3d2aqbOXpa1MQy7d29pIPyrDwbujkoxISTjEw7+biYM4ODi4wsqrucI+Oy7v7e3d5tK+vbmzwMiejId+bWnS0dCntb9kZWDW2NqdnZuVh4SRg4BXTDW+wMCts7eOgHyPfHdSUkRDPCmGeXV1a1bGxsMsKiK6vL24t7WYhH50ZGBgYF1SUlLd4uXLzc2Ol5twZE60treLyT0xLyWxuL6ksr2Vl5OCfWzS1daUoKgeHx/CxMW5ubiRnKKeoKGTlo2MeHN9cW+Fc27h29qdrriprLCsq6qmpqWJfXpsbW2vr6+AdmZSVkorKyugsLptX1xfVkBbUTybq7aKk5WFh4eVf3l8aWQ1MzHGyMqzsrB1fHtpamiFjY61vcOxs7ShpqmYmpeAdnR3dXR8cl9pXkkeHh5FPTRFPy2joqF2amdOTz63tbNaXlNDQjGqqairmZKQj45eUk+EhHRlWFSZnJqDgoGNjIBvd3RXTUi0oZl+hoWm0m6YzVWDxS95gYBOTUvC3aGKh3pQR0FQSzaXzVRDQ0NmWULV5MPM4LR9fHpXWFO5qKG014eOkYet1XobGxuf0GG72pTrXafmAAAACXRSTlO/ICDPz8/Pv7/V1y8LAAAk3klEQVR42sTYv4vTYBgHcEVBG+HNZHE64dIb/BMcT+jkdouHXAs3OBSk5xpdBCVL5wzNFQIqMSmd/EEP6qAdQsHMTv4XN7j6fZ/3ffsmeU3TSsRv3r5py12bT57nzYW7cvXm169fP/B8Qd5+efv27WueFypP13mJQXku8kTkBDnk45DnIc+BTq8nRq/fl9P9dXpq7vfXL5CDYuTHYdZv8eDL+IN/98m1q1eun8GhIeSQEY6ChBgvhQKDMwgCBB78gwsMhTgQh9vrIwrSN3YCVZQ8pKHTw0spIYzMyY0rZ2eQCApBEOVQVSkXBOESjDzFLAgIqEGPok43DlVB+NABEZNg9rSCJHgUbVIhJdQQV+AoQSCpai5IVEl0Z8kAwbfcKZTlkAJMup3yArFJCJ4S96AmiiIdhwQBRfeWjJAUilIsCNWkCIGi0Fk9DB70lAgpenmCfCKiOPcP8MhXoEpyKLuLII9IgggJKPmFUq5JwaGiG4sYxaUuCtEnAmYtkQIz5pI3MSRZlwVFAQQStUwg2bxOXpoSDTGvWNRY6tjJoxh9MZAKCX61rrkUAxu+HRDh+PJweD5Y53Exx5Q95O7e3Vw6Mo4IYxhGbGbbmGnCDqG9fGZG/mR9HGfP4+2MKAia6xyHpeOoGEe1jlVIa0NutW5hYM93fKLXdWltlbsHa8gZ5fndDiCGpMwwIfUOEhBHUFQaoVjn6CwJIYpHrWJUhFVKrF0l2GRBmnMgx1gnuiLoLHKUmx5poLWIIjWUJiUOGBh8jRAFEIqCVNdk99ai6HWCfYMUR1XkGRzVEKSasQvFIDQFYcKBiiDUWjI1y93vCkg6KChqHbocmJutCDrLaC2k6LicOmw2ThdCsZqzOILi3dh2/QvXSn1N2SY7lwT6egg5TtBaSL61loF7OY9kc+HQWTBjU8bOU8aiiMVpatuDCJCBP1iNB55lDQbbU/4F5JAoZciry3g1nbmLmUOZLo6iOIpi9s4du90lKuIGbncWAOK7qbt4Fyyt4AcpGneQpB6CzsIABJJca43j+Ud3NY0XqAnPwp8FDJDxil1EHJLa7oWEWMu59SPwYg+QrSW7WbZuLYIgCpLE8XIex1EcrxzKchXMOCSaL+ZUkcgOZjnIAEWBY4c021saAoWEUOZxkATfZrErK5Iu4nMOWaXM9akiXdfPQaxx/IMuW/8PQo6HWCMFyCl6a7ZcLBI4KMGcccjs8jJgHHK5mNsK4se/8NhlrSPNMcyrFqIvv7NxMF6eVt1u2eV7rXdzYmCz/gUFP11bEQl5VoRU3W6Zd42U5cLDTBaahKnmrqvRqxbaajtIsSAb71KEo77PGr1plP/aQmtVQep6y4iuCLKpJA0sDw2BIgc5K0OQLW7kbdOBoduritNoRU6Q+oqYzZVPdUU2L5SGFIjlcAX+SVi1RhTlODIWe2VFvNyapwyjv4O0uKPSsj5JFgIIBRAhqWitaDS5cMzF7ps1aU+sj+XiZH9VksqTj6HPkurgDjGeUEU2QC4cxzv22athEg5Cfy8cnXqhn3ozz7bTMPT91E6T1PKTrJ18an9OMnx6NBp1omm2j2efj6JRdjvNuiZk178c+tBpFhtPB22FFCtirpKfXBM6E280ZCGbpF7mTezQ/oRaJEf7iZ21Qyv1Qiua7CfWJyt5bFnJZGhl1tEIXzJtDaPpMOnW1KSlpg1LgQ+rVBEJQQQEMSFgcEj42Jk8DhkgA0DSkXeqIfuATNu+DYjtacjRMOsISGvaGnXTYXLnzxChWa+FKkbh2AlThjznWwFiluT8pz9ykvCngBx/9CcEyTxABgNA0FqhxSHtrA0IGipFWz0YZftUkTS7iJJ71VcwvagrFGKTu3L4Gr37XKTQWuYyqbhPMWP9IcZpbW2bYv+UX9l82DIEefn9uwGhmA7EgFRL1HmUUS9rKBpND70ZjFz2vlMAoRCkpigMY1sJpXTN0fOGRuJRFDM5gwl5vxHidLYtirW26JbOt5WcMei9PxcCI1eRMsJkMCYgb75feQ8IAkgpCmJKVGobDCN3SPm65A6Xot/SU3VDMQBU9qDAeAMIUTSkbTRXob3YUH/GHj7wtAQxb+nNimgGvSy+Vd9QLJ/jNyKAIID8ZrXudduGoTAMdy4MZaIgGCAhKFp6E0WX3IAmwVtHLb6JAlroVVMdGOiQQog3N4DXLBnaZO3ki+l3DkmxJC03QPqKsvLjOHpyZMdKKQtBk0Trun7WLBmt5ZSZ8B+lx2GntlkCCTyvn0gUPVwkYEQC+eUh3wHxFAoHgpzq+qjr8bi+3go9EOZhGOS2Xfc9IGrQgKhxuMuehnHpLWnBNZYyEkRSVsYGSdvKT4TiiTgLIQwm1+Pd06iru6/4b403Xkchrh+ux37X9VvUP63bXYct+6Ges6G7Kgny1oAIHGVZQhEw5JSH3BtJo/4OEpPuj8+Nbp6/AFLv8K5LiJPovzjI0EmC6OxHN2S6y8q3SyZEyZlDOAYUQjbfNrt39/dMadpWtcrnII0eG70+6mPNlPpanMbjzVYPDOl3miHyJHfbhy5DRHnzHNzpl9F1hBUlVhtybDaAQHL//XOLVNgyzyssbE3V5KuatrpublZCrFtO3GBXUslO9uujkpIkoJTv/xnfBfcN33EwAluokNhjgBS0BCDIQRAgXERB+VSNZRNRUmz1F4nYcnWWUtLJ0zlexXmBKQuS5xKuykFuAwgkbUhRRMHy1a4Y4zJTOeOwhtJ1VfpPLSF9OqSjoGYh69anZseSagRWlKGcmQk5ptPFngLK2SEILF8KOby7RQRZoXZGwxKsNKs5YylTinkR8n9ngEHGXWXU5SnMTcRDIksoIcz5anAWKQVDSUeC6MTszoc0+nFevsuQw+aAibDkFhBbsWqLIrYsp/KZFvnCZSR8daWSTIr/WnXgAOEY4ikkSYeiUkoae4wE11HsQP8DUtPKuc5BHi2kguADlqGgZChYtnz5L4sZCSBhzrGIE9j+LncJWghnXvNl7Ishjx4CByDmg4IxhaOkl1g4m6VZS0dhCEnKGCLhSOlU/spSyMvhBAgiSFWtqtUHSKylMLWEiSnzOR4gsuQgwY6AspAJn0x36bo8enzH3d68mBjCE0HOguxzxRXN5TxHecrCQHwEMRnI8kIKG9brmiA/HzlATFbCoyn4AvOaItD4k1emonBfTiEYh4d4R/BCwo+hCpt9PKjso7obf1AzEC8JMKHH/Qpf/M0AkibxFHGG4nWpCzWk2L/s3/1EgPSfGOExUcWFUgm9bn2MJOFE5g0f7H6ZNd02+/3+N3ZAEEH+kGrHrk2EYRzH8wec8BIvUg4qPLdlqiLBEkg8hCCICMng4mC0U5f+Cekg2sHRSenQoTi1Y3Fw6xIjEvoXdEgUbK0VKinS1urved73vTfXNxcRv3fXXK5a75PnLs2g5Di4Ry5aPJL8k573qtwjgIjEh9RLQRTlMv719Xu8sbGyYSHo+eJiKnGV8xoDhGEchzZ8RySl6RAeSDksh2nYn8Gii+2hKSAHGaxIhe1tC4FEuiCJseQFA5eVwBHIRNAEByBXInZ4GUWMlTfz80LkOGUPsjKQCl+2P2wbiJ2JpbhyGVidXkAzKURLZn0IbnZ2OL+f+W7s5pOyGCSb7jEr+n1AEKbyvNEQiuuiRXOMKbYlaYQE0jk+HgGSSmbD0WgUMmFWvpQ0xMDnaC4kDs+IJop8MTy2pUEfjP4KIBIgaBGL08STk+n7Cv4axzdPvl5DX/c6dcSSzr4c2T9kFKrXgwCXVhiTbo4k92r4FNlyWurrCgcHBwxZaLgW0RRLVtFAeCAuoc7aNduhdozA0J3Mcg6Cv5Rb+NdiB1nnABHJm0Y2tizmW9IpKPxZhRJSRHDINM7locMSObK2t8+SkYHg2roqE/kvSQpZ15D3B9KbVqvR8jCJbjIDqbEYsofTPeOPsrJTR7xzYgazxgw4AIkEYlNkfoAap1zEyBEfsm4hSCC2DMVZEouwCuVFN/jVjxhCfN58v+PxXO6WEx4JO3giRQNRCIpsOdNJDM+DbK5j3QSEY4hHsSWufAaiY5zsb0DQOXbxMYWPHJbqqMOjqUuBhShbLmX+MUpMC48SSmq1LKUNBFf4/FkkGuIsTpOMY8gh/Ojw6OhoFF0pWkhQ+s1z4MnY2aCShajcyFrad1AjAYBqvXddSoavt4i6W8DwitpAGIhInjK9lc3HqOlRWJ6pagju8X1AzgDpBCLBkTXcHxYyE06FGMmd2upqrUHco4+vu7TVe7GQ0M6gNiCUhegA0Y3NxFpcqqJTCis23nMRhfi1HhUBkUvK3PQBwvnvA1KS8PxKFRBSUyN0++Wzly9bRLVujQiQIf778QINIfEgb9+mEJc/mnmslcpdU2UsJSQ3kAgOxS9/B+cvEJ6Ig+Ae8UaSC6kt/1xebpLq97ZIAbKzS70BDg9TyXUgTk83Tws9xJAlBEIu5wmaH6sCTdZDc/h8EgnkTAbiJuIgLClpSSgSPd68Vna/rffmlSZ/61K/Rz+6pIZDNVS6R6e6wjMEyypDfEyz2Wy1mk+8DKaC1WQHAkjxhH+LBBMggZkOHqPqjIagDCT77Nmvh8vKtLNMaufHLvYWXuxupZBPUgEMtqy22+0lV8Ziu2myGJtoZCDVS4CIY62YgQQWguw7cJUhFZM2+BPC2aspVdR97fgOCNertXVL4Ny65SzNyQnHUXCZ6YHwRA7Z0cFgigYiTYLMjUHM4lRZjztk7krbAwt5pSWAuGBJu2FrNm/kS+TKugzIpWgkDp4M0m+/yLwhu4rFajnECaXdU/eUwoaFn+kqWNyJ+929e+c7FKjw6g/j9ffS1hnGAdw/wEBMBk7jTW/aYBpD07SnaFzADstkmYYSQXaxYkMp3k2kErARFiQXuyg0IOiF9GIFKWVXinWCguBKb0arXdFapEwYaKmjXeek9Me+z/O873nP65ljX9N4TmK399Pv+yNOjE0wZOCSlUwGD4MxURAOS+hJFYJGSi/EIZKPBJFZ9kJBSgoii0QrMNwvQWBHUC7cmHGfO4cHPZlcAEIgTycmJgD5Bjl1yY5Q/Jx0GhBNoS/UnRBI6RZ97sVFgCF8noSQ2hJtAHT1OiQBROYWRiPjBkA77GDopJBk1Pd+SfT58z+eIzVPEVgAYQrnPywZJUk7nqXPhWBmsQOfSQIIOxqD1EOIQitnP9TYCEiwVCrtl/b38GviMYIgxDB9+Bw6o/fPXRiHQcchCKIhaEUgRqNESSSTTNoioRgJzawEQcSxF6DAQZIPNH5c4B3sZNxIabe083bv1v7bt3yUCATRDgPwJTMOyHD76MadjZlLDsdAJD8rhNGIBxBywGRRuBQjCSrIa/qF6jVnd3f3AwHoF8QPb9+94COSILdu/RXaKaGY0g5NrmOAGIpHcVGCt+gZj+z48YvjTqpy35lxNjq+b3dylOO3JTUHBwwpfMU5hHGDa4vyuayUdI4hXcFjAqFCTHi3/ejevlO719672p1SLUECrWENQasehePNReeimw0nOzubBCQ11O6wJHL7uUB+ohw8LVzmgOKXxGJ8rWcaR60U3r9oZiU+CYdb/RBkX1588bFWslv77iMgu7WlnUYFcRymoAaqggefvpjmOLp4gQw52aFUdcMZylc7HIQgiIEcVC/reCmkQFCV3DBEKGb/MoW0luzUSv7a39vb5yvZfj8rHeNdOBgKhGmR9DsIU/CvT0kfijAcK0zEF0N+vD1fcwMOBBAdNcdiOnwf+yYma4ZjJIDwCgmTo1WWOR/qEnX1mVbwDaLeVZX0M8Qa47/Fy3BzQjUCCFOqFy5oh6Qv1ud1uMnnbUqun7YsMNghEEgAYIKITGxViFZJkCBHI6j2wyB5A2HI/PzteYIgBDESxvQhROnrwyUTvoGHJWy5JBIUQg6t0I0g/rH7I5+4zugyzPDUFX/TsXk6TfMcTC1EIJCIpRchiAk3w0BcYo7lMcdEksMvCzakEfE5jMTWhUIBqkQQMjzJ53hwcGXigaQ15NH8/HfzjwSC6QWIBA6GtFgMOAAxEg3BxGKHhuDoVo3YYxaK/ZKCfAoIMYzhyCiTJZZGHj0ChAJI6pDkq5aWPtJAIBB52UjEkUiYdR7iWBC1VBjiW/FmapmRqXMqYwvseLkEuU2Q9Ru//06QVAoSmV+9ash2ejVESwBxuhq800oc+MLgXYlAEINQ4ULw6xVBZGxk0EdVUvZ6jDUj8ds0BA6aWuS4MZxCpBDmxHtNGKWvjCRDC0Q7QuwwO66KPXQ/RD4CC0QGzGUfEVD8EGagETgEAoc/gEFmodSqIYgTTITV2oACD9/wrZHrO7uRT1FJfw5zSmo4JRFPXsWl+ByZzkccQNZ5tQNiUWyVl9IiEqyR3LkGcYR0jMQWubFdIgmLhBinfMnLE2uMRYHotvMmO27WrEsAiQJCmBTHhmXjmoEtgCUopL85AYdA/JTuNh/If7Lo36/OOKe1w5+YMimNnS9uIgS5xo4bw1EKYeg5qiGaEo/HgdBhyGmnGRMLEhNFweN/JgQITa5Pgl2oROaV32E+WUDih3AAQSABxIpdSjZLkhYjieUzuS5Z6ZbFnmfqmx1zrzbrVlnwOUBoVfggcHBci8XpJMWUQBAXsjE7E703M2o7AIGkxQSF9GCl19eBIZRWP8WAjoxHcgaVsATxMXSEInEhppF1/BmOINFoZChSiT7Bl78R7qSX/hAkk+7CzBKIIbg7mDpJfA5/WIIFHzyH/ZcpxqE/UUi0RGP01JriTrgRgUhmKhGCICkzxaQSwfQSJJ9xmhv0Z3c73hr8lbRxDkl4D+5yIFGQGCO04wJFUVoMJcmUdiAQhrzCnyHlKERmI7OAUCpPRnUz3ImWkCPNH3qpEs/o/Q6Jq6hlRbdIFAd/DY1gbvWn6VwgSUxlowUH8WW1jZLFQIZmN+DIa8jqqjSy6UJmZp5E7s3M8DVxUjpawn0ke/qbjxEEhVg9WA4/BOlu667tlv2ZKSE+FMO03NOnFURJxt6//3Ns+1l7iuYGU+jDrKZUqZM8IFJJzSZLAPHnvg0RCS2QJI6QhkTCLeTQ2rYgjR5KG2Mk6qRhPRohiAOIWu/sWBl6tjz2EpqD7VmR9MbhUOmUVd8+NSWQa0dCwLAkGhJL9pyHgyZWHTssizuLrEZwjzKkFfMDHEAgoePdXSQIO1rw/8um7m/Nvfz664kKDUFD5FkgHEytb799hWViQ04wRHI2ajfCR0hDot7rMBrPkvZCoDBNGA8H2xZJEkEsEtsBCCTZFDI7sbIy8cw6BKSYgm5k85Us9uPHIxE8IvhuV6JPenEAcuX0+WZx1AWQVo63F3LQgva2RG0YBxa8tW1xJYBklCIPxzBGyRTWIJWxr1fGnrV4wpDV1dWpVYJQCGJywq4EIclJ1Qh2LC5kcGsQEnLUtaIbhREI4kIqy5WZO9UyySik0qBuFxLgkwSQmEQ7pAF846v41sF7WOI69EZhapVTszkyQhQvJHJCHPgyGEAogKCQhvr68PZacSOA1FFEIZA2tTvxfjw+uTA5WVyYnv4zpxvSm1e3bF/8YxqSP6UcQ7wSaLB22rdevl+Zu4+OVAoohCEjiEBMADExlfAyiSVlhXSuVbbXHpR5btVpBBQq2FshKU9OL+f4vlyco0EbCUFwoQoJtNZ9Evzlb5UDOKD4Cg4/JT5Elko2JakuEuTNG0CugkIQO/7dCxQqpIcKCdc9eBAIlIvFSihkE7oRPCG1ueXpyTL64btycVmvC3lBGsFTSO1bWwsvVQ6wX0kEYgdtDG1VMJyzZ89Go8Pri3AQRDJ6vOlIiKbgfEch6S/JsbFWDmDsy9NzZR6/Hv51ijwvL0zeqcUrks+qC3dhECm/qDVtsgN3rP125jwmV0yN9mgKXqE+opTI8LX1G4uLgDx+TJVsjjY1HSkxEBTyuRRSfAgHRlWeLN7tNrnu5k6xeBfvaxne+2GhiiPQ/SFDaSNIT/FhfeLM+dPJGElshb+SLEtQSHSYfgtZEggCCHIIUh22Uq1WC4X2znIEZ8rWyvcDAwNXrgwODmytTFSvDFBwh/Qgg/cmFx524iX+mQGVuSK9NKjSoy/kL8+t9Gaz0XJne+H/BGNpl8mFqfVmcX1pqebxCEtGmzqY0mRRPOVQJdm+fJq3rM5ihRYGT5S28tzCVpu6uc5JzU3Pncc7snRCbiYncevpjtpok92tstCBza++oSudjB05r05y4idpbnFwV1ikLC3WjPyKbI6MdnSQRHoBx45sx6nemDpDHhbDvFOF1CiKxQ7cqVH20+KgIeIdiT5kysVte1PQykB5YQuOcH2iOZeJxe2QwBf9OSNeWKIAggVy9derLqRDLP4Aku07RVtWQ+KLtQ2c7GE6D+Uk6Xiwts0w5O5C8Q4PNaQZctLUwTK+Nu6eNqxgJVJ8gP8eHA3NTgaN2LEJJmQ8WXizCMbiEkNoaokDHIG4D1PKP4TasWsTYRgG8P4J1RNCqIuLPVJtEEsRNQgJhPTg4EJsIXQrIQkNGRrFI1DoIBKISyElULdCp8wKgQ6CUEKWUggNiCVLZodSQRfB532/78t7x7X4aEhySnu/Pu/33bV0ZeOJly8kIBkOk8lYDBZgEHqmUuCiC+BEnSkbVOSaOTl5z/cCxkjBP02b2xZ+BTiZnE9sPV0vYmhEcbNjdZWflvVoYbGD8W73wjSSNhIZMx1dSMZxEmejVJySBEcnGSufj84b6U8n0wadNBeloh366OE1w80hi9MarZECHzKReEazJRBaElGFygq9LtECwXqfq9Vr1V1eI4hySM4OdSYlFLLdyGUQ53QKDcIaIDi0A5yMPmUt7ikafazRPLd06CCjss2pFVOS+Xln69X6MjexbAhRh40QhSA0WDRa9fru/sWPi71s9gbJ+FzndPNwUCx7eYJMmg5HS5LUhxq1yXfL5GYI4p+0LB5L+S/XQ66GKQ/wcyHsW2S41WHrcC3+1zYovwhSre7vVwGBJEoxK+TL4d/rYy8PSen0TEGkE4osmYiDpkwyOdGtmYUyxZbH88eWhLPlrctGdbsDURBIYJkDo1qt1QliJJ1+iRE+QcxKd/3fp6cfOpnMh2ZGGAgJwIj0YM5ebWzP9TEcPW9iGYmjO+qYzU3tW5l8eSkIWTXRbyCgi0GJIbZ/1b6CpT2HQnar9V0FUZSz1CVDWlwJO1bdYrnhjf+Mfn4blYjBDgyUIcgXWSIOjrnVb1wP0/yZ3lM6zanZpZ8riJN5hUrCDJsiLxeQtzbHbwPSZsguIDWGqFayrXSLp+v4cg8OhuCa3vBy+Xxn2BxqhnYYAkKQiEQc+KOSbo4C+aQZVIiGeGWZrRnDSDTjc1+98NuVqzZBqlgkDJEwxIQhtGN5+RxvWgWZK4boxfGfRnjS5LDBS5gRSzLkZXlJVvqshJlkQQLR1ZWC1Gq1ej0MGfuttEjgsN0l9AEEOyizRiwwJNFGblCxghJCsOMeHIDkX4UhiD1ziEFBMFgMOUJqtaMgpNNNpZEZZGEFOy/VIRJphGPxeleQsEQbdPTBaBvsUJB5gqxjA14ViGRBW6KNkAKt9NbWRJJWMRDbxaUwH27EVDILXgdm626gBksSclmhOpL8MZIPqJGMh9kiwYzBz9qgH8giQSo7O5VKBRAwGEIRSQCy4FIhCDsKZs+SJFViRiLh0yQjcu8eSSQBIBs48XmCbOVxKZEqQhDJIuctKSo7FTRyJBBEIIpCK2S9IQ5ABBGSsOPO86iDQreEDLHCUQTDiAPioJG8Vy4KhHI7ZIcleo0cHSlIpJZQIQW5NZHQO0aQAwk6EH2qeiFJDyIJQ9C1U8BsNZYem1O3zeqQecJDGlEBBDk4AEQkQqEVsrHODtSBzyIQiRoqixRCMBCOMghO5ouhgYVGFCcAMT8xCPXAT1qCNaIgB2AgXQCiFkCwZdElBAEEgQMRBfcR7gImRF87ZLeShGoTFxcEiYJsPGKGlhjCoolBCUSlm0oRoBRoRkFsunvn9FxHSxyi4HuSlUJMhRe5OKL7MPJCRb+R42ETX9oLL7FtbbjseGggiwiuaZLZGtmhvwqySRCi+C3S+Hh01kqtVPp+1i26xaKdy23bl26h6CVKewnHpfka9+K9MhBlaPD2TtyjAsgRC0ICfWiGJMqI8WwVcljsLhWCU2cJiVQiECDeVN68mdvc3DzAAxAKIAAMWmvHg7OPk176YddPD0qt3jg3/ni8sud/8Qafna7/GZJ+d7u3HY+nvvez9ve3fetLZ8CzQRGI+X4wctom4TYQaiTfWFp2ycEQ5DbIfTSycwHK/txrKMKQtf4/QuxfRXEoCgP4YwyiDyBuK9OlMbAksoEMihC2FYt0moWUFhYWNgMueQKr6RYSyBukk20MBHyY/c7JPTm5iuwHzpiMDOfHuf9McfWLOvWP32eHLB1V6713j0rvPp2VBT6yu+SXYLHIwyKLJpM4y9NsOChn57dmIxsKl8iAVqbnSv1NjdOVjJsxafPDpYYAwrVCwgJk9OCgezy08EJHbIjjp4V/XTfrK0GG2ckBJLxH97AeF17jOKc4dwNsKfnifMEYywMn3fthOf4alK5sjRxzpOxucbWye0j0aiCOOUZWjIYAIvVqLMeIINhEiNJ2ZCmQc10U/vFY+Hmd+3l1GB+KJl3X1T5Mqyo+l+UsLjbn8gQIXs3OdfEBZ1dl+WT/tR/YewIu4VAcWLbChkCikCiYvo87SXsKf+qHQpKEIEuBSPw2GFnjIIo36IiJ7O94fbht5ohfVSmvyVwuI8wiLSaWoGQ5q+txkyIQSgvZRKsAFEuiDLo9asNDCxR0BAxYGqefDjIlyC4AQQIG4ro4RbJlTgmjiUJahkBMgVK5VKwKxPoTFi06osQRpslYSm+L5ndyLZBku4UDc2S5pNGlEHUYCCShBJAFQ5RFhy+OqW/Qh2ikfvywJbweSLgj9N93m803DK9hX0JjSQAKud2SW5IkBDGTXR2OgRwACcxT947icry+xK5bHS+iEjCQBwj3OwzxlH7Va8mr/Lp9ItsWsjQQjWnIAU/gVyzpd8WKQCjPDpRr69ShEG0J7yJzknyQRFsyeg3BZviZ0NCCBBR7sotjOCUIYiB/niWu5XiTmqVcySNEFGYvVIhIPI8l78P/QPa09iboCEN+/6yfGkIONCSIOoZnL16eKw4tT6rRYjkdpLORwjqeMEYmmGkKSx5bIs/azRemO3Z1omDV4tn+14bwBDlMjQMMlExhiy5deAPHvzLO3+VpIIzjIuhf4e6gs3+Ak4OC4CSugkWnUgsZBLkDISfkaES86NbVIUlBzqlT++KYV7EG0VKKYCexm7r5eZ40YPHb/LhL+7bP577Pk6YXeA+hHcIjoiMKTR4F6TH+n6ZQlGPzrmvJ88X4nyUwMC2mIm3ejygRih0Q9WT65ghEDQGj57hJ5OgAQqcHwRBuKSoA6mu3H/d/QVB/9MgOriWPQXr35NPEkv9AFEFWlndML8qc70od0RPXk0+fX/R6/frx48cP5bbhXRFkF/TNGAIYMVR7MjIXrly+fZtzwazXtdmMrkoa9+UZDt3uX8UqIitvXbs2u3ntlormTP/kJvtLN24wQXfj8pWLV+VS/OGRHv+rrz+/yGTWgPWQWiyduKJH05OPaL/fb7abzY/Ntliq7NLWdv7y95PW2hpZ3VdvG59lWUiSJKSBHTJJqvsQm3Q8HhvjojPjTobGWhtp/MWzKu2abh+yPM996b3P25fz/VCuQLgQGfHzaTRaoRHFPeA+G/dDYEBMOkhqHVjuKI5gTAdgiL5vNqC8ms/nRcdirV0Wc1tVVV7XpUcuQ0ScGJMgF4zRUE0ibIg2PZdH51IDYKqMqcuci40czWLawQp4FnlPRqgoCsZoOd9u9h+HgMAxFA6+MlariYrZdxUs0ykgBykFCxzPHzx6JJAnePIdFtbtFhTRUoGsbsrFYlHbulyEsGAAF2Vdcsizq6VXsuGpIKuvKzHPy7NVe8pA1L72CbhJKKuq+fUr+gBS3uSZw5AYvYwVPO12PwQBVzCCqh6shpMVwXcE7CDqQYi/rxQB4egJIrvAEAYW9YQFktqqWlYMquoyLz0BxgZFCTsSi0vH6/Vu90e1I5FwgAjxDdN4XUbPJbwGI0wKwTfHlhXX1BwWl5W2aG3xAQwhkcjFhIkmE3faZAOU9CW1eikMIMxFPIIBiD0UQiCP1rZta6umIX1li7pmdKnKZYR3aJk056gRFkJdI4JNiTMhTkeTOPNKd0maRfEgpgk4+taxLHMKMC9rjC9ILiZESayR5NW9kVhAdT8YCAiODBUKEEgE4siSAdUBxw/Saos6GEDAgYdhIjXoVsAA4hhsiaGweBMjzRBiSa5lC0k08iSTxAvy8DXhWb9AHntILeopSRbes0gOgpXlFZ/45EkLXFLa+QdmqYcTMEABicZgxB0dfBCS1eCB6NyZs+f/IaFK+AE/PZHqwA8kHNQHKJY84oGWS6lF2DiJEa4LiQxtCKR7ScKfNoTsA/W7xo/EV6enuTfk2W63C9RDlRtJu/XuD9udpp7DiMaN6ZoUuljxzxve5nIKSLP62Yenww4EUSuATCDBEhE06MzZv/Ds8AQFdTqGAAAAAElFTkSuQmCC", - "description": "Displays a visibility data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a visibility data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/volatile_organic_compounds_card.json b/application/src/main/data/json/system/widget_types/volatile_organic_compounds_card.json new file mode 100644 index 0000000000..4a6fec9e2b --- /dev/null +++ b/application/src/main/data/json/system/widget_types/volatile_organic_compounds_card.json @@ -0,0 +1,29 @@ +{ + "fqn": "volatile_organic_compounds_card", + "name": "Volatile organic compounds card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays the latest volatile organic compounds (VOCs) telemetry in a scalable rectangle card.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'voc', label: 'VOCs', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"VOCs\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:molecule\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#80C32C\"},{\"from\":500,\"to\":1000,\"color\":\"#FFA600\"},{\"from\":1000,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#80C32C\"},{\"from\":500,\"to\":1000,\"color\":\"#FFA600\"},{\"from\":1000,\"to\":null,\"color\":\"#D81838\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Volatile organic compounds card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"ppb\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "vocs" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/volatile_organic_compounds_card_with_background.json b/application/src/main/data/json/system/widget_types/volatile_organic_compounds_card_with_background.json new file mode 100644 index 0000000000..3ffeb76022 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/volatile_organic_compounds_card_with_background.json @@ -0,0 +1,29 @@ +{ + "fqn": "volatile_organic_compounds_card_with_background", + "name": "Volatile organic compounds card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays the latest volatile organic compounds (VOCs) telemetry in a scalable rectangle card with the background image.", + "descriptor": { + "type": "latest", + "sizeX": 3, + "sizeY": 3, + "resources": [], + "templateHtml": "\n", + "templateCss": "", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.valueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.valueCardWidget.onDataUpdated();\n};\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '250px',\n previewHeight: '250px',\n embedTitlePanel: true,\n defaultDataKeysFunction: function() {\n return [{ name: 'voc', label: 'VOCs', type: 'timeseries' }];\n }\n };\n};\n\nself.onDestroy = function() {\n};\n", + "settingsSchema": "", + "dataKeySettingsSchema": "", + "settingsDirective": "tb-value-card-widget-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"function\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"VOCs\",\"color\":\"#2196f3\",\"settings\":{},\"_hash\":0.2392660816082064,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":null,\"decimals\":null,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]}}],\"timewindow\":{\"realtime\":{\"timewindowMs\":60000}},\"showTitle\":false,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"padding\":\"0px\",\"settings\":{\"labelPosition\":\"top\",\"layout\":\"square\",\"showLabel\":true,\"labelFont\":{\"family\":\"Roboto\",\"size\":16,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"labelColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showIcon\":true,\"iconSize\":40,\"iconSizeUnit\":\"px\",\"icon\":\"mdi:molecule\",\"iconColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#7CC322\"},{\"from\":500,\"to\":1000,\"color\":\"#F89E0D\"},{\"from\":1000,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"valueFont\":{\"size\":32,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\"},\"valueColor\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#7CC322\"},{\"from\":500,\"to\":1000,\"color\":\"#F89E0D\"},{\"from\":1000,\"to\":null,\"color\":\"#DE2343\"}]},\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"500\"},\"dateColor\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"Volatile organic compounds card\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"units\":\"ppb\",\"decimals\":0,\"useDashboardTimewindow\":true,\"showLegend\":false,\"widgetStyle\":{},\"actions\":{},\"configMode\":\"basic\",\"displayTimewindow\":true,\"margin\":\"0px\",\"borderRadius\":\"0px\",\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"showTitleIcon\":false,\"titleTooltip\":\"\",\"titleFont\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1.6\"},\"titleIcon\":\"\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"iconSize\":\"14px\",\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"14px\",\"icon\":\"query_builder\",\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":null,\"weight\":null,\"style\":null,\"lineHeight\":\"1\"},\"color\":null}}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "vocs" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/volatile_organic_compounds_chart_card.json b/application/src/main/data/json/system/widget_types/volatile_organic_compounds_chart_card.json new file mode 100644 index 0000000000..fcad265637 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/volatile_organic_compounds_chart_card.json @@ -0,0 +1,32 @@ +{ + "fqn": "volatile_organic_compounds_chart_card", + "name": "Volatile organic compounds chart card", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a volatile organic compounds (VOCs) data by combining the latest and aggregated values with an optional simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'voc', label: 'VOCs', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'ppb', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'voc', 'ppb', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"VOCs\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"ppb\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#80C32C\"},{\"from\":500,\"to\":1000,\"color\":\"#FFA600\"},{\"from\":1000,\"to\":null,\"color\":\"#D81838\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"ppb\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nif (value < -100) {\\n\\tvalue = -100;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"ppb\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"color\",\"color\":\"#fff\",\"overlay\":{\"enabled\":false,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"VOCs\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:molecule\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "vocs" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/volatile_organic_compounds_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/volatile_organic_compounds_chart_card_with_background.json new file mode 100644 index 0000000000..01c2280163 --- /dev/null +++ b/application/src/main/data/json/system/widget_types/volatile_organic_compounds_chart_card_with_background.json @@ -0,0 +1,32 @@ +{ + "fqn": "volatile_organic_compounds_chart_card_with_background", + "name": "Volatile organic compounds chart card with background", + "deprecated": false, + "image": "data:image/png;base64,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", + "description": "Displays a volatile organic compounds (VOCs) data by combining the latest and aggregated values with the background image and optional simplified chart.", + "descriptor": { + "type": "timeseries", + "sizeX": 4.5, + "sizeY": 3.5, + "resources": [], + "templateHtml": "\n\n", + "templateCss": ".legend {\n font-size: 13px;\n line-height: 10px;\n}\n\n.legend table { \n border-spacing: 0px;\n border-collapse: separate;\n}\n\n.mouse-events .flot-overlay {\n cursor: crosshair; \n}\n\n", + "controllerScript": "self.onInit = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onInit();\n};\n\nself.onDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDataUpdated();\n};\n\nself.onLatestDataUpdated = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onLatestDataUpdated();\n}\n\nself.onResize = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onResize();\n}\n\nself.onEditModeChanged = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onEditModeChanged();\n}\n\nself.onDestroy = function() {\n self.ctx.$scope.aggregatedValueCardWidget.onDestroy();\n}\n\nself.typeParameters = function() {\n return {\n maxDatasources: 1,\n maxDataKeys: 1,\n singleEntity: true,\n previewWidth: '400px',\n previewHeight: '300px',\n embedTitlePanel: true,\n hasAdditionalLatestDataKeys: true,\n defaultDataKeysFunction: function() {\n return [\n { name: 'voc', label: 'VOCs', type: 'timeseries', color: 'rgba(0, 0, 0, 0.87)', units: 'ppb', decimals: 0 }\n ];\n },\n defaultLatestDataKeysFunction: function(configComponent, configData) {\n return configComponent.createDefaultAggregatedValueLatestDataKeys(configData, 'voc', 'ppb', 0);\n }\n };\n}\n", + "settingsSchema": "{}", + "dataKeySettingsSchema": "{}", + "latestDataKeySettingsSchema": "{}", + "settingsDirective": "tb-aggregated-value-card-widget-settings", + "dataKeySettingsDirective": "", + "latestDataKeySettingsDirective": "tb-aggregated-value-card-key-settings", + "hasBasicMode": true, + "basicModeDirective": "tb-aggregated-value-card-basic-config", + "defaultConfig": "{\"datasources\":[{\"type\":\"function\",\"name\":\"Main building\",\"dataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"VOCs\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"settings\":{\"showLines\":true,\"fillLines\":true,\"showPoints\":false},\"_hash\":0.8587686344902596,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"ppb\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}],\"alarmFilterConfig\":{\"statusList\":[\"ACTIVE\"]},\"latestDataKeys\":[{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Latest\",\"color\":\"#4caf50\",\"settings\":{\"position\":\"center\",\"font\":{\"size\":52,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"1\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.87)\",\"rangeList\":[{\"from\":0,\"to\":500,\"color\":\"#7CC322\"},{\"from\":500,\"to\":1000,\"color\":\"#F89E0D\"},{\"from\":1000,\"to\":null,\"color\":\"#DE2343\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.9408410830697858,\"funcBody\":\"var value = prevValue + Math.random() * 500 - 250;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < 0) {\\n\\tvalue = 0;\\n} else if (value > 2000) {\\n\\tvalue = 2000;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"ppb\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta percent\",\"color\":\"#f44336\",\"settings\":{\"position\":\"rightTop\",\"font\":{\"size\":14,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"20px\"},\"color\":{\"type\":\"range\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[{\"from\":null,\"to\":0,\"color\":\"#198038\"},{\"from\":0,\"to\":0,\"color\":\"rgba(0, 0, 0, 0.87)\"},{\"from\":0,\"to\":null,\"color\":\"#D12730\"}],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":true},\"_hash\":0.06392321853157967,\"funcBody\":\"var value = prevValue + Math.random() * 6 - 3;\\nvar multiplier = Math.pow(10, 2 || 0);\\nvar value = Math.round(value * multiplier) / multiplier;\\nif (value < -25) {\\n\\tvalue = -25;\\n} else if (value > 25) {\\n\\tvalue = 25;\\n} \\nreturn value;\",\"aggregationType\":null,\"units\":\"%\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null},{\"name\":\"f(x)\",\"type\":\"function\",\"label\":\"Delta absolute\",\"color\":\"#607d8b\",\"settings\":{\"position\":\"rightBottom\",\"font\":{\"size\":11,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":{\"type\":\"constant\",\"color\":\"rgba(0, 0, 0, 0.38)\",\"rangeList\":[],\"colorFunction\":\"var temperature = value;\\nif (typeof temperature !== undefined) {\\n var percent = (temperature + 60)/120 * 100;\\n return tinycolor.mix('blue', 'red', percent).toHexString();\\n}\\nreturn 'blue';\"},\"showArrow\":false},\"_hash\":0.44695098620509865,\"funcBody\":\"var value = prevValue + Math.random() * 50 - 25;\\nif (value < -100) {\\n\\tvalue = -100;\\n} else if (value > 100) {\\n\\tvalue = 100;\\n}\\nreturn value;\",\"aggregationType\":null,\"units\":\"ppb\",\"decimals\":0,\"usePostProcessing\":null,\"postFuncBody\":null}]}],\"timewindow\":{\"hideInterval\":false,\"hideLastInterval\":false,\"hideQuickInterval\":false,\"hideAggregation\":false,\"hideAggInterval\":false,\"hideTimezone\":false,\"selectedTab\":1,\"history\":{\"historyType\":2,\"timewindowMs\":60000,\"interval\":43200000,\"fixedTimewindow\":{\"startTimeMs\":1691927717318,\"endTimeMs\":1692014117318},\"quickInterval\":\"CURRENT_MONTH_SO_FAR\"},\"aggregation\":{\"type\":\"AVG\",\"limit\":25000}},\"showTitle\":true,\"backgroundColor\":\"rgba(0, 0, 0, 0)\",\"color\":null,\"padding\":\"0\",\"settings\":{\"stack\":false,\"fontSize\":10,\"fontColor\":\"#545454\",\"showTooltip\":true,\"tooltipIndividual\":false,\"tooltipCumulative\":false,\"hideZeros\":false,\"grid\":{\"verticalLines\":true,\"horizontalLines\":true,\"outlineWidth\":1,\"color\":\"#545454\",\"backgroundColor\":null,\"tickColor\":\"#DDDDDD\"},\"xaxis\":{\"title\":null,\"showLabels\":true,\"color\":\"#545454\"},\"yaxis\":{\"min\":null,\"max\":null,\"title\":null,\"showLabels\":true,\"color\":\"#545454\",\"tickSize\":null,\"tickDecimals\":0,\"ticksFormatter\":\"\"},\"shadowSize\":4,\"smoothLines\":false,\"comparisonEnabled\":false,\"xaxisSecond\":{\"axisPosition\":\"top\",\"title\":null,\"showLabels\":true},\"showLegend\":true,\"legendConfig\":{\"direction\":\"column\",\"position\":\"bottom\",\"sortDataKeys\":false,\"showMin\":false,\"showMax\":false,\"showAvg\":true,\"showTotal\":false,\"showLatest\":false},\"customLegendEnabled\":false,\"showSubtitle\":true,\"subtitle\":\"${entityName}\",\"subtitleFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"subtitleColor\":\"rgba(0, 0, 0, 0.38)\",\"showDate\":true,\"dateFormat\":{\"format\":null,\"lastUpdateAgo\":true,\"custom\":false},\"dateFont\":{\"family\":\"Roboto\",\"size\":12,\"sizeUnit\":\"px\",\"style\":\"normal\",\"weight\":\"400\",\"lineHeight\":\"16px\"},\"dateColor\":\"rgba(0, 0, 0, 0.38)\",\"showChart\":true,\"chartColor\":\"rgba(0, 0, 0, 0.87)\",\"background\":{\"type\":\"image\",\"imageBase64\":\"data:image/png;base64,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\",\"imageUrl\":null,\"color\":\"#fff\",\"overlay\":{\"enabled\":true,\"color\":\"rgba(255,255,255,0.72)\",\"blur\":3}},\"autoScale\":true},\"title\":\"VOCs\",\"dropShadow\":true,\"enableFullscreen\":false,\"titleStyle\":{\"fontSize\":\"16px\",\"fontWeight\":400},\"mobileHeight\":null,\"configMode\":\"basic\",\"actions\":{},\"showTitleIcon\":true,\"titleIcon\":\"mdi:molecule\",\"iconColor\":\"rgba(0, 0, 0, 0.87)\",\"titleFont\":{\"size\":16,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"500\",\"style\":\"normal\",\"lineHeight\":\"24px\"},\"iconSize\":\"24px\",\"titleTooltip\":\"\",\"widgetStyle\":{},\"widgetCss\":\"\",\"pageSize\":1024,\"noDataDisplayMessage\":\"\",\"useDashboardTimewindow\":false,\"displayTimewindow\":true,\"decimals\":0,\"timewindowStyle\":{\"showIcon\":true,\"iconSize\":\"24px\",\"icon\":null,\"iconPosition\":\"left\",\"font\":{\"size\":12,\"sizeUnit\":\"px\",\"family\":\"Roboto\",\"weight\":\"400\",\"style\":\"normal\",\"lineHeight\":\"16px\"},\"color\":\"rgba(0, 0, 0, 0.38)\",\"displayTypePrefix\":false},\"titleColor\":\"rgba(0, 0, 0, 0.87)\",\"borderRadius\":null}" + }, + "externalId": null, + "tags": [ + "environment", + "indoor", + "air", + "vocs" + ] +} \ No newline at end of file diff --git a/application/src/main/data/json/system/widget_types/wind_speed_card.json b/application/src/main/data/json/system/widget_types/wind_speed_card.json index 45b63875bf..f2960bd039 100644 --- a/application/src/main/data/json/system/widget_types/wind_speed_card.json +++ b/application/src/main/data/json/system/widget_types/wind_speed_card.json @@ -3,7 +3,7 @@ "name": "Wind speed card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest wind speed telemetry data in a box layout.", + "description": "Displays the latest wind speed telemetry in a scalable rectangle card.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/wind_speed_card_with_background.json b/application/src/main/data/json/system/widget_types/wind_speed_card_with_background.json index 78e3fe63d6..933d349b60 100644 --- a/application/src/main/data/json/system/widget_types/wind_speed_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/wind_speed_card_with_background.json @@ -3,7 +3,7 @@ "name": "Wind speed card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a latest wind speed telemetry data in a box layout with background.", + "description": "Displays the latest wind speed telemetry in a scalable rectangle card with the background image.", "descriptor": { "type": "latest", "sizeX": 3, diff --git a/application/src/main/data/json/system/widget_types/wind_speed_chart_card.json b/application/src/main/data/json/system/widget_types/wind_speed_chart_card.json index 723b1478f1..44d770721c 100644 --- a/application/src/main/data/json/system/widget_types/wind_speed_chart_card.json +++ b/application/src/main/data/json/system/widget_types/wind_speed_chart_card.json @@ -3,7 +3,7 @@ "name": "Wind speed chart card", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a wind speed data as a combination of the latest and aggregated values. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a wind speed data by combining the latest and aggregated values with an optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/json/system/widget_types/wind_speed_chart_card_with_background.json b/application/src/main/data/json/system/widget_types/wind_speed_chart_card_with_background.json index dbbb82e43e..bd7a1b472e 100644 --- a/application/src/main/data/json/system/widget_types/wind_speed_chart_card_with_background.json +++ b/application/src/main/data/json/system/widget_types/wind_speed_chart_card_with_background.json @@ -3,7 +3,7 @@ "name": "Wind speed chart card with background", "deprecated": false, "image": "data:image/png;base64,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", - "description": "Displays a wind speed data as a combination of the latest and aggregated values with background. Optionally may display the corresponding historical values as a simplified chart.", + "description": "Displays a wind speed data by combining the latest and aggregated values with the background image and optional simplified chart.", "descriptor": { "type": "timeseries", "sizeX": 4.5, diff --git a/application/src/main/data/upgrade/3.6.0/schema_update.sql b/application/src/main/data/upgrade/3.6.0/schema_update.sql index 0361a5db65..b0a64268ef 100644 --- a/application/src/main/data/upgrade/3.6.0/schema_update.sql +++ b/application/src/main/data/upgrade/3.6.0/schema_update.sql @@ -17,6 +17,9 @@ ALTER TABLE widget_type ADD COLUMN IF NOT EXISTS tags text[]; +ALTER TABLE widgets_bundle + ADD COLUMN IF NOT EXISTS widgets_bundle_order int; + ALTER TABLE api_usage_state ADD COLUMN IF NOT EXISTS tbel_exec varchar(32); UPDATE api_usage_state SET tbel_exec = js_exec WHERE tbel_exec IS NULL; diff --git a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActor.java b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActor.java index 2779a83979..48425d58db 100644 --- a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActor.java +++ b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActor.java @@ -16,9 +16,9 @@ package org.thingsboard.server.actors.device; import lombok.extern.slf4j.Slf4j; -import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg; -import org.thingsboard.rule.engine.api.msg.DeviceEdgeUpdateMsg; -import org.thingsboard.rule.engine.api.msg.DeviceNameOrTypeUpdateMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceAttributesEventNotificationMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceEdgeUpdateMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceNameOrTypeUpdateMsg; import org.thingsboard.server.actors.ActorSystemContext; import org.thingsboard.server.actors.TbActorCtx; import org.thingsboard.server.actors.TbActorException; @@ -27,9 +27,9 @@ import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.msg.TbActorMsg; import org.thingsboard.server.common.msg.timeout.DeviceActorServerSideRpcTimeoutMsg; -import org.thingsboard.server.service.rpc.FromDeviceRpcResponseActorMsg; -import org.thingsboard.server.service.rpc.RemoveRpcActorMsg; -import org.thingsboard.server.service.rpc.ToDeviceRpcRequestActorMsg; +import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponseActorMsg; +import org.thingsboard.server.common.msg.rpc.RemoveRpcActorMsg; +import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequestActorMsg; import org.thingsboard.server.service.transport.msg.TransportToDeviceActorMsgWrapper; @Slf4j diff --git a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java index b838f0b86d..50e237ac73 100644 --- a/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java +++ b/application/src/main/java/org/thingsboard/server/actors/device/DeviceActorMessageProcessor.java @@ -25,10 +25,10 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.LinkedHashMapRemoveEldest; -import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg; -import org.thingsboard.rule.engine.api.msg.DeviceCredentialsUpdateNotificationMsg; -import org.thingsboard.rule.engine.api.msg.DeviceEdgeUpdateMsg; -import org.thingsboard.rule.engine.api.msg.DeviceNameOrTypeUpdateMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceAttributesEventNotificationMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceCredentialsUpdateNotificationMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceEdgeUpdateMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceNameOrTypeUpdateMsg; import org.thingsboard.server.actors.ActorSystemContext; import org.thingsboard.server.actors.TbActorCtx; import org.thingsboard.server.actors.shared.AbstractContextAwareMsgProcessor; @@ -87,10 +87,10 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg; import org.thingsboard.server.gen.transport.TransportProtos.ToTransportUpdateCredentialsProto; import org.thingsboard.server.gen.transport.TransportProtos.TransportToDeviceActorMsg; import org.thingsboard.server.gen.transport.TransportProtos.TsKvProto; -import org.thingsboard.server.service.rpc.FromDeviceRpcResponseActorMsg; -import org.thingsboard.server.service.rpc.RemoveRpcActorMsg; +import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponseActorMsg; +import org.thingsboard.server.common.msg.rpc.RemoveRpcActorMsg; import org.thingsboard.server.service.rpc.RpcSubmitStrategy; -import org.thingsboard.server.service.rpc.ToDeviceRpcRequestActorMsg; +import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequestActorMsg; import org.thingsboard.server.service.transport.msg.TransportToDeviceActorMsgWrapper; import javax.annotation.Nullable; diff --git a/application/src/main/java/org/thingsboard/server/actors/device/ToDeviceRpcRequestMetadata.java b/application/src/main/java/org/thingsboard/server/actors/device/ToDeviceRpcRequestMetadata.java index f876408d24..0a39b892ea 100644 --- a/application/src/main/java/org/thingsboard/server/actors/device/ToDeviceRpcRequestMetadata.java +++ b/application/src/main/java/org/thingsboard/server/actors/device/ToDeviceRpcRequestMetadata.java @@ -16,7 +16,7 @@ package org.thingsboard.server.actors.device; import lombok.Data; -import org.thingsboard.server.service.rpc.ToDeviceRpcRequestActorMsg; +import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequestActorMsg; /** * @author Andrew Shvayka diff --git a/application/src/main/java/org/thingsboard/server/controller/NotificationController.java b/application/src/main/java/org/thingsboard/server/controller/NotificationController.java index a88a7ee4f6..24dc41f199 100644 --- a/application/src/main/java/org/thingsboard/server/controller/NotificationController.java +++ b/application/src/main/java/org/thingsboard/server/controller/NotificationController.java @@ -271,6 +271,7 @@ public class NotificationController extends BaseController { @ApiParam(value = "Amount of the recipients to show in preview") @RequestParam(defaultValue = "20") int recipientsPreviewSize, @AuthenticationPrincipal SecurityUser user) throws ThingsboardException { + // PE: generic permission NotificationTemplate template; if (request.getTemplateId() != null) { template = checkEntityId(request.getTemplateId(), notificationTemplateService::findNotificationTemplateById, Operation.READ); @@ -386,7 +387,7 @@ public class NotificationController extends BaseController { @ApiParam(value = SORT_ORDER_DESCRIPTION) @RequestParam(required = false) String sortOrder, @AuthenticationPrincipal SecurityUser user) throws ThingsboardException { - // generic permission + // PE: generic permission PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); return notificationRequestService.findNotificationRequestsInfosByTenantIdAndOriginatorType(user.getTenantId(), EntityType.USER, pageLink); } diff --git a/application/src/main/java/org/thingsboard/server/controller/NotificationRuleController.java b/application/src/main/java/org/thingsboard/server/controller/NotificationRuleController.java index 2afb67a8bd..4321be8122 100644 --- a/application/src/main/java/org/thingsboard/server/controller/NotificationRuleController.java +++ b/application/src/main/java/org/thingsboard/server/controller/NotificationRuleController.java @@ -161,7 +161,7 @@ public class NotificationRuleController extends BaseController { @ApiParam(value = SORT_ORDER_DESCRIPTION) @RequestParam(required = false) String sortOrder, @AuthenticationPrincipal SecurityUser user) throws ThingsboardException { - // generic permission + // PE: generic permission PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); return notificationRuleService.findNotificationRulesInfosByTenantId(user.getTenantId(), pageLink); } diff --git a/application/src/main/java/org/thingsboard/server/controller/NotificationTargetController.java b/application/src/main/java/org/thingsboard/server/controller/NotificationTargetController.java index a4c829796b..51ed86441b 100644 --- a/application/src/main/java/org/thingsboard/server/controller/NotificationTargetController.java +++ b/application/src/main/java/org/thingsboard/server/controller/NotificationTargetController.java @@ -139,7 +139,7 @@ public class NotificationTargetController extends BaseController { @ApiParam(value = PAGE_NUMBER_DESCRIPTION, required = true) @RequestParam int page, @AuthenticationPrincipal SecurityUser user) throws ThingsboardException { - // generic permission + // PE: generic permission NotificationTargetConfig targetConfig = notificationTarget.getConfiguration(); if (targetConfig.getType() == NotificationTargetType.PLATFORM_USERS) { checkTargetUsers(user, targetConfig); @@ -159,7 +159,7 @@ public class NotificationTargetController extends BaseController { public List getNotificationTargetsByIds(@ApiParam(value = "Comma-separated list of uuids representing targets ids", required = true) @RequestParam("ids") UUID[] ids, @AuthenticationPrincipal SecurityUser user) { - // generic permission + // PE: generic permission List targetsIds = Arrays.stream(ids).map(NotificationTargetId::new).collect(Collectors.toList()); return notificationTargetService.findNotificationTargetsByTenantIdAndIds(user.getTenantId(), targetsIds); } @@ -181,7 +181,7 @@ public class NotificationTargetController extends BaseController { @ApiParam(value = SORT_ORDER_DESCRIPTION) @RequestParam(required = false) String sortOrder, @AuthenticationPrincipal SecurityUser user) throws ThingsboardException { - // generic permission + // PE: generic permission PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); return notificationTargetService.findNotificationTargetsByTenantId(user.getTenantId(), pageLink); } @@ -199,6 +199,7 @@ public class NotificationTargetController extends BaseController { @RequestParam(required = false) String sortOrder, @RequestParam(required = false) NotificationType notificationType, @AuthenticationPrincipal SecurityUser user) throws ThingsboardException { + // PE: generic permission PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); return notificationTargetService.findNotificationTargetsByTenantIdAndSupportedNotificationType(user.getTenantId(), notificationType, pageLink); } @@ -219,7 +220,7 @@ public class NotificationTargetController extends BaseController { if (user.isSystemAdmin()) { return; } - // generic permission for users + // PE: generic permission for users UsersFilter usersFilter = ((PlatformUsersNotificationTargetConfig) targetConfig).getUsersFilter(); switch (usersFilter.getType()) { case USER_LIST: diff --git a/application/src/main/java/org/thingsboard/server/controller/NotificationTemplateController.java b/application/src/main/java/org/thingsboard/server/controller/NotificationTemplateController.java index ab171efacf..514210ec00 100644 --- a/application/src/main/java/org/thingsboard/server/controller/NotificationTemplateController.java +++ b/application/src/main/java/org/thingsboard/server/controller/NotificationTemplateController.java @@ -150,7 +150,7 @@ public class NotificationTemplateController extends BaseController { @ApiParam(value = "Comma-separated list of notification types to filter the templates") @RequestParam(required = false) NotificationType[] notificationTypes, @AuthenticationPrincipal SecurityUser user) throws ThingsboardException { - // generic permission + // PE: generic permission PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); if (notificationTypes == null || notificationTypes.length == 0) { notificationTypes = NotificationType.values(); @@ -180,7 +180,7 @@ public class NotificationTemplateController extends BaseController { @ApiParam(value = "Slack bot token. If absent - system Slack settings will be used") @RequestParam(required = false) String token, @AuthenticationPrincipal SecurityUser user) { - // generic permission + // PE: generic permission if (StringUtils.isEmpty(token)) { NotificationSettings settings = notificationSettingsService.findNotificationSettings(user.getTenantId()); SlackNotificationDeliveryMethodConfig slackConfig = (SlackNotificationDeliveryMethodConfig) diff --git a/application/src/main/java/org/thingsboard/server/controller/RpcV2Controller.java b/application/src/main/java/org/thingsboard/server/controller/RpcV2Controller.java index d8876eaa9c..dd9141adad 100644 --- a/application/src/main/java/org/thingsboard/server/controller/RpcV2Controller.java +++ b/application/src/main/java/org/thingsboard/server/controller/RpcV2Controller.java @@ -47,7 +47,7 @@ import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsgMetaData; import org.thingsboard.server.exception.ToErrorResponseEntity; import org.thingsboard.server.queue.util.TbCoreComponent; -import org.thingsboard.server.service.rpc.RemoveRpcActorMsg; +import org.thingsboard.server.common.msg.rpc.RemoveRpcActorMsg; import org.thingsboard.server.service.security.permission.Operation; import javax.annotation.Nullable; diff --git a/application/src/main/java/org/thingsboard/server/controller/TelemetryController.java b/application/src/main/java/org/thingsboard/server/controller/TelemetryController.java index 2445ee9bb6..5f88752ff4 100644 --- a/application/src/main/java/org/thingsboard/server/controller/TelemetryController.java +++ b/application/src/main/java/org/thingsboard/server/controller/TelemetryController.java @@ -45,7 +45,7 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.request.async.DeferredResult; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.ThingsBoardThreadFactory; -import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceAttributesEventNotificationMsg; import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.StringUtils; diff --git a/application/src/main/java/org/thingsboard/server/controller/WidgetsBundleController.java b/application/src/main/java/org/thingsboard/server/controller/WidgetsBundleController.java index b07467b94b..f62d1b7b05 100644 --- a/application/src/main/java/org/thingsboard/server/controller/WidgetsBundleController.java +++ b/application/src/main/java/org/thingsboard/server/controller/WidgetsBundleController.java @@ -69,6 +69,7 @@ public class WidgetsBundleController extends BaseController { private static final String WIDGET_BUNDLE_DESCRIPTION = "Widget Bundle represents a group(bundle) of widgets. Widgets are grouped into bundle by type or use case. "; private static final String FULL_SEARCH_PARAM_DESCRIPTION = "Optional boolean parameter indicating extended search of widget bundles by description and by name / description of related widget types"; + private static final String TENANT_BUNDLES_ONLY_DESCRIPTION = "Optional boolean parameter to include only tenant-level bundles without system"; @ApiOperation(value = "Get Widget Bundle (getWidgetsBundleById)", notes = "Get the Widget Bundle based on the provided Widget Bundle Id. " + WIDGET_BUNDLE_DESCRIPTION + AVAILABLE_FOR_ANY_AUTHORIZED_USER) @@ -185,6 +186,8 @@ public class WidgetsBundleController extends BaseController { @RequestParam(required = false) String sortProperty, @ApiParam(value = SORT_ORDER_DESCRIPTION, allowableValues = SORT_ORDER_ALLOWABLE_VALUES) @RequestParam(required = false) String sortOrder, + @ApiParam(value = TENANT_BUNDLES_ONLY_DESCRIPTION) + @RequestParam(required = false) Boolean tenantOnly, @ApiParam(value = FULL_SEARCH_PARAM_DESCRIPTION) @RequestParam(required = false) Boolean fullSearch) throws ThingsboardException { PageLink pageLink = createPageLink(pageSize, page, textSearch, sortProperty, sortOrder); @@ -192,7 +195,11 @@ public class WidgetsBundleController extends BaseController { return checkNotNull(widgetsBundleService.findSystemWidgetsBundlesByPageLink(getTenantId(), fullSearch != null && fullSearch, pageLink)); } else { TenantId tenantId = getCurrentUser().getTenantId(); - return checkNotNull(widgetsBundleService.findAllTenantWidgetsBundlesByTenantIdAndPageLink(tenantId, fullSearch != null && fullSearch, pageLink)); + if (tenantOnly != null && tenantOnly) { + return checkNotNull(widgetsBundleService.findTenantWidgetsBundlesByTenantIdAndPageLink(tenantId, fullSearch != null && fullSearch, pageLink)); + } else { + return checkNotNull(widgetsBundleService.findAllTenantWidgetsBundlesByTenantIdAndPageLink(tenantId, fullSearch != null && fullSearch, pageLink)); + } } } diff --git a/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java b/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java index a42194a28d..773174d651 100644 --- a/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java +++ b/application/src/main/java/org/thingsboard/server/install/ThingsboardInstallService.java @@ -265,6 +265,7 @@ public class ThingsboardInstallService { case "3.6.0": log.info("Upgrading ThingsBoard from version 3.6.0 to 3.6.1 ..."); databaseEntitiesUpgradeService.upgradeDatabase("3.6.0"); + dataUpdateService.updateData("3.6.0"); break; case "3.6.1": log.info("Upgrading ThingsBoard from version 3.6.1 to 3.6.2 ..."); diff --git a/application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java b/application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java index 99884b013d..77cc275ab2 100644 --- a/application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java +++ b/application/src/main/java/org/thingsboard/server/service/action/EntityActionService.java @@ -31,9 +31,9 @@ import org.thingsboard.server.common.data.alarm.Alarm; import org.thingsboard.server.common.data.alarm.AlarmComment; import org.thingsboard.server.common.data.alarm.AlarmInfo; import org.thingsboard.server.common.data.audit.ActionType; -import org.thingsboard.server.common.data.edge.EdgeEventActionType; import org.thingsboard.server.common.data.id.CustomerId; import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.HasId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.kv.AttributeKvEntry; import org.thingsboard.server.common.data.kv.TsKvEntry; @@ -179,7 +179,8 @@ public class EntityActionService { } } - private void processNotificationRules(TenantId tenantId, EntityId entityId, HasName entity, ActionType actionType, User user, Object... additionalInfo) { + private void processNotificationRules(TenantId tenantId, EntityId originatorId, HasName entity, ActionType actionType, User user, Object... additionalInfo) { + EntityId entityId = entity instanceof HasId ? ((HasId) entity).getId() : originatorId; switch (actionType) { case ADDED: notificationRuleProcessor.process(EntitiesLimitTrigger.builder() diff --git a/application/src/main/java/org/thingsboard/server/service/edge/DefaultEdgeNotificationService.java b/application/src/main/java/org/thingsboard/server/service/edge/DefaultEdgeNotificationService.java index 84e1faa6cb..87e5adeb99 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/DefaultEdgeNotificationService.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/DefaultEdgeNotificationService.java @@ -45,6 +45,7 @@ import org.thingsboard.server.service.edge.rpc.processor.entityview.EntityViewEd import org.thingsboard.server.service.edge.rpc.processor.ota.OtaPackageEdgeProcessor; import org.thingsboard.server.service.edge.rpc.processor.queue.QueueEdgeProcessor; import org.thingsboard.server.service.edge.rpc.processor.relation.RelationEdgeProcessor; +import org.thingsboard.server.service.edge.rpc.processor.resource.ResourceEdgeProcessor; import org.thingsboard.server.service.edge.rpc.processor.rule.RuleChainEdgeProcessor; import org.thingsboard.server.service.edge.rpc.processor.tenant.TenantEdgeProcessor; import org.thingsboard.server.service.edge.rpc.processor.tenant.TenantProfileEdgeProcessor; @@ -122,6 +123,9 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService { @Autowired private RelationEdgeProcessor relationProcessor; + @Autowired + private ResourceEdgeProcessor resourceEdgeProcessor; + @Autowired protected ApplicationEventPublisher eventPublisher; @@ -221,6 +225,9 @@ public class DefaultEdgeNotificationService implements EdgeNotificationService { case TENANT_PROFILE: tenantProfileEdgeProcessor.processEntityNotification(tenantId, edgeNotificationMsg); break; + case TB_RESOURCE: + resourceEdgeProcessor.processEntityNotification(tenantId, edgeNotificationMsg); + break; default: log.warn("[{}] Edge event type [{}] is not designed to be pushed to edge", tenantId, type); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java b/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java index dc83e0f2a2..7850032142 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/EdgeContextComponent.java @@ -33,6 +33,7 @@ import org.thingsboard.server.dao.edge.EdgeService; import org.thingsboard.server.dao.entityview.EntityViewService; import org.thingsboard.server.dao.ota.OtaPackageService; import org.thingsboard.server.dao.queue.QueueService; +import org.thingsboard.server.dao.resource.ResourceService; import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.dao.settings.AdminSettingsService; import org.thingsboard.server.dao.tenant.TenantProfileService; @@ -55,6 +56,7 @@ import org.thingsboard.server.service.edge.rpc.processor.entityview.EntityViewEd import org.thingsboard.server.service.edge.rpc.processor.ota.OtaPackageEdgeProcessor; import org.thingsboard.server.service.edge.rpc.processor.queue.QueueEdgeProcessor; import org.thingsboard.server.service.edge.rpc.processor.relation.RelationEdgeProcessor; +import org.thingsboard.server.service.edge.rpc.processor.resource.ResourceEdgeProcessor; import org.thingsboard.server.service.edge.rpc.processor.rule.RuleChainEdgeProcessor; import org.thingsboard.server.service.edge.rpc.processor.settings.AdminSettingsEdgeProcessor; import org.thingsboard.server.service.edge.rpc.processor.telemetry.TelemetryEdgeProcessor; @@ -139,6 +141,9 @@ public class EdgeContextComponent { @Autowired private QueueService queueService; + @Autowired + private ResourceService resourceService; + @Autowired private AlarmEdgeProcessor alarmProcessor; @@ -199,6 +204,9 @@ public class EdgeContextComponent { @Autowired private TenantProfileEdgeProcessor tenantProfileEdgeProcessor; + @Autowired + private ResourceEdgeProcessor resourceEdgeProcessor; + @Autowired private EdgeMsgConstructor edgeMsgConstructor; diff --git a/application/src/main/java/org/thingsboard/server/service/edge/EdgeEventSourcingListener.java b/application/src/main/java/org/thingsboard/server/service/edge/EdgeEventSourcingListener.java index 006af577c9..58edc971b8 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/EdgeEventSourcingListener.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/EdgeEventSourcingListener.java @@ -45,7 +45,6 @@ import javax.annotation.PostConstruct; import static org.thingsboard.server.service.entitiy.DefaultTbNotificationEntityService.edgeTypeByActionType; - /** * This event listener does not support async event processing because relay on ThreadLocal * Another possible approach is to implement a special annotation and a bunch of classes similar to TransactionalApplicationListener @@ -75,9 +74,6 @@ public class EdgeEventSourcingListener { @TransactionalEventListener(fallbackExecution = true) public void handleEvent(SaveEntityEvent event) { - if (edgeSynchronizationManager.isSync()) { - return; - } try { if (!isValidSaveEntityEventForEdgeProcessing(event.getEntity(), event.getOldEntity())) { return; @@ -85,7 +81,7 @@ public class EdgeEventSourcingListener { log.trace("[{}] SaveEntityEvent called: {}", event.getTenantId(), event); EdgeEventActionType action = Boolean.TRUE.equals(event.getAdded()) ? EdgeEventActionType.ADDED : EdgeEventActionType.UPDATED; tbClusterService.sendNotificationMsgToEdge(event.getTenantId(), null, event.getEntityId(), - null, null, action); + null, null, action, edgeSynchronizationManager.getEdgeId().get()); } catch (Exception e) { log.error("[{}] failed to process SaveEntityEvent: {}", event.getTenantId(), event, e); } @@ -93,13 +89,11 @@ public class EdgeEventSourcingListener { @TransactionalEventListener(fallbackExecution = true) public void handleEvent(DeleteEntityEvent event) { - if (edgeSynchronizationManager.isSync()) { - return; - } try { log.trace("[{}] DeleteEntityEvent called: {}", event.getTenantId(), event); - tbClusterService.sendNotificationMsgToEdge(event.getTenantId(), event.getEdgeId(), event.getEntityId(), - JacksonUtil.toString(event.getEntity()), null, EdgeEventActionType.DELETED); + tbClusterService.sendNotificationMsgToEdge(event.getTenantId(), null, event.getEntityId(), + JacksonUtil.toString(event.getEntity()), null, EdgeEventActionType.DELETED, + edgeSynchronizationManager.getEdgeId().get()); } catch (Exception e) { log.error("[{}] failed to process DeleteEntityEvent: {}", event.getTenantId(), event, e); } @@ -107,13 +101,11 @@ public class EdgeEventSourcingListener { @TransactionalEventListener(fallbackExecution = true) public void handleEvent(ActionEntityEvent event) { - if (edgeSynchronizationManager.isSync()) { - return; - } try { log.trace("[{}] ActionEntityEvent called: {}", event.getTenantId(), event); tbClusterService.sendNotificationMsgToEdge(event.getTenantId(), event.getEdgeId(), event.getEntityId(), - event.getBody(), null, edgeTypeByActionType(event.getActionType())); + event.getBody(), null, edgeTypeByActionType(event.getActionType()), + edgeSynchronizationManager.getEdgeId().get()); } catch (Exception e) { log.error("[{}] failed to process ActionEntityEvent: {}", event.getTenantId(), event, e); } @@ -121,9 +113,6 @@ public class EdgeEventSourcingListener { @TransactionalEventListener(fallbackExecution = true) public void handleEvent(RelationActionEvent event) { - if (edgeSynchronizationManager.isSync()) { - return; - } try { EntityRelation relation = event.getRelation(); if (relation == null) { @@ -136,7 +125,8 @@ public class EdgeEventSourcingListener { } log.trace("[{}] RelationActionEvent called: {}", event.getTenantId(), event); tbClusterService.sendNotificationMsgToEdge(event.getTenantId(), null, null, - JacksonUtil.toString(relation), EdgeEventType.RELATION, edgeTypeByActionType(event.getActionType())); + JacksonUtil.toString(relation), EdgeEventType.RELATION, edgeTypeByActionType(event.getActionType()), + edgeSynchronizationManager.getEdgeId().get()); } catch (Exception e) { log.error("[{}] failed to process RelationActionEvent: {}", event.getTenantId(), event, e); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java index 59d744c3f1..f9bd956706 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeGrpcSession.java @@ -63,6 +63,7 @@ import org.thingsboard.server.gen.edge.v1.RelationRequestMsg; import org.thingsboard.server.gen.edge.v1.RelationUpdateMsg; import org.thingsboard.server.gen.edge.v1.RequestMsg; import org.thingsboard.server.gen.edge.v1.RequestMsgType; +import org.thingsboard.server.gen.edge.v1.ResourceUpdateMsg; import org.thingsboard.server.gen.edge.v1.ResponseMsg; import org.thingsboard.server.gen.edge.v1.RuleChainMetadataRequestMsg; import org.thingsboard.server.gen.edge.v1.SyncCompletedMsg; @@ -645,6 +646,8 @@ public final class EdgeGrpcSession implements Closeable { return ctx.getAdminSettingsProcessor().convertAdminSettingsEventToDownlink(edgeEvent); case OTA_PACKAGE: return ctx.getOtaPackageEdgeProcessor().convertOtaPackageEventToDownlink(edgeEvent); + case TB_RESOURCE: + return ctx.getResourceEdgeProcessor().convertResourceEventToDownlink(edgeEvent); case QUEUE: return ctx.getQueueEdgeProcessor().convertQueueEventToDownlink(edgeEvent); case TENANT: @@ -677,7 +680,7 @@ public final class EdgeGrpcSession implements Closeable { } if (uplinkMsg.getDeviceCredentialsUpdateMsgCount() > 0) { for (DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg : uplinkMsg.getDeviceCredentialsUpdateMsgList()) { - result.add(ctx.getDeviceProcessor().processDeviceCredentialsMsg(edge.getTenantId(), deviceCredentialsUpdateMsg)); + result.add(ctx.getDeviceProcessor().processDeviceCredentialsMsgFromEdge(edge.getTenantId(), edge.getId(), deviceCredentialsUpdateMsg)); } } if (uplinkMsg.getAssetProfileUpdateMsgCount() > 0) { @@ -692,7 +695,7 @@ public final class EdgeGrpcSession implements Closeable { } if (uplinkMsg.getAlarmUpdateMsgCount() > 0) { for (AlarmUpdateMsg alarmUpdateMsg : uplinkMsg.getAlarmUpdateMsgList()) { - result.add(ctx.getAlarmProcessor().processAlarmMsg(edge.getTenantId(), alarmUpdateMsg)); + result.add(ctx.getAlarmProcessor().processAlarmMsgFromEdge(edge.getTenantId(), edge.getId(), alarmUpdateMsg)); } } if (uplinkMsg.getEntityViewUpdateMsgCount() > 0) { @@ -702,7 +705,7 @@ public final class EdgeGrpcSession implements Closeable { } if (uplinkMsg.getRelationUpdateMsgCount() > 0) { for (RelationUpdateMsg relationUpdateMsg : uplinkMsg.getRelationUpdateMsgList()) { - result.add(ctx.getRelationProcessor().processRelationMsg(edge.getTenantId(), relationUpdateMsg)); + result.add(ctx.getRelationProcessor().processRelationMsgFromEdge(edge.getTenantId(), edge, relationUpdateMsg)); } } if (uplinkMsg.getDashboardUpdateMsgCount() > 0) { @@ -710,6 +713,11 @@ public final class EdgeGrpcSession implements Closeable { result.add(ctx.getDashboardProcessor().processDashboardMsgFromEdge(edge.getTenantId(), edge, dashboardUpdateMsg)); } } + if (uplinkMsg.getResourceUpdateMsgCount() > 0) { + for (ResourceUpdateMsg resourceUpdateMsg : uplinkMsg.getResourceUpdateMsgList()) { + result.add(ctx.getResourceEdgeProcessor().processResourceMsgFromEdge(edge.getTenantId(), edge, resourceUpdateMsg)); + } + } if (uplinkMsg.getRuleChainMetadataRequestMsgCount() > 0) { for (RuleChainMetadataRequestMsg ruleChainMetadataRequestMsg : uplinkMsg.getRuleChainMetadataRequestMsgList()) { result.add(ctx.getEdgeRequestsService().processRuleChainMetadataRequestMsg(edge.getTenantId(), edge, ruleChainMetadataRequestMsg)); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeSyncCursor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeSyncCursor.java index 4eea16286f..5074d580f0 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeSyncCursor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/EdgeSyncCursor.java @@ -33,10 +33,12 @@ import org.thingsboard.server.service.edge.rpc.fetch.EntityViewsEdgeEventFetcher import org.thingsboard.server.service.edge.rpc.fetch.OtaPackagesEdgeEventFetcher; import org.thingsboard.server.service.edge.rpc.fetch.QueuesEdgeEventFetcher; import org.thingsboard.server.service.edge.rpc.fetch.RuleChainsEdgeEventFetcher; +import org.thingsboard.server.service.edge.rpc.fetch.SystemResourcesEdgeEventFetcher; import org.thingsboard.server.service.edge.rpc.fetch.SystemWidgetTypesEdgeEventFetcher; import org.thingsboard.server.service.edge.rpc.fetch.SystemWidgetsBundlesEdgeEventFetcher; import org.thingsboard.server.service.edge.rpc.fetch.TenantAdminUsersEdgeEventFetcher; import org.thingsboard.server.service.edge.rpc.fetch.TenantEdgeEventFetcher; +import org.thingsboard.server.service.edge.rpc.fetch.TenantResourcesEdgeEventFetcher; import org.thingsboard.server.service.edge.rpc.fetch.TenantWidgetTypesEdgeEventFetcher; import org.thingsboard.server.service.edge.rpc.fetch.TenantWidgetsBundlesEdgeEventFetcher; @@ -77,6 +79,8 @@ public class EdgeSyncCursor { fetchers.add(new SystemWidgetsBundlesEdgeEventFetcher(ctx.getWidgetsBundleService())); fetchers.add(new TenantWidgetsBundlesEdgeEventFetcher(ctx.getWidgetsBundleService())); fetchers.add(new OtaPackagesEdgeEventFetcher(ctx.getOtaPackageService())); + fetchers.add(new SystemResourcesEdgeEventFetcher(ctx.getResourceService())); + fetchers.add(new TenantResourcesEdgeEventFetcher(ctx.getResourceService())); } } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ResourceMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ResourceMsgConstructor.java new file mode 100644 index 0000000000..27b7dc3978 --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/ResourceMsgConstructor.java @@ -0,0 +1,57 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.edge.rpc.constructor; + +import org.springframework.stereotype.Component; +import org.thingsboard.server.common.data.TbResource; +import org.thingsboard.server.common.data.id.TbResourceId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.gen.edge.v1.ResourceUpdateMsg; +import org.thingsboard.server.gen.edge.v1.UpdateMsgType; +import org.thingsboard.server.queue.util.TbCoreComponent; + +@Component +@TbCoreComponent +public class ResourceMsgConstructor { + + public ResourceUpdateMsg constructResourceUpdatedMsg(UpdateMsgType msgType, TbResource tbResource) { + ResourceUpdateMsg.Builder builder = ResourceUpdateMsg.newBuilder() + .setMsgType(msgType) + .setIdMSB(tbResource.getId().getId().getMostSignificantBits()) + .setIdLSB(tbResource.getId().getId().getLeastSignificantBits()) + .setTitle(tbResource.getTitle()) + .setResourceKey(tbResource.getResourceKey()) + .setResourceType(tbResource.getResourceType().name()) + .setFileName(tbResource.getFileName()); + if (tbResource.getData() != null) { + builder.setData(tbResource.getData()); + } + if (tbResource.getEtag() != null) { + builder.setEtag(tbResource.getEtag()); + } + if (tbResource.getTenantId().equals(TenantId.SYS_TENANT_ID)) { + builder.setIsSystem(true); + } + return builder.build(); + } + + public ResourceUpdateMsg constructResourceDeleteMsg(TbResourceId tbResourceId) { + return ResourceUpdateMsg.newBuilder() + .setMsgType(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE) + .setIdMSB(tbResourceId.getId().getMostSignificantBits()) + .setIdLSB(tbResourceId.getId().getLeastSignificantBits()).build(); + } +} diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetsBundleMsgConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetsBundleMsgConstructor.java index bed83c8832..5b615ca9f8 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetsBundleMsgConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/WidgetsBundleMsgConstructor.java @@ -45,6 +45,9 @@ public class WidgetsBundleMsgConstructor { if (widgetsBundle.getDescription() != null) { builder.setDescription(widgetsBundle.getDescription()); } + if (widgetsBundle.getOrder() != null) { + builder.setOrder(widgetsBundle.getOrder()); + } if (widgetsBundle.getTenantId().equals(TenantId.SYS_TENANT_ID)) { builder.setIsSystem(true); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/AbstractRuleChainMetadataConstructor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/AbstractRuleChainMetadataConstructor.java index f33f0f84e8..a720d0aab6 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/AbstractRuleChainMetadataConstructor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/AbstractRuleChainMetadataConstructor.java @@ -15,7 +15,6 @@ */ package org.thingsboard.server.service.edge.rpc.constructor.rule; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.node.ObjectNode; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -50,7 +49,7 @@ public abstract class AbstractRuleChainMetadataConstructor implements RuleChainM constructRuleChainMetadataUpdatedMsg(tenantId, builder, ruleChainMetaData); builder.setMsgType(msgType); return builder.build(); - } catch (JsonProcessingException ex) { + } catch (Exception ex) { log.error("[{}] Can't construct RuleChainMetadataUpdateMsg", tenantId, ex); } return null; @@ -58,7 +57,7 @@ public abstract class AbstractRuleChainMetadataConstructor implements RuleChainM protected abstract void constructRuleChainMetadataUpdatedMsg(TenantId tenantId, RuleChainMetadataUpdateMsg.Builder builder, - RuleChainMetaData ruleChainMetaData) throws JsonProcessingException; + RuleChainMetaData ruleChainMetaData); protected List constructConnections(List connections) { List result = new ArrayList<>(); @@ -78,7 +77,7 @@ public abstract class AbstractRuleChainMetadataConstructor implements RuleChainM .build(); } - protected List constructNodes(List nodes) throws JsonProcessingException { + protected List constructNodes(List nodes) { List result = new ArrayList<>(); if (nodes != null && !nodes.isEmpty()) { for (RuleNode node : nodes) { @@ -88,22 +87,22 @@ public abstract class AbstractRuleChainMetadataConstructor implements RuleChainM return result; } - private RuleNodeProto constructNode(RuleNode node) throws JsonProcessingException { + private RuleNodeProto constructNode(RuleNode node) { return RuleNodeProto.newBuilder() .setIdMSB(node.getId().getId().getMostSignificantBits()) .setIdLSB(node.getId().getId().getLeastSignificantBits()) .setType(node.getType()) .setName(node.getName()) .setDebugMode(node.isDebugMode()) - .setConfiguration(JacksonUtil.OBJECT_MAPPER.writeValueAsString(node.getConfiguration())) - .setAdditionalInfo(JacksonUtil.OBJECT_MAPPER.writeValueAsString(node.getAdditionalInfo())) + .setConfiguration(JacksonUtil.toString(node.getConfiguration())) + .setAdditionalInfo(JacksonUtil.toString(node.getAdditionalInfo())) .setSingletonMode(node.isSingletonMode()) .setConfigurationVersion(node.getConfigurationVersion()) .build(); } protected List constructRuleChainConnections(List ruleChainConnections, - NavigableSet removedNodeIndexes) throws JsonProcessingException { + NavigableSet removedNodeIndexes) { List result = new ArrayList<>(); if (ruleChainConnections != null && !ruleChainConnections.isEmpty()) { for (RuleChainConnectionInfo ruleChainConnectionInfo : ruleChainConnections) { @@ -127,13 +126,13 @@ public abstract class AbstractRuleChainMetadataConstructor implements RuleChainM return result; } - private RuleChainConnectionInfoProto constructRuleChainConnection(RuleChainConnectionInfo ruleChainConnectionInfo) throws JsonProcessingException { + private RuleChainConnectionInfoProto constructRuleChainConnection(RuleChainConnectionInfo ruleChainConnectionInfo) { return RuleChainConnectionInfoProto.newBuilder() .setFromIndex(ruleChainConnectionInfo.getFromIndex()) .setTargetRuleChainIdMSB(ruleChainConnectionInfo.getTargetRuleChainId().getId().getMostSignificantBits()) .setTargetRuleChainIdLSB(ruleChainConnectionInfo.getTargetRuleChainId().getId().getLeastSignificantBits()) .setType(ruleChainConnectionInfo.getType()) - .setAdditionalInfo(JacksonUtil.OBJECT_MAPPER.writeValueAsString(ruleChainConnectionInfo.getAdditionalInfo())) + .setAdditionalInfo(JacksonUtil.toString(ruleChainConnectionInfo.getAdditionalInfo())) .build(); } } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV330.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV330.java index 5e1310a5a5..33fc39b7e7 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV330.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV330.java @@ -15,7 +15,6 @@ */ package org.thingsboard.server.service.edge.rpc.constructor.rule; -import com.fasterxml.jackson.core.JsonProcessingException; import lombok.extern.slf4j.Slf4j; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.rule.engine.flow.TbRuleChainInputNode; @@ -45,7 +44,7 @@ public class RuleChainMetadataConstructorV330 extends AbstractRuleChainMetadataC @Override protected void constructRuleChainMetadataUpdatedMsg(TenantId tenantId, RuleChainMetadataUpdateMsg.Builder builder, - RuleChainMetaData ruleChainMetaData) throws JsonProcessingException { + RuleChainMetaData ruleChainMetaData) { List supportedNodes = filterNodes(ruleChainMetaData.getNodes()); NavigableSet removedNodeIndexes = getRemovedNodeIndexes(ruleChainMetaData.getNodes(), ruleChainMetaData.getConnections()); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV340.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV340.java index 6fe39942ad..9a37e416db 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV340.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/constructor/rule/RuleChainMetadataConstructorV340.java @@ -15,7 +15,6 @@ */ package org.thingsboard.server.service.edge.rpc.constructor.rule; -import com.fasterxml.jackson.core.JsonProcessingException; import lombok.extern.slf4j.Slf4j; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.rule.RuleChainMetaData; @@ -29,7 +28,7 @@ public class RuleChainMetadataConstructorV340 extends AbstractRuleChainMetadataC @Override protected void constructRuleChainMetadataUpdatedMsg(TenantId tenantId, RuleChainMetadataUpdateMsg.Builder builder, - RuleChainMetaData ruleChainMetaData) throws JsonProcessingException { + RuleChainMetaData ruleChainMetaData) { builder.addAllNodes(constructNodes(ruleChainMetaData.getNodes())) .addAllConnections(constructConnections(ruleChainMetaData.getConnections())) .addAllRuleChainConnections(constructRuleChainConnections(ruleChainMetaData.getRuleChainConnections(), new TreeSet<>())); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/AdminSettingsEdgeEventFetcher.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/AdminSettingsEdgeEventFetcher.java index b9fc1c8c9e..e3a8c14012 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/AdminSettingsEdgeEventFetcher.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/AdminSettingsEdgeEventFetcher.java @@ -79,19 +79,19 @@ public class AdminSettingsEdgeEventFetcher implements EdgeEventFetcher { AdminSettings systemMailSettings = adminSettingsService.findAdminSettingsByKey(TenantId.SYS_TENANT_ID, "mail"); result.add(EdgeUtils.constructEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, - EdgeEventActionType.UPDATED, null, JacksonUtil.OBJECT_MAPPER.valueToTree(systemMailSettings))); + EdgeEventActionType.UPDATED, null, JacksonUtil.valueToTree(systemMailSettings))); AdminSettings tenantMailSettings = convertToTenantAdminSettings(tenantId, systemMailSettings.getKey(), (ObjectNode) systemMailSettings.getJsonValue()); result.add(EdgeUtils.constructEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, - EdgeEventActionType.UPDATED, null, JacksonUtil.OBJECT_MAPPER.valueToTree(tenantMailSettings))); + EdgeEventActionType.UPDATED, null, JacksonUtil.valueToTree(tenantMailSettings))); AdminSettings systemMailTemplates = loadMailTemplates(tenantId); result.add(EdgeUtils.constructEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, - EdgeEventActionType.UPDATED, null, JacksonUtil.OBJECT_MAPPER.valueToTree(systemMailTemplates))); + EdgeEventActionType.UPDATED, null, JacksonUtil.valueToTree(systemMailTemplates))); AdminSettings tenantMailTemplates = convertToTenantAdminSettings(tenantId, systemMailTemplates.getKey(), (ObjectNode) systemMailTemplates.getJsonValue()); result.add(EdgeUtils.constructEdgeEvent(tenantId, edge.getId(), EdgeEventType.ADMIN_SETTINGS, - EdgeEventActionType.UPDATED, null, JacksonUtil.OBJECT_MAPPER.valueToTree(tenantMailTemplates))); + EdgeEventActionType.UPDATED, null, JacksonUtil.valueToTree(tenantMailTemplates))); // return PageData object to be in sync with other fetchers return new PageData<>(result, 1, result.size(), false); @@ -114,7 +114,7 @@ public class AdminSettingsEdgeEventFetcher implements EdgeEventFetcher { AdminSettings adminSettings = new AdminSettings(); adminSettings.setId(new AdminSettingsId(Uuids.timeBased())); adminSettings.setKey("mailTemplates"); - adminSettings.setJsonValue(JacksonUtil.OBJECT_MAPPER.convertValue(mailTemplates, JsonNode.class)); + adminSettings.setJsonValue(JacksonUtil.convertValue(mailTemplates, JsonNode.class)); return adminSettings; } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/BaseResourceEdgeEventFetcher.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/BaseResourceEdgeEventFetcher.java new file mode 100644 index 0000000000..5e0ea661e0 --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/BaseResourceEdgeEventFetcher.java @@ -0,0 +1,49 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.edge.rpc.fetch; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.thingsboard.server.common.data.EdgeUtils; +import org.thingsboard.server.common.data.TbResource; +import org.thingsboard.server.common.data.edge.Edge; +import org.thingsboard.server.common.data.edge.EdgeEvent; +import org.thingsboard.server.common.data.edge.EdgeEventActionType; +import org.thingsboard.server.common.data.edge.EdgeEventType; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.page.PageData; +import org.thingsboard.server.common.data.page.PageLink; +import org.thingsboard.server.dao.resource.ResourceService; + +@Slf4j +@AllArgsConstructor +public abstract class BaseResourceEdgeEventFetcher extends BasePageableEdgeEventFetcher { + + protected final ResourceService resourceService; + + @Override + PageData fetchPageData(TenantId tenantId, Edge edge, PageLink pageLink) { + return findTenantResources(tenantId, pageLink); + } + + @Override + EdgeEvent constructEdgeEvent(TenantId tenantId, Edge edge, TbResource tbResource) { + return EdgeUtils.constructEdgeEvent(tenantId, edge.getId(), EdgeEventType.TB_RESOURCE, + EdgeEventActionType.ADDED, tbResource.getId(), null); + } + + protected abstract PageData findTenantResources(TenantId tenantId, PageLink pageLink); +} diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/SystemResourcesEdgeEventFetcher.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/SystemResourcesEdgeEventFetcher.java new file mode 100644 index 0000000000..42700ded3e --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/SystemResourcesEdgeEventFetcher.java @@ -0,0 +1,34 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.edge.rpc.fetch; + +import org.thingsboard.server.common.data.TbResource; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.page.PageData; +import org.thingsboard.server.common.data.page.PageLink; +import org.thingsboard.server.dao.resource.ResourceService; + +public class SystemResourcesEdgeEventFetcher extends BaseResourceEdgeEventFetcher { + + public SystemResourcesEdgeEventFetcher(ResourceService resourceService) { + super(resourceService); + } + + @Override + protected PageData findTenantResources(TenantId tenantId, PageLink pageLink) { + return resourceService.findAllTenantResources(TenantId.SYS_TENANT_ID, pageLink); + } +} diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/TenantResourcesEdgeEventFetcher.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/TenantResourcesEdgeEventFetcher.java new file mode 100644 index 0000000000..0992565285 --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/TenantResourcesEdgeEventFetcher.java @@ -0,0 +1,36 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.edge.rpc.fetch; + +import lombok.extern.slf4j.Slf4j; +import org.thingsboard.server.common.data.TbResource; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.page.PageData; +import org.thingsboard.server.common.data.page.PageLink; +import org.thingsboard.server.dao.resource.ResourceService; + +@Slf4j +public class TenantResourcesEdgeEventFetcher extends BaseResourceEdgeEventFetcher { + + public TenantResourcesEdgeEventFetcher(ResourceService resourceService) { + super(resourceService); + } + + @Override + protected PageData findTenantResources(TenantId tenantId, PageLink pageLink) { + return resourceService.findAllTenantResources(tenantId, pageLink); + } +} diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/TenantWidgetsBundlesEdgeEventFetcher.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/TenantWidgetsBundlesEdgeEventFetcher.java index ffddb65315..8f69a904e8 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/TenantWidgetsBundlesEdgeEventFetcher.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/fetch/TenantWidgetsBundlesEdgeEventFetcher.java @@ -28,6 +28,7 @@ public class TenantWidgetsBundlesEdgeEventFetcher extends BaseWidgetsBundlesEdge public TenantWidgetsBundlesEdgeEventFetcher(WidgetsBundleService widgetsBundleService) { super(widgetsBundleService); } + @Override protected PageData findWidgetsBundles(TenantId tenantId, PageLink pageLink) { return widgetsBundleService.findTenantWidgetsBundlesByTenantId(tenantId, pageLink); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessor.java index a888ddc27b..276363e5f6 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessor.java @@ -30,6 +30,7 @@ import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.EdgeUtils; import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.EntityView; +import org.thingsboard.server.common.data.TbResource; import org.thingsboard.server.common.data.asset.Asset; import org.thingsboard.server.common.data.asset.AssetProfile; import org.thingsboard.server.common.data.edge.Edge; @@ -74,6 +75,7 @@ import org.thingsboard.server.dao.entityview.EntityViewService; import org.thingsboard.server.dao.ota.OtaPackageService; import org.thingsboard.server.dao.queue.QueueService; import org.thingsboard.server.dao.relation.RelationService; +import org.thingsboard.server.dao.resource.ResourceService; import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.tenant.TenantProfileService; @@ -103,6 +105,7 @@ import org.thingsboard.server.service.edge.rpc.constructor.OtaPackageMsgConstruc import org.thingsboard.server.service.edge.rpc.constructor.QueueMsgConstructor; import org.thingsboard.server.service.edge.rpc.constructor.RelationMsgConstructor; import org.thingsboard.server.service.edge.rpc.constructor.RuleChainMsgConstructor; +import org.thingsboard.server.service.edge.rpc.constructor.ResourceMsgConstructor; import org.thingsboard.server.service.edge.rpc.constructor.TenantMsgConstructor; import org.thingsboard.server.service.edge.rpc.constructor.TenantProfileMsgConstructor; import org.thingsboard.server.service.edge.rpc.constructor.UserMsgConstructor; @@ -215,6 +218,9 @@ public abstract class BaseEdgeProcessor { @Autowired protected PartitionService partitionService; + @Autowired + protected ResourceService resourceService; + @Autowired @Lazy protected TbQueueProducerProvider producerProvider; @@ -237,6 +243,9 @@ public abstract class BaseEdgeProcessor { @Autowired protected DataValidator entityViewValidator; + @Autowired + protected DataValidator resourceValidator; + @Autowired protected EdgeMsgConstructor edgeMsgConstructor; @@ -297,6 +306,9 @@ public abstract class BaseEdgeProcessor { @Autowired protected QueueMsgConstructor queueMsgConstructor; + @Autowired + protected ResourceMsgConstructor resourceMsgConstructor; + @Autowired protected EdgeSynchronizationManager edgeSynchronizationManager; @@ -376,7 +388,9 @@ public abstract class BaseEdgeProcessor { }, dbCallbackExecutorService); } - protected ListenableFuture processActionForAllEdges(TenantId tenantId, EdgeEventType type, EdgeEventActionType actionType, EntityId entityId) { + protected ListenableFuture processActionForAllEdges(TenantId tenantId, EdgeEventType type, + EdgeEventActionType actionType, EntityId entityId, + EdgeId sourceEdgeId) { List> futures = new ArrayList<>(); if (TenantId.SYS_TENANT_ID.equals(tenantId)) { PageLink pageLink = new PageLink(DEFAULT_PAGE_SIZE); @@ -384,21 +398,22 @@ public abstract class BaseEdgeProcessor { do { tenantsIds = tenantService.findTenantsIds(pageLink); for (TenantId tenantId1 : tenantsIds.getData()) { - futures.addAll(processActionForAllEdgesByTenantId(tenantId1, type, actionType, entityId, null)); + futures.addAll(processActionForAllEdgesByTenantId(tenantId1, type, actionType, entityId, null, sourceEdgeId)); } pageLink = pageLink.nextPageLink(); } while (tenantsIds.hasNext()); } else { - futures = processActionForAllEdgesByTenantId(tenantId, type, actionType, entityId, null); + futures = processActionForAllEdgesByTenantId(tenantId, type, actionType, entityId, null, sourceEdgeId); } return Futures.transform(Futures.allAsList(futures), voids -> null, dbCallbackExecutorService); } private List> processActionForAllEdgesByTenantId(TenantId tenantId, - EdgeEventType type, - EdgeEventActionType actionType, - EntityId entityId, - JsonNode body) { + EdgeEventType type, + EdgeEventActionType actionType, + EntityId entityId, + JsonNode body, + EdgeId sourceEdgeId) { PageLink pageLink = new PageLink(DEFAULT_PAGE_SIZE); PageData pageData; List> futures = new ArrayList<>(); @@ -406,7 +421,9 @@ public abstract class BaseEdgeProcessor { pageData = edgeService.findEdgesByTenantId(tenantId, pageLink); if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { for (Edge edge : pageData.getData()) { - futures.add(saveEdgeEvent(tenantId, edge.getId(), type, actionType, entityId, body)); + if (!edge.getId().equals(sourceEdgeId)) { + futures.add(saveEdgeEvent(tenantId, edge.getId(), type, actionType, entityId, body)); + } } if (pageData.hasNext()) { pageLink = pageLink.nextPageLink(); @@ -450,11 +467,12 @@ public abstract class BaseEdgeProcessor { EdgeEventType type = EdgeEventType.valueOf(edgeNotificationMsg.getType()); EdgeEventActionType actionType = EdgeEventActionType.valueOf(edgeNotificationMsg.getAction()); EntityId entityId = EntityIdFactory.getByEdgeEventTypeAndUuid(type, new UUID(edgeNotificationMsg.getEntityIdMSB(), edgeNotificationMsg.getEntityIdLSB())); + EdgeId sourceEdgeId = safeGetEdgeId(edgeNotificationMsg.getSourceEdgeIdMSB(), edgeNotificationMsg.getSourceEdgeIdLSB()); if (type.isAllEdgesRelated()) { - return processEntityNotificationForAllEdges(tenantId, type, actionType, entityId); + return processEntityNotificationForAllEdges(tenantId, type, actionType, entityId, sourceEdgeId); } else { JsonNode body = JacksonUtil.toJsonNode(edgeNotificationMsg.getBody()); - EdgeId edgeId = safeGetEdgeId(edgeNotificationMsg); + EdgeId edgeId = safeGetEdgeId(edgeNotificationMsg.getEdgeIdMSB(), edgeNotificationMsg.getEdgeIdLSB()); switch (actionType) { case UPDATED: case CREDENTIALS_UPDATED: @@ -463,41 +481,46 @@ public abstract class BaseEdgeProcessor { if (edgeId != null) { return saveEdgeEvent(tenantId, edgeId, type, actionType, entityId, body); } else { - return processNotificationToRelatedEdges(tenantId, entityId, type, actionType); + return processNotificationToRelatedEdges(tenantId, entityId, type, actionType, sourceEdgeId); } case DELETED: EdgeEventActionType deleted = EdgeEventActionType.DELETED; if (edgeId != null) { return saveEdgeEvent(tenantId, edgeId, type, deleted, entityId, body); } else { - return Futures.transform(Futures.allAsList(processActionForAllEdgesByTenantId(tenantId, type, deleted, entityId, body)), + return Futures.transform(Futures.allAsList(processActionForAllEdgesByTenantId(tenantId, type, deleted, entityId, body, sourceEdgeId)), voids -> null, dbCallbackExecutorService); } case ASSIGNED_TO_EDGE: case UNASSIGNED_FROM_EDGE: - ListenableFuture future = saveEdgeEvent(tenantId, edgeId, type, actionType, entityId, body); - return Futures.transformAsync(future, unused -> { - if (type.equals(EdgeEventType.RULE_CHAIN)) { - return updateDependentRuleChains(tenantId, new RuleChainId(entityId.getId()), edgeId); - } else { - return Futures.immediateFuture(null); - } - }, dbCallbackExecutorService); + if (sourceEdgeId == null) { + ListenableFuture future = saveEdgeEvent(tenantId, edgeId, type, actionType, entityId, body); + return Futures.transformAsync(future, unused -> { + if (type.equals(EdgeEventType.RULE_CHAIN)) { + return updateDependentRuleChains(tenantId, new RuleChainId(entityId.getId()), edgeId); + } else { + return Futures.immediateFuture(null); + } + }, dbCallbackExecutorService); + } else { + return Futures.immediateFuture(null); + } default: return Futures.immediateFuture(null); } } } - private EdgeId safeGetEdgeId(TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg) { - if (edgeNotificationMsg.getEdgeIdMSB() != 0 && edgeNotificationMsg.getEdgeIdLSB() != 0) { - return new EdgeId(new UUID(edgeNotificationMsg.getEdgeIdMSB(), edgeNotificationMsg.getEdgeIdLSB())); + protected EdgeId safeGetEdgeId(long edgeIdMSB, long edgeIdLSB) { + if (edgeIdMSB != 0 && edgeIdLSB != 0) { + return new EdgeId(new UUID(edgeIdMSB, edgeIdLSB)); } else { return null; } } - private ListenableFuture processNotificationToRelatedEdges(TenantId tenantId, EntityId entityId, EdgeEventType type, EdgeEventActionType actionType) { + private ListenableFuture processNotificationToRelatedEdges(TenantId tenantId, EntityId entityId, EdgeEventType type, + EdgeEventActionType actionType, EdgeId sourceEdgeId) { PageLink pageLink = new PageLink(DEFAULT_PAGE_SIZE); PageData pageData; List> futures = new ArrayList<>(); @@ -505,7 +528,9 @@ public abstract class BaseEdgeProcessor { pageData = edgeService.findRelatedEdgeIdsByEntityId(tenantId, entityId, pageLink); if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { for (EdgeId relatedEdgeId : pageData.getData()) { - futures.add(saveEdgeEvent(tenantId, relatedEdgeId, type, actionType, entityId, null)); + if (!relatedEdgeId.equals(sourceEdgeId)) { + futures.add(saveEdgeEvent(tenantId, relatedEdgeId, type, actionType, entityId, null)); + } } if (pageData.hasNext()) { pageLink = pageLink.nextPageLink(); @@ -548,13 +573,13 @@ public abstract class BaseEdgeProcessor { return Futures.transform(Futures.allAsList(futures), voids -> null, dbCallbackExecutorService); } - private ListenableFuture processEntityNotificationForAllEdges(TenantId tenantId, EdgeEventType type, EdgeEventActionType actionType, EntityId entityId) { + private ListenableFuture processEntityNotificationForAllEdges(TenantId tenantId, EdgeEventType type, EdgeEventActionType actionType, EntityId entityId, EdgeId sourceEdgeId) { switch (actionType) { case ADDED: case UPDATED: case DELETED: case CREDENTIALS_UPDATED: // used by USER entity - return processActionForAllEdges(tenantId, type, actionType, entityId); + return processActionForAllEdges(tenantId, type, actionType, entityId, sourceEdgeId); default: return Futures.immediateFuture(null); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/AlarmEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/AlarmEdgeProcessor.java index 0b86352c02..f002b5c04e 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/AlarmEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/AlarmEdgeProcessor.java @@ -15,7 +15,6 @@ */ package org.thingsboard.server.service.edge.rpc.processor.alarm; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -47,6 +46,16 @@ import java.util.UUID; @TbCoreComponent public class AlarmEdgeProcessor extends BaseAlarmProcessor { + public ListenableFuture processAlarmMsgFromEdge(TenantId tenantId, EdgeId edgeId, AlarmUpdateMsg alarmUpdateMsg) { + log.trace("[{}] processAlarmMsgFromEdge [{}]", tenantId, alarmUpdateMsg); + try { + edgeSynchronizationManager.getEdgeId().set(edgeId); + return processAlarmMsg(tenantId, alarmUpdateMsg); + } finally { + edgeSynchronizationManager.getEdgeId().remove(); + } + } + public DownlinkMsg convertAlarmEventToDownlink(EdgeEvent edgeEvent) { AlarmUpdateMsg alarmUpdateMsg = convertAlarmEventToAlarmMsg(edgeEvent.getTenantId(), edgeEvent.getEntityId(), edgeEvent.getAction(), edgeEvent.getBody()); @@ -59,13 +68,18 @@ public class AlarmEdgeProcessor extends BaseAlarmProcessor { return null; } - public ListenableFuture processAlarmNotification(TenantId tenantId, TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg) throws JsonProcessingException { + public ListenableFuture processAlarmNotification(TenantId tenantId, TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg) { EdgeEventActionType actionType = EdgeEventActionType.valueOf(edgeNotificationMsg.getAction()); AlarmId alarmId = new AlarmId(new UUID(edgeNotificationMsg.getEntityIdMSB(), edgeNotificationMsg.getEntityIdLSB())); + EdgeId sourceEdgeId = safeGetEdgeId(edgeNotificationMsg.getSourceEdgeIdMSB(), edgeNotificationMsg.getSourceEdgeIdLSB()); switch (actionType) { case DELETED: - Alarm deletedAlarm = JacksonUtil.OBJECT_MAPPER.readValue(edgeNotificationMsg.getBody(), Alarm.class); - List> delFutures = pushEventToAllRelatedEdges(tenantId, deletedAlarm.getOriginator(), alarmId, actionType, JacksonUtil.OBJECT_MAPPER.valueToTree(deletedAlarm)); + Alarm deletedAlarm = JacksonUtil.fromString(edgeNotificationMsg.getBody(), Alarm.class); + if (deletedAlarm == null) { + return Futures.immediateFuture(null); + } + List> delFutures = pushEventToAllRelatedEdges(tenantId, deletedAlarm.getOriginator(), + alarmId, actionType, JacksonUtil.valueToTree(deletedAlarm), sourceEdgeId); return Futures.transform(Futures.allAsList(delFutures), voids -> null, dbCallbackExecutorService); default: ListenableFuture alarmFuture = alarmService.findAlarmByIdAsync(tenantId, alarmId); @@ -77,13 +91,14 @@ public class AlarmEdgeProcessor extends BaseAlarmProcessor { if (type == null) { return Futures.immediateFuture(null); } - List> futures = pushEventToAllRelatedEdges(tenantId, alarm.getOriginator(), alarmId, actionType, null); + List> futures = pushEventToAllRelatedEdges(tenantId, alarm.getOriginator(), + alarmId, actionType, null, sourceEdgeId); return Futures.transform(Futures.allAsList(futures), voids -> null, dbCallbackExecutorService); }, dbCallbackExecutorService); } } - private List> pushEventToAllRelatedEdges(TenantId tenantId, EntityId originatorId, AlarmId alarmId, EdgeEventActionType actionType, JsonNode body) { + private List> pushEventToAllRelatedEdges(TenantId tenantId, EntityId originatorId, AlarmId alarmId, EdgeEventActionType actionType, JsonNode body, EdgeId sourceEdgeId) { PageLink pageLink = new PageLink(DEFAULT_PAGE_SIZE); PageData pageData; List> futures = new ArrayList<>(); @@ -91,12 +106,14 @@ public class AlarmEdgeProcessor extends BaseAlarmProcessor { pageData = edgeService.findRelatedEdgeIdsByEntityId(tenantId, originatorId, pageLink); if (pageData != null && pageData.getData() != null && !pageData.getData().isEmpty()) { for (EdgeId relatedEdgeId : pageData.getData()) { - futures.add(saveEdgeEvent(tenantId, - relatedEdgeId, - EdgeEventType.ALARM, - actionType, - alarmId, - body)); + if (!relatedEdgeId.equals(sourceEdgeId)) { + futures.add(saveEdgeEvent(tenantId, + relatedEdgeId, + EdgeEventType.ALARM, + actionType, + alarmId, + body)); + } } if (pageData.hasNext()) { pageLink = pageLink.nextPageLink(); diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/BaseAlarmProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/BaseAlarmProcessor.java index de072a48e9..3fb086cd52 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/BaseAlarmProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/alarm/BaseAlarmProcessor.java @@ -45,8 +45,7 @@ import java.util.UUID; @Slf4j public abstract class BaseAlarmProcessor extends BaseEdgeProcessor { - public ListenableFuture processAlarmMsg(TenantId tenantId, AlarmUpdateMsg alarmUpdateMsg) { - log.trace("[{}] processAlarmMsg [{}]", tenantId, alarmUpdateMsg); + protected ListenableFuture processAlarmMsg(TenantId tenantId, AlarmUpdateMsg alarmUpdateMsg) { EntityId originatorId = getAlarmOriginator(tenantId, alarmUpdateMsg.getOriginatorName(), EntityType.valueOf(alarmUpdateMsg.getOriginatorType())); AlarmId alarmId = new AlarmId(new UUID(alarmUpdateMsg.getIdMSB(), alarmUpdateMsg.getIdLSB())); @@ -55,7 +54,7 @@ public abstract class BaseAlarmProcessor extends BaseEdgeProcessor { return Futures.immediateFuture(null); } try { - edgeSynchronizationManager.getSync().set(true); + switch (alarmUpdateMsg.getMsgType()) { case ENTITY_CREATED_RPC_MESSAGE: case ENTITY_UPDATED_RPC_MESSAGE: @@ -73,7 +72,7 @@ public abstract class BaseAlarmProcessor extends BaseEdgeProcessor { alarm.setAcknowledged(alarmStatus.isAck()); alarm.setAckTs(alarmUpdateMsg.getAckTs()); alarm.setEndTs(alarmUpdateMsg.getEndTs()); - alarm.setDetails(JacksonUtil.OBJECT_MAPPER.readTree(alarmUpdateMsg.getDetails())); + alarm.setDetails(JacksonUtil.toJsonNode(alarmUpdateMsg.getDetails())); if (UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE.equals(alarmUpdateMsg.getMsgType())) { alarmService.createAlarm(AlarmCreateOrUpdateActiveRequest.fromAlarm(alarm, null, alarmId)); } else { @@ -90,7 +89,7 @@ public abstract class BaseAlarmProcessor extends BaseEdgeProcessor { Alarm alarmToClear = alarmService.findAlarmById(tenantId, alarmId); if (alarmToClear != null) { alarmService.clearAlarm(tenantId, alarmId, alarmUpdateMsg.getClearTs(), - JacksonUtil.OBJECT_MAPPER.readTree(alarmUpdateMsg.getDetails())); + JacksonUtil.toJsonNode(alarmUpdateMsg.getDetails())); } break; case ENTITY_DELETED_RPC_MESSAGE: @@ -106,26 +105,11 @@ public abstract class BaseAlarmProcessor extends BaseEdgeProcessor { } catch (Exception e) { log.error("[{}] Failed to process alarm update msg [{}]", tenantId, alarmUpdateMsg, e); return Futures.immediateFailedFuture(e); - } finally { - edgeSynchronizationManager.getSync().remove(); } return Futures.immediateFuture(null); } - private EntityId getAlarmOriginator(TenantId tenantId, String entityName, EntityType entityType) { - switch (entityType) { - case DEVICE: - return deviceService.findDeviceByTenantIdAndName(tenantId, entityName).getId(); - case ASSET: - return assetService.findAssetByTenantIdAndName(tenantId, entityName).getId(); - case ENTITY_VIEW: - return entityViewService.findEntityViewByTenantIdAndName(tenantId, entityName).getId(); - default: - return null; - } - } - - public AlarmUpdateMsg convertAlarmEventToAlarmMsg(TenantId tenantId, UUID entityId, EdgeEventActionType actionType, JsonNode body) { + protected AlarmUpdateMsg convertAlarmEventToAlarmMsg(TenantId tenantId, UUID entityId, EdgeEventActionType actionType, JsonNode body) { AlarmId alarmId = new AlarmId(entityId); UpdateMsgType msgType = getUpdateMsgType(actionType); switch (actionType) { @@ -139,12 +123,25 @@ public abstract class BaseAlarmProcessor extends BaseEdgeProcessor { } break; case DELETED: - Alarm deletedAlarm = JacksonUtil.OBJECT_MAPPER.convertValue(body, Alarm.class); + Alarm deletedAlarm = JacksonUtil.convertValue(body, Alarm.class); return alarmMsgConstructor.constructAlarmUpdatedMsg(msgType, deletedAlarm, findOriginatorEntityName(tenantId, deletedAlarm)); } return null; } + private EntityId getAlarmOriginator(TenantId tenantId, String entityName, EntityType entityType) { + switch (entityType) { + case DEVICE: + return deviceService.findDeviceByTenantIdAndName(tenantId, entityName).getId(); + case ASSET: + return assetService.findAssetByTenantIdAndName(tenantId, entityName).getId(); + case ENTITY_VIEW: + return entityViewService.findEntityViewByTenantIdAndName(tenantId, entityName).getId(); + default: + return null; + } + } + private String findOriginatorEntityName(TenantId tenantId, Alarm alarm) { String entityName = null; switch (alarm.getOriginator().getEntityType()) { diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetEdgeProcessor.java index 6e3c56d3b3..caa03af8a5 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetEdgeProcessor.java @@ -50,10 +50,10 @@ import java.util.UUID; public class AssetEdgeProcessor extends BaseAssetProcessor { public ListenableFuture processAssetMsgFromEdge(TenantId tenantId, Edge edge, AssetUpdateMsg assetUpdateMsg) { - log.trace("[{}] executing processAssetMsgFromEdge [{}] from edge [{}]", tenantId, assetUpdateMsg, edge.getName()); + log.trace("[{}] executing processAssetMsgFromEdge [{}] from edge [{}]", tenantId, assetUpdateMsg, edge.getId()); AssetId assetId = new AssetId(new UUID(assetUpdateMsg.getIdMSB(), assetUpdateMsg.getIdLSB())); try { - edgeSynchronizationManager.getSync().set(true); + edgeSynchronizationManager.getEdgeId().set(edge.getId()); switch (assetUpdateMsg.getMsgType()) { case ENTITY_CREATED_RPC_MESSAGE: @@ -78,7 +78,7 @@ public class AssetEdgeProcessor extends BaseAssetProcessor { return Futures.immediateFailedFuture(e); } } finally { - edgeSynchronizationManager.getSync().remove(); + edgeSynchronizationManager.getEdgeId().remove(); } } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetProfileEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetProfileEdgeProcessor.java index aceab6692c..fb55edd8c5 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetProfileEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetProfileEdgeProcessor.java @@ -49,10 +49,10 @@ import java.util.UUID; public class AssetProfileEdgeProcessor extends BaseAssetProfileProcessor { public ListenableFuture processAssetProfileMsgFromEdge(TenantId tenantId, Edge edge, AssetProfileUpdateMsg assetProfileUpdateMsg) { - log.trace("[{}] executing processAssetProfileMsgFromEdge [{}] from edge [{}]", tenantId, assetProfileUpdateMsg, edge.getName()); + log.trace("[{}] executing processAssetProfileMsgFromEdge [{}] from edge [{}]", tenantId, assetProfileUpdateMsg, edge.getId()); AssetProfileId assetProfileId = new AssetProfileId(new UUID(assetProfileUpdateMsg.getIdMSB(), assetProfileUpdateMsg.getIdLSB())); try { - edgeSynchronizationManager.getSync().set(true); + edgeSynchronizationManager.getEdgeId().set(edge.getId()); switch (assetProfileUpdateMsg.getMsgType()) { case ENTITY_CREATED_RPC_MESSAGE: @@ -68,7 +68,7 @@ public class AssetProfileEdgeProcessor extends BaseAssetProfileProcessor { log.warn("[{}] Failed to process AssetProfileUpdateMsg from Edge [{}]", tenantId, assetProfileUpdateMsg, e); return Futures.immediateFailedFuture(e); } finally { - edgeSynchronizationManager.getSync().remove(); + edgeSynchronizationManager.getEdgeId().remove(); } } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/DashboardEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/DashboardEdgeProcessor.java index fc19d81789..291491a2fe 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/DashboardEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/dashboard/DashboardEdgeProcessor.java @@ -45,10 +45,10 @@ import java.util.UUID; public class DashboardEdgeProcessor extends BaseDashboardProcessor { public ListenableFuture processDashboardMsgFromEdge(TenantId tenantId, Edge edge, DashboardUpdateMsg dashboardUpdateMsg) { - log.trace("[{}] executing processDashboardMsgFromEdge [{}] from edge [{}]", tenantId, dashboardUpdateMsg, edge.getName()); + log.trace("[{}] executing processDashboardMsgFromEdge [{}] from edge [{}]", tenantId, dashboardUpdateMsg, edge.getId()); DashboardId dashboardId = new DashboardId(new UUID(dashboardUpdateMsg.getIdMSB(), dashboardUpdateMsg.getIdLSB())); try { - edgeSynchronizationManager.getSync().set(true); + edgeSynchronizationManager.getEdgeId().set(edge.getId()); switch (dashboardUpdateMsg.getMsgType()) { case ENTITY_CREATED_RPC_MESSAGE: @@ -73,7 +73,7 @@ public class DashboardEdgeProcessor extends BaseDashboardProcessor { return Futures.immediateFailedFuture(e); } } finally { - edgeSynchronizationManager.getSync().remove(); + edgeSynchronizationManager.getEdgeId().remove(); } } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/BaseDeviceProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/BaseDeviceProcessor.java index 7993eb4fd8..8958db0c44 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/BaseDeviceProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/BaseDeviceProcessor.java @@ -16,7 +16,6 @@ package org.thingsboard.server.service.edge.rpc.processor.device; import com.datastax.oss.driver.api.core.uuid.Uuids; -import com.google.common.util.concurrent.ListenableFuture; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.util.Pair; @@ -107,34 +106,27 @@ public abstract class BaseDeviceProcessor extends BaseEdgeProcessor { return Pair.of(created, deviceNameUpdated); } - public ListenableFuture processDeviceCredentialsMsg(TenantId tenantId, DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg) { - log.debug("[{}] Executing processDeviceCredentialsMsg, deviceCredentialsUpdateMsg [{}]", tenantId, deviceCredentialsUpdateMsg); + protected void updateDeviceCredentials(TenantId tenantId, DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg) { DeviceId deviceId = new DeviceId(new UUID(deviceCredentialsUpdateMsg.getDeviceIdMSB(), deviceCredentialsUpdateMsg.getDeviceIdLSB())); - return dbCallbackExecutorService.submit(() -> { - Device device = deviceService.findDeviceById(tenantId, deviceId); - if (device != null) { - log.debug("[{}] Updating device credentials for device [{}]. New device credentials Id [{}], value [{}]", - tenantId, device.getName(), deviceCredentialsUpdateMsg.getCredentialsId(), deviceCredentialsUpdateMsg.getCredentialsValue()); - try { - edgeSynchronizationManager.getSync().set(true); + Device device = deviceService.findDeviceById(tenantId, deviceId); + if (device != null) { + log.debug("[{}] Updating device credentials for device [{}]. New device credentials Id [{}], value [{}]", + tenantId, device.getName(), deviceCredentialsUpdateMsg.getCredentialsId(), deviceCredentialsUpdateMsg.getCredentialsValue()); + try { + DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(tenantId, device.getId()); + deviceCredentials.setCredentialsType(DeviceCredentialsType.valueOf(deviceCredentialsUpdateMsg.getCredentialsType())); + deviceCredentials.setCredentialsId(deviceCredentialsUpdateMsg.getCredentialsId()); + deviceCredentials.setCredentialsValue(deviceCredentialsUpdateMsg.hasCredentialsValue() + ? deviceCredentialsUpdateMsg.getCredentialsValue() : null); + deviceCredentialsService.updateDeviceCredentials(tenantId, deviceCredentials); - DeviceCredentials deviceCredentials = deviceCredentialsService.findDeviceCredentialsByDeviceId(tenantId, device.getId()); - deviceCredentials.setCredentialsType(DeviceCredentialsType.valueOf(deviceCredentialsUpdateMsg.getCredentialsType())); - deviceCredentials.setCredentialsId(deviceCredentialsUpdateMsg.getCredentialsId()); - deviceCredentials.setCredentialsValue(deviceCredentialsUpdateMsg.hasCredentialsValue() - ? deviceCredentialsUpdateMsg.getCredentialsValue() : null); - deviceCredentialsService.updateDeviceCredentials(tenantId, deviceCredentials); - } catch (Exception e) { - log.error("[{}] Can't update device credentials for device [{}], deviceCredentialsUpdateMsg [{}]", - tenantId, device.getName(), deviceCredentialsUpdateMsg, e); - throw new RuntimeException(e); - } finally { - edgeSynchronizationManager.getSync().remove(); - } - } else { - log.warn("[{}] Can't find device by id [{}], deviceCredentialsUpdateMsg [{}]", tenantId, deviceId, deviceCredentialsUpdateMsg); + } catch (Exception e) { + log.error("[{}] Can't update device credentials for device [{}], deviceCredentialsUpdateMsg [{}]", + tenantId, device.getName(), deviceCredentialsUpdateMsg, e); + throw new RuntimeException(e); } - return null; - }); + } else { + log.warn("[{}] Can't find device by id [{}], deviceCredentialsUpdateMsg [{}]", tenantId, deviceId, deviceCredentialsUpdateMsg); + } } } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java index 7b1da9a297..910be10240 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessor.java @@ -15,7 +15,6 @@ */ package org.thingsboard.server.service.edge.rpc.processor.device; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -55,7 +54,7 @@ import org.thingsboard.server.gen.edge.v1.UpdateMsgType; import org.thingsboard.server.queue.TbQueueCallback; import org.thingsboard.server.queue.TbQueueMsgMetadata; import org.thingsboard.server.queue.util.TbCoreComponent; -import org.thingsboard.server.service.rpc.FromDeviceRpcResponseActorMsg; +import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponseActorMsg; import java.util.UUID; @@ -65,10 +64,10 @@ import java.util.UUID; public class DeviceEdgeProcessor extends BaseDeviceProcessor { public ListenableFuture processDeviceMsgFromEdge(TenantId tenantId, Edge edge, DeviceUpdateMsg deviceUpdateMsg) { - log.trace("[{}] executing processDeviceMsgFromEdge [{}] from edge [{}]", tenantId, deviceUpdateMsg, edge.getName()); + log.trace("[{}] executing processDeviceMsgFromEdge [{}] from edge [{}]", tenantId, deviceUpdateMsg, edge.getId()); DeviceId deviceId = new DeviceId(new UUID(deviceUpdateMsg.getIdMSB(), deviceUpdateMsg.getIdLSB())); try { - edgeSynchronizationManager.getSync().set(true); + edgeSynchronizationManager.getEdgeId().set(edge.getId()); switch (deviceUpdateMsg.getMsgType()) { case ENTITY_CREATED_RPC_MESSAGE: @@ -93,10 +92,22 @@ public class DeviceEdgeProcessor extends BaseDeviceProcessor { return Futures.immediateFailedFuture(e); } } finally { - edgeSynchronizationManager.getSync().remove(); + edgeSynchronizationManager.getEdgeId().remove(); } } + public ListenableFuture processDeviceCredentialsMsgFromEdge(TenantId tenantId, EdgeId edgeId, DeviceCredentialsUpdateMsg deviceCredentialsUpdateMsg) { + log.debug("[{}] Executing processDeviceCredentialsMsgFromEdge, deviceCredentialsUpdateMsg [{}]", tenantId, deviceCredentialsUpdateMsg); + try { + edgeSynchronizationManager.getEdgeId().set(edgeId); + + updateDeviceCredentials(tenantId, deviceCredentialsUpdateMsg); + } finally { + edgeSynchronizationManager.getEdgeId().remove(); + } + return Futures.immediateFuture(null); + } + private void saveOrUpdateDevice(TenantId tenantId, DeviceId deviceId, DeviceUpdateMsg deviceUpdateMsg, Edge edge) { CustomerId customerId = safeGetCustomerId(deviceUpdateMsg.getCustomerIdMSB(), deviceUpdateMsg.getCustomerIdLSB()); Pair resultPair = super.saveOrUpdateDevice(tenantId, deviceId, deviceUpdateMsg, customerId); @@ -183,7 +194,7 @@ public class DeviceEdgeProcessor extends BaseDeviceProcessor { data.put("method", deviceRpcCallMsg.getRequestMsg().getMethod()); data.put("params", deviceRpcCallMsg.getRequestMsg().getParams()); TbMsg tbMsg = TbMsg.newMsg(TbMsgType.TO_SERVER_RPC_REQUEST, deviceId, null, metaData, - TbMsgDataType.JSON, JacksonUtil.OBJECT_MAPPER.writeValueAsString(data)); + TbMsgDataType.JSON, JacksonUtil.toString(data)); tbClusterService.pushMsgToRuleEngine(tenantId, deviceId, tbMsg, new TbQueueCallback() { @Override public void onSuccess(TbQueueMsgMetadata metadata) { @@ -197,7 +208,7 @@ public class DeviceEdgeProcessor extends BaseDeviceProcessor { tenantId, device, deviceRpcCallMsg, t); } }); - } catch (JsonProcessingException | IllegalArgumentException e) { + } catch (IllegalArgumentException e) { log.warn("[{}][{}] Failed to push TO_SERVER_RPC_REQUEST to rule engine. deviceRpcCallMsg {}", tenantId, deviceId, deviceRpcCallMsg, e); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceProfileEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceProfileEdgeProcessor.java index d482f42cf6..3ed75bdb41 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceProfileEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceProfileEdgeProcessor.java @@ -49,10 +49,10 @@ import java.util.UUID; public class DeviceProfileEdgeProcessor extends BaseDeviceProfileProcessor { public ListenableFuture processDeviceProfileMsgFromEdge(TenantId tenantId, Edge edge, DeviceProfileUpdateMsg deviceProfileUpdateMsg) { - log.trace("[{}] executing processDeviceProfileMsgFromEdge [{}] from edge [{}]", tenantId, deviceProfileUpdateMsg, edge.getName()); + log.trace("[{}] executing processDeviceProfileMsgFromEdge [{}] from edge [{}]", tenantId, deviceProfileUpdateMsg, edge.getId()); DeviceProfileId deviceProfileId = new DeviceProfileId(new UUID(deviceProfileUpdateMsg.getIdMSB(), deviceProfileUpdateMsg.getIdLSB())); try { - edgeSynchronizationManager.getSync().set(true); + edgeSynchronizationManager.getEdgeId().set(edge.getId()); switch (deviceProfileUpdateMsg.getMsgType()) { case ENTITY_CREATED_RPC_MESSAGE: @@ -68,7 +68,7 @@ public class DeviceProfileEdgeProcessor extends BaseDeviceProfileProcessor { log.warn("[{}] Failed to process DeviceProfileUpdateMsg from Edge [{}]", tenantId, deviceProfileUpdateMsg, e); return Futures.immediateFailedFuture(e); } finally { - edgeSynchronizationManager.getSync().remove(); + edgeSynchronizationManager.getEdgeId().remove(); } } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/edge/EdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/edge/EdgeProcessor.java index b38659c881..daffefe477 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/edge/EdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/edge/EdgeProcessor.java @@ -72,9 +72,9 @@ public class EdgeProcessor extends BaseEdgeProcessor { EdgeId edgeId = new EdgeId(new UUID(edgeNotificationMsg.getEntityIdMSB(), edgeNotificationMsg.getEntityIdLSB())); switch (actionType) { case ASSIGNED_TO_CUSTOMER: - CustomerId customerId = JacksonUtil.OBJECT_MAPPER.readValue(edgeNotificationMsg.getBody(), CustomerId.class); + CustomerId customerId = JacksonUtil.fromString(edgeNotificationMsg.getBody(), CustomerId.class); Edge edge = edgeService.findEdgeById(tenantId, edgeId); - if (edge == null || customerId.isNullUid()) { + if (customerId != null && (edge == null || customerId.isNullUid())) { return Futures.immediateFuture(null); } List> futures = new ArrayList<>(); @@ -96,9 +96,9 @@ public class EdgeProcessor extends BaseEdgeProcessor { } while (pageData != null && pageData.hasNext()); return Futures.transform(Futures.allAsList(futures), voids -> null, dbCallbackExecutorService); case UNASSIGNED_FROM_CUSTOMER: - CustomerId customerIdToDelete = JacksonUtil.OBJECT_MAPPER.readValue(edgeNotificationMsg.getBody(), CustomerId.class); + CustomerId customerIdToDelete = JacksonUtil.fromString(edgeNotificationMsg.getBody(), CustomerId.class); edge = edgeService.findEdgeById(tenantId, edgeId); - if (edge == null || customerIdToDelete.isNullUid()) { + if (customerIdToDelete != null && (edge == null || customerIdToDelete.isNullUid())) { return Futures.immediateFuture(null); } return Futures.transformAsync(saveEdgeEvent(edge.getTenantId(), edge.getId(), EdgeEventType.EDGE, EdgeEventActionType.UNASSIGNED_FROM_CUSTOMER, edgeId, null), diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/entityview/EntityViewEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/entityview/EntityViewEdgeProcessor.java index 01dd414aee..cd3a0b35ad 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/entityview/EntityViewEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/entityview/EntityViewEdgeProcessor.java @@ -46,10 +46,10 @@ import java.util.UUID; public class EntityViewEdgeProcessor extends BaseEntityViewProcessor { public ListenableFuture processEntityViewMsgFromEdge(TenantId tenantId, Edge edge, EntityViewUpdateMsg entityViewUpdateMsg) { - log.trace("[{}] executing processEntityViewMsgFromEdge [{}] from edge [{}]", tenantId, entityViewUpdateMsg, edge.getName()); + log.trace("[{}] executing processEntityViewMsgFromEdge [{}] from edge [{}]", tenantId, entityViewUpdateMsg, edge.getId()); EntityViewId entityViewId = new EntityViewId(new UUID(entityViewUpdateMsg.getIdMSB(), entityViewUpdateMsg.getIdLSB())); try { - edgeSynchronizationManager.getSync().set(true); + edgeSynchronizationManager.getEdgeId().set(edge.getId()); switch (entityViewUpdateMsg.getMsgType()) { case ENTITY_CREATED_RPC_MESSAGE: @@ -74,7 +74,7 @@ public class EntityViewEdgeProcessor extends BaseEntityViewProcessor { return Futures.immediateFailedFuture(e); } } finally { - edgeSynchronizationManager.getSync().remove(); + edgeSynchronizationManager.getEdgeId().remove(); } } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/relation/BaseRelationProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/relation/BaseRelationProcessor.java index f7be0cf1f4..952affdc3d 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/relation/BaseRelationProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/relation/BaseRelationProcessor.java @@ -33,10 +33,8 @@ import java.util.UUID; @Slf4j public abstract class BaseRelationProcessor extends BaseEdgeProcessor { - public ListenableFuture processRelationMsg(TenantId tenantId, RelationUpdateMsg relationUpdateMsg) { - log.trace("[{}] processRelationMsg [{}]", tenantId, relationUpdateMsg); + protected ListenableFuture processRelationMsg(TenantId tenantId, RelationUpdateMsg relationUpdateMsg) { try { - edgeSynchronizationManager.getSync().set(true); EntityRelation entityRelation = new EntityRelation(); UUID fromUUID = new UUID(relationUpdateMsg.getFromIdMSB(), relationUpdateMsg.getFromIdLSB()); @@ -72,8 +70,6 @@ public abstract class BaseRelationProcessor extends BaseEdgeProcessor { } catch (Exception e) { log.error("[{}] Failed to process relation update msg [{}]", tenantId, relationUpdateMsg, e); return Futures.immediateFailedFuture(e); - } finally { - edgeSynchronizationManager.getSync().remove(); } return Futures.immediateFuture(null); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/relation/RelationEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/relation/RelationEdgeProcessor.java index 48192a3973..fe76fed545 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/relation/RelationEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/relation/RelationEdgeProcessor.java @@ -15,7 +15,6 @@ */ package org.thingsboard.server.service.edge.rpc.processor.relation; -import com.fasterxml.jackson.core.JsonProcessingException; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import lombok.extern.slf4j.Slf4j; @@ -23,6 +22,7 @@ import org.springframework.stereotype.Component; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.EdgeUtils; import org.thingsboard.server.common.data.EntityType; +import org.thingsboard.server.common.data.edge.Edge; import org.thingsboard.server.common.data.edge.EdgeEvent; import org.thingsboard.server.common.data.edge.EdgeEventActionType; import org.thingsboard.server.common.data.edge.EdgeEventType; @@ -45,8 +45,19 @@ import java.util.Set; @TbCoreComponent public class RelationEdgeProcessor extends BaseRelationProcessor { + public ListenableFuture processRelationMsgFromEdge(TenantId tenantId, Edge edge, RelationUpdateMsg relationUpdateMsg) { + log.trace("[{}] executing processRelationMsgFromEdge [{}] from edge [{}]", tenantId, relationUpdateMsg, edge.getId()); + try { + edgeSynchronizationManager.getEdgeId().set(edge.getId()); + + return processRelationMsg(tenantId, relationUpdateMsg); + } finally { + edgeSynchronizationManager.getEdgeId().remove(); + } + } + public DownlinkMsg convertRelationEventToDownlink(EdgeEvent edgeEvent) { - EntityRelation entityRelation = JacksonUtil.OBJECT_MAPPER.convertValue(edgeEvent.getBody(), EntityRelation.class); + EntityRelation entityRelation = JacksonUtil.convertValue(edgeEvent.getBody(), EntityRelation.class); UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction()); RelationUpdateMsg relationUpdateMsg = relationMsgConstructor.constructRelationUpdatedMsg(msgType, entityRelation); return DownlinkMsg.newBuilder() @@ -55,10 +66,9 @@ public class RelationEdgeProcessor extends BaseRelationProcessor { .build(); } - public ListenableFuture processRelationNotification(TenantId tenantId, TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg) throws JsonProcessingException { - EntityRelation relation = JacksonUtil.OBJECT_MAPPER.readValue(edgeNotificationMsg.getBody(), EntityRelation.class); - if (relation.getFrom().getEntityType().equals(EntityType.EDGE) || - relation.getTo().getEntityType().equals(EntityType.EDGE)) { + public ListenableFuture processRelationNotification(TenantId tenantId, TransportProtos.EdgeNotificationMsgProto edgeNotificationMsg) { + EntityRelation relation = JacksonUtil.fromString(edgeNotificationMsg.getBody(), EntityRelation.class); + if (relation == null || (relation.getFrom().getEntityType().equals(EntityType.EDGE) || relation.getTo().getEntityType().equals(EntityType.EDGE))) { return Futures.immediateFuture(null); } @@ -75,7 +85,7 @@ public class RelationEdgeProcessor extends BaseRelationProcessor { EdgeEventType.RELATION, EdgeEventActionType.valueOf(edgeNotificationMsg.getAction()), null, - JacksonUtil.OBJECT_MAPPER.valueToTree(relation))); + JacksonUtil.valueToTree(relation))); } return Futures.transform(Futures.allAsList(futures), voids -> null, dbCallbackExecutorService); } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/BaseResourceProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/BaseResourceProcessor.java new file mode 100644 index 0000000000..13ca012f3c --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/BaseResourceProcessor.java @@ -0,0 +1,61 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.edge.rpc.processor.resource; + +import com.datastax.oss.driver.api.core.uuid.Uuids; +import lombok.extern.slf4j.Slf4j; +import org.thingsboard.server.common.data.ResourceType; +import org.thingsboard.server.common.data.TbResource; +import org.thingsboard.server.common.data.TbResourceInfo; +import org.thingsboard.server.common.data.id.TbResourceId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.gen.edge.v1.ResourceUpdateMsg; +import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor; + +@Slf4j +public abstract class BaseResourceProcessor extends BaseEdgeProcessor { + + protected void saveOrUpdateTbResource(TenantId tenantId, TbResourceId tbResourceId, ResourceUpdateMsg resourceUpdateMsg) { + try { + boolean created = false; + TbResource resource = resourceService.findResourceById(tenantId, tbResourceId); + if (resource == null) { + resource = new TbResource(); + if (resourceUpdateMsg.getIsSystem()) { + resource.setTenantId(TenantId.SYS_TENANT_ID); + } else { + resource.setTenantId(tenantId); + } + resource.setCreatedTime(Uuids.unixTimestamp(tbResourceId.getId())); + created = true; + } + resource.setTitle(resourceUpdateMsg.getTitle()); + resource.setResourceKey(resourceUpdateMsg.getResourceKey()); + resource.setResourceType(ResourceType.valueOf(resourceUpdateMsg.getResourceType())); + resource.setFileName(resourceUpdateMsg.getFileName()); + resource.setData(resourceUpdateMsg.hasData() ? resourceUpdateMsg.getData() : null); + resource.setEtag(resourceUpdateMsg.hasEtag() ? resourceUpdateMsg.getEtag() : null); + resourceValidator.validate(resource, TbResourceInfo::getTenantId); + if (created) { + resource.setId(tbResourceId); + } + resourceService.saveResource(resource, false); + } catch (Exception e) { + log.error("[{}] Failed to process resource update msg [{}]", tenantId, resourceUpdateMsg, e); + throw e; + } + } +} diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/ResourceEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/ResourceEdgeProcessor.java new file mode 100644 index 0000000000..e7c5b21dbd --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/resource/ResourceEdgeProcessor.java @@ -0,0 +1,101 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.edge.rpc.processor.resource; + +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.thingsboard.server.common.data.EdgeUtils; +import org.thingsboard.server.common.data.TbResource; +import org.thingsboard.server.common.data.edge.Edge; +import org.thingsboard.server.common.data.edge.EdgeEvent; +import org.thingsboard.server.common.data.id.TbResourceId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.dao.exception.DataValidationException; +import org.thingsboard.server.gen.edge.v1.DownlinkMsg; +import org.thingsboard.server.gen.edge.v1.ResourceUpdateMsg; +import org.thingsboard.server.gen.edge.v1.UpdateMsgType; +import org.thingsboard.server.queue.util.TbCoreComponent; + +import java.util.UUID; + +@Component +@Slf4j +@TbCoreComponent +public class ResourceEdgeProcessor extends BaseResourceProcessor { + + public ListenableFuture processResourceMsgFromEdge(TenantId tenantId, Edge edge, ResourceUpdateMsg resourceUpdateMsg) { + TbResourceId tbResourceId = new TbResourceId(new UUID(resourceUpdateMsg.getIdMSB(), resourceUpdateMsg.getIdLSB())); + try { + edgeSynchronizationManager.getEdgeId().set(edge.getId()); + + switch (resourceUpdateMsg.getMsgType()) { + case ENTITY_CREATED_RPC_MESSAGE: + case ENTITY_UPDATED_RPC_MESSAGE: + super.saveOrUpdateTbResource(tenantId, tbResourceId, resourceUpdateMsg); + break; + case ENTITY_DELETED_RPC_MESSAGE: + TbResource tbResourceToDelete = resourceService.findResourceById(tenantId, tbResourceId); + if (tbResourceToDelete != null) { + resourceService.deleteResource(tenantId, tbResourceId); + } + break; + case UNRECOGNIZED: + return handleUnsupportedMsgType(resourceUpdateMsg.getMsgType()); + } + } catch (DataValidationException e) { + if (e.getMessage().contains("files size limit is exhausted")) { + log.warn("[{}] Resource data size has been exhausted {}", tenantId, resourceUpdateMsg, e); + return Futures.immediateFuture(null); + } else { + return Futures.immediateFailedFuture(e); + } + } finally { + edgeSynchronizationManager.getEdgeId().remove(); + } + return Futures.immediateFuture(null); + } + + public DownlinkMsg convertResourceEventToDownlink(EdgeEvent edgeEvent) { + TbResourceId tbResourceId = new TbResourceId(edgeEvent.getEntityId()); + DownlinkMsg downlinkMsg = null; + switch (edgeEvent.getAction()) { + case ADDED: + case UPDATED: + TbResource tbResource = resourceService.findResourceById(edgeEvent.getTenantId(), tbResourceId); + if (tbResource != null) { + UpdateMsgType msgType = getUpdateMsgType(edgeEvent.getAction()); + ResourceUpdateMsg resourceUpdateMsg = + resourceMsgConstructor.constructResourceUpdatedMsg(msgType, tbResource); + downlinkMsg = DownlinkMsg.newBuilder() + .setDownlinkMsgId(EdgeUtils.nextPositiveInt()) + .addResourceUpdateMsg(resourceUpdateMsg) + .build(); + } + break; + case DELETED: + ResourceUpdateMsg resourceUpdateMsg = + resourceMsgConstructor.constructResourceDeleteMsg(tbResourceId); + downlinkMsg = DownlinkMsg.newBuilder() + .setDownlinkMsgId(EdgeUtils.nextPositiveInt()) + .addResourceUpdateMsg(resourceUpdateMsg) + .build(); + break; + } + return downlinkMsg; + } +} diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/settings/AdminSettingsEdgeProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/settings/AdminSettingsEdgeProcessor.java index 6bd21e0796..bbd9edd172 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/settings/AdminSettingsEdgeProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/settings/AdminSettingsEdgeProcessor.java @@ -32,7 +32,10 @@ import org.thingsboard.server.service.edge.rpc.processor.BaseEdgeProcessor; public class AdminSettingsEdgeProcessor extends BaseEdgeProcessor { public DownlinkMsg convertAdminSettingsEventToDownlink(EdgeEvent edgeEvent) { - AdminSettings adminSettings = JacksonUtil.OBJECT_MAPPER.convertValue(edgeEvent.getBody(), AdminSettings.class); + AdminSettings adminSettings = JacksonUtil.convertValue(edgeEvent.getBody(), AdminSettings.class); + if (adminSettings == null) { + return null; + } AdminSettingsUpdateMsg adminSettingsUpdateMsg = adminSettingsMsgConstructor.constructAdminSettingsUpdateMsg(adminSettings); return DownlinkMsg.newBuilder() .setDownlinkMsgId(EdgeUtils.nextPositiveInt()) diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/telemetry/BaseTelemetryProcessor.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/telemetry/BaseTelemetryProcessor.java index c2d172ede0..974e9267f6 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/telemetry/BaseTelemetryProcessor.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/processor/telemetry/BaseTelemetryProcessor.java @@ -22,14 +22,13 @@ import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; import com.google.gson.Gson; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import org.thingsboard.common.util.JacksonUtil; -import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceAttributesEventNotificationMsg; import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceProfile; @@ -346,8 +345,9 @@ public abstract class BaseTelemetryProcessor extends BaseEdgeProcessor { log.warn("[{}] Unsupported edge event type [{}]", tenantId, entityType); return null; } - JsonElement entityData = JsonParser.parseString(JacksonUtil.OBJECT_MAPPER.writeValueAsString(body)); - return entityDataMsgConstructor.constructEntityDataMsg(tenantId, entityId, actionType, entityData); + String bodyJackson = JacksonUtil.toString(body); + return bodyJackson == null ? null : + entityDataMsgConstructor.constructEntityDataMsg(tenantId, entityId, actionType, JsonParser.parseString(bodyJackson)); } } diff --git a/application/src/main/java/org/thingsboard/server/service/edge/rpc/sync/DefaultEdgeRequestsService.java b/application/src/main/java/org/thingsboard/server/service/edge/rpc/sync/DefaultEdgeRequestsService.java index 46bb940da9..af9f72e819 100644 --- a/application/src/main/java/org/thingsboard/server/service/edge/rpc/sync/DefaultEdgeRequestsService.java +++ b/application/src/main/java/org/thingsboard/server/service/edge/rpc/sync/DefaultEdgeRequestsService.java @@ -176,7 +176,7 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService { if (attributes.size() > 0) { entityData.put("kv", attributes); entityData.put("scope", scope); - JsonNode body = JacksonUtil.OBJECT_MAPPER.valueToTree(entityData); + JsonNode body = JacksonUtil.valueToTree(entityData); log.debug("[{}] Sending attributes data msg, entityId [{}], attributes [{}]", tenantId, entityId, body); future = saveEdgeEvent(tenantId, edge.getId(), entityType, EdgeEventActionType.ATTRIBUTES_UPDATED, entityId, body); } else { @@ -249,7 +249,7 @@ public class DefaultEdgeRequestsService implements EdgeRequestsService { EdgeEventType.RELATION, EdgeEventActionType.ADDED, null, - JacksonUtil.OBJECT_MAPPER.valueToTree(relation))); + JacksonUtil.valueToTree(relation))); } } catch (Exception e) { String errMsg = String.format("[%s][%s] Exception during loading relation [%s] to edge on sync!", tenantId, edge.getId(), relation); diff --git a/application/src/main/java/org/thingsboard/server/service/entitiy/DefaultTbNotificationEntityService.java b/application/src/main/java/org/thingsboard/server/service/entitiy/DefaultTbNotificationEntityService.java index f2465c9398..72e8f44020 100644 --- a/application/src/main/java/org/thingsboard/server/service/entitiy/DefaultTbNotificationEntityService.java +++ b/application/src/main/java/org/thingsboard/server/service/entitiy/DefaultTbNotificationEntityService.java @@ -19,7 +19,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.thingsboard.common.util.JacksonUtil; -import org.thingsboard.rule.engine.api.msg.DeviceCredentialsUpdateNotificationMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceCredentialsUpdateNotificationMsg; import org.thingsboard.server.cluster.TbClusterService; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.HasName; diff --git a/application/src/main/java/org/thingsboard/server/service/housekeeper/InMemoryHouseKeeperServiceService.java b/application/src/main/java/org/thingsboard/server/service/housekeeper/InMemoryHouseKeeperServiceService.java index 4e83aa0060..9edc81f9fd 100644 --- a/application/src/main/java/org/thingsboard/server/service/housekeeper/InMemoryHouseKeeperServiceService.java +++ b/application/src/main/java/org/thingsboard/server/service/housekeeper/InMemoryHouseKeeperServiceService.java @@ -22,7 +22,6 @@ import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Component; import org.springframework.transaction.event.TransactionalEventListener; import org.thingsboard.common.util.ThingsBoardThreadFactory; @@ -91,7 +90,7 @@ public class InMemoryHouseKeeperServiceService implements HouseKeeperService { } @Override - public void onFailure(@NotNull Throwable throwable) { + public void onFailure(Throwable throwable) { queueSize.decrementAndGet(); totalProcessedCounter.incrementAndGet(); log.error("[{}][{}] unassignDeletedUserAlarms failed, pending queue size: {}, total processed count: {}", diff --git a/application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java b/application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java index 87e1b097e4..16704a0856 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/DefaultSystemDataLoaderService.java @@ -264,6 +264,7 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService { ObjectNode node = JacksonUtil.newObjectNode(); node.put("baseUrl", "http://localhost:8080"); node.put("prohibitDifferentUrl", false); + node.set("connectivity", createDeviceConnectivityConfiguration()); generalSettings.setJsonValue(node); adminSettingsService.saveAdminSettings(TenantId.SYS_TENANT_ID, generalSettings); @@ -284,6 +285,53 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService { node.put("showChangePassword", false); mailSettings.setJsonValue(node); adminSettingsService.saveAdminSettings(TenantId.SYS_TENANT_ID, mailSettings); + + AdminSettings connectivitySettings = new AdminSettings(); + connectivitySettings.setTenantId(TenantId.SYS_TENANT_ID); + connectivitySettings.setKey("connectivity"); + connectivitySettings.setJsonValue(createDeviceConnectivityConfiguration()); + adminSettingsService.saveAdminSettings(TenantId.SYS_TENANT_ID, connectivitySettings); + } + + private ObjectNode createDeviceConnectivityConfiguration() { + ObjectNode config = JacksonUtil.newObjectNode(); + + ObjectNode http = JacksonUtil.newObjectNode(); + http.put("enabled", true); + http.put("host", ""); + http.put("port", 8080); + config.set("http", http); + + ObjectNode https = JacksonUtil.newObjectNode(); + https.put("enabled", false); + https.put("host", ""); + https.put("port", 443); + config.set("https", https); + + ObjectNode mqtt = JacksonUtil.newObjectNode(); + mqtt.put("enabled", true); + mqtt.put("host", ""); + mqtt.put("port", 1883); + config.set("mqtt", mqtt); + + ObjectNode mqtts = JacksonUtil.newObjectNode(); + mqtts.put("enabled", false); + mqtts.put("host", ""); + mqtts.put("port", 8883); + config.set("mqtts", mqtts); + + ObjectNode coap = JacksonUtil.newObjectNode(); + coap.put("enabled", true); + coap.put("host", ""); + coap.put("port", 5683); + config.set("coap", coap); + + ObjectNode coaps = JacksonUtil.newObjectNode(); + coaps.put("enabled", false); + coaps.put("host", ""); + coaps.put("port", 5684); + config.set("coaps", coaps); + return config; } @Override @@ -535,6 +583,8 @@ public class DefaultSystemDataLoaderService implements SystemDataLoaderService { this.deleteSystemWidgetBundle("status_indicators"); this.deleteSystemWidgetBundle("outdoor_environment"); this.deleteSystemWidgetBundle("indoor_environment"); + this.deleteSystemWidgetBundle("air_quality"); + this.deleteSystemWidgetBundle("liquid_level_tanks"); installScripts.loadSystemWidgets(); } diff --git a/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java b/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java index d16b8c362b..c49578c912 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/update/DefaultDataUpdateService.java @@ -32,6 +32,7 @@ import org.thingsboard.rule.engine.flow.TbRuleChainInputNode; import org.thingsboard.rule.engine.flow.TbRuleChainInputNodeConfiguration; import org.thingsboard.rule.engine.profile.TbDeviceProfileNode; import org.thingsboard.rule.engine.profile.TbDeviceProfileNodeConfiguration; +import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.EntityView; import org.thingsboard.server.common.data.Tenant; @@ -70,6 +71,7 @@ import org.thingsboard.server.common.data.util.TbPair; import org.thingsboard.server.dao.DaoUtil; import org.thingsboard.server.dao.alarm.AlarmDao; import org.thingsboard.server.dao.audit.AuditLogDao; +import org.thingsboard.server.dao.device.DeviceConnectivityConfiguration; import org.thingsboard.server.dao.edge.EdgeEventDao; import org.thingsboard.server.dao.entity.EntityService; import org.thingsboard.server.dao.entityview.EntityViewService; @@ -78,6 +80,7 @@ import org.thingsboard.server.dao.model.sql.DeviceProfileEntity; import org.thingsboard.server.dao.queue.QueueService; import org.thingsboard.server.dao.relation.RelationService; import org.thingsboard.server.dao.rule.RuleChainService; +import org.thingsboard.server.dao.settings.AdminSettingsService; import org.thingsboard.server.dao.sql.JpaExecutorService; import org.thingsboard.server.dao.sql.device.DeviceProfileRepository; import org.thingsboard.server.dao.tenant.TenantProfileService; @@ -161,6 +164,12 @@ public class DefaultDataUpdateService implements DataUpdateService { @Autowired JpaExecutorService jpaExecutorService; + @Autowired + AdminSettingsService adminSettingsService; + + @Autowired + DeviceConnectivityConfiguration connectivityConfiguration; + @Override public void updateData(String fromVersion) throws Exception { switch (fromVersion) { @@ -215,6 +224,10 @@ public class DefaultDataUpdateService implements DataUpdateService { log.info("Updating data from version 3.5.1 to 3.6.0 ..."); migrateEdgeEvents("Starting edge events migration - adding seq_id column. "); break; + case "3.6.0": + log.info("Updating data from version 3.6.0 to 3.6.1 ..."); + migrateDeviceConnectivity(); + break; default: throw new RuntimeException("Unable to update data, unsupported fromVersion: " + fromVersion); } @@ -230,6 +243,16 @@ public class DefaultDataUpdateService implements DataUpdateService { } } + private void migrateDeviceConnectivity() { + if (adminSettingsService.findAdminSettingsByKey(TenantId.SYS_TENANT_ID, "connectivity") == null) { + AdminSettings connectivitySettings = new AdminSettings(); + connectivitySettings.setTenantId(TenantId.SYS_TENANT_ID); + connectivitySettings.setKey("connectivity"); + connectivitySettings.setJsonValue(JacksonUtil.valueToTree(connectivityConfiguration.getConnectivity())); + adminSettingsService.saveAdminSettings(TenantId.SYS_TENANT_ID, connectivitySettings); + } + } + @Override public void upgradeRuleNodes() { try { diff --git a/application/src/main/java/org/thingsboard/server/service/notification/DefaultNotificationCenter.java b/application/src/main/java/org/thingsboard/server/service/notification/DefaultNotificationCenter.java index f6c77691da..b4ba871edf 100644 --- a/application/src/main/java/org/thingsboard/server/service/notification/DefaultNotificationCenter.java +++ b/application/src/main/java/org/thingsboard/server/service/notification/DefaultNotificationCenter.java @@ -64,7 +64,7 @@ import org.thingsboard.server.dao.notification.NotificationTemplateService; import org.thingsboard.server.dao.util.limits.RateLimitService; import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.provider.TbQueueProducerProvider; import org.thingsboard.server.service.executors.NotificationExecutorService; import org.thingsboard.server.service.notification.channels.NotificationChannel; @@ -94,7 +94,7 @@ public class DefaultNotificationCenter extends AbstractSubscriptionService imple private final NotificationTemplateService notificationTemplateService; private final NotificationSettingsService notificationSettingsService; private final NotificationExecutorService notificationExecutor; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbQueueProducerProvider producerProvider; private final RateLimitService rateLimitService; @@ -431,7 +431,7 @@ public class DefaultNotificationCenter extends AbstractSubscriptionService imple TransportProtos.ToCoreNotificationMsg notificationRequestUpdateProto = TbSubscriptionUtils.notificationRequestUpdateToProto(tenantId, update); Set coreServices = new HashSet<>(partitionService.getAllServiceIds(ServiceType.TB_CORE)); for (String serviceId : coreServices) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); producerProvider.getTbCoreNotificationsMsgProducer().send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), notificationRequestUpdateProto), null); } }); diff --git a/application/src/main/java/org/thingsboard/server/service/ota/DefaultOtaPackageStateService.java b/application/src/main/java/org/thingsboard/server/service/ota/DefaultOtaPackageStateService.java index 6ab61426a8..fef96c0fcb 100644 --- a/application/src/main/java/org/thingsboard/server/service/ota/DefaultOtaPackageStateService.java +++ b/application/src/main/java/org/thingsboard/server/service/ota/DefaultOtaPackageStateService.java @@ -20,7 +20,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.thingsboard.rule.engine.api.RuleEngineTelemetryService; -import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceAttributesEventNotificationMsg; import org.thingsboard.server.cluster.TbClusterService; import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.Device; diff --git a/application/src/main/java/org/thingsboard/server/service/partition/TbCoreStartupService.java b/application/src/main/java/org/thingsboard/server/service/partition/TbCoreStartupService.java new file mode 100644 index 0000000000..3139ff256e --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/partition/TbCoreStartupService.java @@ -0,0 +1,52 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.partition; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.stereotype.Service; +import org.thingsboard.server.cluster.TbClusterService; +import org.thingsboard.server.common.msg.queue.ServiceType; +import org.thingsboard.server.gen.transport.TransportProtos; +import org.thingsboard.server.queue.discovery.PartitionService; +import org.thingsboard.server.queue.discovery.QueueKey; +import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.util.AfterStartUp; +import org.thingsboard.server.queue.util.TbCoreComponent; + +@Slf4j +@TbCoreComponent +@Service +@RequiredArgsConstructor +public class TbCoreStartupService { + + private final PartitionService partitionService; + private final TbServiceInfoProvider serviceInfoProvider; + private final TbClusterService clusterService; + + @AfterStartUp(order = AfterStartUp.STARTUP_SERVICE) + public void onApplicationEvent(ApplicationReadyEvent event) { + var myPartitions = partitionService.getMyPartitions(new QueueKey(ServiceType.TB_CORE)); + if (myPartitions != null && !myPartitions.isEmpty()) { + TransportProtos.ToCoreNotificationMsg toCoreMsg = TransportProtos.ToCoreNotificationMsg.newBuilder() + .setCoreStartupMsg(TransportProtos.CoreStartupMsg.newBuilder() + .setServiceId(serviceInfoProvider.getServiceId()).addAllPartitions(myPartitions).build()).build(); + clusterService.broadcastToCore(toCoreMsg); + } + } + +} diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java index 937ee12fab..103d2b68e2 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbClusterService.java @@ -23,8 +23,6 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; -import org.thingsboard.rule.engine.api.msg.DeviceEdgeUpdateMsg; -import org.thingsboard.rule.engine.api.msg.DeviceNameOrTypeUpdateMsg; import org.thingsboard.server.cluster.TbClusterService; import org.thingsboard.server.common.data.ApiUsageState; import org.thingsboard.server.common.data.Device; @@ -57,6 +55,8 @@ import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg; import org.thingsboard.server.common.msg.queue.ServiceType; import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse; +import org.thingsboard.server.common.msg.rule.engine.DeviceEdgeUpdateMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceNameOrTypeUpdateMsg; import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos.FromDeviceRPCResponseProto; import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; @@ -68,7 +68,7 @@ import org.thingsboard.server.queue.TbQueueCallback; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.MultipleTbQueueCallbackWrapper; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.PartitionService; import org.thingsboard.server.queue.provider.TbQueueProducerProvider; import org.thingsboard.server.queue.util.DataDecodingEncodingService; @@ -81,6 +81,8 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; +import static org.thingsboard.server.service.queue.ProtoUtils.toProto; + @Service @Slf4j @RequiredArgsConstructor @@ -109,7 +111,7 @@ public class DefaultTbClusterService implements TbClusterService { @Lazy private OtaPackageStateService otaPackageStateService; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final DataDecodingEncodingService encodingService; private final TbDeviceProfileCache deviceProfileCache; private final TbAssetProfileCache assetProfileCache; @@ -132,12 +134,23 @@ public class DefaultTbClusterService implements TbClusterService { public void pushMsgToCore(ToDeviceActorNotificationMsg msg, TbQueueCallback callback) { TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_CORE, msg.getTenantId(), msg.getDeviceId()); log.trace("PUSHING msg: {} to:{}", msg, tpi); - byte[] msgBytes = encodingService.encode(msg); - ToCoreMsg toCoreMsg = ToCoreMsg.newBuilder().setToDeviceActorNotificationMsg(ByteString.copyFrom(msgBytes)).build(); + ToCoreMsg toCoreMsg = ToCoreMsg.newBuilder().setToDeviceActorNotification(toProto(msg)).build(); producerProvider.getTbCoreMsgProducer().send(tpi, new TbProtoQueueMsg<>(msg.getDeviceId().getId(), toCoreMsg), callback); toCoreMsgs.incrementAndGet(); } + @Override + public void broadcastToCore(ToCoreNotificationMsg toCoreMsg) { + UUID msgId = UUID.randomUUID(); + TbQueueProducer> toCoreNfProducer = producerProvider.getTbCoreNotificationsMsgProducer(); + Set tbCoreServices = partitionService.getAllServiceIds(ServiceType.TB_CORE); + for (String serviceId : tbCoreServices) { + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); + toCoreNfProducer.send(tpi, new TbProtoQueueMsg<>(msgId, toCoreMsg), null); + toCoreNfs.incrementAndGet(); + } + } + @Override public void pushMsgToVersionControl(TenantId tenantId, TransportProtos.ToVersionControlServiceMsg msg, TbQueueCallback callback) { TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_VC_EXECUTOR, tenantId, tenantId); @@ -149,7 +162,7 @@ public class DefaultTbClusterService implements TbClusterService { @Override public void pushNotificationToCore(String serviceId, FromDeviceRpcResponse response, TbQueueCallback callback) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); log.trace("PUSHING msg: {} to:{}", response, tpi); FromDeviceRPCResponseProto.Builder builder = FromDeviceRPCResponseProto.newBuilder() .setRequestIdMSB(response.getId().getMostSignificantBits()) @@ -203,6 +216,7 @@ public class DefaultTbClusterService implements TbClusterService { } return null; } + private TbMsg transformMsg(TbMsg tbMsg, HasRuleEngineProfile ruleEngineProfile) { if (ruleEngineProfile != null) { RuleChainId targetRuleChainId = ruleEngineProfile.getDefaultRuleChainId(); @@ -224,7 +238,7 @@ public class DefaultTbClusterService implements TbClusterService { @Override public void pushNotificationToRuleEngine(String serviceId, FromDeviceRpcResponse response, TbQueueCallback callback) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceId); log.trace("PUSHING msg: {} to:{}", response, tpi); FromDeviceRPCResponseProto.Builder builder = FromDeviceRPCResponseProto.newBuilder() .setRequestIdMSB(response.getId().getMostSignificantBits()) @@ -245,7 +259,7 @@ public class DefaultTbClusterService implements TbClusterService { } return; } - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, serviceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, serviceId); log.trace("PUSHING msg: {} to:{}", response, tpi); producerProvider.getTransportNotificationsMsgProducer().send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), response), callback); toTransportNfs.incrementAndGet(); @@ -353,7 +367,7 @@ public class DefaultTbClusterService implements TbClusterService { Set tbTransportServices = partitionService.getAllServiceIds(ServiceType.TB_TRANSPORT); TbQueueCallback proxyCallback = callback != null ? new MultipleTbQueueCallbackWrapper(tbTransportServices.size(), callback) : null; for (String transportServiceId : tbTransportServices) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, transportServiceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, transportServiceId); toTransportNfProducer.send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), transportMsg), proxyCallback); toTransportNfs.incrementAndGet(); } @@ -363,24 +377,21 @@ public class DefaultTbClusterService implements TbClusterService { public void onEdgeEventUpdate(TenantId tenantId, EdgeId edgeId) { log.trace("[{}] Processing edge {} event update ", tenantId, edgeId); EdgeEventUpdateMsg msg = new EdgeEventUpdateMsg(tenantId, edgeId); - byte[] msgBytes = encodingService.encode(msg); - ToCoreNotificationMsg toCoreMsg = ToCoreNotificationMsg.newBuilder().setEdgeEventUpdateMsg(ByteString.copyFrom(msgBytes)).build(); + ToCoreNotificationMsg toCoreMsg = ToCoreNotificationMsg.newBuilder().setEdgeEventUpdate(toProto(msg)).build(); pushEdgeSyncMsgToCore(edgeId, toCoreMsg); } @Override public void pushEdgeSyncRequestToCore(ToEdgeSyncRequest toEdgeSyncRequest) { log.trace("[{}] Processing edge sync request {} ", toEdgeSyncRequest.getTenantId(), toEdgeSyncRequest); - byte[] msgBytes = encodingService.encode(toEdgeSyncRequest); - ToCoreNotificationMsg toCoreMsg = ToCoreNotificationMsg.newBuilder().setToEdgeSyncRequestMsg(ByteString.copyFrom(msgBytes)).build(); + ToCoreNotificationMsg toCoreMsg = ToCoreNotificationMsg.newBuilder().setToEdgeSyncRequest(toProto(toEdgeSyncRequest)).build(); pushEdgeSyncMsgToCore(toEdgeSyncRequest.getEdgeId(), toCoreMsg); } @Override public void pushEdgeSyncResponseToCore(FromEdgeSyncResponse fromEdgeSyncResponse) { log.trace("[{}] Processing edge sync response {}", fromEdgeSyncResponse.getTenantId(), fromEdgeSyncResponse); - byte[] msgBytes = encodingService.encode(fromEdgeSyncResponse); - ToCoreNotificationMsg toCoreMsg = ToCoreNotificationMsg.newBuilder().setFromEdgeSyncResponseMsg(ByteString.copyFrom(msgBytes)).build(); + ToCoreNotificationMsg toCoreMsg = ToCoreNotificationMsg.newBuilder().setFromEdgeSyncResponse(toProto(fromEdgeSyncResponse)).build(); pushEdgeSyncMsgToCore(fromEdgeSyncResponse.getEdgeId(), toCoreMsg); } @@ -388,14 +399,14 @@ public class DefaultTbClusterService implements TbClusterService { TbQueueProducer> toCoreNfProducer = producerProvider.getTbCoreNotificationsMsgProducer(); Set tbCoreServices = partitionService.getAllServiceIds(ServiceType.TB_CORE); for (String serviceId : tbCoreServices) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); toCoreNfProducer.send(tpi, new TbProtoQueueMsg<>(edgeId.getId(), toCoreMsg), null); toCoreNfs.incrementAndGet(); } } private void broadcast(ComponentLifecycleMsg msg) { - TransportProtos.ComponentLifecycleMsgProto componentLifecycleMsgProto = ProtoUtils.toProto(msg); + TransportProtos.ComponentLifecycleMsgProto componentLifecycleMsgProto = toProto(msg); TbQueueProducer> toRuleEngineProducer = producerProvider.getRuleEngineNotificationsMsgProducer(); Set tbRuleEngineServices = partitionService.getAllServiceIds(ServiceType.TB_RULE_ENGINE); EntityType entityType = msg.getEntityId().getEntityType(); @@ -412,7 +423,7 @@ public class DefaultTbClusterService implements TbClusterService { TbQueueProducer> toCoreNfProducer = producerProvider.getTbCoreNotificationsMsgProducer(); Set tbCoreServices = partitionService.getAllServiceIds(ServiceType.TB_CORE); for (String serviceId : tbCoreServices) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); ToCoreNotificationMsg toCoreMsg = ToCoreNotificationMsg.newBuilder().setComponentLifecycle(componentLifecycleMsgProto).build(); toCoreNfProducer.send(tpi, new TbProtoQueueMsg<>(msg.getEntityId().getId(), toCoreMsg), null); toCoreNfs.incrementAndGet(); @@ -421,7 +432,7 @@ public class DefaultTbClusterService implements TbClusterService { tbRuleEngineServices.removeAll(tbCoreServices); } for (String serviceId : tbRuleEngineServices) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceId); ToRuleEngineNotificationMsg toRuleEngineMsg = ToRuleEngineNotificationMsg.newBuilder().setComponentLifecycle(componentLifecycleMsgProto).build(); toRuleEngineProducer.send(tpi, new TbProtoQueueMsg<>(msg.getEntityId().getId(), toRuleEngineMsg), null); toRuleEngineNfs.incrementAndGet(); @@ -475,7 +486,7 @@ public class DefaultTbClusterService implements TbClusterService { } @Override - public void sendNotificationMsgToEdge(TenantId tenantId, EdgeId edgeId, EntityId entityId, String body, EdgeEventType type, EdgeEventActionType action) { + public void sendNotificationMsgToEdge(TenantId tenantId, EdgeId edgeId, EntityId entityId, String body, EdgeEventType type, EdgeEventActionType action, EdgeId sourceEdgeId) { if (!edgesEnabled) { return; } @@ -508,6 +519,10 @@ public class DefaultTbClusterService implements TbClusterService { if (body != null) { builder.setBody(body); } + if (sourceEdgeId != null) { + builder.setSourceEdgeIdMSB(sourceEdgeId.getId().getMostSignificantBits()); + builder.setSourceEdgeIdLSB(sourceEdgeId.getId().getLeastSignificantBits()); + } TransportProtos.EdgeNotificationMsgProto msg = builder.build(); log.trace("[{}] sending notification to edge service {}", tenantId.getId(), msg); pushMsgToCore(tenantId, entityId != null ? entityId : tenantId, TransportProtos.ToCoreMsg.newBuilder().setEdgeNotificationMsg(msg).build(), null); @@ -576,17 +591,17 @@ public class DefaultTbClusterService implements TbClusterService { tbCoreServices.removeAll(tbRuleEngineServices); for (String ruleEngineServiceId : tbRuleEngineServices) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngineServiceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngineServiceId); producerProvider.getRuleEngineNotificationsMsgProducer().send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), ruleEngineMsg), null); toRuleEngineNfs.incrementAndGet(); } for (String coreServiceId : tbCoreServices) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, coreServiceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, coreServiceId); producerProvider.getTbCoreNotificationsMsgProducer().send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), coreMsg), null); toCoreNfs.incrementAndGet(); } for (String transportServiceId : tbTransportServices) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, transportServiceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, transportServiceId); producerProvider.getTransportNotificationsMsgProducer().send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), transportMsg), null); toTransportNfs.incrementAndGet(); } diff --git a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java index 7415ee6717..754537ef11 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/DefaultTbCoreConsumerService.java @@ -58,7 +58,6 @@ import org.thingsboard.server.gen.transport.TransportProtos.TbAlarmDeleteProto; import org.thingsboard.server.gen.transport.TransportProtos.TbAlarmUpdateProto; import org.thingsboard.server.gen.transport.TransportProtos.TbAttributeDeleteProto; import org.thingsboard.server.gen.transport.TransportProtos.TbAttributeUpdateProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbSubscriptionCloseProto; import org.thingsboard.server.gen.transport.TransportProtos.TbTimeSeriesDeleteProto; import org.thingsboard.server.gen.transport.TransportProtos.TbTimeSeriesUpdateProto; import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; @@ -66,6 +65,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMs import org.thingsboard.server.gen.transport.TransportProtos.ToOtaPackageStateServiceMsg; import org.thingsboard.server.gen.transport.TransportProtos.ToUsageStatsServiceMsg; import org.thingsboard.server.gen.transport.TransportProtos.TransportToDeviceActorMsg; +import org.thingsboard.server.gen.transport.TransportProtos.TbEntitySubEventProto; import org.thingsboard.server.queue.TbQueueConsumer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.queue.discovery.PartitionService; @@ -83,7 +83,7 @@ import org.thingsboard.server.service.profile.TbDeviceProfileCache; import org.thingsboard.server.service.queue.processing.AbstractConsumerService; import org.thingsboard.server.service.queue.processing.IdMsgPair; import org.thingsboard.server.service.rpc.TbCoreDeviceRpcService; -import org.thingsboard.server.service.rpc.ToDeviceRpcRequestActorMsg; +import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequestActorMsg; import org.thingsboard.server.service.security.auth.jwt.settings.JwtSettingsService; import org.thingsboard.server.service.state.DeviceStateService; import org.thingsboard.server.service.subscription.SubscriptionManagerService; @@ -93,7 +93,6 @@ import org.thingsboard.server.service.sync.vc.GitVersionControlQueueService; import org.thingsboard.server.service.transport.msg.TransportToDeviceActorMsgWrapper; import org.thingsboard.server.service.ws.notification.sub.NotificationRequestUpdate; import org.thingsboard.server.service.ws.notification.sub.NotificationUpdate; -import org.thingsboard.server.service.ws.notification.sub.NotificationsSubscriptionUpdate; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; @@ -268,7 +267,19 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService actorMsg = encodingService.decode(toCoreMsg.getToDeviceActorNotificationMsg().toByteArray()); if (actorMsg.isPresent()) { TbActorMsg tbActorMsg = actorMsg.get(); @@ -347,21 +358,36 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService Do NOTHING. + callback.onSuccess(); } else { throwNotHandled(msg, callback); } } + private void forwardCoreStartupMsg(TransportProtos.CoreStartupMsg coreStartupMsg, TbCallback callback) { + log.info("[{}] Processing core startup with partitions: {}", coreStartupMsg.getServiceId(), coreStartupMsg.getPartitionsList()); + localSubscriptionService.onCoreStartupMsg(coreStartupMsg); + callback.onSuccess(); + } + private void forwardToSubMgrService(SubscriptionMgrMsgProto msg, TbCallback callback) { - if (msg.hasAttributeSub()) { - subscriptionManagerService.addSubscription(TbSubscriptionUtils.fromProto(msg.getAttributeSub()), callback); + if (msg.hasSubEvent()) { + TbEntitySubEventProto subEvent = msg.getSubEvent(); + subscriptionManagerService.onSubEvent(subEvent.getServiceId(), TbSubscriptionUtils.fromProto(subEvent), callback); } else if (msg.hasTelemetrySub()) { - subscriptionManagerService.addSubscription(TbSubscriptionUtils.fromProto(msg.getTelemetrySub()), callback); + callback.onSuccess(); + // Deprecated, for removal; Left intentionally to avoid throwNotHandled } else if (msg.hasAlarmSub()) { - subscriptionManagerService.addSubscription(TbSubscriptionUtils.fromProto(msg.getAlarmSub()), callback); + callback.onSuccess(); + // Deprecated, for removal; Left intentionally to avoid throwNotHandled } else if (msg.hasNotificationsSub()) { - subscriptionManagerService.addSubscription(TbSubscriptionUtils.fromProto(msg.getNotificationsSub()), callback); + callback.onSuccess(); + // Deprecated, for removal; Left intentionally to avoid throwNotHandled } else if (msg.hasNotificationsCountSub()) { - subscriptionManagerService.addSubscription(TbSubscriptionUtils.fromProto(msg.getNotificationsCountSub()), callback); + callback.onSuccess(); + // Deprecated, for removal; Left intentionally to avoid throwNotHandled } else if (msg.hasSubClose()) { - TbSubscriptionCloseProto closeProto = msg.getSubClose(); - subscriptionManagerService.cancelSubscription(closeProto.getSessionId(), closeProto.getSubscriptionId(), callback); + callback.onSuccess(); + // Deprecated, for removal; Left intentionally to avoid throwNotHandled } else if (msg.hasTsUpdate()) { TbTimeSeriesUpdateProto proto = msg.getTsUpdate(); long tenantIdMSB = proto.getTenantIdMSB(); @@ -584,7 +618,7 @@ public class DefaultTbCoreConsumerService extends AbstractConsumerService actorMsg, TbCallback callback) { if (actorMsg.isPresent()) { - log.trace("[{}] Forwarding message to App Actor {}", id, actorMsg.get()); - actorContext.tell(actorMsg.get()); + forwardToAppActor(id, actorMsg.get()); } callback.onSuccess(); } + private void forwardToAppActor(UUID id, TbActorMsg actorMsg) { + log.trace("[{}] Forwarding message to App Actor {}", id, actorMsg); + actorContext.tell(actorMsg); + } + private void forwardToEventService(ErrorEventProto eventProto, TbCallback callback) { Event event = ErrorEvent.builder() .tenantId(toTenantId(eventProto.getTenantIdMSB(), eventProto.getTenantIdLSB())) diff --git a/application/src/main/java/org/thingsboard/server/service/queue/ProtoUtils.java b/application/src/main/java/org/thingsboard/server/service/queue/ProtoUtils.java index e39949e891..76a8e3e89a 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/ProtoUtils.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/ProtoUtils.java @@ -16,14 +16,46 @@ package org.thingsboard.server.service.queue; import org.thingsboard.server.common.data.EntityType; +import org.thingsboard.server.common.data.id.DeviceId; +import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.EntityIdFactory; import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.kv.AttributeKey; +import org.thingsboard.server.common.data.kv.AttributeKvEntry; +import org.thingsboard.server.common.data.kv.BaseAttributeKvEntry; +import org.thingsboard.server.common.data.kv.BooleanDataEntry; +import org.thingsboard.server.common.data.kv.DoubleDataEntry; +import org.thingsboard.server.common.data.kv.JsonDataEntry; +import org.thingsboard.server.common.data.kv.KvEntry; +import org.thingsboard.server.common.data.kv.LongDataEntry; +import org.thingsboard.server.common.data.kv.StringDataEntry; import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; +import org.thingsboard.server.common.data.rpc.RpcError; +import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody; +import org.thingsboard.server.common.data.security.DeviceCredentials; +import org.thingsboard.server.common.data.security.DeviceCredentialsType; +import org.thingsboard.server.common.msg.ToDeviceActorNotificationMsg; +import org.thingsboard.server.common.msg.edge.EdgeEventUpdateMsg; +import org.thingsboard.server.common.msg.edge.FromEdgeSyncResponse; +import org.thingsboard.server.common.msg.edge.ToEdgeSyncRequest; import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg; +import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse; +import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponseActorMsg; +import org.thingsboard.server.common.msg.rpc.RemoveRpcActorMsg; +import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest; +import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequestActorMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceAttributesEventNotificationMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceCredentialsUpdateNotificationMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceEdgeUpdateMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceNameOrTypeUpdateMsg; import org.thingsboard.server.gen.transport.TransportProtos; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; +import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; public class ProtoUtils { @@ -62,4 +94,377 @@ public class ProtoUtils { return entityTypeByProtoNumber[entityType.getNumber()]; } + + public static TransportProtos.ToEdgeSyncRequestMsgProto toProto(ToEdgeSyncRequest request) { + return TransportProtos.ToEdgeSyncRequestMsgProto.newBuilder() + .setTenantIdMSB(request.getTenantId().getId().getMostSignificantBits()) + .setTenantIdLSB(request.getTenantId().getId().getLeastSignificantBits()) + .setRequestIdMSB(request.getId().getMostSignificantBits()) + .setRequestIdLSB(request.getId().getLeastSignificantBits()) + .setEdgeIdMSB(request.getEdgeId().getId().getMostSignificantBits()) + .setEdgeIdLSB(request.getEdgeId().getId().getLeastSignificantBits()) + .build(); + } + + public static ToEdgeSyncRequest fromProto(TransportProtos.ToEdgeSyncRequestMsgProto proto) { + return new ToEdgeSyncRequest( + new UUID(proto.getRequestIdMSB(), proto.getRequestIdLSB()), + TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB())), + new EdgeId(new UUID(proto.getEdgeIdMSB(), proto.getEdgeIdLSB())) + ); + } + + public static TransportProtos.FromEdgeSyncResponseMsgProto toProto(FromEdgeSyncResponse response) { + return TransportProtos.FromEdgeSyncResponseMsgProto.newBuilder() + .setTenantIdMSB(response.getTenantId().getId().getMostSignificantBits()) + .setTenantIdLSB(response.getTenantId().getId().getLeastSignificantBits()) + .setResponseIdMSB(response.getId().getMostSignificantBits()) + .setResponseIdLSB(response.getId().getLeastSignificantBits()) + .setEdgeIdMSB(response.getEdgeId().getId().getMostSignificantBits()) + .setEdgeIdLSB(response.getEdgeId().getId().getLeastSignificantBits()) + .setSuccess(response.isSuccess()) + .build(); + } + + public static FromEdgeSyncResponse fromProto(TransportProtos.FromEdgeSyncResponseMsgProto proto) { + return new FromEdgeSyncResponse( + new UUID(proto.getResponseIdMSB(), proto.getResponseIdLSB()), + TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB())), + new EdgeId(new UUID(proto.getEdgeIdMSB(), proto.getEdgeIdLSB())), + proto.getSuccess() + ); + } + + public static TransportProtos.EdgeEventUpdateMsgProto toProto(EdgeEventUpdateMsg msg) { + return TransportProtos.EdgeEventUpdateMsgProto.newBuilder() + .setTenantIdMSB(msg.getTenantId().getId().getMostSignificantBits()) + .setTenantIdLSB(msg.getTenantId().getId().getLeastSignificantBits()) + .setEdgeIdMSB(msg.getEdgeId().getId().getMostSignificantBits()) + .setEdgeIdLSB(msg.getEdgeId().getId().getLeastSignificantBits()) + .build(); + } + + public static EdgeEventUpdateMsg fromProto(TransportProtos.EdgeEventUpdateMsgProto proto) { + return new EdgeEventUpdateMsg( + TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB())), + new EdgeId(new UUID(proto.getEdgeIdMSB(), proto.getEdgeIdLSB())) + ); + } + + private static TransportProtos.DeviceEdgeUpdateMsgProto toProto(DeviceEdgeUpdateMsg msg) { + return TransportProtos.DeviceEdgeUpdateMsgProto.newBuilder() + .setTenantIdMSB(msg.getTenantId().getId().getMostSignificantBits()) + .setTenantIdLSB(msg.getTenantId().getId().getLeastSignificantBits()) + .setDeviceIdMSB(msg.getDeviceId().getId().getMostSignificantBits()) + .setDeviceIdLSB(msg.getDeviceId().getId().getLeastSignificantBits()) + .setEdgeIdMSB(msg.getEdgeId().getId().getMostSignificantBits()) + .setEdgeIdLSB(msg.getEdgeId().getId().getLeastSignificantBits()) + .build(); + } + + private static DeviceEdgeUpdateMsg fromProto(TransportProtos.DeviceEdgeUpdateMsgProto proto) { + return new DeviceEdgeUpdateMsg( + TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB())), + new DeviceId(new UUID(proto.getDeviceIdMSB(), proto.getDeviceIdLSB())), + new EdgeId(new UUID(proto.getEdgeIdMSB(), proto.getEdgeIdLSB())) + ); + } + + private static TransportProtos.DeviceNameOrTypeUpdateMsgProto toProto(DeviceNameOrTypeUpdateMsg msg) { + return TransportProtos.DeviceNameOrTypeUpdateMsgProto.newBuilder() + .setTenantIdMSB(msg.getTenantId().getId().getMostSignificantBits()) + .setTenantIdLSB(msg.getTenantId().getId().getLeastSignificantBits()) + .setDeviceIdMSB(msg.getDeviceId().getId().getMostSignificantBits()) + .setDeviceIdLSB(msg.getDeviceId().getId().getLeastSignificantBits()) + .setDeviceName(msg.getDeviceName()) + .setDeviceType(msg.getDeviceType()) + .build(); + } + + private static DeviceNameOrTypeUpdateMsg fromProto(TransportProtos.DeviceNameOrTypeUpdateMsgProto proto) { + return new DeviceNameOrTypeUpdateMsg( + TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB())), + new DeviceId(new UUID(proto.getDeviceIdMSB(), proto.getDeviceIdLSB())), + proto.getDeviceName(), + proto.getDeviceType() + ); + } + + private static TransportProtos.DeviceAttributesEventMsgProto toProto(DeviceAttributesEventNotificationMsg msg) { + TransportProtos.DeviceAttributesEventMsgProto.Builder builder = TransportProtos.DeviceAttributesEventMsgProto.newBuilder(); + builder.setTenantIdMSB(msg.getTenantId().getId().getMostSignificantBits()) + .setTenantIdLSB(msg.getTenantId().getId().getLeastSignificantBits()) + .setDeviceIdMSB(msg.getDeviceId().getId().getMostSignificantBits()) + .setDeviceIdLSB(msg.getDeviceId().getId().getLeastSignificantBits()) + .setDeleted(msg.isDeleted()); + + if (msg.getScope() != null) { + builder.setScope(TransportProtos.AttributeScopeProto.valueOf(msg.getScope())); + } + + if (msg.getDeletedKeys() != null) { + for (AttributeKey key : msg.getDeletedKeys()) { + builder.addDeletedKeys(TransportProtos.AttributeKey.newBuilder() + .setScope(TransportProtos.AttributeScopeProto.valueOf(key.getScope())) + .setAttributeKey(key.getAttributeKey()) + .build()); + } + } + + if (msg.getValues() != null) { + for (AttributeKvEntry attributeKvEntry : msg.getValues()) { + TransportProtos.AttributeValueProto.Builder attributeValueBuilder = TransportProtos.AttributeValueProto.newBuilder() + .setLastUpdateTs(attributeKvEntry.getLastUpdateTs()) + .setKey(attributeKvEntry.getKey()); + switch (attributeKvEntry.getDataType()) { + case BOOLEAN: + attributeKvEntry.getBooleanValue().ifPresent(attributeValueBuilder::setBoolV); + attributeValueBuilder.setHasV(attributeKvEntry.getBooleanValue().isPresent()); + attributeValueBuilder.setType(TransportProtos.KeyValueType.BOOLEAN_V); + break; + case STRING: + attributeKvEntry.getStrValue().ifPresent(attributeValueBuilder::setStringV); + attributeValueBuilder.setHasV(attributeKvEntry.getStrValue().isPresent()); + attributeValueBuilder.setType(TransportProtos.KeyValueType.STRING_V); + break; + case DOUBLE: + attributeKvEntry.getDoubleValue().ifPresent(attributeValueBuilder::setDoubleV); + attributeValueBuilder.setHasV(attributeKvEntry.getDoubleValue().isPresent()); + attributeValueBuilder.setType(TransportProtos.KeyValueType.DOUBLE_V); + break; + case LONG: + attributeKvEntry.getLongValue().ifPresent(attributeValueBuilder::setLongV); + attributeValueBuilder.setHasV(attributeKvEntry.getLongValue().isPresent()); + attributeValueBuilder.setType(TransportProtos.KeyValueType.LONG_V); + break; + case JSON: + attributeKvEntry.getJsonValue().ifPresent(attributeValueBuilder::setJsonV); + attributeValueBuilder.setHasV(attributeKvEntry.getJsonValue().isPresent()); + attributeValueBuilder.setType(TransportProtos.KeyValueType.JSON_V); + break; + } + builder.addValues(attributeValueBuilder.build()); + } + } + return builder.build(); + } + + private static ToDeviceActorNotificationMsg fromProto(TransportProtos.DeviceAttributesEventMsgProto proto) { + return new DeviceAttributesEventNotificationMsg( + TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB())), + new DeviceId(new UUID(proto.getDeviceIdMSB(), proto.getDeviceIdLSB())), + getAttributeKeySetFromProto(proto.getDeletedKeysList()), + proto.hasScope() ? proto.getScope().name() : null, + getAttributesKvEntryFromProto(proto.getValuesList()), + proto.getDeleted() + ); + } + + private static TransportProtos.DeviceCredentialsUpdateMsgProto toProto(DeviceCredentialsUpdateNotificationMsg msg) { + TransportProtos.DeviceCredentialsProto.Builder protoBuilder = TransportProtos.DeviceCredentialsProto.newBuilder() + .setDeviceIdMSB(msg.getDeviceCredentials().getDeviceId().getId().getMostSignificantBits()) + .setDeviceIdLSB(msg.getDeviceCredentials().getDeviceId().getId().getLeastSignificantBits()) + .setCredentialsId(msg.getDeviceCredentials().getCredentialsId()) + .setCredentialsType(TransportProtos.CredentialsType.valueOf(msg.getDeviceCredentials().getCredentialsType().name())); + + if (msg.getDeviceCredentials().getCredentialsValue() != null) { + protoBuilder.setCredentialsValue(msg.getDeviceCredentials().getCredentialsValue()); + } + + return TransportProtos.DeviceCredentialsUpdateMsgProto.newBuilder() + .setTenantIdMSB(msg.getTenantId().getId().getMostSignificantBits()) + .setTenantIdLSB(msg.getTenantId().getId().getLeastSignificantBits()) + .setDeviceIdMSB(msg.getDeviceId().getId().getMostSignificantBits()) + .setDeviceIdLSB(msg.getDeviceId().getId().getLeastSignificantBits()) + .setDeviceCredentials(protoBuilder.build()) + .build(); + } + + private static ToDeviceActorNotificationMsg fromProto(TransportProtos.DeviceCredentialsUpdateMsgProto proto) { + DeviceCredentials deviceCredentials = new DeviceCredentials(); + deviceCredentials.setDeviceId(new DeviceId(new UUID(proto.getDeviceCredentials().getDeviceIdMSB(), proto.getDeviceCredentials().getDeviceIdLSB()))); + deviceCredentials.setCredentialsId(proto.getDeviceCredentials().getCredentialsId()); + deviceCredentials.setCredentialsValue(proto.getDeviceCredentials().hasCredentialsValue() ? proto.getDeviceCredentials().getCredentialsValue() : null); + deviceCredentials.setCredentialsType(DeviceCredentialsType.valueOf(proto.getDeviceCredentials().getCredentialsType().name())); + return new DeviceCredentialsUpdateNotificationMsg( + TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB())), + new DeviceId(new UUID(proto.getDeviceIdMSB(), proto.getDeviceIdLSB())), + deviceCredentials + ); + } + + private static TransportProtos.ToDeviceRpcRequestActorMsgProto toProto(ToDeviceRpcRequestActorMsg msg) { + TransportProtos.ToDeviceRpcRequestMsg proto = TransportProtos.ToDeviceRpcRequestMsg.newBuilder() + .setMethodName(msg.getMsg().getBody().getMethod()) + .setParams(msg.getMsg().getBody().getParams()) + .setExpirationTime(msg.getMsg().getExpirationTime()) + .setRequestIdMSB(msg.getMsg().getId().getMostSignificantBits()) + .setRequestIdLSB(msg.getMsg().getId().getLeastSignificantBits()) + .setOneway(msg.getMsg().isOneway()) + .build(); + + return TransportProtos.ToDeviceRpcRequestActorMsgProto.newBuilder() + .setTenantIdMSB(msg.getTenantId().getId().getMostSignificantBits()) + .setTenantIdLSB(msg.getTenantId().getId().getLeastSignificantBits()) + .setDeviceIdMSB(msg.getDeviceId().getId().getMostSignificantBits()) + .setDeviceIdLSB(msg.getDeviceId().getId().getLeastSignificantBits()) + .setServiceId(msg.getServiceId()) + .setToDeviceRpcRequestMsg(proto) + .build(); + } + + private static ToDeviceActorNotificationMsg fromProto(TransportProtos.ToDeviceRpcRequestActorMsgProto proto) { + TransportProtos.ToDeviceRpcRequestMsg toDeviceRpcRequestMsg = proto.getToDeviceRpcRequestMsg(); + ToDeviceRpcRequest toDeviceRpcRequest = new ToDeviceRpcRequest( + new UUID(toDeviceRpcRequestMsg.getRequestIdMSB(), toDeviceRpcRequestMsg.getRequestIdLSB()), + TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB())), + new DeviceId(new UUID(proto.getDeviceIdMSB(), proto.getDeviceIdLSB())), + toDeviceRpcRequestMsg.getOneway(), + toDeviceRpcRequestMsg.getExpirationTime(), + new ToDeviceRpcRequestBody(toDeviceRpcRequestMsg.getMethodName(), toDeviceRpcRequestMsg.getParams()), + toDeviceRpcRequestMsg.getPersisted(), 0, ""); + return new ToDeviceRpcRequestActorMsg(proto.getServiceId(), toDeviceRpcRequest); + } + + private static TransportProtos.FromDeviceRpcResponseActorMsgProto toProto(FromDeviceRpcResponseActorMsg msg) { + TransportProtos.FromDeviceRPCResponseProto.Builder builder = TransportProtos.FromDeviceRPCResponseProto.newBuilder() + .setRequestIdMSB(msg.getMsg().getId().getMostSignificantBits()) + .setRequestIdLSB(msg.getMsg().getId().getLeastSignificantBits()) + .setError(msg.getMsg().getError().isPresent() ? msg.getMsg().getError().get().ordinal() : -1); + if (msg.getMsg().getResponse().isPresent()) { + builder.setResponse(msg.getMsg().getResponse().get()); + } + + return TransportProtos.FromDeviceRpcResponseActorMsgProto.newBuilder() + .setRequestId(msg.getRequestId()) + .setTenantIdMSB(msg.getTenantId().getId().getMostSignificantBits()) + .setTenantIdLSB(msg.getTenantId().getId().getLeastSignificantBits()) + .setDeviceIdMSB(msg.getDeviceId().getId().getMostSignificantBits()) + .setDeviceIdLSB(msg.getDeviceId().getId().getLeastSignificantBits()) + .setRpcResponse(builder.build()) + .build(); + } + + private static ToDeviceActorNotificationMsg fromProto(TransportProtos.FromDeviceRpcResponseActorMsgProto proto) { + FromDeviceRpcResponse fromDeviceRpcResponse = new FromDeviceRpcResponse( + new UUID(proto.getRpcResponse().getRequestIdMSB(), proto.getRpcResponse().getRequestIdLSB()), + proto.getRpcResponse().getResponse(), + proto.getRpcResponse().getError() >= 0 ? RpcError.values()[proto.getRpcResponse().getError()] : null); + return new FromDeviceRpcResponseActorMsg( + proto.getRequestId(), + TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB())), + new DeviceId(new UUID(proto.getDeviceIdMSB(), proto.getDeviceIdLSB())), + fromDeviceRpcResponse + ); + } + + private static TransportProtos.RemoveRpcActorMsgProto toProto(RemoveRpcActorMsg msg) { + return TransportProtos.RemoveRpcActorMsgProto.newBuilder() + .setTenantIdMSB(msg.getTenantId().getId().getMostSignificantBits()) + .setTenantIdLSB(msg.getTenantId().getId().getLeastSignificantBits()) + .setDeviceIdMSB(msg.getDeviceId().getId().getMostSignificantBits()) + .setDeviceIdLSB(msg.getDeviceId().getId().getLeastSignificantBits()) + .setRequestIdMSB(msg.getRequestId().getMostSignificantBits()) + .setRequestIdLSB(msg.getRequestId().getLeastSignificantBits()) + .build(); + } + + private static ToDeviceActorNotificationMsg fromProto(TransportProtos.RemoveRpcActorMsgProto proto) { + return new RemoveRpcActorMsg( + TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB())), + new DeviceId(new UUID(proto.getDeviceIdMSB(), proto.getDeviceIdLSB())), + new UUID(proto.getRequestIdMSB(), proto.getRequestIdLSB()) + ); + } + + public static TransportProtos.ToDeviceActorNotificationMsgProto toProto(ToDeviceActorNotificationMsg msg) { + if (msg instanceof DeviceEdgeUpdateMsg) { + DeviceEdgeUpdateMsg updateMsg = (DeviceEdgeUpdateMsg) msg; + TransportProtos.DeviceEdgeUpdateMsgProto proto = toProto(updateMsg); + return TransportProtos.ToDeviceActorNotificationMsgProto.newBuilder().setDeviceEdgeUpdateMsg(proto).build(); + } else if (msg instanceof DeviceNameOrTypeUpdateMsg) { + DeviceNameOrTypeUpdateMsg updateMsg = (DeviceNameOrTypeUpdateMsg) msg; + TransportProtos.DeviceNameOrTypeUpdateMsgProto proto = toProto(updateMsg); + return TransportProtos.ToDeviceActorNotificationMsgProto.newBuilder().setDeviceNameOrTypeMsg(proto).build(); + } else if (msg instanceof DeviceAttributesEventNotificationMsg) { + DeviceAttributesEventNotificationMsg updateMsg = (DeviceAttributesEventNotificationMsg) msg; + TransportProtos.DeviceAttributesEventMsgProto proto = toProto(updateMsg); + return TransportProtos.ToDeviceActorNotificationMsgProto.newBuilder().setDeviceAttributesEventMsg(proto).build(); + } else if (msg instanceof DeviceCredentialsUpdateNotificationMsg) { + DeviceCredentialsUpdateNotificationMsg updateMsg = (DeviceCredentialsUpdateNotificationMsg) msg; + TransportProtos.DeviceCredentialsUpdateMsgProto proto = toProto(updateMsg); + return TransportProtos.ToDeviceActorNotificationMsgProto.newBuilder().setDeviceCredentialsUpdateMsg(proto).build(); + } else if (msg instanceof ToDeviceRpcRequestActorMsg) { + ToDeviceRpcRequestActorMsg updateMsg = (ToDeviceRpcRequestActorMsg) msg; + TransportProtos.ToDeviceRpcRequestActorMsgProto proto = toProto(updateMsg); + return TransportProtos.ToDeviceActorNotificationMsgProto.newBuilder().setToDeviceRpcRequestMsg(proto).build(); + } else if (msg instanceof FromDeviceRpcResponseActorMsg) { + FromDeviceRpcResponseActorMsg updateMsg = (FromDeviceRpcResponseActorMsg) msg; + TransportProtos.FromDeviceRpcResponseActorMsgProto proto = toProto(updateMsg); + return TransportProtos.ToDeviceActorNotificationMsgProto.newBuilder().setFromDeviceRpcResponseMsg(proto).build(); + } else if (msg instanceof RemoveRpcActorMsg) { + RemoveRpcActorMsg updateMsg = (RemoveRpcActorMsg) msg; + TransportProtos.RemoveRpcActorMsgProto proto = toProto(updateMsg); + return TransportProtos.ToDeviceActorNotificationMsgProto.newBuilder().setRemoveRpcActorMsg(proto).build(); + } + return null; + } + + public static ToDeviceActorNotificationMsg fromProto(TransportProtos.ToDeviceActorNotificationMsgProto proto) { + if (proto.hasDeviceEdgeUpdateMsg()) { + return fromProto(proto.getDeviceEdgeUpdateMsg()); + } else if (proto.hasDeviceNameOrTypeMsg()) { + return fromProto(proto.getDeviceNameOrTypeMsg()); + } else if (proto.hasDeviceAttributesEventMsg()) { + return fromProto(proto.getDeviceAttributesEventMsg()); + } else if (proto.hasDeviceCredentialsUpdateMsg()) { + return fromProto(proto.getDeviceCredentialsUpdateMsg()); + } else if (proto.hasToDeviceRpcRequestMsg()) { + return fromProto(proto.getToDeviceRpcRequestMsg()); + } else if (proto.hasFromDeviceRpcResponseMsg()) { + return fromProto(proto.getFromDeviceRpcResponseMsg()); + } else if (proto.hasRemoveRpcActorMsg()) { + return fromProto(proto.getRemoveRpcActorMsg()); + } + return null; + } + + private static Set getAttributeKeySetFromProto(List deletedKeysList) { + if (deletedKeysList.isEmpty()) { + return null; + } + return deletedKeysList.stream() + .map(attributeKey -> new AttributeKey(attributeKey.getScope().name(), attributeKey.getAttributeKey())) + .collect(Collectors.toSet()); + } + + private static List getAttributesKvEntryFromProto(List valuesList) { + if (valuesList.isEmpty()) { + return null; + } + List result = new ArrayList<>(); + for (TransportProtos.AttributeValueProto kvEntry : valuesList) { + boolean hasValue = kvEntry.getHasV(); + KvEntry entry = null; + switch (kvEntry.getType()) { + case BOOLEAN_V: + entry = new BooleanDataEntry(kvEntry.getKey(), hasValue ? kvEntry.getBoolV() : null); + break; + case LONG_V: + entry = new LongDataEntry(kvEntry.getKey(), hasValue ? kvEntry.getLongV() : null); + break; + case DOUBLE_V: + entry = new DoubleDataEntry(kvEntry.getKey(), hasValue ? kvEntry.getDoubleV() : null); + break; + case STRING_V: + entry = new StringDataEntry(kvEntry.getKey(), hasValue ? kvEntry.getStringV() : null); + break; + case JSON_V: + entry = new JsonDataEntry(kvEntry.getKey(), hasValue ? kvEntry.getJsonV() : null); + break; + } + result.add(new BaseAttributeKvEntry(kvEntry.getLastUpdateTs(), entry)); + } + return result; + } } diff --git a/application/src/main/java/org/thingsboard/server/service/queue/TbCoreConsumerStats.java b/application/src/main/java/org/thingsboard/server/service/queue/TbCoreConsumerStats.java index 9107159615..5ff72e97e3 100644 --- a/application/src/main/java/org/thingsboard/server/service/queue/TbCoreConsumerStats.java +++ b/application/src/main/java/org/thingsboard/server/service/queue/TbCoreConsumerStats.java @@ -172,10 +172,16 @@ public class TbCoreConsumerStats { toCoreNfComponentLifecycleCounter.increment(); } else if (!msg.getComponentLifecycleMsg().isEmpty()) { toCoreNfComponentLifecycleCounter.increment(); + } else if (msg.hasEdgeEventUpdate()) { + toCoreNfEdgeEventUpdateCounter.increment(); } else if (!msg.getEdgeEventUpdateMsg().isEmpty()) { toCoreNfEdgeEventUpdateCounter.increment(); + } else if (msg.hasToEdgeSyncRequest()) { + toCoreNfEdgeSyncRequestCounter.increment(); } else if (!msg.getToEdgeSyncRequestMsg().isEmpty()) { toCoreNfEdgeSyncRequestCounter.increment(); + } else if (msg.hasFromEdgeSyncResponse()) { + toCoreNfEdgeSyncResponseCounter.increment(); } else if (!msg.getFromEdgeSyncResponseMsg().isEmpty()) { toCoreNfEdgeSyncResponseCounter.increment(); } else if (msg.hasQueueUpdateMsg()) { diff --git a/application/src/main/java/org/thingsboard/server/service/rpc/DefaultTbCoreDeviceRpcService.java b/application/src/main/java/org/thingsboard/server/service/rpc/DefaultTbCoreDeviceRpcService.java index 8ea7208c55..d421466963 100644 --- a/application/src/main/java/org/thingsboard/server/service/rpc/DefaultTbCoreDeviceRpcService.java +++ b/application/src/main/java/org/thingsboard/server/service/rpc/DefaultTbCoreDeviceRpcService.java @@ -31,6 +31,8 @@ import org.thingsboard.server.common.data.rpc.RpcError; import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsgDataType; import org.thingsboard.server.common.msg.TbMsgMetaData; +import org.thingsboard.server.common.msg.rpc.RemoveRpcActorMsg; +import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequestActorMsg; import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse; import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest; import org.thingsboard.server.dao.device.DeviceService; diff --git a/application/src/main/java/org/thingsboard/server/service/rpc/DefaultTbRuleEngineRpcService.java b/application/src/main/java/org/thingsboard/server/service/rpc/DefaultTbRuleEngineRpcService.java index 1fef6acbc0..2d854e5604 100644 --- a/application/src/main/java/org/thingsboard/server/service/rpc/DefaultTbRuleEngineRpcService.java +++ b/application/src/main/java/org/thingsboard/server/service/rpc/DefaultTbRuleEngineRpcService.java @@ -27,6 +27,7 @@ import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.rpc.Rpc; import org.thingsboard.server.common.data.rpc.RpcError; import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody; +import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequestActorMsg; import org.thingsboard.server.common.msg.queue.ServiceType; import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse; diff --git a/application/src/main/java/org/thingsboard/server/service/rpc/TbCoreDeviceRpcService.java b/application/src/main/java/org/thingsboard/server/service/rpc/TbCoreDeviceRpcService.java index 9b81f4c6de..973d88d58a 100644 --- a/application/src/main/java/org/thingsboard/server/service/rpc/TbCoreDeviceRpcService.java +++ b/application/src/main/java/org/thingsboard/server/service/rpc/TbCoreDeviceRpcService.java @@ -15,6 +15,8 @@ */ package org.thingsboard.server.service.rpc; +import org.thingsboard.server.common.msg.rpc.RemoveRpcActorMsg; +import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequestActorMsg; import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse; import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest; import org.thingsboard.server.service.security.model.SecurityUser; diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultSubscriptionManagerService.java b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultSubscriptionManagerService.java index 60fce13560..812ca137aa 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultSubscriptionManagerService.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultSubscriptionManagerService.java @@ -17,11 +17,9 @@ package org.thingsboard.server.service.subscription; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; -import org.thingsboard.common.util.DonAsynchron; -import org.thingsboard.common.util.JacksonUtil; -import org.thingsboard.common.util.ThingsBoardThreadFactory; -import org.thingsboard.rule.engine.api.msg.DeviceAttributesEventNotificationMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceAttributesEventNotificationMsg; import org.thingsboard.server.cluster.TbClusterService; import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.EntityType; @@ -30,57 +28,42 @@ import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.id.UserId; -import org.thingsboard.server.common.data.kv.Aggregation; import org.thingsboard.server.common.data.kv.AttributeKvEntry; -import org.thingsboard.server.common.data.kv.BaseReadTsKvQuery; +import org.thingsboard.server.common.data.kv.BaseAttributeKvEntry; import org.thingsboard.server.common.data.kv.BasicTsKvEntry; import org.thingsboard.server.common.data.kv.KvEntry; -import org.thingsboard.server.common.data.kv.ReadTsKvQuery; import org.thingsboard.server.common.data.kv.StringDataEntry; import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.common.msg.queue.ServiceType; import org.thingsboard.server.common.msg.queue.TbCallback; import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; -import org.thingsboard.server.dao.attributes.AttributesService; -import org.thingsboard.server.dao.timeseries.TimeseriesService; -import org.thingsboard.server.gen.transport.TransportProtos.LocalSubscriptionServiceMsgProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbAlarmSubscriptionUpdateProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbSubscriptionUpdateProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbSubscriptionUpdateTsValue; -import org.thingsboard.server.gen.transport.TransportProtos.TbSubscriptionUpdateValueListProto; import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.PartitionService; import org.thingsboard.server.queue.discovery.TbApplicationEventListener; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.discovery.event.PartitionChangeEvent; +import org.thingsboard.server.queue.discovery.event.OtherServiceShutdownEvent; import org.thingsboard.server.queue.provider.TbQueueProducerProvider; import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.state.DefaultDeviceStateService; import org.thingsboard.server.service.state.DeviceStateService; -import org.thingsboard.server.service.ws.notification.sub.NotificationRequestUpdate; import org.thingsboard.server.service.ws.notification.sub.NotificationUpdate; import org.thingsboard.server.service.ws.notification.sub.NotificationsSubscriptionUpdate; -import org.thingsboard.server.service.ws.telemetry.sub.AlarmSubscriptionUpdate; -import org.thingsboard.server.service.ws.telemetry.sub.TelemetrySubscriptionUpdate; import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Set; -import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.function.Function; -import java.util.function.Predicate; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; +import java.util.stream.Collectors; @Slf4j @TbCoreComponent @@ -88,135 +71,96 @@ import java.util.function.Predicate; @RequiredArgsConstructor public class DefaultSubscriptionManagerService extends TbApplicationEventListener implements SubscriptionManagerService { - private final AttributesService attrService; - private final TimeseriesService tsService; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final PartitionService partitionService; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueProducerProvider producerProvider; private final TbLocalSubscriptionService localSubscriptionService; private final DeviceStateService deviceStateService; private final TbClusterService clusterService; + private final SubscriptionSchedulerComponent scheduler; - private final Map> subscriptionsByEntityId = new ConcurrentHashMap<>(); - private final Map> subscriptionsByWsSessionId = new ConcurrentHashMap<>(); - private final ConcurrentMap> partitionedSubscriptions = new ConcurrentHashMap<>(); - private final Set currentPartitions = ConcurrentHashMap.newKeySet(); + private final Lock subsLock = new ReentrantLock(); + private final ConcurrentMap entitySubscriptions = new ConcurrentHashMap<>(); + + private final ConcurrentMap entityUpdates = new ConcurrentHashMap<>(); - private ExecutorService tsCallBackExecutor; private String serviceId; private TbQueueProducer> toCoreNotificationsProducer; + private long initTs; + @PostConstruct public void initExecutor() { - tsCallBackExecutor = Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("ts-sub-callback")); serviceId = serviceInfoProvider.getServiceId(); + initTs = System.currentTimeMillis(); toCoreNotificationsProducer = producerProvider.getTbCoreNotificationsMsgProducer(); - } - - @PreDestroy - public void shutdownExecutor() { - if (tsCallBackExecutor != null) { - tsCallBackExecutor.shutdownNow(); - } + scheduler.scheduleWithFixedDelay(this::cleanupEntityUpdates, 1, 1, TimeUnit.HOURS); } @Override - public void addSubscription(TbSubscription subscription, TbCallback callback) { - log.trace("[{}][{}][{}] Registering subscription for entity [{}]", - subscription.getServiceId(), subscription.getSessionId(), subscription.getSubscriptionId(), subscription.getEntityId()); - TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_CORE, subscription.getTenantId(), subscription.getEntityId()); - if (currentPartitions.contains(tpi)) { - partitionedSubscriptions.computeIfAbsent(tpi, k -> ConcurrentHashMap.newKeySet()).add(subscription); + public void onSubEvent(String serviceId, TbEntitySubEvent event, TbCallback callback) { + var tenantId = event.getTenantId(); + var entityId = event.getEntityId(); + log.trace("[{}][{}][{}] Processing subscription event {}", tenantId, entityId, serviceId, event); + TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_CORE, tenantId, entityId); + if (tpi.isMyPartition()) { + subsLock.lock(); + try { + var entitySubs = entitySubscriptions.computeIfAbsent(entityId, id -> new TbEntityRemoteSubsInfo(tenantId, entityId)); + boolean empty = entitySubs.updateAndCheckIsEmpty(serviceId, event); + if (empty) { + entitySubscriptions.remove(entityId); + } + } finally { + subsLock.unlock(); + } callback.onSuccess(); + if (event.hasTsOrAttrSub()) { + sendSubEventCallback(serviceId, entityId, event.getSeqNumber()); + } } else { - log.warn("[{}][{}] Entity belongs to external partition. Probably rebalancing is in progress. Topic: {}" - , subscription.getTenantId(), subscription.getEntityId(), tpi.getFullTopicName()); + log.warn("[{}][{}][{}] Event belongs to external partition. Probably re-balancing is in progress. Topic: {}" + , tenantId, entityId, serviceId, tpi.getFullTopicName()); callback.onFailure(new RuntimeException("Entity belongs to external partition " + tpi.getFullTopicName() + "!")); } - boolean newSubscription = subscriptionsByEntityId - .computeIfAbsent(subscription.getEntityId(), k -> ConcurrentHashMap.newKeySet()).add(subscription); - subscriptionsByWsSessionId.computeIfAbsent(subscription.getSessionId(), k -> new ConcurrentHashMap<>()).put(subscription.getSubscriptionId(), subscription); - if (newSubscription) { - switch (subscription.getType()) { - case TIMESERIES: - handleNewTelemetrySubscription((TbTimeseriesSubscription) subscription); - break; - case ATTRIBUTES: - handleNewAttributeSubscription((TbAttributeSubscription) subscription); - break; - case ALARMS: - handleNewAlarmsSubscription((TbAlarmsSubscription) subscription); - break; - } - } } @Override - public void cancelSubscription(String sessionId, int subscriptionId, TbCallback callback) { - log.debug("[{}][{}] Going to remove subscription.", sessionId, subscriptionId); - Map sessionSubscriptions = subscriptionsByWsSessionId.get(sessionId); - if (sessionSubscriptions != null) { - TbSubscription subscription = sessionSubscriptions.remove(subscriptionId); - if (subscription != null) { - removeSubscriptionFromEntityMap(subscription); - removeSubscriptionFromPartitionMap(subscription); - if (sessionSubscriptions.isEmpty()) { - subscriptionsByWsSessionId.remove(sessionId); - } - } else { - log.debug("[{}][{}] Subscription not found!", sessionId, subscriptionId); + @EventListener(OtherServiceShutdownEvent.class) + public void onApplicationEvent(OtherServiceShutdownEvent event) { + if (event.getServiceTypes() != null && event.getServiceTypes().contains(ServiceType.TB_CORE)) { + subsLock.lock(); + try { + int sizeBeforeCleanup = entitySubscriptions.size(); + entitySubscriptions.entrySet().removeIf(kv -> kv.getValue().removeAndCheckIsEmpty(event.getServiceId())); + log.info("[{}][{}] Removed {} entity subscription records due to server shutdown.", serviceId, event.getServiceId(), entitySubscriptions.size() - sizeBeforeCleanup); + } finally { + subsLock.unlock(); } + } + } + + private void sendSubEventCallback(String targetId, EntityId entityId, int seqNumber) { + var update = getEntityUpdatesInfo(entityId); + if (serviceId.equals(targetId)) { + localSubscriptionService.onSubEventCallback(entityId, seqNumber, update, TbCallback.EMPTY); } else { - log.debug("[{}] No session subscriptions found!", sessionId); + sendCoreNotification(targetId, entityId, TbSubscriptionUtils.toProto(entityId.getId(), seqNumber, update)); } - callback.onSuccess(); } @Override protected void onTbApplicationEvent(PartitionChangeEvent partitionChangeEvent) { if (ServiceType.TB_CORE.equals(partitionChangeEvent.getServiceType())) { - Set removedPartitions = new HashSet<>(currentPartitions); - removedPartitions.removeAll(partitionChangeEvent.getPartitions()); - - currentPartitions.clear(); - currentPartitions.addAll(partitionChangeEvent.getPartitions()); - - // We no longer manage current partition of devices; - removedPartitions.forEach(partition -> { - Set subs = partitionedSubscriptions.remove(partition); - if (subs != null) { - subs.forEach(sub -> { - if (!serviceId.equals(sub.getServiceId())) { - removeSubscriptionFromEntityMap(sub); - } - }); - } - }); + entitySubscriptions.values().removeIf(sub -> + !partitionService.resolve(ServiceType.TB_CORE, sub.getTenantId(), sub.getEntityId()).isMyPartition()); } } @Override public void onTimeSeriesUpdate(TenantId tenantId, EntityId entityId, List ts, TbCallback callback) { - onLocalTelemetrySubUpdate(entityId, - s -> { - if (TbSubscriptionType.TIMESERIES.equals(s.getType())) { - return (TbTimeseriesSubscription) s; - } else { - return null; - } - }, s -> true, s -> { - List subscriptionUpdate = null; - for (TsKvEntry kv : ts) { - if ((s.isAllKeys() || s.getKeyStates().containsKey((kv.getKey())))) { - if (subscriptionUpdate == null) { - subscriptionUpdate = new ArrayList<>(); - } - subscriptionUpdate.add(kv); - } - } - return subscriptionUpdate; - }, true); + onTimeSeriesUpdate(entityId, ts); if (entityId.getEntityType() == EntityType.DEVICE) { updateDeviceInactivityTimeout(tenantId, entityId, ts); } @@ -224,168 +168,68 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene } @Override - public void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List attributes, TbCallback callback) { - onAttributesUpdate(tenantId, entityId, scope, attributes, true, callback); - } - - @Override - public void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List attributes, boolean notifyDevice, TbCallback callback) { - onLocalTelemetrySubUpdate(entityId, - s -> { - if (TbSubscriptionType.ATTRIBUTES.equals(s.getType())) { - return (TbAttributeSubscription) s; - } else { - return null; - } - }, - s -> (TbAttributeSubscriptionScope.ANY_SCOPE.equals(s.getScope()) || scope.equals(s.getScope().name())), - s -> { - List subscriptionUpdate = null; - for (AttributeKvEntry kv : attributes) { - if (s.isAllKeys() || s.getKeyStates().containsKey(kv.getKey())) { - if (subscriptionUpdate == null) { - subscriptionUpdate = new ArrayList<>(); - } - subscriptionUpdate.add(new BasicTsKvEntry(kv.getLastUpdateTs(), kv)); - } - } - return subscriptionUpdate; - }, true); + public void onTimeSeriesDelete(TenantId tenantId, EntityId entityId, List keys, TbCallback callback) { + onTimeSeriesUpdate(entityId, + keys.stream().map(key -> new BasicTsKvEntry(0, new StringDataEntry(key, ""))).collect(Collectors.toList())); if (entityId.getEntityType() == EntityType.DEVICE) { - if (TbAttributeSubscriptionScope.SERVER_SCOPE.name().equalsIgnoreCase(scope)) { - updateDeviceInactivityTimeout(tenantId, entityId, attributes); - } else if (TbAttributeSubscriptionScope.SHARED_SCOPE.name().equalsIgnoreCase(scope) && notifyDevice) { - clusterService.pushMsgToCore(DeviceAttributesEventNotificationMsg.onUpdate(tenantId, - new DeviceId(entityId.getId()), DataConstants.SHARED_SCOPE, new ArrayList<>(attributes)) - , null); - } + deleteDeviceInactivityTimeout(tenantId, entityId, keys); } callback.onSuccess(); } - private void updateDeviceInactivityTimeout(TenantId tenantId, EntityId entityId, List kvEntries) { - for (KvEntry kvEntry : kvEntries) { - if (kvEntry.getKey().equals(DefaultDeviceStateService.INACTIVITY_TIMEOUT)) { - deviceStateService.onDeviceInactivityTimeoutUpdate(tenantId, new DeviceId(entityId.getId()), getLongValue(kvEntry)); - } + public void onTimeSeriesUpdate(EntityId entityId, List update) { + getEntityUpdatesInfo(entityId).timeSeriesUpdateTs = System.currentTimeMillis(); + TbEntityRemoteSubsInfo subInfo = entitySubscriptions.get(entityId); + if (subInfo != null) { + log.trace("[{}] Handling time-series update: {}", entityId, update); + subInfo.getSubs().forEach((serviceId, sub) -> { + if (sub.tsAllKeys) { + onTimeSeriesUpdate(serviceId, entityId, update); + } else if (sub.tsKeys != null) { + List tmp = getSubList(update, sub.tsKeys); + if (tmp != null) { + onTimeSeriesUpdate(serviceId, entityId, tmp); + } + } + }); + } else { + log.trace("[{}] No time-series subscriptions for entity.", entityId); } } - private void deleteDeviceInactivityTimeout(TenantId tenantId, EntityId entityId, List keys) { - for (String key : keys) { - if (key.equals(DefaultDeviceStateService.INACTIVITY_TIMEOUT)) { - deviceStateService.onDeviceInactivityTimeoutUpdate(tenantId, new DeviceId(entityId.getId()), 0); - } + private void onTimeSeriesUpdate(String targetId, EntityId entityId, List update) { + if (serviceId.equals(targetId)) { + localSubscriptionService.onTimeSeriesUpdate(entityId, update, TbCallback.EMPTY); + } else { + sendCoreNotification(targetId, entityId, TbSubscriptionUtils.toProto(entityId, update)); } } @Override - public void onAlarmUpdate(TenantId tenantId, EntityId entityId, AlarmInfo alarm, TbCallback callback) { - onLocalAlarmSubUpdate(entityId, - s -> { - if (TbSubscriptionType.ALARMS.equals(s.getType())) { - return (TbAlarmsSubscription) s; - } else { - return null; - } - }, - s -> alarm.getCreatedTime() >= s.getTs() || alarm.getAssignTs() >= s.getTs(), - alarm, false - ); - callback.onSuccess(); - } - - @Override - public void onAlarmDeleted(TenantId tenantId, EntityId entityId, AlarmInfo alarm, TbCallback callback) { - onLocalAlarmSubUpdate(entityId, - s -> { - if (TbSubscriptionType.ALARMS.equals(s.getType())) { - return (TbAlarmsSubscription) s; - } else { - return null; - } - }, - s -> alarm.getCreatedTime() >= s.getTs(), - alarm, true - ); - callback.onSuccess(); - } - - @Override - public void onNotificationUpdate(TenantId tenantId, UserId recipientId, NotificationUpdate notificationUpdate, TbCallback callback) { - Set subscriptions = subscriptionsByEntityId.get(recipientId); - if (subscriptions != null) { - NotificationsSubscriptionUpdate subscriptionUpdate = new NotificationsSubscriptionUpdate(notificationUpdate); - log.trace("Handling notificationUpdate for user {}: {}", recipientId, notificationUpdate); - subscriptions.stream() - .filter(subscription -> subscription.getType() == TbSubscriptionType.NOTIFICATIONS - || subscription.getType() == TbSubscriptionType.NOTIFICATIONS_COUNT) - .forEach(subscription -> onNotificationsSubUpdate(subscriptionUpdate, subscription)); - } - callback.onSuccess(); + public void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List attributes, TbCallback callback) { + onAttributesUpdate(tenantId, entityId, scope, attributes, true, callback); } @Override - public void onNotificationRequestUpdate(TenantId tenantId, NotificationRequestUpdate notificationRequestUpdate, TbCallback callback) { - NotificationsSubscriptionUpdate subscriptionUpdate = new NotificationsSubscriptionUpdate(notificationRequestUpdate); - subscriptionsByEntityId.forEach((entityId, subscriptions) -> { - if (entityId.getEntityType() != EntityType.USER) { - return; + public void onAttributesUpdate(TenantId tenantId, EntityId entityId, String scope, List attributes, boolean notifyDevice, TbCallback callback) { + getEntityUpdatesInfo(entityId).attributesUpdateTs = System.currentTimeMillis(); + processAttributesUpdate(entityId, scope, attributes); + if (entityId.getEntityType() == EntityType.DEVICE) { + if (TbAttributeSubscriptionScope.SERVER_SCOPE.name().equalsIgnoreCase(scope)) { + updateDeviceInactivityTimeout(tenantId, entityId, attributes); + } else if (TbAttributeSubscriptionScope.SHARED_SCOPE.name().equalsIgnoreCase(scope) && notifyDevice) { + clusterService.pushMsgToCore(DeviceAttributesEventNotificationMsg.onUpdate(tenantId, + new DeviceId(entityId.getId()), DataConstants.SHARED_SCOPE, new ArrayList<>(attributes)) + , null); } - log.trace("Handling notificationRequestUpdate for user {}: {}", entityId, notificationRequestUpdate); - subscriptions.forEach(subscription -> { - if (subscription.getType() != TbSubscriptionType.NOTIFICATIONS && - subscription.getType() != TbSubscriptionType.NOTIFICATIONS_COUNT) { - return; - } - if (!subscription.getTenantId().equals(tenantId)) { - return; - } - onNotificationsSubUpdate(subscriptionUpdate, subscription); - }); - }); - callback.onSuccess(); - } - - private void onNotificationsSubUpdate(NotificationsSubscriptionUpdate subscriptionUpdate, TbSubscription subscription) { - if (serviceId.equals(subscription.getServiceId())) { - log.trace("[{}][{}][{}] Subscription session is managed by current service, forwarding to localSubscriptionService (update: {})", - subscription.getServiceId(), subscription.getEntityId(), subscription.getSessionId(), subscriptionUpdate); - localSubscriptionService.onSubscriptionUpdate(subscription.getSessionId(), - subscription.getSubscriptionId(), subscriptionUpdate, TbCallback.EMPTY); - } else { - log.trace("[{}][{}][{}] Subscription session is not managed by current service (update: {})", - subscription.getServiceId(), subscription.getEntityId(), subscription.getSessionId(), subscriptionUpdate); - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, subscription.getServiceId()); - ToCoreNotificationMsg updateProto = TbSubscriptionUtils.notificationsSubUpdateToProto(subscription, subscriptionUpdate); - TbProtoQueueMsg queueMsg = new TbProtoQueueMsg<>(subscription.getEntityId().getId(), updateProto); - toCoreNotificationsProducer.send(tpi, queueMsg, null); } + callback.onSuccess(); } @Override public void onAttributesDelete(TenantId tenantId, EntityId entityId, String scope, List keys, boolean notifyDevice, TbCallback callback) { - onLocalTelemetrySubUpdate(entityId, - s -> { - if (TbSubscriptionType.ATTRIBUTES.equals(s.getType())) { - return (TbAttributeSubscription) s; - } else { - return null; - } - }, - s -> (TbAttributeSubscriptionScope.ANY_SCOPE.equals(s.getScope()) || scope.equals(s.getScope().name())), - s -> { - List subscriptionUpdate = null; - for (String key : keys) { - if (s.isAllKeys() || s.getKeyStates().containsKey(key)) { - if (subscriptionUpdate == null) { - subscriptionUpdate = new ArrayList<>(); - } - subscriptionUpdate.add(new BasicTsKvEntry(0, new StringDataEntry(key, ""))); - } - } - return subscriptionUpdate; - }, false); + processAttributesUpdate(entityId, scope, + keys.stream().map(key -> new BaseAttributeKvEntry(0, new StringDataEntry(key, ""))).collect(Collectors.toList())); if (entityId.getEntityType() == EntityType.DEVICE) { if (TbAttributeSubscriptionScope.SERVER_SCOPE.name().equalsIgnoreCase(scope) || TbAttributeSubscriptionScope.ANY_SCOPE.name().equalsIgnoreCase(scope)) { @@ -398,222 +242,117 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene callback.onSuccess(); } - @Override - public void onTimeSeriesDelete(TenantId tenantId, EntityId entityId, List keys, TbCallback callback) { - onLocalTelemetrySubUpdate(entityId, - s -> { - if (TbSubscriptionType.TIMESERIES.equals(s.getType())) { - return (TbTimeseriesSubscription) s; - } else { - return null; - } - }, s -> true, s -> { - List subscriptionUpdate = null; - for (String key : keys) { - if (s.isAllKeys() || s.getKeyStates().containsKey(key)) { - if (subscriptionUpdate == null) { - subscriptionUpdate = new ArrayList<>(); - } - subscriptionUpdate.add(new BasicTsKvEntry(0, new StringDataEntry(key, ""))); - } - } - return subscriptionUpdate; - }, false); - if (entityId.getEntityType() == EntityType.DEVICE) { - deleteDeviceInactivityTimeout(tenantId, entityId, keys); - } - callback.onSuccess(); - } - - private void onLocalTelemetrySubUpdate(EntityId entityId, - Function castFunction, - Predicate filterFunction, - Function> processFunction, - boolean ignoreEmptyUpdates) { - Set entitySubscriptions = subscriptionsByEntityId.get(entityId); - if (entitySubscriptions != null) { - entitySubscriptions.stream().map(castFunction).filter(Objects::nonNull).filter(filterFunction).forEach(s -> { - List subscriptionUpdate = processFunction.apply(s); - if (subscriptionUpdate != null && !subscriptionUpdate.isEmpty()) { - if (serviceId.equals(s.getServiceId())) { - TelemetrySubscriptionUpdate update = new TelemetrySubscriptionUpdate(s.getSubscriptionId(), subscriptionUpdate); - localSubscriptionService.onSubscriptionUpdate(s.getSessionId(), update, TbCallback.EMPTY); - } else { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, s.getServiceId()); - toCoreNotificationsProducer.send(tpi, toProto(s, subscriptionUpdate, ignoreEmptyUpdates), null); + public void processAttributesUpdate(EntityId entityId, String scope, List update) { + TbEntityRemoteSubsInfo subInfo = entitySubscriptions.get(entityId); + if (subInfo != null) { + log.trace("[{}] Handling attributes update: {}", entityId, update); + subInfo.getSubs().forEach((serviceId, sub) -> { + if (sub.attrAllKeys) { + processAttributesUpdate(serviceId, entityId, scope, update); + } else if (sub.attrKeys != null) { + List tmp = getSubList(update, sub.attrKeys); + if (tmp != null) { + processAttributesUpdate(serviceId, entityId, scope, tmp); } } }); } else { - log.debug("[{}] No device subscriptions to process!", entityId); + log.trace("[{}] No attributes subscriptions for entity.", entityId); } } - private void onLocalAlarmSubUpdate(EntityId entityId, - Function castFunction, - Predicate filterFunction, - AlarmInfo alarm, boolean deleted) { - Set entitySubscriptions = subscriptionsByEntityId.get(entityId); - if (alarm == null) { - log.warn("[{}] empty alarm update!", entityId); - return; - } - if (entitySubscriptions != null) { - entitySubscriptions.stream().map(castFunction).filter(Objects::nonNull).filter(filterFunction).forEach(s -> { - if (serviceId.equals(s.getServiceId())) { - AlarmSubscriptionUpdate update = new AlarmSubscriptionUpdate(s.getSubscriptionId(), alarm, deleted); - localSubscriptionService.onSubscriptionUpdate(s.getSessionId(), update, TbCallback.EMPTY); - } else { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, s.getServiceId()); - toCoreNotificationsProducer.send(tpi, toProto(s, alarm, deleted), null); - } - }); + private void processAttributesUpdate(String targetId, EntityId entityId, String scope, List update) { + List tsKvEntryList = update.stream().map(attr -> new BasicTsKvEntry(attr.getLastUpdateTs(), attr)).collect(Collectors.toList()); + if (serviceId.equals(targetId)) { + localSubscriptionService.onAttributesUpdate(entityId, scope, tsKvEntryList, TbCallback.EMPTY); } else { - log.debug("[{}] No device subscriptions to process!", entityId); + sendCoreNotification(targetId, entityId, TbSubscriptionUtils.toProto(scope, entityId, tsKvEntryList)); } } - private void removeSubscriptionFromEntityMap(TbSubscription sub) { - Set entitySubSet = subscriptionsByEntityId.get(sub.getEntityId()); - if (entitySubSet != null) { - entitySubSet.remove(sub); - if (entitySubSet.isEmpty()) { - subscriptionsByEntityId.remove(sub.getEntityId()); + private void updateDeviceInactivityTimeout(TenantId tenantId, EntityId entityId, List kvEntries) { + for (KvEntry kvEntry : kvEntries) { + if (kvEntry.getKey().equals(DefaultDeviceStateService.INACTIVITY_TIMEOUT)) { + deviceStateService.onDeviceInactivityTimeoutUpdate(tenantId, new DeviceId(entityId.getId()), getLongValue(kvEntry)); } } } - private void removeSubscriptionFromPartitionMap(TbSubscription sub) { - TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_CORE, sub.getTenantId(), sub.getEntityId()); - Set subs = partitionedSubscriptions.get(tpi); - if (subs != null) { - subs.remove(sub); + private void deleteDeviceInactivityTimeout(TenantId tenantId, EntityId entityId, List keys) { + for (String key : keys) { + if (key.equals(DefaultDeviceStateService.INACTIVITY_TIMEOUT)) { + deviceStateService.onDeviceInactivityTimeoutUpdate(tenantId, new DeviceId(entityId.getId()), 0); + } } } - private void handleNewAttributeSubscription(TbAttributeSubscription subscription) { - log.trace("[{}][{}][{}] Processing remote attribute subscription for entity [{}]", - serviceId, subscription.getSessionId(), subscription.getSubscriptionId(), subscription.getEntityId()); - - final Map keyStates = subscription.getKeyStates(); - DonAsynchron.withCallback(attrService.find(subscription.getTenantId(), subscription.getEntityId(), DataConstants.CLIENT_SCOPE, keyStates.keySet()), values -> { - List missedUpdates = new ArrayList<>(); - values.forEach(latestEntry -> { - if (latestEntry.getLastUpdateTs() > keyStates.get(latestEntry.getKey())) { - missedUpdates.add(new BasicTsKvEntry(latestEntry.getLastUpdateTs(), latestEntry)); - } - }); - if (!missedUpdates.isEmpty()) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, subscription.getServiceId()); - toCoreNotificationsProducer.send(tpi, toProto(subscription, missedUpdates), null); - } - }, - e -> log.error("Failed to fetch missed updates.", e), tsCallBackExecutor); + @Override + public void onAlarmUpdate(TenantId tenantId, EntityId entityId, AlarmInfo alarm, TbCallback callback) { + onAlarmSubUpdate(tenantId, entityId, alarm, false, callback); } - private void handleNewAlarmsSubscription(TbAlarmsSubscription subscription) { - log.trace("[{}][{}][{}] Processing remote alarm subscription for entity [{}]", - serviceId, subscription.getSessionId(), subscription.getSubscriptionId(), subscription.getEntityId()); - //TODO: @dlandiak search all new alarms for this entity. + @Override + public void onAlarmDeleted(TenantId tenantId, EntityId entityId, AlarmInfo alarm, TbCallback callback) { + onAlarmSubUpdate(tenantId, entityId, alarm, true, callback); } - private void handleNewTelemetrySubscription(TbTimeseriesSubscription subscription) { - log.trace("[{}][{}][{}] Processing remote telemetry subscription for entity [{}]", - serviceId, subscription.getSessionId(), subscription.getSubscriptionId(), subscription.getEntityId()); - - long curTs = System.currentTimeMillis(); - - if (subscription.isLatestValues()) { - DonAsynchron.withCallback(tsService.findLatest(subscription.getTenantId(), subscription.getEntityId(), subscription.getKeyStates().keySet()), - missedUpdates -> { - if (missedUpdates != null && !missedUpdates.isEmpty()) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, subscription.getServiceId()); - toCoreNotificationsProducer.send(tpi, toProto(subscription, missedUpdates), null); - } - }, - e -> log.error("Failed to fetch missed updates.", e), - tsCallBackExecutor); - } else { - List queries = new ArrayList<>(); - subscription.getKeyStates().forEach((key, value) -> { - if (curTs > value) { - long startTs = subscription.getStartTime() > 0 ? Math.max(subscription.getStartTime(), value + 1L) : (value + 1L); - long endTs = subscription.getEndTime() > 0 ? Math.min(subscription.getEndTime(), curTs) : curTs; - queries.add(new BaseReadTsKvQuery(key, startTs, endTs, 0, 1000, Aggregation.NONE)); + private void onAlarmSubUpdate(TenantId tenantId, EntityId entityId, AlarmInfo alarm, boolean deleted, TbCallback callback) { + TbEntityRemoteSubsInfo subInfo = entitySubscriptions.get(entityId); + if (subInfo != null) { + log.trace("[{}][{}] Handling alarm update {}: {}", tenantId, entityId, alarm, deleted); + for (Map.Entry entry : subInfo.getSubs().entrySet()) { + if (entry.getValue().notifications) { + onAlarmSubUpdate(entry.getKey(), entityId, alarm, deleted); } - }); - if (!queries.isEmpty()) { - DonAsynchron.withCallback(tsService.findAll(subscription.getTenantId(), subscription.getEntityId(), queries), - missedUpdates -> { - if (missedUpdates != null && !missedUpdates.isEmpty()) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, subscription.getServiceId()); - toCoreNotificationsProducer.send(tpi, toProto(subscription, missedUpdates), null); - } - }, - e -> log.error("Failed to fetch missed updates.", e), - tsCallBackExecutor); } } + callback.onSuccess(); } - private TbProtoQueueMsg toProto(TbSubscription subscription, List updates) { - return toProto(subscription, updates, true); + private void onAlarmSubUpdate(String targetServiceId, EntityId entityId, AlarmInfo alarm, boolean deleted) { + if (alarm == null) { + log.warn("[{}] empty alarm update!", entityId); + return; + } + if (serviceId.equals(targetServiceId)) { + log.trace("[{}] Forwarding to local service: {} deleted: {}", entityId, alarm, deleted); + localSubscriptionService.onAlarmUpdate(entityId, alarm, deleted, TbCallback.EMPTY); + } else { + sendCoreNotification(targetServiceId, entityId, + TbSubscriptionUtils.toAlarmSubUpdateToProto(entityId, alarm, deleted)); + } } - private TbProtoQueueMsg toProto(TbSubscription subscription, List updates, boolean ignoreEmptyUpdates) { - TbSubscriptionUpdateProto.Builder builder = TbSubscriptionUpdateProto.newBuilder(); - - builder.setSessionId(subscription.getSessionId()); - builder.setSubscriptionId(subscription.getSubscriptionId()); - - Map> data = new TreeMap<>(); - for (TsKvEntry tsEntry : updates) { - List values = data.computeIfAbsent(tsEntry.getKey(), k -> new ArrayList<>()); - Object[] value = new Object[2]; - value[0] = tsEntry.getTs(); - value[1] = tsEntry.getValueAsString(); - values.add(value); - } + private void sendCoreNotification(String targetServiceId, EntityId entityId, ToCoreNotificationMsg msg) { + log.trace("[{}] Forwarding to remote service [{}]: {}", entityId, targetServiceId, msg); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, targetServiceId); + TbProtoQueueMsg queueMsg = new TbProtoQueueMsg<>(entityId.getId(), msg); + toCoreNotificationsProducer.send(tpi, queueMsg, null); + } - data.forEach((key, value) -> { - TbSubscriptionUpdateValueListProto.Builder dataBuilder = TbSubscriptionUpdateValueListProto.newBuilder(); - dataBuilder.setKey(key); - boolean hasData = false; - for (Object v : value) { - Object[] array = (Object[]) v; - TbSubscriptionUpdateTsValue.Builder tsValueBuilder = TbSubscriptionUpdateTsValue.newBuilder(); - tsValueBuilder.setTs((long) array[0]); - String strVal = (String) array[1]; - if (strVal != null) { - hasData = true; - tsValueBuilder.setValue(strVal); + @Override + public void onNotificationUpdate(TenantId tenantId, UserId entityId, NotificationUpdate notificationUpdate, TbCallback callback) { + TbEntityRemoteSubsInfo subInfo = entitySubscriptions.get(entityId); + if (subInfo != null) { + NotificationsSubscriptionUpdate subscriptionUpdate = new NotificationsSubscriptionUpdate(notificationUpdate); + log.trace("[{}][{}] Handling notificationUpdate for user {}", tenantId, entityId, notificationUpdate); + for (Map.Entry entry : subInfo.getSubs().entrySet()) { + if (entry.getValue().notifications) { + onNotificationsSubUpdate(entry.getKey(), entityId, subscriptionUpdate); } - dataBuilder.addTsValue(tsValueBuilder.build()); - } - if (!ignoreEmptyUpdates || hasData) { - builder.addData(dataBuilder.build()); } - }); - - ToCoreNotificationMsg toCoreMsg = ToCoreNotificationMsg.newBuilder().setToLocalSubscriptionServiceMsg( - LocalSubscriptionServiceMsgProto.newBuilder().setSubUpdate(builder.build()).build()) - .build(); - return new TbProtoQueueMsg<>(subscription.getEntityId().getId(), toCoreMsg); + } + callback.onSuccess(); } - private TbProtoQueueMsg toProto(TbSubscription subscription, AlarmInfo alarm, boolean deleted) { - TbAlarmSubscriptionUpdateProto.Builder builder = TbAlarmSubscriptionUpdateProto.newBuilder(); - - builder.setSessionId(subscription.getSessionId()); - builder.setSubscriptionId(subscription.getSubscriptionId()); - builder.setAlarm(JacksonUtil.toString(alarm)); - builder.setDeleted(deleted); - - ToCoreNotificationMsg toCoreMsg = ToCoreNotificationMsg.newBuilder().setToLocalSubscriptionServiceMsg( - LocalSubscriptionServiceMsgProto.newBuilder() - .setAlarmSubUpdate(builder.build()).build()) - .build(); - return new TbProtoQueueMsg<>(subscription.getEntityId().getId(), toCoreMsg); + private void onNotificationsSubUpdate(String targetServiceId, EntityId entityId, NotificationsSubscriptionUpdate subscriptionUpdate) { + if (serviceId.equals(targetServiceId)) { + log.trace("[{}] Forwarding to local service: {}", entityId, subscriptionUpdate); + localSubscriptionService.onNotificationUpdate(entityId, subscriptionUpdate, TbCallback.EMPTY); + } else { + sendCoreNotification(targetServiceId, entityId, + TbSubscriptionUtils.notificationsSubUpdateToProto(entityId, subscriptionUpdate)); + } } private static long getLongValue(KvEntry kve) { @@ -639,4 +378,31 @@ public class DefaultSubscriptionManagerService extends TbApplicationEventListene } } + private static List getSubList(List ts, Set keys) { + List update = null; + for (T entry : ts) { + if (keys.contains(entry.getKey())) { + if (update == null) { + update = new ArrayList<>(ts.size()); + } + update.add(entry); + } + } + return update; + } + + private TbEntityUpdatesInfo getEntityUpdatesInfo(EntityId entityId) { + return entityUpdates.computeIfAbsent(entityId, id -> new TbEntityUpdatesInfo(initTs)); + } + + private void cleanupEntityUpdates() { + initTs = System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1); + int sizeBeforeCleanup = entityUpdates.size(); + entityUpdates.entrySet().removeIf(kv -> { + var v = kv.getValue(); + return initTs > v.attributesUpdateTs && initTs > v.timeSeriesUpdateTs; + }); + log.info("Removed {} old entity update records.", entityUpdates.size() - sizeBeforeCleanup); + } + } diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java index 4b37ba26b5..b45450cec8 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbEntityDataSubscriptionService.java @@ -641,7 +641,7 @@ public class DefaultTbEntityDataSubscriptionService implements TbEntityDataSubsc private void handleLatestCmd(TbEntityDataSubCtx ctx, LatestValueCmd latestCmd) { log.trace("[{}][{}] Going to process latest command: {}", ctx.getSessionId(), ctx.getCmdId(), latestCmd); - //Fetch the latest values for telemetry keys (in case they are not copied from NoSQL to SQL DB in hybrid mode. + //Fetch the latest values for telemetry keys in case they are not copied from NoSQL to SQL DB in hybrid mode. if (!tsInSqlDB) { log.trace("[{}][{}] Going to fetch missing latest values: {}", ctx.getSessionId(), ctx.getCmdId(), latestCmd); List allTsKeys = latestCmd.getKeys().stream() diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbLocalSubscriptionService.java b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbLocalSubscriptionService.java index 64f1de8662..1bb452f4a9 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbLocalSubscriptionService.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/DefaultTbLocalSubscriptionService.java @@ -16,85 +16,97 @@ package org.thingsboard.server.service.subscription; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; +import org.thingsboard.common.util.DonAsynchron; import org.thingsboard.common.util.ThingsBoardExecutors; +import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.server.cluster.TbClusterService; +import org.thingsboard.server.common.data.DataConstants; +import org.thingsboard.server.common.data.EntityType; +import org.thingsboard.server.common.data.alarm.AlarmInfo; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.kv.Aggregation; +import org.thingsboard.server.common.data.kv.BaseReadTsKvQuery; +import org.thingsboard.server.common.data.kv.BasicTsKvEntry; +import org.thingsboard.server.common.data.kv.ReadTsKvQuery; +import org.thingsboard.server.common.data.kv.TsKvEntry; +import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; import org.thingsboard.server.common.msg.queue.ServiceType; import org.thingsboard.server.common.msg.queue.TbCallback; import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; +import org.thingsboard.server.dao.attributes.AttributesService; +import org.thingsboard.server.dao.timeseries.TimeseriesService; import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.queue.discovery.PartitionService; -import org.thingsboard.server.queue.discovery.TbApplicationEventListener; +import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.discovery.event.ClusterTopologyChangeEvent; -import org.thingsboard.server.queue.discovery.event.PartitionChangeEvent; import org.thingsboard.server.queue.util.TbCoreComponent; +import org.thingsboard.server.service.ws.notification.sub.NotificationRequestUpdate; import org.thingsboard.server.service.ws.notification.sub.NotificationsSubscriptionUpdate; import org.thingsboard.server.service.ws.telemetry.sub.AlarmSubscriptionUpdate; import org.thingsboard.server.service.ws.telemetry.sub.TelemetrySubscriptionUpdate; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; -import java.util.Collections; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Consumer; +import java.util.function.Predicate; +import java.util.stream.Collectors; @Slf4j @TbCoreComponent @Service public class DefaultTbLocalSubscriptionService implements TbLocalSubscriptionService { - private final Set currentPartitions = ConcurrentHashMap.newKeySet(); - private final Map> subscriptionsBySessionId = new ConcurrentHashMap<>(); + private final ConcurrentMap>> subscriptionsBySessionId = new ConcurrentHashMap<>(); + private final ConcurrentMap subscriptionsByEntityId = new ConcurrentHashMap<>(); + private final ConcurrentMap entityUpdates = new ConcurrentHashMap<>(); - @Autowired - private PartitionService partitionService; + private final AttributesService attrService; + private final TimeseriesService tsService; + private final TbServiceInfoProvider serviceInfoProvider; + private final PartitionService partitionService; + private final TbClusterService clusterService; + private final SubscriptionManagerService subscriptionManagerService; - @Autowired - private TbClusterService clusterService; + private ExecutorService tsCallBackExecutor; - @Autowired - @Lazy - private SubscriptionManagerService subscriptionManagerService; + public DefaultTbLocalSubscriptionService(AttributesService attrService, TimeseriesService tsService, TbServiceInfoProvider serviceInfoProvider, + PartitionService partitionService, TbClusterService clusterService, + @Lazy SubscriptionManagerService subscriptionManagerService) { + this.attrService = attrService; + this.tsService = tsService; + this.serviceInfoProvider = serviceInfoProvider; + this.partitionService = partitionService; + this.clusterService = clusterService; + this.subscriptionManagerService = subscriptionManagerService; + } + private String serviceId; private ExecutorService subscriptionUpdateExecutor; - private TbApplicationEventListener partitionChangeListener = new TbApplicationEventListener<>() { - @Override - protected void onTbApplicationEvent(PartitionChangeEvent event) { - if (ServiceType.TB_CORE.equals(event.getServiceType())) { - currentPartitions.clear(); - currentPartitions.addAll(event.getPartitions()); - } - } - }; - - private TbApplicationEventListener clusterTopologyChangeListener = new TbApplicationEventListener<>() { - @Override - protected void onTbApplicationEvent(ClusterTopologyChangeEvent event) { - if (event.getQueueKeys().stream().anyMatch(key -> ServiceType.TB_CORE.equals(key.getType()))) { - /* - * If the cluster topology has changed, we need to push all current subscriptions to SubscriptionManagerService again. - * Otherwise, the SubscriptionManagerService may "forget" those subscriptions in case of restart. - * Although this is resource consuming operation, it is cheaper than sending ping/pong commands periodically - * It is also cheaper then caching the subscriptions by entity id and then lookup of those caches every time we have new telemetry in SubscriptionManagerService. - * Even if we cache locally the list of active subscriptions by entity id, it is still time consuming operation to get them from cache - * Since number of subscriptions is usually much less then number of devices that are pushing data. - */ - subscriptionsBySessionId.values().forEach(map -> map.values() - .forEach(sub -> pushSubscriptionToManagerService(sub, true))); - } - } - }; + private final Lock subsLock = new ReentrantLock(); @PostConstruct public void initExecutor() { subscriptionUpdateExecutor = ThingsBoardExecutors.newWorkStealingPool(20, getClass()); + tsCallBackExecutor = Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("ts-sub-callback")); + serviceId = serviceInfoProvider.getServiceId(); } @PreDestroy @@ -102,79 +114,78 @@ public class DefaultTbLocalSubscriptionService implements TbLocalSubscriptionSer if (subscriptionUpdateExecutor != null) { subscriptionUpdateExecutor.shutdownNow(); } - } - - @Override - @EventListener(PartitionChangeEvent.class) - public void onApplicationEvent(PartitionChangeEvent event) { - partitionChangeListener.onApplicationEvent(event); + if (tsCallBackExecutor != null) { + tsCallBackExecutor.shutdownNow(); + } } @Override @EventListener(ClusterTopologyChangeEvent.class) public void onApplicationEvent(ClusterTopologyChangeEvent event) { - clusterTopologyChangeListener.onApplicationEvent(event); + if (event.getQueueKeys().stream().anyMatch(key -> ServiceType.TB_CORE.equals(key.getType()))) { + /* + * If the cluster topology has changed, we need to push all current subscriptions to SubscriptionManagerService again. + * Otherwise, the SubscriptionManagerService may "forget" those subscriptions in case of restart. + * Although this is resource consuming operation, it is cheaper than sending ping/pong commands periodically + * It is also cheaper than caching the subscriptions by entity id and then lookup of those caches every time we have new telemetry in SubscriptionManagerService. + * Even if we cache locally the list of active subscriptions by entity id, it is still time-consuming operation to get them from cache + * Since number of subscriptions is usually much less than number of devices that are pushing data. + */ + subscriptionsByEntityId.values().forEach(sub -> pushSubEventToManagerService(sub.getTenantId(), sub.getEntityId(), sub.toEvent(ComponentLifecycleEvent.UPDATED))); + } } - //TODO 3.1: replace null callbacks with callbacks from websocket service. @Override - public void addSubscription(TbSubscription subscription) { - pushSubscriptionToManagerService(subscription, true); - registerSubscription(subscription); + public void onCoreStartupMsg(TransportProtos.CoreStartupMsg coreStartupMsg) { + subscriptionUpdateExecutor.submit(() -> { + Set partitions = new HashSet<>(coreStartupMsg.getPartitionsList()); + AtomicInteger counter = new AtomicInteger(); + subscriptionsByEntityId.values().forEach(sub -> { + var tpi = partitionService.resolve(ServiceType.TB_CORE, sub.getTenantId(), sub.getEntityId()); + if (!tpi.isMyPartition() && partitions.contains(tpi.getPartition().orElse(Integer.MAX_VALUE))) { + pushToQueue(sub.getEntityId(), sub.toEvent(ComponentLifecycleEvent.UPDATED), tpi); + counter.incrementAndGet(); + } + }); + log.info("[{}] Pushed {} subscriptions to [{}]", serviceId, counter.get(), coreStartupMsg.getServiceId()); + }); } - private void pushSubscriptionToManagerService(TbSubscription subscription, boolean pushToLocalService) { - TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_CORE, subscription.getTenantId(), subscription.getEntityId()); - if (currentPartitions.contains(tpi)) { - // Subscription is managed on the same server; - if (pushToLocalService) { - subscriptionManagerService.addSubscription(subscription, TbCallback.EMPTY); - } - } else { - // Push to the queue; - TransportProtos.ToCoreMsg toCoreMsg = TbSubscriptionUtils.toNewSubscriptionProto(subscription); - clusterService.pushMsgToCore(tpi, subscription.getEntityId().getId(), toCoreMsg, null); - } + @Override + public void addSubscription(TbSubscription subscription) { + TenantId tenantId = subscription.getTenantId(); + EntityId entityId = subscription.getEntityId(); + log.debug("[{}][{}] Register subscription: {}", tenantId, entityId, subscription); + Map> sessionSubscriptions = subscriptionsBySessionId.computeIfAbsent(subscription.getSessionId(), k -> new ConcurrentHashMap<>()); + sessionSubscriptions.put(subscription.getSubscriptionId(), subscription); + modifySubscription(tenantId, entityId, subscription, true); } @Override - @SuppressWarnings("unchecked") - public void onSubscriptionUpdate(String sessionId, TelemetrySubscriptionUpdate update, TbCallback callback) { - TbSubscription subscription = subscriptionsBySessionId - .getOrDefault(sessionId, Collections.emptyMap()).get(update.getSubscriptionId()); - if (subscription != null) { - switch (subscription.getType()) { - case TIMESERIES: - TbTimeseriesSubscription tsSub = (TbTimeseriesSubscription) subscription; - update.getLatestValues().forEach((key, value) -> tsSub.getKeyStates().put(key, value)); - break; - case ATTRIBUTES: - TbAttributeSubscription attrSub = (TbAttributeSubscription) subscription; - update.getLatestValues().forEach((key, value) -> attrSub.getKeyStates().put(key, value)); - break; - } - subscriptionUpdateExecutor.submit(() -> subscription.getUpdateProcessor().accept(subscription, update)); - } - callback.onSuccess(); + public void onSubEventCallback(TransportProtos.TbEntitySubEventCallbackProto subEventCallback, TbCallback callback) { + UUID entityId = new UUID(subEventCallback.getEntityIdMSB(), subEventCallback.getEntityIdLSB()); + onSubEventCallback(entityId, subEventCallback.getSeqNumber(), new TbEntityUpdatesInfo(subEventCallback.getAttributesUpdateTs(), subEventCallback.getTimeSeriesUpdateTs()), callback); } @Override - @SuppressWarnings("unchecked") - public void onSubscriptionUpdate(String sessionId, AlarmSubscriptionUpdate update, TbCallback callback) { - TbSubscription subscription = subscriptionsBySessionId - .getOrDefault(sessionId, Collections.emptyMap()).get(update.getSubscriptionId()); - if (subscription != null && subscription.getType() == TbSubscriptionType.ALARMS) { - subscriptionUpdateExecutor.submit(() -> subscription.getUpdateProcessor().accept(subscription, update)); - } - callback.onSuccess(); + public void onSubEventCallback(EntityId entityId, int seqNumber, TbEntityUpdatesInfo entityUpdatesInfo, TbCallback callback) { + onSubEventCallback(entityId.getId(), seqNumber, entityUpdatesInfo, callback); } - @Override - public void onSubscriptionUpdate(String sessionId, int subscriptionId, NotificationsSubscriptionUpdate update, TbCallback callback) { - TbSubscription subscription = subscriptionsBySessionId.getOrDefault(sessionId, Collections.emptyMap()).get(subscriptionId); - if (subscription != null && (subscription.getType() == TbSubscriptionType.NOTIFICATIONS - || subscription.getType() == TbSubscriptionType.NOTIFICATIONS_COUNT)) { - subscriptionUpdateExecutor.submit(() -> subscription.getUpdateProcessor().accept(subscription, update)); + public void onSubEventCallback(UUID entityId, int seqNumber, TbEntityUpdatesInfo entityUpdatesInfo, TbCallback callback) { + entityUpdates.put(entityId, entityUpdatesInfo); + Set> pendingSubs = null; + subsLock.lock(); + try { + TbEntityLocalSubsInfo entitySubs = subscriptionsByEntityId.get(entityId); + if (entitySubs != null) { + pendingSubs = entitySubs.clearPendingSubscriptions(seqNumber); + } + } finally { + subsLock.unlock(); + } + if (pendingSubs != null) { + pendingSubs.forEach(this::checkMissedUpdates); } callback.onSuccess(); } @@ -182,22 +193,14 @@ public class DefaultTbLocalSubscriptionService implements TbLocalSubscriptionSer @Override public void cancelSubscription(String sessionId, int subscriptionId) { log.debug("[{}][{}] Going to remove subscription.", sessionId, subscriptionId); - Map sessionSubscriptions = subscriptionsBySessionId.get(sessionId); + Map> sessionSubscriptions = subscriptionsBySessionId.get(sessionId); if (sessionSubscriptions != null) { - TbSubscription subscription = sessionSubscriptions.remove(subscriptionId); + TbSubscription subscription = sessionSubscriptions.remove(subscriptionId); if (subscription != null) { if (sessionSubscriptions.isEmpty()) { subscriptionsBySessionId.remove(sessionId); } - TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_CORE, subscription.getTenantId(), subscription.getEntityId()); - if (currentPartitions.contains(tpi)) { - // Subscription is managed on the same server; - subscriptionManagerService.cancelSubscription(sessionId, subscriptionId, TbCallback.EMPTY); - } else { - // Push to the queue; - TransportProtos.ToCoreMsg toCoreMsg = TbSubscriptionUtils.toCloseSubscriptionProto(subscription); - clusterService.pushMsgToCore(tpi, subscription.getEntityId().getId(), toCoreMsg, null); - } + modifySubscription(subscription.getTenantId(), subscription.getEntityId(), subscription, false); } else { log.debug("[{}][{}] Subscription not found!", sessionId, subscriptionId); } @@ -208,16 +211,309 @@ public class DefaultTbLocalSubscriptionService implements TbLocalSubscriptionSer @Override public void cancelAllSessionSubscriptions(String sessionId) { - Map subscriptions = subscriptionsBySessionId.get(sessionId); - if (subscriptions != null) { - Set toRemove = new HashSet<>(subscriptions.keySet()); - toRemove.forEach(id -> cancelSubscription(sessionId, id)); + log.debug("[{}] Going to remove session subscriptions.", sessionId); + Map> sessionSubscriptions = subscriptionsBySessionId.remove(sessionId); + if (sessionSubscriptions != null) { + for (TbSubscription subscription : sessionSubscriptions.values()) { + modifySubscription(subscription.getTenantId(), subscription.getEntityId(), subscription, false); + } + } else { + log.debug("[{}] No session subscriptions found!", sessionId); } } - private void registerSubscription(TbSubscription subscription) { - Map sessionSubscriptions = subscriptionsBySessionId.computeIfAbsent(subscription.getSessionId(), k -> new ConcurrentHashMap<>()); - sessionSubscriptions.put(subscription.getSubscriptionId(), subscription); + @Override + public void onTimeSeriesUpdate(TransportProtos.TbSubUpdateProto proto, TbCallback callback) { + //TODO: optimize to avoid re-wrapping from TsValueListProto -> List -> Map>. Low priority. + onTimeSeriesUpdate(new UUID(proto.getEntityIdMSB(), proto.getEntityIdLSB()), TbSubscriptionUtils.fromProto(proto), callback); + } + + @Override + public void onTimeSeriesUpdate(EntityId entityId, List data, TbCallback callback) { + onTimeSeriesUpdate(entityId.getId(), data, callback); + } + + private void onTimeSeriesUpdate(UUID entityId, List data, TbCallback callback) { + entityUpdates.get(entityId).timeSeriesUpdateTs = System.currentTimeMillis(); + processSubscriptionData(entityId, + sub -> TbSubscriptionType.TIMESERIES.equals(sub.getType()), + s -> { + TbTimeSeriesSubscription sub = (TbTimeSeriesSubscription) s; + List updateData = null; + if (sub.isAllKeys()) { + updateData = data; + } else { + for (TsKvEntry kv : data) { + if (sub.getKeyStates().containsKey((kv.getKey()))) { + if (updateData == null) { + updateData = new ArrayList<>(); + } + updateData.add(kv); + } + } + } + if (updateData != null) { + TelemetrySubscriptionUpdate update = new TelemetrySubscriptionUpdate(sub.getSubscriptionId(), updateData); + update.getLatestValues().forEach((key, value) -> sub.getKeyStates().put(key, value)); + subscriptionUpdateExecutor.submit(() -> sub.getUpdateProcessor().accept(sub, update)); + } + }, callback); + } + + @Override + public void onAttributesUpdate(TransportProtos.TbSubUpdateProto proto, TbCallback callback) { + onAttributesUpdate(new UUID(proto.getEntityIdMSB(), proto.getEntityIdLSB()), proto.getScope(), TbSubscriptionUtils.fromProto(proto), callback); + } + + @Override + public void onAttributesUpdate(EntityId entityId, String scope, List data, TbCallback callback) { + onAttributesUpdate(entityId.getId(), scope, data, callback); + } + + private void onAttributesUpdate(UUID entityId, String scope, List data, TbCallback callback) { + entityUpdates.get(entityId).attributesUpdateTs = System.currentTimeMillis(); + processSubscriptionData(entityId, + sub -> TbSubscriptionType.ATTRIBUTES.equals(sub.getType()), + s -> { + TbAttributeSubscription sub = (TbAttributeSubscription) s; + if (sub.getScope() == null || TbAttributeSubscriptionScope.ANY_SCOPE.equals(sub.getScope()) || sub.getScope().name().equals(scope)) { + List updateData = null; + if (sub.isAllKeys()) { + updateData = data; + } else { + for (TsKvEntry kv : data) { + if (sub.getKeyStates().containsKey((kv.getKey()))) { + if (updateData == null) { + updateData = new ArrayList<>(); + } + updateData.add(kv); + } + } + } + if (updateData != null) { + TelemetrySubscriptionUpdate update = new TelemetrySubscriptionUpdate(sub.getSubscriptionId(), updateData); + update.getLatestValues().forEach((key, value) -> sub.getKeyStates().put(key, value)); + subscriptionUpdateExecutor.submit(() -> sub.getUpdateProcessor().accept(sub, update)); + } + } + }, callback); + } + + @Override + public void onAlarmUpdate(TransportProtos.TbAlarmSubUpdateProto proto, TbCallback callback) { + onAlarmUpdate(new UUID(proto.getEntityIdMSB(), proto.getEntityIdLSB()), TbSubscriptionUtils.fromProto(proto), callback); + } + + @Override + public void onAlarmUpdate(EntityId entityId, AlarmInfo alarm, boolean deleted, TbCallback callback) { + onAlarmUpdate(entityId.getId(), new AlarmSubscriptionUpdate(alarm, deleted), callback); + } + + private void onAlarmUpdate(UUID entityId, AlarmSubscriptionUpdate update, TbCallback callback) { + processSubscriptionData(entityId, + sub -> TbSubscriptionType.ALARMS.equals(sub.getType()), + update, callback); + } + + @Override + public void onNotificationUpdate(TransportProtos.NotificationsSubUpdateProto proto, TbCallback callback) { + onNotificationUpdate(new UUID(proto.getEntityIdMSB(), proto.getEntityIdLSB()), TbSubscriptionUtils.fromProto(proto), callback); + } + + @Override + public void onNotificationUpdate(EntityId entityId, NotificationsSubscriptionUpdate update, TbCallback callback) { + onNotificationUpdate(entityId.getId(), update, callback); + } + + private void onNotificationUpdate(UUID entityId, NotificationsSubscriptionUpdate update, TbCallback callback) { + processSubscriptionData(entityId, + sub -> TbSubscriptionType.NOTIFICATIONS.equals(sub.getType()) || TbSubscriptionType.NOTIFICATIONS_COUNT.equals(sub.getType()), + update, callback); + } + + @Override + @SuppressWarnings("unchecked") + public void onNotificationRequestUpdate(TenantId tenantId, NotificationRequestUpdate update, TbCallback callback) { + log.trace("[{}] Received notification request update: {}", tenantId, update); + NotificationsSubscriptionUpdate theUpdate = new NotificationsSubscriptionUpdate(update); + subscriptionsByEntityId.values().forEach(subInfo -> { + if (subInfo.isNf() && tenantId.equals(subInfo.getTenantId()) && EntityType.USER.equals(subInfo.getEntityId().getEntityType())) { + subInfo.getSubs().forEach(s -> { + TbSubscription sub = (TbSubscription) s; + subscriptionUpdateExecutor.submit(() -> sub.getUpdateProcessor().accept(sub, theUpdate)); + }); + } + }); + callback.onSuccess(); + } + + @SuppressWarnings("unchecked") + private void processSubscriptionData(UUID entityId, + Predicate> filter, + T data, + TbCallback callback) { + log.trace("[{}] Received subscription data: {}", entityId, data); + var subs = subscriptionsByEntityId.get(entityId); + if (subs != null) { + subs.getSubs().forEach(s -> { + if (filter.test(s)) { + subscriptionUpdateExecutor.submit(() -> { + TbSubscription sub = (TbSubscription) s; + sub.getUpdateProcessor().accept(sub, data); + }); + } + }); + } + callback.onSuccess(); + } + + private void processSubscriptionData(UUID entityId, + Predicate> filter, + Consumer> processor, + TbCallback callback) { + var subs = subscriptionsByEntityId.get(entityId); + if (subs != null) { + subs.getSubs().forEach(s -> { + if (filter.test(s)) { + processor.accept(s); + } + }); + } + callback.onSuccess(); + } + + private void modifySubscription(TenantId tenantId, EntityId entityId, TbSubscription subscription, boolean add) { + TbSubscription missedUpdatesCandidate = null; + TbEntitySubEvent event; + subsLock.lock(); + try { + TbEntityLocalSubsInfo entitySubs = subscriptionsByEntityId.computeIfAbsent(entityId.getId(), id -> new TbEntityLocalSubsInfo(tenantId, entityId)); + event = add ? entitySubs.add(subscription) : entitySubs.remove(subscription); + if (entitySubs.isEmpty()) { + subscriptionsByEntityId.remove(entityId.getId()); + entityUpdates.remove(entityId.getId()); + } else if (add) { + missedUpdatesCandidate = entitySubs.registerPendingSubscription(subscription, event); + } + } finally { + subsLock.unlock(); + } + if (event != null) { + log.trace("[{}][{}][{}] Event: {}", tenantId, entityId, subscription.getSubscriptionId(), event); + pushSubEventToManagerService(tenantId, entityId, event); + if (missedUpdatesCandidate != null) { + checkMissedUpdates(missedUpdatesCandidate); + } + } else { + log.trace("[{}][{}][{}] No changes detected.", tenantId, entityId, subscription.getSubscriptionId()); + } + } + + private void pushSubEventToManagerService(TenantId tenantId, EntityId entityId, TbEntitySubEvent event) { + TopicPartitionInfo tpi = partitionService.resolve(ServiceType.TB_CORE, tenantId, entityId); + if (tpi.isMyPartition()) { + // Subscription is managed on the same server; + subscriptionManagerService.onSubEvent(serviceId, event, TbCallback.EMPTY); + } else { + pushToQueue(entityId, event, tpi); + } + } + + private void pushToQueue(EntityId entityId, TbEntitySubEvent event, TopicPartitionInfo tpi) { + clusterService.pushMsgToCore(tpi, entityId.getId(), TbSubscriptionUtils.toSubEventProto(serviceId, event), null); + } + + private void checkMissedUpdates(TbSubscription subscription) { + log.trace("[{}][{}][{}] Check missed updates for subscription: {}", + subscription.getTenantId(), subscription.getEntityId(), subscription.getSubscriptionId(), subscription); + switch (subscription.getType()) { + case TIMESERIES: + handleNewTelemetrySubscription((TbTimeSeriesSubscription) subscription); + break; + case ATTRIBUTES: + handleNewAttributeSubscription((TbAttributeSubscription) subscription); + break; + } + } + + private void handleNewAttributeSubscription(TbAttributeSubscription subscription) { + log.trace("[{}][{}][{}] Processing attribute subscription for entity [{}]", + subscription.getTenantId(), subscription.getSessionId(), subscription.getSubscriptionId(), subscription.getEntityId()); + var entityUpdateInfo = entityUpdates.get(subscription.getEntityId().getId()); + if (entityUpdateInfo != null && entityUpdateInfo.attributesUpdateTs > 0 && subscription.getQueryTs() > entityUpdateInfo.attributesUpdateTs) { + log.trace("[{}][{}][{}] No need to check for missed updates [{}]", + subscription.getTenantId(), subscription.getSessionId(), subscription.getSubscriptionId(), subscription.getEntityId()); + return; + } + final Map keyStates = subscription.getKeyStates(); + String scope; + if (subscription.getScope() != null && !TbAttributeSubscriptionScope.ANY_SCOPE.equals(subscription.getScope())) { + scope = subscription.getScope().name(); + } else { + scope = DataConstants.CLIENT_SCOPE; + } + DonAsynchron.withCallback(attrService.find(subscription.getTenantId(), subscription.getEntityId(), scope, keyStates.keySet()), values -> { + List updates = new ArrayList<>(); + values.forEach(latestEntry -> { + if (latestEntry.getLastUpdateTs() > keyStates.get(latestEntry.getKey())) { + updates.add(new BasicTsKvEntry(latestEntry.getLastUpdateTs(), latestEntry)); + } + }); + var missedUpdates = updates.stream().filter(u -> u.getValue() != null).collect(Collectors.toList()); + if (!missedUpdates.isEmpty()) { + onAttributesUpdate(subscription.getEntityId(), scope, missedUpdates, TbCallback.EMPTY); + } + }, + e -> log.error("Failed to fetch missed updates.", e), tsCallBackExecutor); + } + + private void handleNewTelemetrySubscription(TbTimeSeriesSubscription subscription) { + log.trace("[{}][{}][{}] Processing telemetry subscription for entity [{}]", + subscription.getTenantId(), subscription.getSessionId(), subscription.getSubscriptionId(), subscription.getEntityId()); + var entityUpdateInfo = entityUpdates.get(subscription.getEntityId().getId()); + if (entityUpdateInfo != null && entityUpdateInfo.timeSeriesUpdateTs > 0 && subscription.getQueryTs() > entityUpdateInfo.timeSeriesUpdateTs) { + log.trace("[{}][{}][{}] No need to check for missed updates. time [{}][{}] diff: {}ms", + subscription.getTenantId(), subscription.getSessionId(), subscription.getSubscriptionId(), subscription.getQueryTs(), entityUpdateInfo.timeSeriesUpdateTs, subscription.getQueryTs() - entityUpdateInfo.timeSeriesUpdateTs); + return; + } + + long curTs = System.currentTimeMillis(); + + if (subscription.isLatestValues()) { + DonAsynchron.withCallback(tsService.findLatest(subscription.getTenantId(), subscription.getEntityId(), subscription.getKeyStates().keySet()), + missedUpdates -> { + if (missedUpdates != null && !missedUpdates.isEmpty()) { + missedUpdates = missedUpdates.stream().filter(u -> u.getValue() != null).collect(Collectors.toList()); + if (!missedUpdates.isEmpty()) { + onTimeSeriesUpdate(subscription.getEntityId(), missedUpdates, TbCallback.EMPTY); + } + } + }, + e -> log.error("Failed to fetch missed updates.", e), + tsCallBackExecutor); + } else { + List queries = new ArrayList<>(); + subscription.getKeyStates().forEach((key, value) -> { + if (curTs > value) { + long startTs = subscription.getStartTime() > 0 ? Math.max(subscription.getStartTime(), value + 1L) : (value + 1L); + long endTs = subscription.getEndTime() > 0 ? Math.min(subscription.getEndTime(), curTs) : curTs; + queries.add(new BaseReadTsKvQuery(key, startTs, endTs, 0, 1000, Aggregation.NONE)); + } + }); + if (!queries.isEmpty()) { + DonAsynchron.withCallback(tsService.findAll(subscription.getTenantId(), subscription.getEntityId(), queries), + missedUpdates -> { + if (missedUpdates != null && !missedUpdates.isEmpty()) { + missedUpdates = missedUpdates.stream().filter(u -> u.getValue() != null).collect(Collectors.toList()); + if (!missedUpdates.isEmpty()) { + onTimeSeriesUpdate(subscription.getEntityId(), missedUpdates, TbCallback.EMPTY); + } + } + }, + e -> log.error("Failed to fetch missed updates.", e), + tsCallBackExecutor); + } + } } } diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/SubscriptionManagerService.java b/application/src/main/java/org/thingsboard/server/service/subscription/SubscriptionManagerService.java index 736a251dff..4f6d16e6c2 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/SubscriptionManagerService.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/SubscriptionManagerService.java @@ -16,6 +16,7 @@ package org.thingsboard.server.service.subscription; import org.springframework.context.ApplicationListener; +import org.springframework.context.event.EventListener; import org.thingsboard.server.common.data.alarm.AlarmInfo; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.TenantId; @@ -23,6 +24,8 @@ import org.thingsboard.server.common.data.id.UserId; import org.thingsboard.server.common.data.kv.AttributeKvEntry; import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.common.msg.queue.TbCallback; +import org.thingsboard.server.gen.transport.TransportProtos; +import org.thingsboard.server.queue.discovery.event.OtherServiceShutdownEvent; import org.thingsboard.server.queue.discovery.event.PartitionChangeEvent; import org.thingsboard.server.service.ws.notification.sub.NotificationRequestUpdate; import org.thingsboard.server.service.ws.notification.sub.NotificationUpdate; @@ -31,9 +34,9 @@ import java.util.List; public interface SubscriptionManagerService extends ApplicationListener { - void addSubscription(TbSubscription subscription, TbCallback callback); + void onSubEvent(String serviceId, TbEntitySubEvent event, TbCallback empty); - void cancelSubscription(String sessionId, int subscriptionId, TbCallback callback); + void onApplicationEvent(OtherServiceShutdownEvent event); void onTimeSeriesUpdate(TenantId tenantId, EntityId entityId, List ts, TbCallback callback); @@ -51,6 +54,4 @@ public interface SubscriptionManagerService extends ApplicationListener scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) { + return scheduler.scheduleWithFixedDelay(command, initialDelay, delay, unit); + } +} diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractDataSubCtx.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractDataSubCtx.java index 3f11679849..f02a466994 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractDataSubCtx.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractDataSubCtx.java @@ -186,6 +186,7 @@ public abstract class TbAbstractDataSubCtx sendWsMsg(sub.getSessionId(), subscriptionUpdate, keysType)) + .queryTs(createdTime) .allKeys(false) .keyStates(keyStates) .scope(scope) @@ -207,19 +208,20 @@ public abstract class TbAbstractDataSubCtx keyStates) { + private TbTimeSeriesSubscription createTsSub(EntityData entityData, int subIdx, boolean latestValues, long startTs, long endTs, Map keyStates) { return createTsSub(entityData, subIdx, latestValues, startTs, endTs, keyStates, latestValues); } - private TbTimeseriesSubscription createTsSub(EntityData entityData, int subIdx, boolean latestValues, long startTs, long endTs, Map keyStates, boolean resultToLatestValues) { + private TbTimeSeriesSubscription createTsSub(EntityData entityData, int subIdx, boolean latestValues, long startTs, long endTs, Map keyStates, boolean resultToLatestValues) { log.trace("[{}][{}][{}] Creating time-series subscription for [{}] with keys: {}", serviceId, cmdId, subIdx, entityData.getEntityId(), keyStates); - return TbTimeseriesSubscription.builder() + return TbTimeSeriesSubscription.builder() .serviceId(serviceId) .sessionId(sessionRef.getSessionId()) .subscriptionId(subIdx) .tenantId(sessionRef.getSecurityCtx().getTenantId()) .entityId(entityData.getEntityId()) .updateProcessor((sub, subscriptionUpdate) -> sendWsMsg(sub.getSessionId(), subscriptionUpdate, EntityKeyType.TIME_SERIES, resultToLatestValues)) + .queryTs(createdTime) .allKeys(false) .keyStates(keyStates) .latestValues(latestValues) diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractSubCtx.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractSubCtx.java index 7eba28bccd..102431f63b 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractSubCtx.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbAbstractSubCtx.java @@ -78,11 +78,14 @@ public abstract class TbAbstractSubCtx { @Setter protected volatile ScheduledFuture refreshTask; protected volatile boolean stopped; + @Getter + protected long createdTime; public TbAbstractSubCtx(String serviceId, WebSocketService wsService, EntityService entityService, TbLocalSubscriptionService localSubscriptionService, AttributesService attributesService, SubscriptionServiceStatistics stats, WebSocketSessionRef sessionRef, int cmdId) { + this.createdTime = System.currentTimeMillis(); this.serviceId = serviceId; this.wsService = wsService; this.entityService = entityService; @@ -142,6 +145,7 @@ public abstract class TbAbstractSubCtx { .tenantId(sessionRef.getSecurityCtx().getTenantId()) .entityId(entityId) .updateProcessor((subscription, subscriptionUpdate) -> dynamicValueSubUpdate(subscription.getSessionId(), subscriptionUpdate, dynamicValueKeySubMap)) + .queryTs(createdTime) .allKeys(false) .keyStates(keyStates) .scope(TbAttributeSubscriptionScope.SERVER_SCOPE) diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbAttributeSubscription.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbAttributeSubscription.java index 3746758caa..2392899dc7 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/TbAttributeSubscription.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbAttributeSubscription.java @@ -26,6 +26,7 @@ import java.util.function.BiConsumer; public class TbAttributeSubscription extends TbSubscription { + @Getter private final long queryTs; @Getter private final boolean allKeys; @Getter private final Map keyStates; @Getter private final TbAttributeSubscriptionScope scope; @@ -33,8 +34,9 @@ public class TbAttributeSubscription extends TbSubscription, TelemetrySubscriptionUpdate> updateProcessor, - boolean allKeys, Map keyStates, TbAttributeSubscriptionScope scope) { + long queryTs, boolean allKeys, Map keyStates, TbAttributeSubscriptionScope scope) { super(serviceId, sessionId, subscriptionId, tenantId, entityId, TbSubscriptionType.ATTRIBUTES, updateProcessor); + this.queryTs = queryTs; this.allKeys = allKeys; this.keyStates = keyStates; this.scope = scope; diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbEntityLocalSubsInfo.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbEntityLocalSubsInfo.java new file mode 100644 index 0000000000..96ea628de2 --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbEntityLocalSubsInfo.java @@ -0,0 +1,245 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.subscription; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * Information about the local websocket subscriptions. + */ +@Slf4j +@RequiredArgsConstructor +public class TbEntityLocalSubsInfo { + + @Getter + private final TenantId tenantId; + @Getter + private final EntityId entityId; + @Getter + private final Lock lock = new ReentrantLock(); + @Getter + private final Set> subs = ConcurrentHashMap.newKeySet(); + private volatile TbSubscriptionsInfo state = new TbSubscriptionsInfo(); + + private final Map>> pendingSubs = new ConcurrentHashMap<>(); + @Getter + @Setter + private int pendingTimeSeriesEvent; + @Getter + @Setter + private long pendingTimeSeriesEventTs; + @Getter + @Setter + private int pendingAttributesEvent; + @Getter + @Setter + private long pendingAttributesEventTs; + + private int seqNumber = 0; + + public TbEntitySubEvent add(TbSubscription subscription) { + log.trace("[{}][{}][{}] Adding: {}", tenantId, entityId, subscription.getSubscriptionId(), subscription); + boolean created = subs.isEmpty(); + subs.add(subscription); + TbSubscriptionsInfo newState = created ? state : state.copy(); + boolean stateChanged = false; + switch (subscription.getType()) { + case NOTIFICATIONS: + case NOTIFICATIONS_COUNT: + if (!newState.notifications) { + newState.notifications = true; + stateChanged = true; + } + break; + case ALARMS: + if (!newState.alarms) { + newState.alarms = true; + stateChanged = true; + } + break; + case ATTRIBUTES: + var attrSub = (TbAttributeSubscription) subscription; + if (!newState.attrAllKeys) { + if (attrSub.isAllKeys()) { + newState.attrAllKeys = true; + stateChanged = true; + } else { + if (newState.attrKeys == null) { + newState.attrKeys = new HashSet<>(attrSub.getKeyStates().keySet()); + stateChanged = true; + } else if (newState.attrKeys.addAll(attrSub.getKeyStates().keySet())) { + stateChanged = true; + } + } + } + break; + case TIMESERIES: + var tsSub = (TbTimeSeriesSubscription) subscription; + if (!newState.tsAllKeys) { + if (tsSub.isAllKeys()) { + newState.tsAllKeys = true; + stateChanged = true; + } else { + if (newState.tsKeys == null) { + newState.tsKeys = new HashSet<>(tsSub.getKeyStates().keySet()); + stateChanged = true; + } else if (newState.tsKeys.addAll(tsSub.getKeyStates().keySet())) { + stateChanged = true; + } + } + } + break; + } + if (stateChanged) { + state = newState; + } + if (created) { + return toEvent(ComponentLifecycleEvent.CREATED); + } else if (stateChanged) { + return toEvent(ComponentLifecycleEvent.UPDATED); + } else { + return null; + } + } + + public TbEntitySubEvent remove(TbSubscription sub) { + log.trace("[{}][{}][{}] Removing: {}", tenantId, entityId, sub.getSubscriptionId(), sub); + if (!subs.remove(sub)) { + return null; + } + if (subs.isEmpty()) { + return toEvent(ComponentLifecycleEvent.DELETED); + } + TbSubscriptionsInfo oldState = state.copy(); + TbSubscriptionsInfo newState = new TbSubscriptionsInfo(); + for (TbSubscription subscription : subs) { + switch (subscription.getType()) { + case NOTIFICATIONS: + case NOTIFICATIONS_COUNT: + if (!newState.notifications) { + newState.notifications = true; + } + break; + case ALARMS: + if (!newState.alarms) { + newState.alarms = true; + } + break; + case ATTRIBUTES: + var attrSub = (TbAttributeSubscription) subscription; + if (!newState.attrAllKeys && attrSub.isAllKeys()) { + newState.attrAllKeys = true; + continue; + } + if (newState.attrKeys == null) { + newState.attrKeys = new HashSet<>(attrSub.getKeyStates().keySet()); + } else { + newState.attrKeys.addAll(attrSub.getKeyStates().keySet()); + } + break; + case TIMESERIES: + var tsSub = (TbTimeSeriesSubscription) subscription; + if (!newState.tsAllKeys && tsSub.isAllKeys()) { + newState.tsAllKeys = true; + continue; + } + if (newState.tsKeys == null) { + newState.tsKeys = new HashSet<>(tsSub.getKeyStates().keySet()); + } else { + newState.tsKeys.addAll(tsSub.getKeyStates().keySet()); + } + break; + } + } + if (newState.equals(oldState)) { + return null; + } else { + this.state = newState; + return toEvent(ComponentLifecycleEvent.UPDATED); + } + } + + public TbEntitySubEvent toEvent(ComponentLifecycleEvent type) { + seqNumber++; + var result = TbEntitySubEvent.builder().tenantId(tenantId).entityId(entityId).type(type).seqNumber(seqNumber); + if (!ComponentLifecycleEvent.DELETED.equals(type)) { + result.info(state.copy(seqNumber)); + } + return result.build(); + } + + public boolean isNf() { + return state.notifications; + } + + + public boolean isEmpty() { + return state.isEmpty(); + } + + public TbSubscription registerPendingSubscription(TbSubscription subscription, TbEntitySubEvent event) { + if (TbSubscriptionType.ATTRIBUTES.equals(subscription.getType())) { + if (event != null) { + log.trace("[{}][{}] Registering new pending attributes subscription event: {} for subscription: {}", tenantId, entityId, event.getSeqNumber(), subscription.getSubscriptionId()); + pendingAttributesEvent = event.getSeqNumber(); + pendingAttributesEventTs = System.currentTimeMillis(); + pendingSubs.computeIfAbsent(pendingAttributesEvent, e -> new HashSet<>()).add(subscription); + } else if (pendingAttributesEvent > 0) { + log.trace("[{}][{}] Registering pending attributes subscription {} for event: {} ", tenantId, entityId, subscription.getSubscriptionId(), pendingAttributesEvent); + pendingSubs.computeIfAbsent(pendingAttributesEvent, e -> new HashSet<>()).add(subscription); + } else { + return subscription; + } + } else if (subscription instanceof TbTimeSeriesSubscription) { + if (event != null) { + log.trace("[{}][{}] Registering new pending time-series subscription event: {} for subscription: {}", tenantId, entityId, event.getSeqNumber(), subscription.getSubscriptionId()); + pendingTimeSeriesEvent = event.getSeqNumber(); + pendingTimeSeriesEventTs = System.currentTimeMillis(); + pendingSubs.computeIfAbsent(pendingTimeSeriesEvent, e -> new HashSet<>()).add(subscription); + } else if (pendingTimeSeriesEvent > 0) { + log.trace("[{}][{}] Registering pending time-series subscription {} for event: {} ", tenantId, entityId, subscription.getSubscriptionId(), pendingTimeSeriesEvent); + pendingSubs.computeIfAbsent(pendingTimeSeriesEvent, e -> new HashSet<>()).add(subscription); + } else { + return subscription; + } + } + return null; + } + + public Set> clearPendingSubscriptions(int seqNumber) { + if (pendingTimeSeriesEvent == seqNumber) { + pendingTimeSeriesEvent = 0; + pendingTimeSeriesEventTs = 0L; + } else if (pendingAttributesEvent == seqNumber) { + pendingAttributesEvent = 0; + pendingAttributesEventTs = 0L; + } + return pendingSubs.remove(seqNumber); + } +} diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbEntityRemoteSubsInfo.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbEntityRemoteSubsInfo.java new file mode 100644 index 0000000000..df66b060da --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbEntityRemoteSubsInfo.java @@ -0,0 +1,79 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.subscription; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.util.Pair; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.TenantId; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Information about the local websocket subscriptions. + */ +@RequiredArgsConstructor +@Slf4j +public class TbEntityRemoteSubsInfo { + @Getter + private final TenantId tenantId; + @Getter + private final EntityId entityId; + @Getter + private final Map subs = new ConcurrentHashMap<>(); // By service ID + + public boolean updateAndCheckIsEmpty(String serviceId, TbEntitySubEvent event) { + var current = subs.get(serviceId); + if (current != null && current.seqNumber > event.getSeqNumber()) { + log.warn("[{}][{}] Duplicate subscription event received. Current: {}, Event: {}", + tenantId, entityId, current, event.getInfo()); + return false; + } + switch (event.getType()) { + case CREATED: + subs.put(serviceId, event.getInfo()); + break; + case UPDATED: + var newSubInfo = event.getInfo(); + if (newSubInfo.isEmpty()) { + subs.remove(serviceId); + return isEmpty(); + } else { + subs.put(serviceId, newSubInfo); + } + break; + case DELETED: + subs.remove(serviceId); + return isEmpty(); + } + return false; + } + + public boolean removeAndCheckIsEmpty(String serviceId) { + if (subs.remove(serviceId) != null) { + return subs.isEmpty(); + } else { + return false; + } + } + + public boolean isEmpty() { + return subs.isEmpty(); + } +} diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbEntitySubEvent.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbEntitySubEvent.java new file mode 100644 index 0000000000..7e2956b5f0 --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbEntitySubEvent.java @@ -0,0 +1,42 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.subscription; + +import lombok.Builder; +import lombok.Data; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; + +import java.util.Set; + +/** + * Information about the local websocket subscriptions. + */ +@Builder +@Data +public class TbEntitySubEvent { + + private final TenantId tenantId; + private final EntityId entityId; + private final ComponentLifecycleEvent type; + private final TbSubscriptionsInfo info; + private final int seqNumber; + + public boolean hasTsOrAttrSub() { + return info != null && (info.tsAllKeys || info.attrAllKeys || info.tsKeys != null || info.attrKeys != null); + } +} diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/gauge-highlight.component.scss b/application/src/main/java/org/thingsboard/server/service/subscription/TbEntityUpdatesInfo.java similarity index 59% rename from ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/gauge-highlight.component.scss rename to application/src/main/java/org/thingsboard/server/service/subscription/TbEntityUpdatesInfo.java index 8b61fb7e3d..a09da220d5 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/gauge-highlight.component.scss +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbEntityUpdatesInfo.java @@ -13,28 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -:host { - display: block; - .mat-expansion-panel { - box-shadow: none; - &.gauge-highlight { - border: 1px groove rgba(0, 0, 0, .25); - .mat-expansion-panel-header { - padding: 0 24px 0 8px; - &.mat-expanded { - height: 48px; - } - } - } - } -} +package org.thingsboard.server.service.subscription; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class TbEntityUpdatesInfo { + + volatile long attributesUpdateTs; + volatile long timeSeriesUpdateTs; -:host ::ng-deep { - .mat-expansion-panel { - &.gauge-highlight { - .mat-expansion-panel-body { - padding: 0 8px 8px; - } + public TbEntityUpdatesInfo(long ts) { + this.attributesUpdateTs = ts; + this.timeSeriesUpdateTs = ts; } - } } diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbLocalSubscriptionService.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbLocalSubscriptionService.java index 7685c8fbed..d968bd515f 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/TbLocalSubscriptionService.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbLocalSubscriptionService.java @@ -15,28 +15,50 @@ */ package org.thingsboard.server.service.subscription; +import org.thingsboard.server.common.data.alarm.AlarmInfo; +import org.thingsboard.server.common.data.id.EntityId; +import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.common.msg.queue.TbCallback; +import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.queue.discovery.event.ClusterTopologyChangeEvent; -import org.thingsboard.server.queue.discovery.event.PartitionChangeEvent; +import org.thingsboard.server.service.ws.notification.sub.NotificationRequestUpdate; import org.thingsboard.server.service.ws.notification.sub.NotificationsSubscriptionUpdate; -import org.thingsboard.server.service.ws.telemetry.sub.AlarmSubscriptionUpdate; -import org.thingsboard.server.service.ws.telemetry.sub.TelemetrySubscriptionUpdate; + +import java.util.List; public interface TbLocalSubscriptionService { - void addSubscription(TbSubscription subscription); + void addSubscription(TbSubscription subscription); + + void onSubEventCallback(TransportProtos.TbEntitySubEventCallbackProto subEventCallback, TbCallback callback); + + void onSubEventCallback(EntityId entityId, int seqNumber, TbEntityUpdatesInfo entityUpdatesInfo, TbCallback empty); void cancelSubscription(String sessionId, int subscriptionId); void cancelAllSessionSubscriptions(String sessionId); - void onSubscriptionUpdate(String sessionId, TelemetrySubscriptionUpdate update, TbCallback callback); + void onTimeSeriesUpdate(TransportProtos.TbSubUpdateProto tsUpdate, TbCallback callback); + + void onTimeSeriesUpdate(EntityId entityId, List update, TbCallback callback); + + void onAttributesUpdate(TransportProtos.TbSubUpdateProto attrUpdate, TbCallback callback); - void onSubscriptionUpdate(String sessionId, AlarmSubscriptionUpdate update, TbCallback callback); + void onAttributesUpdate(EntityId entityId, String scope, List update, TbCallback callback); - void onSubscriptionUpdate(String sessionId, int subscriptionId, NotificationsSubscriptionUpdate update, TbCallback callback); + void onAlarmUpdate(EntityId entityId, AlarmInfo alarm, boolean deleted, TbCallback callback); - void onApplicationEvent(PartitionChangeEvent event); + void onAlarmUpdate(TransportProtos.TbAlarmSubUpdateProto update, TbCallback callback); + + void onNotificationUpdate(EntityId entityId, NotificationsSubscriptionUpdate subscriptionUpdate, TbCallback callback); void onApplicationEvent(ClusterTopologyChangeEvent event); + + void onCoreStartupMsg(TransportProtos.CoreStartupMsg coreStartupMsg); + + void onNotificationRequestUpdate(TenantId tenantId, NotificationRequestUpdate update, TbCallback callback); + + void onNotificationUpdate(TransportProtos.NotificationsSubUpdateProto notificationsUpdate, TbCallback callback); + } diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscription.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscription.java index dfad6a41de..1cda590a1f 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscription.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscription.java @@ -33,7 +33,7 @@ public abstract class TbSubscription { private final TenantId tenantId; private final EntityId entityId; private final TbSubscriptionType type; - private final BiConsumer, T> updateProcessor; + private final BiConsumer, T> updateProcessor; @Override public boolean equals(Object o) { diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionUtils.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionUtils.java index 8905b1b3ad..1163e13077 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionUtils.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionUtils.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.service.subscription; +import org.apache.commons.lang3.StringUtils; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.alarm.AlarmInfo; import org.thingsboard.server.common.data.id.EntityId; @@ -32,6 +33,7 @@ import org.thingsboard.server.common.data.kv.KvEntry; import org.thingsboard.server.common.data.kv.LongDataEntry; import org.thingsboard.server.common.data.kv.StringDataEntry; import org.thingsboard.server.common.data.kv.TsKvEntry; +import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos.KeyValueProto; import org.thingsboard.server.gen.transport.TransportProtos.KeyValueType; @@ -39,29 +41,20 @@ import org.thingsboard.server.gen.transport.TransportProtos.SubscriptionMgrMsgPr import org.thingsboard.server.gen.transport.TransportProtos.TbAlarmDeleteProto; import org.thingsboard.server.gen.transport.TransportProtos.TbAlarmUpdateProto; import org.thingsboard.server.gen.transport.TransportProtos.TbAttributeDeleteProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbAttributeSubscriptionProto; import org.thingsboard.server.gen.transport.TransportProtos.TbAttributeUpdateProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbSubscriptionCloseProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbSubscriptionKetStateProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbSubscriptionProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbSubscriptionUpdateProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbSubscriptionUpdateTsValue; +import org.thingsboard.server.gen.transport.TransportProtos.TbEntitySubEventProto; import org.thingsboard.server.gen.transport.TransportProtos.TbTimeSeriesDeleteProto; -import org.thingsboard.server.gen.transport.TransportProtos.TbTimeSeriesSubscriptionProto; import org.thingsboard.server.gen.transport.TransportProtos.TbTimeSeriesUpdateProto; import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; import org.thingsboard.server.gen.transport.TransportProtos.ToCoreNotificationMsg; import org.thingsboard.server.gen.transport.TransportProtos.TsKvProto; import org.thingsboard.server.service.ws.notification.sub.NotificationRequestUpdate; import org.thingsboard.server.service.ws.notification.sub.NotificationUpdate; -import org.thingsboard.server.service.ws.notification.sub.NotificationsCountSubscription; -import org.thingsboard.server.service.ws.notification.sub.NotificationsSubscription; import org.thingsboard.server.service.ws.notification.sub.NotificationsSubscriptionUpdate; import org.thingsboard.server.service.ws.telemetry.sub.AlarmSubscriptionUpdate; -import org.thingsboard.server.service.ws.telemetry.sub.TelemetrySubscriptionUpdate; import java.util.ArrayList; -import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -69,172 +62,118 @@ import java.util.UUID; public class TbSubscriptionUtils { - public static ToCoreMsg toNewSubscriptionProto(TbSubscription subscription) { + public static ToCoreMsg toSubEventProto(String serviceId, TbEntitySubEvent event) { SubscriptionMgrMsgProto.Builder msgBuilder = SubscriptionMgrMsgProto.newBuilder(); - TbSubscriptionProto subscriptionProto = TbSubscriptionProto.newBuilder() - .setServiceId(subscription.getServiceId()) - .setSessionId(subscription.getSessionId()) - .setSubscriptionId(subscription.getSubscriptionId()) - .setTenantIdMSB(subscription.getTenantId().getId().getMostSignificantBits()) - .setTenantIdLSB(subscription.getTenantId().getId().getLeastSignificantBits()) - .setEntityType(subscription.getEntityId().getEntityType().name()) - .setEntityIdMSB(subscription.getEntityId().getId().getMostSignificantBits()) - .setEntityIdLSB(subscription.getEntityId().getId().getLeastSignificantBits()).build(); - - switch (subscription.getType()) { - case TIMESERIES: - TbTimeseriesSubscription tSub = (TbTimeseriesSubscription) subscription; - TbTimeSeriesSubscriptionProto.Builder tSubProto = TbTimeSeriesSubscriptionProto.newBuilder() - .setSub(subscriptionProto) - .setAllKeys(tSub.isAllKeys()); - tSub.getKeyStates().forEach((key, value) -> tSubProto.addKeyStates( - TbSubscriptionKetStateProto.newBuilder().setKey(key).setTs(value).build())); - tSubProto.setStartTime(tSub.getStartTime()); - tSubProto.setEndTime(tSub.getEndTime()); - tSubProto.setLatestValues(tSub.isLatestValues()); - msgBuilder.setTelemetrySub(tSubProto.build()); - break; - case ATTRIBUTES: - TbAttributeSubscription aSub = (TbAttributeSubscription) subscription; - TbAttributeSubscriptionProto.Builder aSubProto = TbAttributeSubscriptionProto.newBuilder() - .setSub(subscriptionProto) - .setAllKeys(aSub.isAllKeys()) - .setScope(aSub.getScope().name()); - aSub.getKeyStates().forEach((key, value) -> aSubProto.addKeyStates( - TbSubscriptionKetStateProto.newBuilder().setKey(key).setTs(value).build())); - msgBuilder.setAttributeSub(aSubProto.build()); - break; - case ALARMS: - TbAlarmsSubscription alarmSub = (TbAlarmsSubscription) subscription; - TransportProtos.TbAlarmSubscriptionProto.Builder alarmSubProto = TransportProtos.TbAlarmSubscriptionProto.newBuilder() - .setSub(subscriptionProto) - .setTs(alarmSub.getTs()); - msgBuilder.setAlarmSub(alarmSubProto.build()); - break; - case NOTIFICATIONS: - NotificationsSubscription notificationsSub = (NotificationsSubscription) subscription; - msgBuilder.setNotificationsSub(TransportProtos.NotificationsSubscriptionProto.newBuilder() - .setSub(subscriptionProto) - .setLimit(notificationsSub.getLimit())); - break; - case NOTIFICATIONS_COUNT: - NotificationsCountSubscription notificationsCountSub = (NotificationsCountSubscription) subscription; - msgBuilder.setNotificationsCountSub(TransportProtos.NotificationsCountSubscriptionProto.newBuilder() - .setSub(subscriptionProto)); - break; + var builder = TbEntitySubEventProto.newBuilder() + .setServiceId(serviceId) + .setSeqNumber(event.getSeqNumber()) + .setTenantIdMSB(event.getTenantId().getId().getMostSignificantBits()) + .setTenantIdLSB(event.getTenantId().getId().getLeastSignificantBits()) + .setEntityType(event.getEntityId().getEntityType().name()) + .setEntityIdMSB(event.getEntityId().getId().getMostSignificantBits()) + .setEntityIdLSB(event.getEntityId().getId().getLeastSignificantBits()) + .setType(event.getType().name()); + TbSubscriptionsInfo info = event.getInfo(); + if (info != null) { + builder.setNotifications(info.notifications) + .setAlarms(info.alarms) + .setTsAllKeys(info.tsAllKeys) + .setAttrAllKeys(info.attrAllKeys); + if (info.tsKeys != null) { + builder.addAllTsKeys(info.tsKeys); + } + if (info.attrKeys != null) { + builder.addAllAttrKeys(info.attrKeys); + } } - return ToCoreMsg.newBuilder().setToSubscriptionMgrMsg(msgBuilder.build()).build(); + msgBuilder.setSubEvent(builder); + return ToCoreMsg.newBuilder().setToSubscriptionMgrMsg(msgBuilder).build(); } - public static ToCoreMsg toCloseSubscriptionProto(TbSubscription subscription) { - SubscriptionMgrMsgProto.Builder msgBuilder = SubscriptionMgrMsgProto.newBuilder(); - TbSubscriptionCloseProto closeProto = TbSubscriptionCloseProto.newBuilder() - .setSessionId(subscription.getSessionId()) - .setSubscriptionId(subscription.getSubscriptionId()).build(); - msgBuilder.setSubClose(closeProto); - return ToCoreMsg.newBuilder().setToSubscriptionMgrMsg(msgBuilder.build()).build(); + public static ToCoreNotificationMsg toProto(UUID id, int seqNumber, TbEntityUpdatesInfo update) { + TransportProtos.TbEntitySubEventCallbackProto.Builder updateProto = TransportProtos.TbEntitySubEventCallbackProto.newBuilder() + .setEntityIdMSB(id.getMostSignificantBits()) + .setEntityIdLSB(id.getLeastSignificantBits()) + .setSeqNumber(seqNumber) + .setAttributesUpdateTs(update.attributesUpdateTs) + .setTimeSeriesUpdateTs(update.timeSeriesUpdateTs); + return ToCoreNotificationMsg.newBuilder() + .setToLocalSubscriptionServiceMsg( + TransportProtos.LocalSubscriptionServiceMsgProto.newBuilder() + .setSubEventCallback(updateProto) + .build()) + .build(); } - public static TbSubscription fromProto(TbAttributeSubscriptionProto attributeSub) { - TbSubscriptionProto subProto = attributeSub.getSub(); - TbAttributeSubscription.TbAttributeSubscriptionBuilder builder = TbAttributeSubscription.builder() - .serviceId(subProto.getServiceId()) - .sessionId(subProto.getSessionId()) - .subscriptionId(subProto.getSubscriptionId()) - .entityId(EntityIdFactory.getByTypeAndUuid(subProto.getEntityType(), new UUID(subProto.getEntityIdMSB(), subProto.getEntityIdLSB()))) - .tenantId(TenantId.fromUUID(new UUID(subProto.getTenantIdMSB(), subProto.getTenantIdLSB()))); - - builder.scope(TbAttributeSubscriptionScope.valueOf(attributeSub.getScope())); - builder.allKeys(attributeSub.getAllKeys()); - Map keyStates = new HashMap<>(); - attributeSub.getKeyStatesList().forEach(ksProto -> keyStates.put(ksProto.getKey(), ksProto.getTs())); - builder.keyStates(keyStates); - return builder.build(); - } - public static TbSubscription fromProto(TbTimeSeriesSubscriptionProto telemetrySub) { - TbSubscriptionProto subProto = telemetrySub.getSub(); - TbTimeseriesSubscription.TbTimeseriesSubscriptionBuilder builder = TbTimeseriesSubscription.builder() - .serviceId(subProto.getServiceId()) - .sessionId(subProto.getSessionId()) - .subscriptionId(subProto.getSubscriptionId()) - .entityId(EntityIdFactory.getByTypeAndUuid(subProto.getEntityType(), new UUID(subProto.getEntityIdMSB(), subProto.getEntityIdLSB()))) - .tenantId(TenantId.fromUUID(new UUID(subProto.getTenantIdMSB(), subProto.getTenantIdLSB()))); - - builder.allKeys(telemetrySub.getAllKeys()); - Map keyStates = new HashMap<>(); - telemetrySub.getKeyStatesList().forEach(ksProto -> keyStates.put(ksProto.getKey(), ksProto.getTs())); - builder.startTime(telemetrySub.getStartTime()); - builder.endTime(telemetrySub.getEndTime()); - builder.latestValues(telemetrySub.getLatestValues()); - builder.keyStates(keyStates); + public static TbEntitySubEvent fromProto(TbEntitySubEventProto proto) { + ComponentLifecycleEvent event = ComponentLifecycleEvent.valueOf(proto.getType()); + var builder = TbEntitySubEvent.builder() + .tenantId(TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB()))) + .seqNumber(proto.getSeqNumber()) + .entityId(EntityIdFactory.getByTypeAndUuid(proto.getEntityType(), new UUID(proto.getEntityIdMSB(), proto.getEntityIdLSB()))) + .type(event); + if (!ComponentLifecycleEvent.DELETED.equals(event)) { + builder.info(new TbSubscriptionsInfo(proto.getNotifications(), proto.getAlarms(), + proto.getTsAllKeys(), proto.getTsKeysCount() > 0 ? new HashSet<>(proto.getTsKeysList()) : null, + proto.getAttrAllKeys(), proto.getAttrKeysCount() > 0 ? new HashSet<>(proto.getAttrKeysList()) : null, + proto.getSeqNumber())); + } return builder.build(); } - public static TbSubscription fromProto(TransportProtos.TbAlarmSubscriptionProto alarmSub) { - TbSubscriptionProto subProto = alarmSub.getSub(); - TbAlarmsSubscription.TbAlarmsSubscriptionBuilder builder = TbAlarmsSubscription.builder() - .serviceId(subProto.getServiceId()) - .sessionId(subProto.getSessionId()) - .subscriptionId(subProto.getSubscriptionId()) - .entityId(EntityIdFactory.getByTypeAndUuid(subProto.getEntityType(), new UUID(subProto.getEntityIdMSB(), subProto.getEntityIdLSB()))) - .tenantId(TenantId.fromUUID(new UUID(subProto.getTenantIdMSB(), subProto.getTenantIdLSB()))); - builder.ts(alarmSub.getTs()); - return builder.build(); + public static AlarmSubscriptionUpdate fromProto(TransportProtos.TbAlarmSubUpdateProto proto) { + if (proto.getErrorCode() > 0) { + return new AlarmSubscriptionUpdate(SubscriptionErrorCode.forCode(proto.getErrorCode()), proto.getErrorMsg()); + } else { + AlarmInfo alarm = JacksonUtil.fromString(proto.getAlarm(), AlarmInfo.class); + return new AlarmSubscriptionUpdate(alarm, proto.getDeleted()); + } } - public static NotificationsSubscription fromProto(TransportProtos.NotificationsSubscriptionProto notificationsSub) { - TbSubscriptionProto sub = notificationsSub.getSub(); - return NotificationsSubscription.builder() - .serviceId(sub.getServiceId()) - .sessionId(sub.getSessionId()) - .subscriptionId(sub.getSubscriptionId()) - .tenantId(TenantId.fromUUID(new UUID(sub.getTenantIdMSB(), sub.getTenantIdLSB()))) - .entityId(EntityIdFactory.getByTypeAndUuid(sub.getEntityType(), new UUID(sub.getEntityIdMSB(), sub.getEntityIdLSB()))) - .limit(notificationsSub.getLimit()) - .build(); + public static NotificationsSubscriptionUpdate fromProto(TransportProtos.NotificationsSubUpdateProto proto) { + NotificationsSubscriptionUpdate update; + if (StringUtils.isNotEmpty(proto.getNotificationUpdate())) { + NotificationUpdate notificationUpdate = JacksonUtil.fromString(proto.getNotificationUpdate(), NotificationUpdate.class); + update = new NotificationsSubscriptionUpdate(notificationUpdate); + } else { + NotificationRequestUpdate notificationRequestUpdate = JacksonUtil.fromString(proto.getNotificationRequestUpdate(), NotificationRequestUpdate.class); + update = new NotificationsSubscriptionUpdate(notificationRequestUpdate); + } + return update; } - public static NotificationsCountSubscription fromProto(TransportProtos.NotificationsCountSubscriptionProto notificationsCountSub) { - TbSubscriptionProto sub = notificationsCountSub.getSub(); - return NotificationsCountSubscription.builder() - .serviceId(sub.getServiceId()) - .sessionId(sub.getSessionId()) - .subscriptionId(sub.getSubscriptionId()) - .tenantId(TenantId.fromUUID(new UUID(sub.getTenantIdMSB(), sub.getTenantIdLSB()))) - .entityId(EntityIdFactory.getByTypeAndUuid(sub.getEntityType(), new UUID(sub.getEntityIdMSB(), sub.getEntityIdLSB()))) + public static ToCoreNotificationMsg toAlarmSubUpdateToProto(EntityId entityId, AlarmInfo alarmInfo, boolean deleted) { + TransportProtos.TbAlarmSubUpdateProto.Builder updateProto = TransportProtos.TbAlarmSubUpdateProto.newBuilder() + .setEntityIdMSB(entityId.getId().getMostSignificantBits()) + .setEntityIdLSB(entityId.getId().getLeastSignificantBits()) + .setAlarm(JacksonUtil.toString(alarmInfo)) + .setDeleted(deleted); + return ToCoreNotificationMsg.newBuilder() + .setToLocalSubscriptionServiceMsg( + TransportProtos.LocalSubscriptionServiceMsgProto.newBuilder() + .setAlarmUpdate(updateProto) + .build()) .build(); } - public static TelemetrySubscriptionUpdate fromProto(TbSubscriptionUpdateProto proto) { - if (proto.getErrorCode() > 0) { - return new TelemetrySubscriptionUpdate(proto.getSubscriptionId(), SubscriptionErrorCode.forCode(proto.getErrorCode()), proto.getErrorMsg()); - } else { - Map> data = new TreeMap<>(); - proto.getDataList().forEach(v -> { - List values = data.computeIfAbsent(v.getKey(), k -> new ArrayList<>()); - for (int i = 0; i < v.getTsValueCount(); i++) { - Object[] value = new Object[2]; - TbSubscriptionUpdateTsValue tsValue = v.getTsValue(i); - value[0] = tsValue.getTs(); - value[1] = tsValue.hasValue() ? tsValue.getValue() : null; - values.add(value); - } - }); - return new TelemetrySubscriptionUpdate(proto.getSubscriptionId(), data); + public static ToCoreNotificationMsg notificationsSubUpdateToProto(EntityId entityId, NotificationsSubscriptionUpdate update) { + TransportProtos.NotificationsSubUpdateProto.Builder updateProto = TransportProtos.NotificationsSubUpdateProto.newBuilder() + .setEntityIdMSB(entityId.getId().getMostSignificantBits()) + .setEntityIdLSB(entityId.getId().getLeastSignificantBits()); + if (update.getNotificationUpdate() != null) { + updateProto.setNotificationUpdate(JacksonUtil.toString(update.getNotificationUpdate())); } - } - - public static AlarmSubscriptionUpdate fromProto(TransportProtos.TbAlarmSubscriptionUpdateProto proto) { - if (proto.getErrorCode() > 0) { - return new AlarmSubscriptionUpdate(proto.getSubscriptionId(), SubscriptionErrorCode.forCode(proto.getErrorCode()), proto.getErrorMsg()); - } else { - AlarmInfo alarm = JacksonUtil.fromString(proto.getAlarm(), AlarmInfo.class); - return new AlarmSubscriptionUpdate(proto.getSubscriptionId(), alarm, proto.getDeleted()); + if (update.getNotificationRequestUpdate() != null) { + updateProto.setNotificationRequestUpdate(JacksonUtil.toString(update.getNotificationRequestUpdate())); } + return ToCoreNotificationMsg.newBuilder() + .setToLocalSubscriptionServiceMsg(TransportProtos.LocalSubscriptionServiceMsgProto.newBuilder() + .setNotificationsUpdate(updateProto) + .build()) + .build(); } - public static ToCoreMsg toTimeseriesUpdateProto(TenantId tenantId, EntityId entityId, List ts) { TbTimeSeriesUpdateProto.Builder builder = TbTimeSeriesUpdateProto.newBuilder(); builder.setEntityType(entityId.getEntityType().name()); @@ -317,6 +256,31 @@ public class TbSubscriptionUtils { return TsKvProto.newBuilder().setTs(ts).setKv(dataBuilder); } + private static TransportProtos.TsValueProto toTsValueProto(long ts, KvEntry attr) { + TransportProtos.TsValueProto.Builder dataBuilder = TransportProtos.TsValueProto.newBuilder(); + dataBuilder.setTs(ts); + dataBuilder.setType(KeyValueType.forNumber(attr.getDataType().ordinal())); + switch (attr.getDataType()) { + case BOOLEAN: + attr.getBooleanValue().ifPresent(dataBuilder::setBoolV); + break; + case LONG: + attr.getLongValue().ifPresent(dataBuilder::setLongV); + break; + case DOUBLE: + attr.getDoubleValue().ifPresent(dataBuilder::setDoubleV); + break; + case JSON: + attr.getJsonValue().ifPresent(dataBuilder::setJsonV); + break; + case STRING: + attr.getStrValue().ifPresent(dataBuilder::setStringV); + break; + } + return dataBuilder.build(); + } + + public static EntityId toEntityId(String entityType, long entityIdMSB, long entityIdLSB) { return EntityIdFactory.getByTypeAndUuid(entityType, new UUID(entityIdMSB, entityIdLSB)); } @@ -356,6 +320,35 @@ public class TbSubscriptionUtils { return entry; } + public static List toTsKvEntityList(String key, List dataList) { + List result = new ArrayList<>(dataList.size()); + dataList.forEach(proto -> result.add(new BasicTsKvEntry(proto.getTs(), getKvEntry(key, proto)))); + return result; + } + + private static KvEntry getKvEntry(String key, TransportProtos.TsValueProto proto) { + KvEntry entry = null; + DataType type = DataType.values()[proto.getType().getNumber()]; + switch (type) { + case BOOLEAN: + entry = new BooleanDataEntry(key, proto.getBoolV()); + break; + case LONG: + entry = new LongDataEntry(key, proto.getLongV()); + break; + case DOUBLE: + entry = new DoubleDataEntry(key, proto.getDoubleV()); + break; + case STRING: + entry = new StringDataEntry(key, proto.getStringV()); + break; + case JSON: + entry = new JsonDataEntry(key, proto.getJsonV()); + break; + } + return entry; + } + public static ToCoreMsg toAlarmUpdateProto(TenantId tenantId, EntityId entityId, AlarmInfo alarm) { TbAlarmUpdateProto.Builder builder = TbAlarmUpdateProto.newBuilder(); builder.setEntityType(entityId.getEntityType().name()); @@ -382,23 +375,6 @@ public class TbSubscriptionUtils { return ToCoreMsg.newBuilder().setToSubscriptionMgrMsg(msgBuilder.build()).build(); } - public static ToCoreNotificationMsg notificationsSubUpdateToProto(TbSubscription subscription, NotificationsSubscriptionUpdate update) { - TransportProtos.NotificationsSubscriptionUpdateProto.Builder updateProto = TransportProtos.NotificationsSubscriptionUpdateProto.newBuilder() - .setSessionId(subscription.getSessionId()) - .setSubscriptionId(subscription.getSubscriptionId()); - if (update.getNotificationUpdate() != null) { - updateProto.setNotificationUpdate(JacksonUtil.toString(update.getNotificationUpdate())); - } - if (update.getNotificationRequestUpdate() != null) { - updateProto.setNotificationRequestUpdate(JacksonUtil.toString(update.getNotificationRequestUpdate())); - } - return ToCoreNotificationMsg.newBuilder() - .setToLocalSubscriptionServiceMsg(TransportProtos.LocalSubscriptionServiceMsgProto.newBuilder() - .setNotificationsSubUpdate(updateProto) - .build()) - .build(); - } - public static ToCoreMsg notificationUpdateToProto(TenantId tenantId, UserId recipientId, NotificationUpdate notificationUpdate) { TransportProtos.NotificationUpdateProto updateProto = TransportProtos.NotificationUpdateProto.newBuilder() .setTenantIdMSB(tenantId.getId().getMostSignificantBits()) @@ -427,4 +403,49 @@ public class TbSubscriptionUtils { .build(); } + public static List fromProto(TransportProtos.TbSubUpdateProto proto) { + List result = new ArrayList<>(); + for (var p : proto.getDataList()) { + result.addAll(toTsKvEntityList(p.getKey(), p.getTsValueList())); + } + return result; + } + + static ToCoreNotificationMsg toProto(EntityId entityId, List updates) { + return toProto(true, null, entityId, updates); + } + + static ToCoreNotificationMsg toProto(String scope, EntityId entityId, List updates) { + return toProto(false, scope, entityId, updates); + } + + static ToCoreNotificationMsg toProto(boolean timeSeries, String scope, EntityId entityId, List updates) { + TransportProtos.TbSubUpdateProto.Builder builder = TransportProtos.TbSubUpdateProto.newBuilder(); + + builder.setEntityIdMSB(entityId.getId().getMostSignificantBits()); + builder.setEntityIdLSB(entityId.getId().getLeastSignificantBits()); + + Map> data = new TreeMap<>(); + + for (TsKvEntry tsEntry : updates) { + data.computeIfAbsent(tsEntry.getKey(), k -> new ArrayList<>()).add(toTsValueProto(tsEntry.getTs(), tsEntry)); + } + + data.forEach((key, value) -> { + TransportProtos.TsValueListProto.Builder dataBuilder = TransportProtos.TsValueListProto.newBuilder(); + dataBuilder.setKey(key); + dataBuilder.addAllTsValue(value); + builder.addData(dataBuilder.build()); + }); + + var result = TransportProtos.LocalSubscriptionServiceMsgProto.newBuilder(); + if (timeSeries) { + result.setTsUpdate(builder); + } else { + builder.setScope(scope); + result.setAttrUpdate(builder); + } + return ToCoreNotificationMsg.newBuilder().setToLocalSubscriptionServiceMsg(result).build(); + } + } diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionsInfo.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionsInfo.java new file mode 100644 index 0000000000..93b1fb0857 --- /dev/null +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbSubscriptionsInfo.java @@ -0,0 +1,56 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.service.subscription; + +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.RequiredArgsConstructor; +import lombok.ToString; + +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Information about the local websocket subscriptions. + */ +@RequiredArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(exclude = {"seqNumber"}) +@ToString +public class TbSubscriptionsInfo { + + protected boolean notifications; + protected boolean alarms; + protected boolean tsAllKeys; + protected Set tsKeys; + protected boolean attrAllKeys; + protected Set attrKeys; + protected int seqNumber; + + public boolean isEmpty() { + return !notifications && !alarms && !tsAllKeys && !attrAllKeys && tsKeys == null && attrKeys == null; + } + + protected TbSubscriptionsInfo copy() { + return copy(0); + } + + protected TbSubscriptionsInfo copy(int seqNumber) { + return new TbSubscriptionsInfo(notifications, alarms, tsAllKeys, tsKeys, attrAllKeys, attrKeys, seqNumber); + } + +} diff --git a/application/src/main/java/org/thingsboard/server/service/subscription/TbTimeseriesSubscription.java b/application/src/main/java/org/thingsboard/server/service/subscription/TbTimeSeriesSubscription.java similarity index 84% rename from application/src/main/java/org/thingsboard/server/service/subscription/TbTimeseriesSubscription.java rename to application/src/main/java/org/thingsboard/server/service/subscription/TbTimeSeriesSubscription.java index 400cf07e7e..d3ebe4cd3f 100644 --- a/application/src/main/java/org/thingsboard/server/service/subscription/TbTimeseriesSubscription.java +++ b/application/src/main/java/org/thingsboard/server/service/subscription/TbTimeSeriesSubscription.java @@ -24,8 +24,10 @@ import org.thingsboard.server.service.ws.telemetry.sub.TelemetrySubscriptionUpda import java.util.Map; import java.util.function.BiConsumer; -public class TbTimeseriesSubscription extends TbSubscription { +public class TbTimeSeriesSubscription extends TbSubscription { + @Getter + private final long queryTs; @Getter private final boolean allKeys; @Getter @@ -38,10 +40,11 @@ public class TbTimeseriesSubscription extends TbSubscription, TelemetrySubscriptionUpdate> updateProcessor, - boolean allKeys, Map keyStates, long startTime, long endTime, boolean latestValues) { + long queryTs, boolean allKeys, Map keyStates, long startTime, long endTime, boolean latestValues) { super(serviceId, sessionId, subscriptionId, tenantId, entityId, TbSubscriptionType.TIMESERIES, updateProcessor); + this.queryTs = queryTs; this.allKeys = allKeys; this.keyStates = keyStates; this.startTime = startTime; diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/AssetProfileExportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/AssetProfileExportService.java index 340298db7a..710e33f106 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/AssetProfileExportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/AssetProfileExportService.java @@ -33,6 +33,7 @@ public class AssetProfileExportService extends BaseEntityExportService ctx, AssetProfile assetProfile, EntityExportData exportData) { assetProfile.setDefaultDashboardId(getExternalIdOrElseInternal(ctx, assetProfile.getDefaultDashboardId())); assetProfile.setDefaultRuleChainId(getExternalIdOrElseInternal(ctx, assetProfile.getDefaultRuleChainId())); + assetProfile.setDefaultEdgeRuleChainId(getExternalIdOrElseInternal(ctx, assetProfile.getDefaultEdgeRuleChainId())); } @Override diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DeviceProfileExportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DeviceProfileExportService.java index 82ce17893a..b95d8b83e2 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DeviceProfileExportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/exporting/impl/DeviceProfileExportService.java @@ -33,6 +33,7 @@ public class DeviceProfileExportService extends BaseEntityExportService ctx, DeviceProfile deviceProfile, EntityExportData exportData) { deviceProfile.setDefaultDashboardId(getExternalIdOrElseInternal(ctx, deviceProfile.getDefaultDashboardId())); deviceProfile.setDefaultRuleChainId(getExternalIdOrElseInternal(ctx, deviceProfile.getDefaultRuleChainId())); + deviceProfile.setDefaultEdgeRuleChainId(getExternalIdOrElseInternal(ctx, deviceProfile.getDefaultEdgeRuleChainId())); } @Override diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/AssetProfileImportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/AssetProfileImportService.java index 3255c418c5..68481bad66 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/AssetProfileImportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/AssetProfileImportService.java @@ -46,6 +46,7 @@ public class AssetProfileImportService extends BaseEntityImportService exportData, IdProvider idProvider) { assetProfile.setDefaultRuleChainId(idProvider.getInternalId(assetProfile.getDefaultRuleChainId())); assetProfile.setDefaultDashboardId(idProvider.getInternalId(assetProfile.getDefaultDashboardId())); + assetProfile.setDefaultEdgeRuleChainId(idProvider.getInternalId(assetProfile.getDefaultEdgeRuleChainId())); return assetProfile; } diff --git a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DeviceProfileImportService.java b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DeviceProfileImportService.java index 70d09f6678..0684858803 100644 --- a/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DeviceProfileImportService.java +++ b/application/src/main/java/org/thingsboard/server/service/sync/ie/importing/impl/DeviceProfileImportService.java @@ -49,6 +49,7 @@ public class DeviceProfileImportService extends BaseEntityImportService exportData, IdProvider idProvider) { deviceProfile.setDefaultRuleChainId(idProvider.getInternalId(deviceProfile.getDefaultRuleChainId())); + deviceProfile.setDefaultEdgeRuleChainId(idProvider.getInternalId(deviceProfile.getDefaultEdgeRuleChainId())); deviceProfile.setDefaultDashboardId(idProvider.getInternalId(deviceProfile.getDefaultDashboardId())); deviceProfile.setFirmwareId(getOldEntityField(old, DeviceProfile::getFirmwareId)); deviceProfile.setSoftwareId(getOldEntityField(old, DeviceProfile::getSoftwareId)); diff --git a/application/src/main/java/org/thingsboard/server/service/transport/DefaultTbCoreToTransportService.java b/application/src/main/java/org/thingsboard/server/service/transport/DefaultTbCoreToTransportService.java index b87758ace5..380ba34f91 100644 --- a/application/src/main/java/org/thingsboard/server/service/transport/DefaultTbCoreToTransportService.java +++ b/application/src/main/java/org/thingsboard/server/service/transport/DefaultTbCoreToTransportService.java @@ -24,7 +24,7 @@ import org.thingsboard.server.queue.TbQueueCallback; import org.thingsboard.server.queue.TbQueueMsgMetadata; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.provider.TbQueueProducerProvider; import org.thingsboard.server.queue.util.TbCoreComponent; @@ -38,11 +38,11 @@ import static org.thingsboard.server.dao.model.ModelConstants.NULL_UUID; @TbCoreComponent public class DefaultTbCoreToTransportService implements TbCoreToTransportService { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbQueueProducer> tbTransportProducer; - public DefaultTbCoreToTransportService(NotificationsTopicService notificationsTopicService, TbQueueProducerProvider tbQueueProducerProvider) { - this.notificationsTopicService = notificationsTopicService; + public DefaultTbCoreToTransportService(TopicService topicService, TbQueueProducerProvider tbQueueProducerProvider) { + this.topicService = topicService; this.tbTransportProducer = tbQueueProducerProvider.getTransportNotificationsMsgProducer(); } @@ -60,7 +60,7 @@ public class DefaultTbCoreToTransportService implements TbCoreToTransportService } return; } - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, nodeId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, nodeId); UUID sessionId = new UUID(msg.getSessionIdMSB(), msg.getSessionIdLSB()); log.trace("[{}][{}] Pushing session data to topic: {}", tpi.getFullTopicName(), sessionId, msg); TbProtoQueueMsg queueMsg = new TbProtoQueueMsg<>(NULL_UUID, msg); diff --git a/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java b/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java index d197e1b4a4..5531f48a8e 100644 --- a/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java +++ b/application/src/main/java/org/thingsboard/server/service/transport/DefaultTransportApiService.java @@ -20,12 +20,16 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; import com.google.protobuf.ByteString; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.util.ConcurrentReferenceHashMap; import org.thingsboard.common.util.JacksonUtil; +import org.thingsboard.common.util.ThingsBoardExecutors; import org.thingsboard.server.cache.ota.OtaPackageDataCache; import org.thingsboard.server.cluster.TbClusterService; import org.thingsboard.server.common.data.ApiUsageState; @@ -105,10 +109,11 @@ import org.thingsboard.server.service.executors.DbCallbackExecutorService; import org.thingsboard.server.service.profile.TbDeviceProfileCache; import org.thingsboard.server.service.resource.TbResourceService; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import java.util.List; import java.util.Optional; import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -145,12 +150,28 @@ public class DefaultTransportApiService implements TransportApiService { private final OtaPackageDataCache otaPackageDataCache; private final QueueService queueService; - private final ConcurrentMap deviceCreationLocks = new ConcurrentHashMap<>(); + private final ConcurrentMap deviceCreationLocks = new ConcurrentReferenceHashMap<>(16, ConcurrentReferenceHashMap.ReferenceType.WEAK); + + @Value("${queue.transport_api.max_core_handler_threads:16}") + private int maxCoreHandlerThreads; + + ListeningExecutorService handlerExecutor; private static boolean checkIsMqttCredentials(DeviceCredentials credentials) { return credentials != null && DeviceCredentialsType.MQTT_BASIC.equals(credentials.getCredentialsType()); } + @PostConstruct + public void init() { + handlerExecutor = MoreExecutors.listeningDecorator(ThingsBoardExecutors.newWorkStealingPool(maxCoreHandlerThreads, "transport-api-service-core-handler")); + } + @PreDestroy + public void destroy() { + if (handlerExecutor != null) { + handlerExecutor.shutdownNow(); + } + } + @Override public ListenableFuture> handle(TbProtoQueueMsg tbProtoQueueMsg) { TransportApiRequestMsg transportApiRequestMsg = tbProtoQueueMsg.getValue(); @@ -158,16 +179,19 @@ public class DefaultTransportApiService implements TransportApiService { if (transportApiRequestMsg.hasValidateTokenRequestMsg()) { ValidateDeviceTokenRequestMsg msg = transportApiRequestMsg.getValidateTokenRequestMsg(); - result = validateCredentials(msg.getToken(), DeviceCredentialsType.ACCESS_TOKEN); + final String token = msg.getToken(); + result = handlerExecutor.submit(() -> validateCredentials(token, DeviceCredentialsType.ACCESS_TOKEN)); } else if (transportApiRequestMsg.hasValidateBasicMqttCredRequestMsg()) { TransportProtos.ValidateBasicMqttCredRequestMsg msg = transportApiRequestMsg.getValidateBasicMqttCredRequestMsg(); - result = validateCredentials(msg); + result = handlerExecutor.submit(() -> validateCredentials(msg)); } else if (transportApiRequestMsg.hasValidateX509CertRequestMsg()) { ValidateDeviceX509CertRequestMsg msg = transportApiRequestMsg.getValidateX509CertRequestMsg(); - result = validateCredentials(msg.getHash(), DeviceCredentialsType.X509_CERTIFICATE); + final String hash = msg.getHash(); + result = handlerExecutor.submit(() -> validateCredentials(hash, DeviceCredentialsType.X509_CERTIFICATE)); } else if (transportApiRequestMsg.hasValidateOrCreateX509CertRequestMsg()) { TransportProtos.ValidateOrCreateDeviceX509CertRequestMsg msg = transportApiRequestMsg.getValidateOrCreateX509CertRequestMsg(); - result = validateOrCreateDeviceX509Certificate(msg.getCertificateChain()); + final String certChain = msg.getCertificateChain(); + result = handlerExecutor.submit(() -> validateOrCreateDeviceX509Certificate(certChain)); } else if (transportApiRequestMsg.hasGetOrCreateDeviceRequestMsg()) { result = handle(transportApiRequestMsg.getGetOrCreateDeviceRequestMsg()); } else if (transportApiRequestMsg.hasEntityProfileRequestMsg()) { @@ -176,7 +200,8 @@ public class DefaultTransportApiService implements TransportApiService { result = handle(transportApiRequestMsg.getLwM2MRequestMsg()); } else if (transportApiRequestMsg.hasValidateDeviceLwM2MCredentialsRequestMsg()) { ValidateDeviceLwM2MCredentialsRequestMsg msg = transportApiRequestMsg.getValidateDeviceLwM2MCredentialsRequestMsg(); - result = validateCredentials(msg.getCredentialsId(), DeviceCredentialsType.LWM2M_CREDENTIALS); + final String credentialsId = msg.getCredentialsId(); + result = handlerExecutor.submit(() -> validateCredentials(credentialsId, DeviceCredentialsType.LWM2M_CREDENTIALS)); } else if (transportApiRequestMsg.hasProvisionDeviceRequestMsg()) { result = handle(transportApiRequestMsg.getProvisionDeviceRequestMsg()); } else if (transportApiRequestMsg.hasResourceRequestMsg()) { @@ -198,24 +223,24 @@ public class DefaultTransportApiService implements TransportApiService { MoreExecutors.directExecutor()); } - private ListenableFuture validateCredentials(String credentialsId, DeviceCredentialsType credentialsType) { + private TransportApiResponseMsg validateCredentials(String credentialsId, DeviceCredentialsType credentialsType) { //TODO: Make async and enable caching DeviceCredentials credentials = deviceCredentialsService.findDeviceCredentialsByCredentialsId(credentialsId); if (credentials != null && credentials.getCredentialsType() == credentialsType) { return getDeviceInfo(credentials); } else { - return getEmptyTransportApiResponseFuture(); + return getEmptyTransportApiResponse(); } } - private ListenableFuture validateCredentials(TransportProtos.ValidateBasicMqttCredRequestMsg mqtt) { + private TransportApiResponseMsg validateCredentials(TransportProtos.ValidateBasicMqttCredRequestMsg mqtt) { DeviceCredentials credentials; if (StringUtils.isEmpty(mqtt.getUserName())) { credentials = checkMqttCredentials(mqtt, EncryptionUtil.getSha3Hash(mqtt.getClientId())); if (credentials != null) { return getDeviceInfo(credentials); } else { - return getEmptyTransportApiResponseFuture(); + return getEmptyTransportApiResponse(); } } else { credentials = deviceCredentialsService.findDeviceCredentialsByCredentialsId( @@ -225,7 +250,7 @@ public class DefaultTransportApiService implements TransportApiService { if (VALID.equals(validationResult)) { return getDeviceInfo(credentials); } else if (PASSWORD_MISMATCH.equals(validationResult)) { - return getEmptyTransportApiResponseFuture(); + return getEmptyTransportApiResponse(); } else { return validateUserNameCredentials(mqtt); } @@ -235,7 +260,7 @@ public class DefaultTransportApiService implements TransportApiService { } } - protected ListenableFuture validateOrCreateDeviceX509Certificate(String certificateChain) { + protected TransportApiResponseMsg validateOrCreateDeviceX509Certificate(String certificateChain) { List chain = X509_CERTIFICATE_TRIM_CHAIN_PATTERN.matcher(certificateChain).results().map(match -> EncryptionUtil.certTrimNewLines(match.group())).collect(Collectors.toList()); for (String certificateValue : chain) { @@ -255,16 +280,16 @@ public class DefaultTransportApiService implements TransportApiService { } } catch (ProvisionFailedException e) { log.debug("[{}][{}] Failed to provision device with cert chain: {}", deviceProfile.getTenantId(), deviceProfile.getId(), provisionRequest, e); - return getEmptyTransportApiResponseFuture(); + return getEmptyTransportApiResponse(); } } else if (deviceProfile != null) { log.warn("[{}][{}] Device Profile provision configuration mismatched: expected {}, actual {}", deviceProfile.getTenantId(), deviceProfile.getId(), DeviceProfileProvisionType.X509_CERTIFICATE_CHAIN, deviceProfile.getProvisionType()); } } - return getEmptyTransportApiResponseFuture(); + return getEmptyTransportApiResponse(); } - private ListenableFuture validateUserNameCredentials(TransportProtos.ValidateBasicMqttCredRequestMsg mqtt) { + private TransportApiResponseMsg validateUserNameCredentials(TransportProtos.ValidateBasicMqttCredRequestMsg mqtt) { DeviceCredentials credentials = deviceCredentialsService.findDeviceCredentialsByCredentialsId(mqtt.getUserName()); if (credentials != null) { switch (credentials.getCredentialsType()) { @@ -274,11 +299,11 @@ public class DefaultTransportApiService implements TransportApiService { if (VALID.equals(validateMqttCredentials(mqtt, credentials))) { return getDeviceInfo(credentials); } else { - return getEmptyTransportApiResponseFuture(); + return getEmptyTransportApiResponse(); } } } - return getEmptyTransportApiResponseFuture(); + return getEmptyTransportApiResponse(); } private DeviceCredentials checkMqttCredentials(TransportProtos.ValidateBasicMqttCredRequestMsg clientCred, String credId) { @@ -519,31 +544,30 @@ public class DefaultTransportApiService implements TransportApiService { .build()); } - private ListenableFuture getDeviceInfo(DeviceCredentials credentials) { - return Futures.transform(deviceService.findDeviceByIdAsync(TenantId.SYS_TENANT_ID, credentials.getDeviceId()), device -> { - if (device == null) { - log.trace("[{}] Failed to lookup device by id", credentials.getDeviceId()); - return getEmptyTransportApiResponse(); + TransportApiResponseMsg getDeviceInfo(DeviceCredentials credentials) { + Device device = deviceService.findDeviceById(TenantId.SYS_TENANT_ID, credentials.getDeviceId()); + if (device == null) { + log.trace("[{}] Failed to lookup device by id", credentials.getDeviceId()); + return getEmptyTransportApiResponse(); + } + try { + ValidateDeviceCredentialsResponseMsg.Builder builder = ValidateDeviceCredentialsResponseMsg.newBuilder(); + builder.setDeviceInfo(getDeviceInfoProto(device)); + DeviceProfile deviceProfile = deviceProfileCache.get(device.getTenantId(), device.getDeviceProfileId()); + if (deviceProfile != null) { + builder.setProfileBody(ByteString.copyFrom(dataDecodingEncodingService.encode(deviceProfile))); + } else { + log.warn("[{}] Failed to find device profile [{}] for device. ", device.getId(), device.getDeviceProfileId()); } - try { - ValidateDeviceCredentialsResponseMsg.Builder builder = ValidateDeviceCredentialsResponseMsg.newBuilder(); - builder.setDeviceInfo(getDeviceInfoProto(device)); - DeviceProfile deviceProfile = deviceProfileCache.get(device.getTenantId(), device.getDeviceProfileId()); - if (deviceProfile != null) { - builder.setProfileBody(ByteString.copyFrom(dataDecodingEncodingService.encode(deviceProfile))); - } else { - log.warn("[{}] Failed to find device profile [{}] for device. ", device.getId(), device.getDeviceProfileId()); - } - if (!StringUtils.isEmpty(credentials.getCredentialsValue())) { - builder.setCredentialsBody(credentials.getCredentialsValue()); - } - return TransportApiResponseMsg.newBuilder() - .setValidateCredResponseMsg(builder.build()).build(); - } catch (JsonProcessingException e) { - log.warn("[{}] Failed to lookup device by id", credentials.getDeviceId(), e); - return getEmptyTransportApiResponse(); + if (!StringUtils.isEmpty(credentials.getCredentialsValue())) { + builder.setCredentialsBody(credentials.getCredentialsValue()); } - }, MoreExecutors.directExecutor()); + return TransportApiResponseMsg.newBuilder() + .setValidateCredResponseMsg(builder.build()).build(); + } catch (JsonProcessingException e) { + log.warn("[{}] Failed to lookup device by id", credentials.getDeviceId(), e); + return getEmptyTransportApiResponse(); + } } private DeviceInfoProto getDeviceInfoProto(Device device) throws JsonProcessingException { diff --git a/application/src/main/java/org/thingsboard/server/service/ws/DefaultWebSocketService.java b/application/src/main/java/org/thingsboard/server/service/ws/DefaultWebSocketService.java index 21d69d6b42..d0334f90b6 100644 --- a/application/src/main/java/org/thingsboard/server/service/ws/DefaultWebSocketService.java +++ b/application/src/main/java/org/thingsboard/server/service/ws/DefaultWebSocketService.java @@ -62,7 +62,7 @@ import org.thingsboard.server.service.subscription.TbAttributeSubscription; import org.thingsboard.server.service.subscription.TbAttributeSubscriptionScope; import org.thingsboard.server.service.subscription.TbEntityDataSubscriptionService; import org.thingsboard.server.service.subscription.TbLocalSubscriptionService; -import org.thingsboard.server.service.subscription.TbTimeseriesSubscription; +import org.thingsboard.server.service.subscription.TbTimeSeriesSubscription; import org.thingsboard.server.service.ws.notification.NotificationCommandsHandler; import org.thingsboard.server.service.ws.notification.cmd.NotificationCmdsWrapper; import org.thingsboard.server.service.ws.notification.cmd.WsCmd; @@ -443,7 +443,7 @@ public class DefaultWebSocketService implements WebSocketService { } } } catch (IOException e) { - log.warn("[{}] Failed to send session close: {}", sessionRef.getSessionId(), e); + log.warn("[{}] Failed to send session close:", sessionRef.getSessionId(), e); return false; } return true; @@ -477,6 +477,7 @@ public class DefaultWebSocketService implements WebSocketService { private void handleWsAttributesSubscriptionByKeys(WebSocketSessionRef sessionRef, AttributesSubscriptionCmd cmd, String sessionId, EntityId entityId, List keys) { + long queryTs = System.currentTimeMillis(); FutureCallback> callback = new FutureCallback<>() { @Override public void onSuccess(List data) { @@ -495,6 +496,7 @@ public class DefaultWebSocketService implements WebSocketService { .subscriptionId(cmd.getCmdId()) .tenantId(sessionRef.getSecurityCtx().getTenantId()) .entityId(entityId) + .queryTs(queryTs) .allKeys(false) .keyStates(subState) .scope(scope) @@ -591,7 +593,10 @@ public class DefaultWebSocketService implements WebSocketService { } private void handleWsAttributesSubscription(WebSocketSessionRef sessionRef, - AttributesSubscriptionCmd cmd, String sessionId, EntityId entityId) { + AttributesSubscriptionCmd cmd, + String sessionId, + EntityId entityId) { + long queryTs = System.currentTimeMillis(); FutureCallback> callback = new FutureCallback<>() { @Override public void onSuccess(List data) { @@ -609,6 +614,7 @@ public class DefaultWebSocketService implements WebSocketService { .subscriptionId(cmd.getCmdId()) .tenantId(sessionRef.getSecurityCtx().getTenantId()) .entityId(entityId) + .queryTs(queryTs) .allKeys(true) .keyStates(subState) .updateProcessor((subscription, update) -> { @@ -664,17 +670,18 @@ public class DefaultWebSocketService implements WebSocketService { Optional> keysOptional = getKeys(cmd); if (keysOptional.isPresent()) { - handleWsTimeseriesSubscriptionByKeys(sessionRef, cmd, sessionId, entityId); + handleWsTimeSeriesSubscriptionByKeys(sessionRef, cmd, sessionId, entityId); } else { - handleWsTimeseriesSubscription(sessionRef, cmd, sessionId, entityId); + handleWsTimeSeriesSubscription(sessionRef, cmd, sessionId, entityId); } } } } - private void handleWsTimeseriesSubscriptionByKeys(WebSocketSessionRef sessionRef, + private void handleWsTimeSeriesSubscriptionByKeys(WebSocketSessionRef sessionRef, TimeseriesSubscriptionCmd cmd, String sessionId, EntityId entityId) { long startTs; + long queryTs = System.currentTimeMillis(); if (cmd.getTimeWindow() > 0) { List keys = new ArrayList<>(getKeys(cmd).orElse(Collections.emptySet())); log.debug("[{}] fetching timeseries data for last {} ms for keys: ({}) for device : {}", sessionId, cmd.getTimeWindow(), cmd.getKeys(), entityId); @@ -682,22 +689,22 @@ public class DefaultWebSocketService implements WebSocketService { long endTs = cmd.getStartTs() + cmd.getTimeWindow(); List queries = keys.stream().map(key -> new BaseReadTsKvQuery(key, startTs, endTs, cmd.getInterval(), getLimit(cmd.getLimit()), getAggregation(cmd.getAgg()))).collect(Collectors.toList()); - - final FutureCallback> callback = getSubscriptionCallback(sessionRef, cmd, sessionId, entityId, startTs, keys); + final FutureCallback> callback = getSubscriptionCallback(sessionRef, cmd, sessionId, entityId, queryTs, startTs, keys); accessValidator.validate(sessionRef.getSecurityCtx(), Operation.READ_TELEMETRY, entityId, on(r -> Futures.addCallback(tsService.findAll(sessionRef.getSecurityCtx().getTenantId(), entityId, queries), callback, executor), callback::onFailure)); } else { List keys = new ArrayList<>(getKeys(cmd).orElse(Collections.emptySet())); startTs = System.currentTimeMillis(); log.debug("[{}] fetching latest timeseries data for keys: ({}) for device : {}", sessionId, cmd.getKeys(), entityId); - final FutureCallback> callback = getSubscriptionCallback(sessionRef, cmd, sessionId, entityId, startTs, keys); + final FutureCallback> callback = getSubscriptionCallback(sessionRef, cmd, sessionId, entityId, queryTs, startTs, keys); accessValidator.validate(sessionRef.getSecurityCtx(), Operation.READ_TELEMETRY, entityId, on(r -> Futures.addCallback(tsService.findLatest(sessionRef.getSecurityCtx().getTenantId(), entityId, keys), callback, executor), callback::onFailure)); } } - private void handleWsTimeseriesSubscription(WebSocketSessionRef sessionRef, + private void handleWsTimeSeriesSubscription(WebSocketSessionRef sessionRef, TimeseriesSubscriptionCmd cmd, String sessionId, EntityId entityId) { + long queryTs = System.currentTimeMillis(); FutureCallback> callback = new FutureCallback>() { @Override public void onSuccess(List data) { @@ -705,7 +712,7 @@ public class DefaultWebSocketService implements WebSocketService { data.forEach(v -> subState.put(v.getKey(), v.getTs())); Lock subLock = new ReentrantLock(); - TbTimeseriesSubscription sub = TbTimeseriesSubscription.builder() + TbTimeSeriesSubscription sub = TbTimeSeriesSubscription.builder() .serviceId(serviceId) .sessionId(sessionId) .subscriptionId(cmd.getCmdId()) @@ -719,6 +726,7 @@ public class DefaultWebSocketService implements WebSocketService { subLock.unlock(); } }) + .queryTs(queryTs) .allKeys(true) .keyStates(subState) .build(); @@ -749,7 +757,8 @@ public class DefaultWebSocketService implements WebSocketService { on(r -> Futures.addCallback(tsService.findAllLatest(sessionRef.getSecurityCtx().getTenantId(), entityId), callback, executor), callback::onFailure)); } - private FutureCallback> getSubscriptionCallback(final WebSocketSessionRef sessionRef, final TimeseriesSubscriptionCmd cmd, final String sessionId, final EntityId entityId, final long startTs, final List keys) { + private FutureCallback> getSubscriptionCallback(final WebSocketSessionRef sessionRef, final TimeseriesSubscriptionCmd cmd, + final String sessionId, final EntityId entityId, final long queryTs, final long startTs, final List keys) { return new FutureCallback<>() { @Override public void onSuccess(List data) { @@ -758,7 +767,7 @@ public class DefaultWebSocketService implements WebSocketService { data.forEach(v -> subState.put(v.getKey(), v.getTs())); Lock subLock = new ReentrantLock(); - TbTimeseriesSubscription sub = TbTimeseriesSubscription.builder() + TbTimeSeriesSubscription sub = TbTimeSeriesSubscription.builder() .serviceId(serviceId) .sessionId(sessionId) .subscriptionId(cmd.getCmdId()) @@ -772,6 +781,7 @@ public class DefaultWebSocketService implements WebSocketService { subLock.unlock(); } }) + .queryTs(queryTs) .allKeys(false) .keyStates(subState) .build(); diff --git a/application/src/main/java/org/thingsboard/server/service/ws/notification/DefaultNotificationCommandsHandler.java b/application/src/main/java/org/thingsboard/server/service/ws/notification/DefaultNotificationCommandsHandler.java index 012808b253..0937275a0d 100644 --- a/application/src/main/java/org/thingsboard/server/service/ws/notification/DefaultNotificationCommandsHandler.java +++ b/application/src/main/java/org/thingsboard/server/service/ws/notification/DefaultNotificationCommandsHandler.java @@ -32,6 +32,7 @@ import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.util.TbCoreComponent; import org.thingsboard.server.service.security.model.SecurityUser; import org.thingsboard.server.service.subscription.TbLocalSubscriptionService; +import org.thingsboard.server.service.subscription.TbSubscription; import org.thingsboard.server.service.ws.WebSocketService; import org.thingsboard.server.service.ws.WebSocketSessionRef; import org.thingsboard.server.service.ws.notification.cmd.MarkAllNotificationsAsReadCmd; @@ -119,7 +120,8 @@ public class DefaultNotificationCommandsHandler implements NotificationCommandsH /* Notifications subscription update handling */ - private void handleNotificationsSubscriptionUpdate(NotificationsSubscription subscription, NotificationsSubscriptionUpdate subscriptionUpdate) { + private void handleNotificationsSubscriptionUpdate(TbSubscription sub, NotificationsSubscriptionUpdate subscriptionUpdate) { + NotificationsSubscription subscription = (NotificationsSubscription) sub; try { if (subscriptionUpdate.getNotificationUpdate() != null) { handleNotificationUpdate(subscription, subscriptionUpdate.getNotificationUpdate()); @@ -178,7 +180,8 @@ public class DefaultNotificationCommandsHandler implements NotificationCommandsH /* Notifications count subscription update handling */ - private void handleNotificationsCountSubscriptionUpdate(NotificationsCountSubscription subscription, NotificationsSubscriptionUpdate subscriptionUpdate) { + private void handleNotificationsCountSubscriptionUpdate(TbSubscription sub, NotificationsSubscriptionUpdate subscriptionUpdate) { + NotificationsCountSubscription subscription = (NotificationsCountSubscription) sub; try { if (subscriptionUpdate.getNotificationUpdate() != null) { handleNotificationUpdate(subscription, subscriptionUpdate.getNotificationUpdate()); diff --git a/application/src/main/java/org/thingsboard/server/service/ws/notification/sub/NotificationsCountSubscription.java b/application/src/main/java/org/thingsboard/server/service/ws/notification/sub/NotificationsCountSubscription.java index cb5d140d21..5263f9d651 100644 --- a/application/src/main/java/org/thingsboard/server/service/ws/notification/sub/NotificationsCountSubscription.java +++ b/application/src/main/java/org/thingsboard/server/service/ws/notification/sub/NotificationsCountSubscription.java @@ -33,7 +33,7 @@ public class NotificationsCountSubscription extends TbSubscription updateProcessor) { + BiConsumer, NotificationsSubscriptionUpdate> updateProcessor) { super(serviceId, sessionId, subscriptionId, tenantId, entityId, TbSubscriptionType.NOTIFICATIONS_COUNT, updateProcessor); } diff --git a/application/src/main/java/org/thingsboard/server/service/ws/notification/sub/NotificationsSubscription.java b/application/src/main/java/org/thingsboard/server/service/ws/notification/sub/NotificationsSubscription.java index 591781a5f6..ede82f9ff7 100644 --- a/application/src/main/java/org/thingsboard/server/service/ws/notification/sub/NotificationsSubscription.java +++ b/application/src/main/java/org/thingsboard/server/service/ws/notification/sub/NotificationsSubscription.java @@ -43,7 +43,7 @@ public class NotificationsSubscription extends TbSubscription updateProcessor, + BiConsumer, NotificationsSubscriptionUpdate> updateProcessor, int limit) { super(serviceId, sessionId, subscriptionId, tenantId, entityId, TbSubscriptionType.NOTIFICATIONS, updateProcessor); this.limit = limit; diff --git a/application/src/main/java/org/thingsboard/server/service/ws/telemetry/sub/AlarmSubscriptionUpdate.java b/application/src/main/java/org/thingsboard/server/service/ws/telemetry/sub/AlarmSubscriptionUpdate.java index 90041ffa13..66d18b24b2 100644 --- a/application/src/main/java/org/thingsboard/server/service/ws/telemetry/sub/AlarmSubscriptionUpdate.java +++ b/application/src/main/java/org/thingsboard/server/service/ws/telemetry/sub/AlarmSubscriptionUpdate.java @@ -16,13 +16,13 @@ package org.thingsboard.server.service.ws.telemetry.sub; import lombok.Getter; +import lombok.ToString; import org.thingsboard.server.common.data.alarm.AlarmInfo; import org.thingsboard.server.service.subscription.SubscriptionErrorCode; +@ToString public class AlarmSubscriptionUpdate { - @Getter - private int subscriptionId; @Getter private int errorCode; @Getter @@ -32,31 +32,24 @@ public class AlarmSubscriptionUpdate { @Getter private boolean alarmDeleted; - public AlarmSubscriptionUpdate(int subscriptionId, AlarmInfo alarm) { - this(subscriptionId, alarm, false); + public AlarmSubscriptionUpdate(AlarmInfo alarm) { + this(alarm, false); } - public AlarmSubscriptionUpdate(int subscriptionId, AlarmInfo alarm, boolean alarmDeleted) { + public AlarmSubscriptionUpdate(AlarmInfo alarm, boolean alarmDeleted) { super(); - this.subscriptionId = subscriptionId; this.alarm = alarm; this.alarmDeleted = alarmDeleted; } - public AlarmSubscriptionUpdate(int subscriptionId, SubscriptionErrorCode errorCode) { - this(subscriptionId, errorCode, null); + public AlarmSubscriptionUpdate(SubscriptionErrorCode errorCode) { + this(errorCode, null); } - public AlarmSubscriptionUpdate(int subscriptionId, SubscriptionErrorCode errorCode, String errorMsg) { + public AlarmSubscriptionUpdate(SubscriptionErrorCode errorCode, String errorMsg) { super(); - this.subscriptionId = subscriptionId; this.errorCode = errorCode.getCode(); this.errorMsg = errorMsg != null ? errorMsg : errorCode.getDefaultMsg(); } - @Override - public String toString() { - return "AlarmUpdate [subscriptionId=" + subscriptionId + ", errorCode=" + errorCode + ", errorMsg=" + errorMsg + - ", alarm=" + alarm + "]"; - } } \ No newline at end of file diff --git a/application/src/main/java/org/thingsboard/server/service/ws/telemetry/sub/TelemetrySubscriptionUpdate.java b/application/src/main/java/org/thingsboard/server/service/ws/telemetry/sub/TelemetrySubscriptionUpdate.java index 108c5cf1d4..cea1731a31 100644 --- a/application/src/main/java/org/thingsboard/server/service/ws/telemetry/sub/TelemetrySubscriptionUpdate.java +++ b/application/src/main/java/org/thingsboard/server/service/ws/telemetry/sub/TelemetrySubscriptionUpdate.java @@ -19,6 +19,7 @@ import org.thingsboard.server.common.data.kv.TsKvEntry; import org.thingsboard.server.service.subscription.SubscriptionErrorCode; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; @@ -27,7 +28,7 @@ import java.util.stream.Collectors; public class TelemetrySubscriptionUpdate { - private int subscriptionId; + private final int subscriptionId; private int errorCode; private String errorMsg; private Map> data; @@ -94,7 +95,14 @@ public class TelemetrySubscriptionUpdate { @Override public String toString() { - return "TsSubscriptionUpdate [subscriptionId=" + subscriptionId + ", errorCode=" + errorCode + ", errorMsg=" + errorMsg + ", data=" - + data + "]"; + StringBuilder result = new StringBuilder("TelemetrySubscriptionUpdate [subscriptionId=" + subscriptionId + ", errorCode=" + errorCode + ", errorMsg=" + errorMsg + ", data="); + data.forEach((k, v) -> { + result.append(k).append("=["); + for(Object a : v){ + result.append(Arrays.toString((Object[])a)).append("|"); + } + result.append("]"); + }); + return result.toString(); } } diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index a954178d5c..999c3c0fff 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -1228,7 +1228,7 @@ edges: # Number of milliseconds to wait before the next check of edge events in DB no_read_records_sleep: "${EDGES_NO_READ_RECORDS_SLEEP:1000}" # Number of milliseconds to wait before resending failed batch of edge events to edge - sleep_between_batches: "${EDGES_SLEEP_BETWEEN_BATCHES:10000}" + sleep_between_batches: "${EDGES_SLEEP_BETWEEN_BATCHES:60000}" # Number of threads that are used to check DB for edge events scheduler_pool_size: "${EDGES_SCHEDULER_POOL_SIZE:1}" # Number of threads that are used to send downlink messages to edge over gRPC @@ -1271,6 +1271,7 @@ swagger: # Queue configuration parameters queue: type: "${TB_QUEUE_TYPE:in-memory}" # in-memory or kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka) except of js executor topics (please use REMOTE_JS_EVAL_REQUEST_TOPIC and REMOTE_JS_EVAL_RESPONSE_TOPIC to specify custom topic names) in_memory: stats: # For debug level @@ -1490,6 +1491,8 @@ queue: max_requests_timeout: "${TB_QUEUE_TRANSPORT_MAX_REQUEST_TIMEOUT:10000}" # Amount of threads used to invoke callbacks max_callback_threads: "${TB_QUEUE_TRANSPORT_MAX_CALLBACK_THREADS:100}" + # Amount of threads used for transport API requests + max_core_handler_threads: "${TB_QUEUE_TRANSPORT_MAX_CORE_HANDLER_THREADS:16}" # Interval in milliseconds to poll api requests from transport microservices request_poll_interval: "${TB_QUEUE_TRANSPORT_REQUEST_POLL_INTERVAL_MS:25}" # Interval in milliseconds to poll api response from transport microservices diff --git a/application/src/test/java/org/thingsboard/server/controller/AbstractNotifyEntityTest.java b/application/src/test/java/org/thingsboard/server/controller/AbstractNotifyEntityTest.java index 71c244890d..d9bc42db9a 100644 --- a/application/src/test/java/org/thingsboard/server/controller/AbstractNotifyEntityTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/AbstractNotifyEntityTest.java @@ -91,7 +91,7 @@ public abstract class AbstractNotifyEntityTest extends AbstractWebTest { int cntTime = 1; Mockito.verify(tbClusterService, times(cntTime)).sendNotificationMsgToEdge(Mockito.eq(tenantId), Mockito.isNull(), Mockito.isNull(), Mockito.any(), Mockito.eq(EdgeEventType.RELATION), - Mockito.eq(edgeTypeByActionType(actionType))); + Mockito.eq(edgeTypeByActionType(actionType)), Mockito.any()); ArgumentMatcher matcherOriginatorId = argument -> argument.equals(relation.getTo()); ArgumentMatcher matcherEntityClassEquals = Objects::isNull; ArgumentMatcher matcherCustomerId = customerId == null ? @@ -111,7 +111,7 @@ public abstract class AbstractNotifyEntityTest extends AbstractWebTest { ActionType actionType, int cntTime) { Mockito.verify(tbClusterService, times(cntTime)).sendNotificationMsgToEdge(Mockito.eq(tenantId), Mockito.isNull(), Mockito.isNull(), Mockito.any(), Mockito.eq(EdgeEventType.RELATION), - Mockito.eq(edgeTypeByActionType(actionType))); + Mockito.eq(edgeTypeByActionType(actionType)), Mockito.any()); ArgumentMatcher matcherOriginatorId = argument -> argument.getClass().equals(relation.getFrom().getClass()); ArgumentMatcher matcherEntityClassEquals = Objects::isNull; ArgumentMatcher matcherCustomerId = customerId == null ? @@ -318,13 +318,13 @@ public abstract class AbstractNotifyEntityTest extends AbstractWebTest { private void testNotificationMsgToEdgeServiceNeverWithActionType(EntityId entityId, ActionType actionType) { EdgeEventActionType edgeEventActionType = ActionType.CREDENTIALS_UPDATED.equals(actionType) ? EdgeEventActionType.CREDENTIALS_UPDATED : edgeTypeByActionType(actionType); - Mockito.verify(tbClusterService, never()).sendNotificationMsgToEdge(Mockito.any(), - Mockito.any(), Mockito.any(entityId.getClass()), Mockito.any(), Mockito.any(), Mockito.eq(edgeEventActionType)); + Mockito.verify(tbClusterService, never()).sendNotificationMsgToEdge(Mockito.any(), Mockito.any(), + Mockito.any(entityId.getClass()), Mockito.any(), Mockito.any(), Mockito.eq(edgeEventActionType), Mockito.any()); } private void testNotificationMsgToEdgeServiceNever(EntityId entityId) { - Mockito.verify(tbClusterService, never()).sendNotificationMsgToEdge(Mockito.any(), - Mockito.any(), Mockito.any(entityId.getClass()), Mockito.any(), Mockito.any(), Mockito.any()); + Mockito.verify(tbClusterService, never()).sendNotificationMsgToEdge(Mockito.any(), Mockito.any(), + Mockito.any(entityId.getClass()), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()); } private void testLogEntityActionNever(EntityId entityId, HasName entity) { @@ -358,13 +358,13 @@ public abstract class AbstractNotifyEntityTest extends AbstractWebTest { argument -> argument.getClass().equals(entityId.getClass()); Mockito.verify(tbClusterService, times(cntTime)).sendNotificationMsgToEdge(Mockito.eq(tenantId), Mockito.any(), Mockito.argThat(matcherEntityId), Mockito.any(), Mockito.isNull(), - Mockito.eq(edgeEventActionType)); + Mockito.eq(edgeEventActionType), Mockito.any()); } private void testSendNotificationMsgToEdgeServiceTimeEntityEqAny(TenantId tenantId, ActionType actionType, int cntTime) { Mockito.verify(tbClusterService, times(cntTime)).sendNotificationMsgToEdge(Mockito.eq(tenantId), Mockito.any(), Mockito.any(EntityId.class), Mockito.any(), Mockito.isNull(), - Mockito.eq(edgeTypeByActionType(actionType))); + Mockito.eq(edgeTypeByActionType(actionType)), Mockito.any()); } protected void testBroadcastEntityStateChangeEventTime(EntityId entityId, TenantId tenantId, int cntTime) { diff --git a/application/src/test/java/org/thingsboard/server/controller/DeviceConnectivityControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/DeviceConnectivityControllerTest.java index 1eaf719921..adec1951dd 100644 --- a/application/src/test/java/org/thingsboard/server/controller/DeviceConnectivityControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/DeviceConnectivityControllerTest.java @@ -17,12 +17,14 @@ package org.thingsboard.server.controller; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; import org.mockito.AdditionalAnswers; import org.mockito.Mockito; import org.springframework.context.annotation.Bean; @@ -32,6 +34,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestPropertySource; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.common.util.ThingsBoardExecutors; +import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceProfileType; @@ -44,6 +47,7 @@ import org.thingsboard.server.common.data.device.profile.DefaultDeviceProfileCon import org.thingsboard.server.common.data.device.profile.DeviceProfileData; import org.thingsboard.server.common.data.device.profile.MqttDeviceProfileTransportConfiguration; import org.thingsboard.server.common.data.id.DeviceProfileId; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.common.data.security.DeviceCredentialsType; @@ -65,12 +69,7 @@ import static org.thingsboard.server.dao.util.DeviceConnectivityUtil.MQTTS; import static org.thingsboard.server.dao.util.DeviceConnectivityUtil.CA_ROOT_CERT_PEM; @TestPropertySource(properties = { - "device.connectivity.https.enabled=true", - "device.connectivity.http.port=8080", - "device.connectivity.https.port=444", - "device.connectivity.mqtts.enabled=true", - "device.connectivity.mqtts.pem_cert_file=/tmp/" + CA_ROOT_CERT_PEM, - "device.connectivity.coaps.enabled=true", + "device.connectivity.mqtts.pem_cert_file=/tmp/" + CA_ROOT_CERT_PEM }) @ContextConfiguration(classes = {DeviceConnectivityControllerTest.Config.class}) @DaoSqlTest @@ -122,6 +121,19 @@ public class DeviceConnectivityControllerTest extends AbstractControllerTest { loginSysAdmin(); + AdminSettings adminSettings = doGet("/api/admin/settings/connectivity", AdminSettings.class); + JsonNode connectivity = adminSettings.getJsonValue(); + + ((ObjectNode)connectivity.get("http")).put("port", 8080); + ((ObjectNode)connectivity.get("http")).put("enabled", true); + ((ObjectNode)connectivity.get("https")).put("enabled", true); + ((ObjectNode)connectivity.get("https")).put("port", 444); + ((ObjectNode)connectivity.get("mqtt")).put("enabled", true); + ((ObjectNode)connectivity.get("mqtts")).put("enabled", true); + ((ObjectNode)connectivity.get("coap")).put("enabled", true); + ((ObjectNode)connectivity.get("coaps")).put("enabled", true); + doPost("/api/admin/settings", adminSettings); + Tenant tenant = new Tenant(); tenant.setTitle("My tenant"); savedTenant = doPost("/api/tenant", tenant, Tenant.class); diff --git a/application/src/test/java/org/thingsboard/server/controller/DeviceConnectivityControllerWithDefaultPortTest.java b/application/src/test/java/org/thingsboard/server/controller/DeviceConnectivityControllerWithDefaultPortTest.java index bba834912f..0889f458ba 100644 --- a/application/src/test/java/org/thingsboard/server/controller/DeviceConnectivityControllerWithDefaultPortTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/DeviceConnectivityControllerWithDefaultPortTest.java @@ -17,6 +17,7 @@ package org.thingsboard.server.controller; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; import org.junit.After; @@ -28,8 +29,8 @@ import org.mockito.Mockito; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Primary; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.TestPropertySource; import org.thingsboard.common.util.ThingsBoardExecutors; +import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.Tenant; import org.thingsboard.server.common.data.User; @@ -43,14 +44,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import static org.thingsboard.server.dao.util.DeviceConnectivityUtil.HTTP; import static org.thingsboard.server.dao.util.DeviceConnectivityUtil.HTTPS; -@TestPropertySource(properties = { - "device.connectivity.https.enabled=true", - "device.connectivity.http.port=80", - "device.connectivity.mqtt.enabled=false", - "device.connectivity.mqtts.enabled=false", - "device.connectivity.coap.enabled=false", - "device.connectivity.coaps.enabled=false", -}) @ContextConfiguration(classes = {DeviceConnectivityControllerWithDefaultPortTest.Config.class}) @DaoSqlTest public class DeviceConnectivityControllerWithDefaultPortTest extends AbstractControllerTest { @@ -73,6 +66,17 @@ public class DeviceConnectivityControllerWithDefaultPortTest extends AbstractCon loginSysAdmin(); + AdminSettings adminSettings = doGet("/api/admin/settings/connectivity", AdminSettings.class); + JsonNode connectivity = adminSettings.getJsonValue(); + + ((ObjectNode) connectivity.get("http")).put("port", 80); + ((ObjectNode) connectivity.get("https")).put("enabled", true); + ((ObjectNode) connectivity.get("mqtt")).put("enabled", false); + ((ObjectNode) connectivity.get("mqtts")).put("enabled", false); + ((ObjectNode) connectivity.get("coaps")).put("enabled", false); + ((ObjectNode) connectivity.get("coap")).put("enabled", false); + doPost("/api/admin/settings", adminSettings); + Tenant tenant = new Tenant(); tenant.setTitle("My tenant"); savedTenant = doPost("/api/tenant", tenant, Tenant.class); diff --git a/application/src/test/java/org/thingsboard/server/controller/TbResourceControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/TbResourceControllerTest.java index d4c21c63fc..239c189243 100644 --- a/application/src/test/java/org/thingsboard/server/controller/TbResourceControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/TbResourceControllerTest.java @@ -105,9 +105,9 @@ public class TbResourceControllerTest extends AbstractControllerTest { TbResource savedResource = save(resource); - testNotifyEntityOneTimeMsgToEdgeServiceNever(savedResource, savedResource.getId(), savedResource.getId(), + testNotifyEntityAllOneTimeLogEntityActionEntityEqClass(savedResource, savedResource.getId(), savedResource.getId(), savedTenant.getId(), tenantAdmin.getCustomerId(), tenantAdmin.getId(), tenantAdmin.getEmail(), - ActionType.ADDED); + ActionType.ADDED, ActionType.ADDED); Assert.assertNotNull(savedResource); Assert.assertNotNull(savedResource.getId()); @@ -125,9 +125,9 @@ public class TbResourceControllerTest extends AbstractControllerTest { TbResource foundResource = doGet("/api/resource/" + savedResource.getId().getId().toString(), TbResource.class); Assert.assertEquals(foundResource.getTitle(), savedResource.getTitle()); - testNotifyEntityOneTimeMsgToEdgeServiceNever(foundResource, foundResource.getId(), foundResource.getId(), + testNotifyEntityAllOneTimeLogEntityActionEntityEqClass(foundResource, foundResource.getId(), foundResource.getId(), savedTenant.getId(), tenantAdmin.getCustomerId(), tenantAdmin.getId(), tenantAdmin.getEmail(), - ActionType.UPDATED); + ActionType.UPDATED, ActionType.UPDATED); } @Test @@ -157,7 +157,7 @@ public class TbResourceControllerTest extends AbstractControllerTest { resource.setFileName(DEFAULT_FILE_NAME); resource.setBase64Data(TEST_DATA); - TbResource savedResource = save(resource); + TbResource savedResource = save(resource); loginDifferentTenant(); @@ -210,9 +210,9 @@ public class TbResourceControllerTest extends AbstractControllerTest { .andExpect(status().isOk()); - testNotifyEntityOneTimeMsgToEdgeServiceNever(savedResource, savedResource.getId(), savedResource.getId(), + testNotifyEntityAllOneTimeLogEntityActionEntityEqClass(savedResource, savedResource.getId(), savedResource.getId(), savedTenant.getId(), tenantAdmin.getCustomerId(), tenantAdmin.getId(), tenantAdmin.getEmail(), - ActionType.DELETED, resourceIdStr); + ActionType.DELETED, ActionType.DELETED, resourceIdStr); doGet("/api/resource/" + savedResource.getUuidId()) .andExpect(status().isNotFound()) @@ -241,7 +241,7 @@ public class TbResourceControllerTest extends AbstractControllerTest { doDelete("/api/resource/" + resourceIdStr) .andExpect(status().isBadRequest()) .andExpect(statusReason(containsString("Following widget types uses current resource: [" - + widgetType .getName()+ "]"))); + + widgetType.getName() + "]"))); } @Test @@ -272,9 +272,9 @@ public class TbResourceControllerTest extends AbstractControllerTest { } } while (pageData.hasNext()); - testNotifyManyEntityManyTimeMsgToEdgeServiceNever(new TbResource(), new TbResource(), + testNotifyManyEntityManyTimeMsgToEdgeServiceEntityEqAny(new TbResource(), new TbResource(), savedTenant.getId(), tenantAdmin.getCustomerId(), tenantAdmin.getId(), tenantAdmin.getEmail(), - ActionType.ADDED, cntEntity); + ActionType.ADDED, cntEntity, cntEntity, cntEntity); Collections.sort(resources, idComparator); Collections.sort(loadedResources, idComparator); @@ -320,9 +320,9 @@ public class TbResourceControllerTest extends AbstractControllerTest { } } while (pageData.hasNext()); - testNotifyManyEntityManyTimeMsgToEdgeServiceNever(new TbResource(), new TbResource(), - savedTenant.getId(), tenantAdmin.getCustomerId(), tenantAdmin.getId(), tenantAdmin.getEmail(), - ActionType.ADDED, jksCntEntity + lwm2mCntEntity); + testNotifyManyEntityManyTimeMsgToEdgeServiceEntityEqAny(new TbResource(), new TbResource(), + savedTenant.getId(), tenantAdmin.getCustomerId(), tenantAdmin.getId(), tenantAdmin.getEmail(), ActionType.ADDED, + jksCntEntity + lwm2mCntEntity, jksCntEntity + lwm2mCntEntity, jksCntEntity + lwm2mCntEntity); Collections.sort(resources, idComparator); Collections.sort(loadedResources, idComparator); @@ -369,9 +369,9 @@ public class TbResourceControllerTest extends AbstractControllerTest { .andExpect(status().isOk()); } - testNotifyManyEntityManyTimeMsgToEdgeServiceNeverAdditionalInfoAny(new TbResource(), new TbResource(), + testNotifyManyEntityManyTimeMsgToEdgeServiceEntityEqAnyAdditionalInfoAny(new TbResource(), new TbResource(), resources.get(0).getTenantId(), null, null, SYS_ADMIN_EMAIL, - ActionType.DELETED, cntEntity, 1); + ActionType.DELETED, ActionType.DELETED, cntEntity, cntEntity, 1); pageLink = new PageLink(27); loadedResources.clear(); @@ -442,9 +442,9 @@ public class TbResourceControllerTest extends AbstractControllerTest { .andExpect(status().isOk()); } - testNotifyManyEntityManyTimeMsgToEdgeServiceNeverAdditionalInfoAny(new TbResource(), new TbResource(), + testNotifyManyEntityManyTimeMsgToEdgeServiceEntityEqAnyAdditionalInfoAny(new TbResource(), new TbResource(), jksResources.get(0).getTenantId(), null, null, SYS_ADMIN_EMAIL, - ActionType.DELETED, cntEntity, 1); + ActionType.DELETED, ActionType.DELETED, cntEntity, cntEntity, 1); pageLink = new PageLink(27); loadedResources.clear(); @@ -536,9 +536,9 @@ public class TbResourceControllerTest extends AbstractControllerTest { TbResource savedResource = save(resource); - testNotifyEntityOneTimeMsgToEdgeServiceNever(savedResource, savedResource.getId(), savedResource.getId(), + testNotifyEntityAllOneTimeLogEntityActionEntityEqClass(savedResource, savedResource.getId(), savedResource.getId(), savedTenant.getId(), tenantAdmin.getCustomerId(), tenantAdmin.getId(), tenantAdmin.getEmail(), - ActionType.ADDED); + ActionType.ADDED, ActionType.ADDED); ResultActions resultActions = doGet("/api/resource/js/" + savedResource.getId().getId().toString() + "/download") .andExpect(status().isOk()); @@ -712,7 +712,8 @@ public class TbResourceControllerTest extends AbstractControllerTest { } private TbResource save(TbResource tbResource) throws Exception { - return doPostWithTypedResponse("/api/resource", tbResource, new TypeReference<>(){}); + return doPostWithTypedResponse("/api/resource", tbResource, new TypeReference<>() { + }); } private byte[] download(TbResourceId resourceId) throws Exception { diff --git a/application/src/test/java/org/thingsboard/server/controller/WebsocketApiTest.java b/application/src/test/java/org/thingsboard/server/controller/WebsocketApiTest.java index a8334fc959..73ee8f9252 100644 --- a/application/src/test/java/org/thingsboard/server/controller/WebsocketApiTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/WebsocketApiTest.java @@ -454,6 +454,12 @@ public class WebsocketApiTest extends AbstractControllerTest { getWsClient().registerWaitForUpdate(); + // Pushing update with wrong scope and make sure it will not arrive. + AttributeKvEntry invalidDataPoint = new BaseAttributeKvEntry(now - TimeUnit.MINUTES.toMillis(1), new LongDataEntry("serverAttributeKey", 55L)); + sendAttributes(device, TbAttributeSubscriptionScope.CLIENT_SCOPE, Arrays.asList(invalidDataPoint)); + + Assert.assertNull(getWsClient().waitForUpdate(3000)); + AttributeKvEntry dataPoint1 = new BaseAttributeKvEntry(now - TimeUnit.MINUTES.toMillis(1), new LongDataEntry("serverAttributeKey", 42L)); List tsData = Arrays.asList(dataPoint1); sendAttributes(device, TbAttributeSubscriptionScope.SERVER_SCOPE, tsData); diff --git a/application/src/test/java/org/thingsboard/server/controller/WidgetsBundleControllerTest.java b/application/src/test/java/org/thingsboard/server/controller/WidgetsBundleControllerTest.java index ee341fe284..80d70c1b8b 100644 --- a/application/src/test/java/org/thingsboard/server/controller/WidgetsBundleControllerTest.java +++ b/application/src/test/java/org/thingsboard/server/controller/WidgetsBundleControllerTest.java @@ -206,22 +206,32 @@ public class WidgetsBundleControllerTest extends AbstractControllerTest { @Test public void testFindTenantWidgetsBundlesByPageLink() throws Exception { + loginSysAdmin(); - login(tenantAdmin.getEmail(), "testPassword1"); + //upload some system bundles + int sysCntEntity = 10; + for (int i = 0; i < sysCntEntity; i++) { + WidgetsBundle widgetsBundle = new WidgetsBundle(); + widgetsBundle.setTitle("Widgets bundle" + i); + doPost("/api/widgetsBundle", widgetsBundle, WidgetsBundle.class); + } List sysWidgetsBundles = doGetTyped("/api/widgetsBundles?", new TypeReference<>() { }); + login(tenantAdmin.getEmail(), "testPassword1"); + int cntEntity = 73; - List widgetsBundles = new ArrayList<>(); + List tenantWidgetsBundles = new ArrayList<>(); for (int i = 0; i < cntEntity; i++) { WidgetsBundle widgetsBundle = new WidgetsBundle(); widgetsBundle.setTitle("Widgets bundle" + i); - widgetsBundles.add(doPost("/api/widgetsBundle", widgetsBundle, WidgetsBundle.class)); + tenantWidgetsBundles.add(doPost("/api/widgetsBundle", widgetsBundle, WidgetsBundle.class)); } - widgetsBundles.addAll(sysWidgetsBundles); + List allWidgetsBundles = new ArrayList<>(tenantWidgetsBundles); + allWidgetsBundles.addAll(sysWidgetsBundles); List loadedWidgetsBundles = new ArrayList<>(); PageLink pageLink = new PageLink(14); @@ -236,10 +246,28 @@ public class WidgetsBundleControllerTest extends AbstractControllerTest { } } while (pageData.hasNext()); - Collections.sort(widgetsBundles, idComparator); + Collections.sort(allWidgetsBundles, idComparator); Collections.sort(loadedWidgetsBundles, idComparator); - Assert.assertEquals(widgetsBundles, loadedWidgetsBundles); + Assert.assertEquals(allWidgetsBundles, loadedWidgetsBundles); + + //retrieve tenant only bundles + List loadedWidgetsBundles2 = new ArrayList<>(); + PageLink pageLink2 = new PageLink(14); + do { + pageData = doGetTypedWithPageLink("/api/widgetsBundles?tenantOnly=true&", + new TypeReference<>() { + }, pageLink2); + loadedWidgetsBundles2.addAll(pageData.getData()); + if (pageData.hasNext()) { + pageLink2 = pageLink2.nextPageLink(); + } + } while (pageData.hasNext()); + + Collections.sort(tenantWidgetsBundles, idComparator); + Collections.sort(loadedWidgetsBundles2, idComparator); + + Assert.assertEquals(tenantWidgetsBundles, loadedWidgetsBundles2); } @Test diff --git a/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java index 43544dd5cf..1ce8e3810d 100644 --- a/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/AbstractEdgeTest.java @@ -15,7 +15,6 @@ */ package org.thingsboard.server.edge; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.google.protobuf.InvalidProtocolBufferException; @@ -387,7 +386,7 @@ abstract public class AbstractEdgeTest extends AbstractControllerTest { Assert.assertEquals(expectedRuleChainUUID, ruleChainUUID); } - private void validateAdminSettings() throws JsonProcessingException { + private void validateAdminSettings() { List adminSettingsUpdateMsgs = edgeImitator.findAllMessagesByType(AdminSettingsUpdateMsg.class); Assert.assertEquals(4, adminSettingsUpdateMsgs.size()); diff --git a/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java index ca8dd5dbf0..de6939444d 100644 --- a/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java +++ b/application/src/test/java/org/thingsboard/server/edge/DeviceEdgeTest.java @@ -553,9 +553,9 @@ public class DeviceEdgeTest extends AbstractEdgeTest { Assert.assertTrue(edgeImitator.waitForResponses()); Assert.assertTrue(edgeImitator.waitForMessages()); - AbstractMessage latestMessage = edgeImitator.getLatestMessage(); - Assert.assertTrue(latestMessage instanceof DeviceCredentialsRequestMsg); - DeviceCredentialsRequestMsg latestDeviceCredentialsRequestMsg = (DeviceCredentialsRequestMsg) latestMessage; + Optional deviceCredentialsRequestMsgOpt = edgeImitator.findMessageByType(DeviceCredentialsRequestMsg.class); + Assert.assertTrue(deviceCredentialsRequestMsgOpt.isPresent()); + DeviceCredentialsRequestMsg latestDeviceCredentialsRequestMsg = deviceCredentialsRequestMsgOpt.get(); Assert.assertEquals(uuid.getMostSignificantBits(), latestDeviceCredentialsRequestMsg.getDeviceIdMSB()); Assert.assertEquals(uuid.getLeastSignificantBits(), latestDeviceCredentialsRequestMsg.getDeviceIdLSB()); diff --git a/application/src/test/java/org/thingsboard/server/edge/ResourceEdgeTest.java b/application/src/test/java/org/thingsboard/server/edge/ResourceEdgeTest.java new file mode 100644 index 0000000000..6a3001f292 --- /dev/null +++ b/application/src/test/java/org/thingsboard/server/edge/ResourceEdgeTest.java @@ -0,0 +1,123 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.edge; + +import com.datastax.oss.driver.api.core.uuid.Uuids; +import com.google.protobuf.AbstractMessage; +import org.junit.Assert; +import org.junit.Test; +import org.thingsboard.server.common.data.ResourceType; +import org.thingsboard.server.common.data.StringUtils; +import org.thingsboard.server.common.data.TbResource; +import org.thingsboard.server.dao.service.DaoSqlTest; +import org.thingsboard.server.gen.edge.v1.ResourceUpdateMsg; +import org.thingsboard.server.gen.edge.v1.UpdateMsgType; +import org.thingsboard.server.gen.edge.v1.UplinkMsg; +import org.thingsboard.server.gen.edge.v1.UplinkResponseMsg; + +import java.util.UUID; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@DaoSqlTest +public class ResourceEdgeTest extends AbstractEdgeTest { + + private static final String TEST_DATA = "77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLQpGSUxFIElORk9STUFUSU9OCgpPTUEgUGVybWFuZW50IERvY3VtZW50CiAgIEZpbGU6IE9NQS1TVVAtTHdNMk1fQmluYXJ5QXBwRGF0YUNvbnRhaW5lci1WMV8wXzEtMjAxOTAyMjEtQQogICBUeXBlOiB4bWwKClB1YmxpYyBSZWFjaGFibGUgSW5mb3JtYXRpb24KICAgUGF0aDogaHR0cDovL3d3dy5vcGVubW9iaWxlYWxsaWFuY2Uub3JnL3RlY2gvcHJvZmlsZXMKICAgTmFtZTogTHdNMk1fQmluYXJ5QXBwRGF0YUNvbnRhaW5lci12MV8wXzEueG1sCgpOT1JNQVRJVkUgSU5GT1JNQVRJT04KCiAgSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBmaWxlIGNhbiBiZSBmb3VuZCBpbiB0aGUgbGF0ZXN0IHJldmlzaW9uIG9mCgogIE9NQS1UUy1MV00yTV9CaW5hcnlBcHBEYXRhQ29udGFpbmVyLVYxXzBfMQoKICBUaGlzIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5tb2JpbGVhbGxpYW5jZS5vcmcvCgogIFNlbmQgY29tbWVudHMgdG8gaHR0cHM6Ly9naXRodWIuY29tL09wZW5Nb2JpbGVBbGxpYW5jZS9PTUFfTHdNMk1fZm9yX0RldmVsb3BlcnMvaXNzdWVzCgpDSEFOR0UgSElTVE9SWQoKMTUwNjIwMTggU3RhdHVzIGNoYW5nZWQgdG8gQXBwcm92ZWQgYnkgRE0sIERvYyBSZWYgIyBPTUEtRE0mU0UtMjAxOC0wMDYxLUlOUF9MV00yTV9BUFBEQVRBX1YxXzBfRVJQX2Zvcl9maW5hbF9BcHByb3ZhbAoyMTAyMjAxOSBTdGF0dXMgY2hhbmdlZCB0byBBcHByb3ZlZCBieSBJUFNPLCBEb2MgUmVmICMgT01BLUlQU08tMjAxOS0wMDI1LUlOUF9Md00yTV9PYmplY3RfQXBwX0RhdGFfQ29udGFpbmVyXzFfMF8xX2Zvcl9GaW5hbF9BcHByb3ZhbAoKTEVHQUwgRElTQ0xBSU1FUgoKQ29weXJpZ2h0IDIwMTkgT3BlbiBNb2JpbGUgQWxsaWFuY2UuCgpSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCmFyZSBtZXQ6CgoxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodApub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCjIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cm5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlciBub3IgdGhlIG5hbWVzIG9mIGl0cwpjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwoiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVApMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwpGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULApJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLApCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CkxPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCkxJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCkFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQpQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KClRoZSBhYm92ZSBsaWNlbnNlIGlzIHVzZWQgYXMgYSBsaWNlbnNlIHVuZGVyIGNvcHlyaWdodCBvbmx5LiBQbGVhc2UKcmVmZXJlbmNlIHRoZSBPTUEgSVBSIFBvbGljeSBmb3IgcGF0ZW50IGxpY2Vuc2luZyB0ZXJtczoKaHR0cHM6Ly93d3cub21hc3BlY3dvcmtzLm9yZy9hYm91dC9pbnRlbGxlY3R1YWwtcHJvcGVydHktcmlnaHRzLwoKLS0+CjxMV00yTSB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iaHR0cDovL29wZW5tb2JpbGVhbGxpYW5jZS5vcmcvdGVjaC9wcm9maWxlcy9MV00yTS54c2QiPgoJPE9iamVjdCBPYmplY3RUeXBlPSJNT0RlZmluaXRpb24iPgoJCTxOYW1lPkJpbmFyeUFwcERhdGFDb250YWluZXI8L05hbWU+CgkJPERlc2NyaXB0aW9uMT48IVtDREFUQVtUaGlzIEx3TTJNIE9iamVjdHMgcHJvdmlkZXMgdGhlIGFwcGxpY2F0aW9uIHNlcnZpY2UgZGF0YSByZWxhdGVkIHRvIGEgTHdNMk0gU2VydmVyLCBlZy4gV2F0ZXIgbWV0ZXIgZGF0YS4gClRoZXJlIGFyZSBzZXZlcmFsIG1ldGhvZHMgdG8gY3JlYXRlIGluc3RhbmNlIHRvIGluZGljYXRlIHRoZSBtZXNzYWdlIGRpcmVjdGlvbiBiYXNlZCBvbiB0aGUgbmVnb3RpYXRpb24gYmV0d2VlbiBBcHBsaWNhdGlvbiBhbmQgTHdNMk0uIFRoZSBDbGllbnQgYW5kIFNlcnZlciBzaG91bGQgbmVnb3RpYXRlIHRoZSBpbnN0YW5jZShzKSB1c2VkIHRvIGV4Y2hhbmdlIHRoZSBkYXRhLiBGb3IgZXhhbXBsZToKIC0gVXNpbmcgYSBzaW5nbGUgaW5zdGFuY2UgZm9yIGJvdGggZGlyZWN0aW9ucyBjb21tdW5pY2F0aW9uLCBmcm9tIENsaWVudCB0byBTZXJ2ZXIgYW5kIGZyb20gU2VydmVyIHRvIENsaWVudC4KIC0gVXNpbmcgYW4gaW5zdGFuY2UgZm9yIGNvbW11bmljYXRpb24gZnJvbSBDbGllbnQgdG8gU2VydmVyIGFuZCBhbm90aGVyIG9uZSBmb3IgY29tbXVuaWNhdGlvbiBmcm9tIFNlcnZlciB0byBDbGllbnQKIC0gVXNpbmcgc2V2ZXJhbCBpbnN0YW5jZXMKXV0+PC9EZXNjcmlwdGlvbjE+CgkJPE9iamVjdElEPjE5PC9PYmplY3RJRD4KCQk8T2JqZWN0VVJOPnVybjpvbWE6bHdtMm06b21hOjE5PC9PYmplY3RVUk4+CgkJPExXTTJNVmVyc2lvbj4xLjA8L0xXTTJNVmVyc2lvbj4KCQk8T2JqZWN0VmVyc2lvbj4xLjA8L09iamVjdFZlcnNpb24+CgkJPE11bHRpcGxlSW5zdGFuY2VzPk11bHRpcGxlPC9NdWx0aXBsZUluc3RhbmNlcz4KCQk8TWFuZGF0b3J5Pk9wdGlvbmFsPC9NYW5kYXRvcnk+CgkJPFJlc291cmNlcz4KCQkJPEl0ZW0gSUQ9IjAiPjxOYW1lPkRhdGE8L05hbWU+CgkJCQk8T3BlcmF0aW9ucz5SVzwvT3BlcmF0aW9ucz4KCQkJCTxNdWx0aXBsZUluc3RhbmNlcz5NdWx0aXBsZTwvTXVsdGlwbGVJbnN0YW5jZXM+CgkJCQk8TWFuZGF0b3J5Pk1hbmRhdG9yeTwvTWFuZGF0b3J5PgoJCQkJPFR5cGU+T3BhcXVlPC9UeXBlPgoJCQkJPFJhbmdlRW51bWVyYXRpb24gLz4KCQkJCTxVbml0cyAvPgoJCQkJPERlc2NyaXB0aW9uPjwhW0NEQVRBW0luZGljYXRlcyB0aGUgYXBwbGljYXRpb24gZGF0YSBjb250ZW50Ll1dPjwvRGVzY3JpcHRpb24+CgkJCTwvSXRlbT4KCQkJPEl0ZW0gSUQ9IjEiPjxOYW1lPkRhdGEgUHJpb3JpdHk8L05hbWU+CgkJCQk8T3BlcmF0aW9ucz5SVzwvT3BlcmF0aW9ucz4KCQkJCTxNdWx0aXBsZUluc3RhbmNlcz5TaW5nbGU8L011bHRpcGxlSW5zdGFuY2VzPgoJCQkJPE1hbmRhdG9yeT5PcHRpb25hbDwvTWFuZGF0b3J5PgoJCQkJPFR5cGU+SW50ZWdlcjwvVHlwZT4KCQkJCTxSYW5nZUVudW1lcmF0aW9uPjEgYnl0ZXM8L1JhbmdlRW51bWVyYXRpb24+CgkJCQk8VW5pdHMgLz4KCQkJCTxEZXNjcmlwdGlvbj48IVtDREFUQVtJbmRpY2F0ZXMgdGhlIEFwcGxpY2F0aW9uIGRhdGEgcHJpb3JpdHk6CjA6SW1tZWRpYXRlCjE6QmVzdEVmZm9ydAoyOkxhdGVzdAozLTEwMDogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCjEwMS0yNTQ6IFByb3ByaWV0YXJ5IG1vZGUuXV0+PC9EZXNjcmlwdGlvbj4KCQkJPC9JdGVtPgoJCQk8SXRlbSBJRD0iMiI+PE5hbWU+RGF0YSBDcmVhdGlvbiBUaW1lPC9OYW1lPgoJCQkJPE9wZXJhdGlvbnM+Ulc8L09wZXJhdGlvbnM+CgkJCQk8TXVsdGlwbGVJbnN0YW5jZXM+U2luZ2xlPC9NdWx0aXBsZUluc3RhbmNlcz4KCQkJCTxNYW5kYXRvcnk+T3B0aW9uYWw8L01hbmRhdG9yeT4KCQkJCTxUeXBlPlRpbWU8L1R5cGU+CgkJCQk8UmFuZ2VFbnVtZXJhdGlvbiAvPgoJCQkJPFVuaXRzIC8+CgkJCQk8RGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGVzIHRoZSBEYXRhIGluc3RhbmNlIGNyZWF0aW9uIHRpbWVzdGFtcC5dXT48L0Rlc2NyaXB0aW9uPgoJCQk8L0l0ZW0+CgkJCTxJdGVtIElEPSIzIj48TmFtZT5EYXRhIERlc2NyaXB0aW9uPC9OYW1lPgoJCQkJPE9wZXJhdGlvbnM+Ulc8L09wZXJhdGlvbnM+CgkJCQk8TXVsdGlwbGVJbnN0YW5jZXM+U2luZ2xlPC9NdWx0aXBsZUluc3RhbmNlcz4KCQkJCTxNYW5kYXRvcnk+T3B0aW9uYWw8L01hbmRhdG9yeT4KCQkJCTxUeXBlPlN0cmluZzwvVHlwZT4KCQkJCTxSYW5nZUVudW1lcmF0aW9uPjMyIGJ5dGVzPC9SYW5nZUVudW1lcmF0aW9uPgoJCQkJPFVuaXRzIC8+CgkJCQk8RGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGVzIHRoZSBkYXRhIGRlc2NyaXB0aW9uLgplLmcuICJtZXRlciByZWFkaW5nIi5dXT48L0Rlc2NyaXB0aW9uPgoJCQk8L0l0ZW0+CgkJCTxJdGVtIElEPSI0Ij48TmFtZT5EYXRhIEZvcm1hdDwvTmFtZT4KCQkJCTxPcGVyYXRpb25zPlJXPC9PcGVyYXRpb25zPgoJCQkJPE11bHRpcGxlSW5zdGFuY2VzPlNpbmdsZTwvTXVsdGlwbGVJbnN0YW5jZXM+CgkJCQk8TWFuZGF0b3J5Pk9wdGlvbmFsPC9NYW5kYXRvcnk+CgkJCQk8VHlwZT5TdHJpbmc8L1R5cGU+CgkJCQk8UmFuZ2VFbnVtZXJhdGlvbj4zMiBieXRlczwvUmFuZ2VFbnVtZXJhdGlvbj4KCQkJCTxVbml0cyAvPgoJCQkJPERlc2NyaXB0aW9uPjwhW0NEQVRBW0luZGljYXRlcyB0aGUgZm9ybWF0IG9mIHRoZSBBcHBsaWNhdGlvbiBEYXRhLgplLmcuIFlHLU1ldGVyLVdhdGVyLVJlYWRpbmcKVVRGOC1zdHJpbmcKXV0+PC9EZXNjcmlwdGlvbj4KCQkJPC9JdGVtPgoJCQk8SXRlbSBJRD0iNSI+PE5hbWU+QXBwIElEPC9OYW1lPgoJCQkJPE9wZXJhdGlvbnM+Ulc8L09wZXJhdGlvbnM+CgkJCQk8TXVsdGlwbGVJbnN0YW5jZXM+U2luZ2xlPC9NdWx0aXBsZUluc3RhbmNlcz4KCQkJCTxNYW5kYXRvcnk+T3B0aW9uYWw8L01hbmRhdG9yeT4KCQkJCTxUeXBlPkludGVnZXI8L1R5cGU+CgkJCQk8UmFuZ2VFbnVtZXJhdGlvbj4yIGJ5dGVzPC9SYW5nZUVudW1lcmF0aW9uPgoJCQkJPFVuaXRzIC8+CgkJCQk8RGVzY3JpcHRpb24+PCFbQ0RBVEFbSW5kaWNhdGVzIHRoZSBkZXN0aW5hdGlvbiBBcHBsaWNhdGlvbiBJRC5dXT48L0Rlc2NyaXB0aW9uPgoJCQk8L0l0ZW0+PC9SZXNvdXJjZXM+CgkJPERlc2NyaXB0aW9uMj48IVtDREFUQVtdXT48L0Rlc2NyaXB0aW9uMj4KCTwvT2JqZWN0Pgo8L0xXTTJNPgo="; + private static final String FILE_NAME = "test.jks"; + + @Test + public void testResources_create_update_delete() throws Exception { + // create resource + TbResource resource = new TbResource(); + resource.setResourceType(ResourceType.JKS); + resource.setTitle("Edge Test Resource"); + resource.setFileName(FILE_NAME); + resource.setData(TEST_DATA); + + edgeImitator.expectMessageAmount(1); + TbResource savedResource = doPost("/api/resource", resource, TbResource.class); + Assert.assertTrue(edgeImitator.waitForMessages()); + + AbstractMessage latestMessage = edgeImitator.getLatestMessage(); + Assert.assertTrue(latestMessage instanceof ResourceUpdateMsg); + ResourceUpdateMsg resourceUpdateMsg = (ResourceUpdateMsg) latestMessage; + Assert.assertEquals(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE, resourceUpdateMsg.getMsgType()); + Assert.assertEquals(savedResource.getUuidId().getMostSignificantBits(), resourceUpdateMsg.getIdMSB()); + Assert.assertEquals(savedResource.getUuidId().getLeastSignificantBits(), resourceUpdateMsg.getIdLSB()); + Assert.assertEquals("Edge Test Resource", resourceUpdateMsg.getTitle()); + Assert.assertEquals(ResourceType.JKS.name(), resourceUpdateMsg.getResourceType()); + Assert.assertEquals(FILE_NAME, resourceUpdateMsg.getResourceKey()); + Assert.assertEquals(FILE_NAME, resourceUpdateMsg.getFileName()); + Assert.assertEquals(TEST_DATA, resourceUpdateMsg.getData()); + Assert.assertTrue(StringUtils.isNotBlank(resourceUpdateMsg.getEtag())); + + // update resource + edgeImitator.expectMessageAmount(1); + savedResource.setTitle("Updated Edge Test Resource"); + savedResource = doPost("/api/resource", savedResource, TbResource.class); + Assert.assertTrue(edgeImitator.waitForMessages()); + latestMessage = edgeImitator.getLatestMessage(); + Assert.assertTrue(latestMessage instanceof ResourceUpdateMsg); + resourceUpdateMsg = (ResourceUpdateMsg) latestMessage; + Assert.assertEquals(UpdateMsgType.ENTITY_UPDATED_RPC_MESSAGE, resourceUpdateMsg.getMsgType()); + Assert.assertEquals("Updated Edge Test Resource", resourceUpdateMsg.getTitle()); + + // delete resource + edgeImitator.expectMessageAmount(1); + doDelete("/api/resource/" + savedResource.getUuidId()) + .andExpect(status().isOk()); + Assert.assertTrue(edgeImitator.waitForMessages()); + latestMessage = edgeImitator.getLatestMessage(); + Assert.assertTrue(latestMessage instanceof ResourceUpdateMsg); + resourceUpdateMsg = (ResourceUpdateMsg) latestMessage; + Assert.assertEquals(UpdateMsgType.ENTITY_DELETED_RPC_MESSAGE, resourceUpdateMsg.getMsgType()); + Assert.assertEquals(savedResource.getUuidId().getMostSignificantBits(), resourceUpdateMsg.getIdMSB()); + Assert.assertEquals(savedResource.getUuidId().getLeastSignificantBits(), resourceUpdateMsg.getIdLSB()); + } + + @Test + public void testSendResourceToCloud() throws Exception { + UUID uuid = Uuids.timeBased(); + + UplinkMsg.Builder uplinkMsgBuilder = UplinkMsg.newBuilder(); + ResourceUpdateMsg.Builder resourceUpdateMsgBuilder = ResourceUpdateMsg.newBuilder(); + resourceUpdateMsgBuilder.setIdMSB(uuid.getMostSignificantBits()); + resourceUpdateMsgBuilder.setIdLSB(uuid.getLeastSignificantBits()); + resourceUpdateMsgBuilder.setTitle("Edge Test Resource"); + resourceUpdateMsgBuilder.setResourceType(ResourceType.JKS.name()); + resourceUpdateMsgBuilder.setResourceKey(FILE_NAME); + resourceUpdateMsgBuilder.setFileName(FILE_NAME); + resourceUpdateMsgBuilder.setData(TEST_DATA); + resourceUpdateMsgBuilder.setIsSystem(false); + resourceUpdateMsgBuilder.setMsgType(UpdateMsgType.ENTITY_CREATED_RPC_MESSAGE); + testAutoGeneratedCodeByProtobuf(resourceUpdateMsgBuilder); + uplinkMsgBuilder.addResourceUpdateMsg(resourceUpdateMsgBuilder.build()); + + testAutoGeneratedCodeByProtobuf(uplinkMsgBuilder); + + edgeImitator.expectResponsesAmount(1); + edgeImitator.sendUplinkMsg(uplinkMsgBuilder.build()); + + Assert.assertTrue(edgeImitator.waitForResponses()); + + UplinkResponseMsg latestResponseMsg = edgeImitator.getLatestResponseMsg(); + Assert.assertTrue(latestResponseMsg.getSuccess()); + + TbResource tbResource = doGet("/api/resource/" + uuid, TbResource.class); + Assert.assertNotNull(tbResource); + Assert.assertEquals("Edge Test Resource", tbResource.getName()); + } +} diff --git a/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java b/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java index f9efbb3ee1..9be0627414 100644 --- a/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java +++ b/application/src/test/java/org/thingsboard/server/edge/imitator/EdgeImitator.java @@ -45,6 +45,7 @@ import org.thingsboard.server.gen.edge.v1.EntityViewUpdateMsg; import org.thingsboard.server.gen.edge.v1.OtaPackageUpdateMsg; import org.thingsboard.server.gen.edge.v1.QueueUpdateMsg; import org.thingsboard.server.gen.edge.v1.RelationUpdateMsg; +import org.thingsboard.server.gen.edge.v1.ResourceUpdateMsg; import org.thingsboard.server.gen.edge.v1.RuleChainMetadataUpdateMsg; import org.thingsboard.server.gen.edge.v1.RuleChainUpdateMsg; import org.thingsboard.server.gen.edge.v1.TenantProfileUpdateMsg; @@ -303,6 +304,11 @@ public class EdgeImitator { result.add(saveDownlinkMsg(tenantProfileUpdateMsg)); } } + if (downlinkMsg.getResourceUpdateMsgCount() > 0) { + for (ResourceUpdateMsg resourceUpdateMsg : downlinkMsg.getResourceUpdateMsgList()) { + result.add(saveDownlinkMsg(resourceUpdateMsg)); + } + } if (downlinkMsg.hasEdgeConfiguration()) { result.add(saveDownlinkMsg(downlinkMsg.getEdgeConfiguration())); } diff --git a/application/src/test/java/org/thingsboard/server/queue/discovery/HashPartitionServiceTest.java b/application/src/test/java/org/thingsboard/server/queue/discovery/HashPartitionServiceTest.java index ef87794d96..4ea648119b 100644 --- a/application/src/test/java/org/thingsboard/server/queue/discovery/HashPartitionServiceTest.java +++ b/application/src/test/java/org/thingsboard/server/queue/discovery/HashPartitionServiceTest.java @@ -19,6 +19,7 @@ import com.datastax.oss.driver.api.core.uuid.Uuids; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.RandomStringUtils; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -62,6 +63,7 @@ import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -77,6 +79,7 @@ public class HashPartitionServiceTest { private TenantRoutingInfoService routingInfoService; private ApplicationEventPublisher applicationEventPublisher; private QueueRoutingInfoService queueRoutingInfoService; + private TopicService topicService; private String hashFunctionName = "murmur3_128"; @@ -86,6 +89,8 @@ public class HashPartitionServiceTest { applicationEventPublisher = mock(ApplicationEventPublisher.class); routingInfoService = mock(TenantRoutingInfoService.class); queueRoutingInfoService = mock(QueueRoutingInfoService.class); + topicService = mock(TopicService.class); + when(topicService.buildTopicName(Mockito.any())).thenAnswer(i -> i.getArguments()[0]); clusterRoutingService = createPartitionService(); ServiceInfo currentServer = ServiceInfo.newBuilder() .setServiceId("tb-core-0") @@ -365,6 +370,35 @@ public class HashPartitionServiceTest { assertThat(clusterRoutingService.isManagedByCurrentService(regularTenantId)).isTrue(); } + @Test + public void testPartitionsDistribution_sameTenantDifferentQueues() { + List ruleEngines = new ArrayList<>(); + int serviceId = 0; + for (int i = 0; i < 5; i++) { + ServiceInfo commonServer = ServiceInfo.newBuilder() + .setServiceId("tb-rule-engine-" + serviceId) + .addAllServiceTypes(List.of(ServiceType.TB_RULE_ENGINE.name())) + .build(); + ruleEngines.add(commonServer); + serviceId++; + } + + Stream.concat(Stream.of(TenantId.SYS_TENANT_ID), Stream.generate(UUID::randomUUID).map(TenantId::new).limit(10)).forEach(tenantId -> { + List queues = Stream.generate(() -> RandomStringUtils.randomAlphabetic(10)) + .map(queueName -> new QueueKey(ServiceType.TB_RULE_ENGINE, queueName, tenantId)) + .limit(100).collect(Collectors.toList()); + + for (int partition = 0; partition < 10; partition++) { + ServiceInfo expectedAssignedRuleEngine = clusterRoutingService.resolveByPartitionIdx(ruleEngines, new QueueKey(ServiceType.TB_RULE_ENGINE, tenantId), partition); + for (QueueKey queueKey : queues) { + ServiceInfo assignedRuleEngine = clusterRoutingService.resolveByPartitionIdx(ruleEngines, queueKey, partition); + assertThat(assignedRuleEngine).as(queueKey + "[" + partition + "] should be assigned to " + expectedAssignedRuleEngine.getServiceId()) + .isEqualTo(expectedAssignedRuleEngine); + } + } + }); + } + private void verifyPartitionChangeEvent(Predicate predicate) { verify(applicationEventPublisher).publishEvent(argThat(event -> event instanceof PartitionChangeEvent && predicate.test((PartitionChangeEvent) event))); } @@ -393,7 +427,8 @@ public class HashPartitionServiceTest { HashPartitionService partitionService = new HashPartitionService(discoveryService, routingInfoService, applicationEventPublisher, - queueRoutingInfoService); + queueRoutingInfoService, + topicService); ReflectionTestUtils.setField(partitionService, "coreTopic", "tb.core"); ReflectionTestUtils.setField(partitionService, "corePartitions", 10); ReflectionTestUtils.setField(partitionService, "vcTopic", "tb.vc"); diff --git a/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessorTest.java b/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessorTest.java index 1c4b481302..dc59d4f7e9 100644 --- a/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessorTest.java +++ b/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/BaseEdgeProcessorTest.java @@ -24,6 +24,7 @@ import org.thingsboard.server.common.data.Dashboard; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.EntityView; +import org.thingsboard.server.common.data.TbResource; import org.thingsboard.server.common.data.asset.Asset; import org.thingsboard.server.common.data.asset.AssetProfile; import org.thingsboard.server.common.data.edge.EdgeEvent; @@ -47,6 +48,7 @@ import org.thingsboard.server.dao.entityview.EntityViewService; import org.thingsboard.server.dao.ota.OtaPackageService; import org.thingsboard.server.dao.queue.QueueService; import org.thingsboard.server.dao.relation.RelationService; +import org.thingsboard.server.dao.resource.ResourceService; import org.thingsboard.server.dao.rule.RuleChainService; import org.thingsboard.server.dao.service.DataValidator; import org.thingsboard.server.dao.tenant.TenantProfileService; @@ -72,6 +74,7 @@ import org.thingsboard.server.service.edge.rpc.constructor.EntityViewMsgConstruc import org.thingsboard.server.service.edge.rpc.constructor.OtaPackageMsgConstructor; import org.thingsboard.server.service.edge.rpc.constructor.QueueMsgConstructor; import org.thingsboard.server.service.edge.rpc.constructor.RelationMsgConstructor; +import org.thingsboard.server.service.edge.rpc.constructor.ResourceMsgConstructor; import org.thingsboard.server.service.edge.rpc.constructor.RuleChainMsgConstructor; import org.thingsboard.server.service.edge.rpc.constructor.TenantMsgConstructor; import org.thingsboard.server.service.edge.rpc.constructor.TenantProfileMsgConstructor; @@ -174,6 +177,9 @@ public abstract class BaseEdgeProcessorTest { @MockBean protected PartitionService partitionService; + @MockBean + protected ResourceService resourceService; + @MockBean @Lazy protected TbQueueProducerProvider producerProvider; @@ -196,6 +202,9 @@ public abstract class BaseEdgeProcessorTest { @MockBean protected DataValidator entityViewValidator; + @MockBean + protected DataValidator resourceValidator; + @MockBean protected EdgeMsgConstructor edgeMsgConstructor; @@ -256,6 +265,9 @@ public abstract class BaseEdgeProcessorTest { @MockBean protected QueueMsgConstructor queueMsgConstructor; + @MockBean + protected ResourceMsgConstructor resourceMsgConstructor; + @MockBean protected EdgeSynchronizationManager edgeSynchronizationManager; diff --git a/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetEdgeProcessorTest.java b/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetEdgeProcessorTest.java index d8c8041694..fcad4a4500 100644 --- a/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetEdgeProcessorTest.java +++ b/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetEdgeProcessorTest.java @@ -40,5 +40,4 @@ class AssetEdgeProcessorTest extends AbstractAssetProcessorTest { verify(downlinkMsg, expectedDashboardIdMSB, expectedDashboardIdLSB, expectedRuleChainIdMSB, expectedRuleChainIdLSB); } - -} \ No newline at end of file +} diff --git a/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetProfileEdgeProcessorTest.java b/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetProfileEdgeProcessorTest.java index e0a6155664..bafad59050 100644 --- a/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetProfileEdgeProcessorTest.java +++ b/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/asset/AssetProfileEdgeProcessorTest.java @@ -40,4 +40,4 @@ class AssetProfileEdgeProcessorTest extends AbstractAssetProcessorTest{ verify(downlinkMsg, expectedDashboardIdMSB, expectedDashboardIdLSB, expectedRuleChainIdMSB, expectedRuleChainIdLSB); } -} \ No newline at end of file +} diff --git a/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessorTest.java b/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessorTest.java index f64bd898d1..e40ea364be 100644 --- a/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessorTest.java +++ b/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceEdgeProcessorTest.java @@ -39,5 +39,4 @@ class DeviceEdgeProcessorTest extends AbstractDeviceProcessorTest { verify(downlinkMsg, expectedDashboardIdMSB, expectedDashboardIdLSB, expectedRuleChainIdMSB, expectedRuleChainIdLSB); } - -} \ No newline at end of file +} diff --git a/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceProfileEdgeProcessorTest.java b/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceProfileEdgeProcessorTest.java index 35d44852e9..c2e9dca077 100644 --- a/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceProfileEdgeProcessorTest.java +++ b/application/src/test/java/org/thingsboard/server/service/edge/rpc/processor/device/DeviceProfileEdgeProcessorTest.java @@ -41,5 +41,4 @@ class DeviceProfileEdgeProcessorTest extends AbstractDeviceProcessorTest { verify(downlinkMsg, expectedDashboardIdMSB, expectedDashboardIdLSB, expectedRuleChainIdMSB, expectedRuleChainIdLSB); } - -} \ No newline at end of file +} diff --git a/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java b/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java index 0f57d5ef14..0909510243 100644 --- a/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java +++ b/application/src/test/java/org/thingsboard/server/service/notification/NotificationRuleApiTest.java @@ -269,6 +269,31 @@ public class NotificationRuleApiTest extends AbstractNotificationApiTest { }); } + @Test + public void testNotificationRuleProcessing_alarmTrigger_createViaRestApi() throws Exception { + Device device = createDevice("Device with alarm", "233"); + NotificationTarget target = createNotificationTarget(tenantAdminUserId); + defaultNotifications.create(tenantId, DefaultNotifications.newAlarm, target.getId()); + defaultNotifications.create(tenantId, DefaultNotifications.entityAction, target.getId()); + notificationRulesCache.evict(tenantId); + + Alarm alarm = new Alarm(); + alarm.setSeverity(AlarmSeverity.CRITICAL); + alarm.setType("testAlarm"); + alarm.setOriginator(device.getId()); + alarm = doPost("/api/alarm", alarm, Alarm.class); + + await().atMost(15, TimeUnit.SECONDS) + .pollDelay(2, TimeUnit.SECONDS) + .untilAsserted(() -> { + List notifications = getMyNotifications(false, 10); + assertThat(notifications).hasSize(1).first().matches(notification -> { + return notification.getType() == NotificationType.ALARM && + notification.getSubject().equals("New alarm 'testAlarm'"); + }); + }); + } + @Test public void testNotificationRuleProcessing_alarmTrigger_clearRule() throws Exception { String notificationSubject = "${alarmSeverity} alarm '${alarmType}' is ${alarmStatus}"; diff --git a/application/src/test/java/org/thingsboard/server/service/queue/DefaultTbClusterServiceTest.java b/application/src/test/java/org/thingsboard/server/service/queue/DefaultTbClusterServiceTest.java index 0bc1800896..233839bb5f 100644 --- a/application/src/test/java/org/thingsboard/server/service/queue/DefaultTbClusterServiceTest.java +++ b/application/src/test/java/org/thingsboard/server/service/queue/DefaultTbClusterServiceTest.java @@ -32,7 +32,7 @@ import org.thingsboard.server.common.msg.queue.ServiceType; import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.PartitionService; import org.thingsboard.server.queue.provider.TbQueueProducerProvider; import org.thingsboard.server.queue.util.DataDecodingEncodingService; @@ -78,7 +78,7 @@ public class DefaultTbClusterServiceTest { protected TbQueueProducerProvider producerProvider; @SpyBean - protected NotificationsTopicService notificationsTopicService; + protected TopicService topicService; @SpyBean protected TbClusterService clusterService; @@ -94,12 +94,12 @@ public class DefaultTbClusterServiceTest { clusterService.onQueueChange(createTestQueue()); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, MONOLITH); - verify(notificationsTopicService, never()).getNotificationsTopic(eq(ServiceType.TB_CORE), any()); - verify(notificationsTopicService, never()).getNotificationsTopic(eq(ServiceType.TB_TRANSPORT), any()); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, MONOLITH); + verify(topicService, never()).getNotificationsTopic(eq(ServiceType.TB_CORE), any()); + verify(topicService, never()).getNotificationsTopic(eq(ServiceType.TB_TRANSPORT), any()); verify(tbQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, MONOLITH)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, MONOLITH)), any(TbProtoQueueMsg.class), isNull()); verify(producerProvider, never()).getTbCoreNotificationsMsgProducer(); verify(producerProvider, never()).getTransportNotificationsMsgProducer(); @@ -119,15 +119,15 @@ public class DefaultTbClusterServiceTest { clusterService.onQueueChange(createTestQueue()); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith1); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith2); - verify(notificationsTopicService, never()).getNotificationsTopic(eq(ServiceType.TB_CORE), any()); - verify(notificationsTopicService, never()).getNotificationsTopic(eq(ServiceType.TB_TRANSPORT), any()); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith1); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith2); + verify(topicService, never()).getNotificationsTopic(eq(ServiceType.TB_CORE), any()); + verify(topicService, never()).getNotificationsTopic(eq(ServiceType.TB_TRANSPORT), any()); verify(tbQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith1)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith1)), any(TbProtoQueueMsg.class), isNull()); verify(tbQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith2)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith2)), any(TbProtoQueueMsg.class), isNull()); verify(producerProvider, never()).getTbCoreNotificationsMsgProducer(); verify(producerProvider, never()).getTransportNotificationsMsgProducer(); @@ -147,20 +147,20 @@ public class DefaultTbClusterServiceTest { clusterService.onQueueChange(createTestQueue()); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, MONOLITH); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_TRANSPORT, TRANSPORT); - verify(notificationsTopicService, never()).getNotificationsTopic(eq(ServiceType.TB_CORE), any()); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, MONOLITH); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_TRANSPORT, TRANSPORT); + verify(topicService, never()).getNotificationsTopic(eq(ServiceType.TB_CORE), any()); verify(tbREQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, MONOLITH)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, MONOLITH)), any(TbProtoQueueMsg.class), isNull()); verify(tbTransportQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, TRANSPORT)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, TRANSPORT)), any(TbProtoQueueMsg.class), isNull()); verify(tbTransportQueueProducer, never()) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, MONOLITH)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, MONOLITH)), any(TbProtoQueueMsg.class), isNull()); verify(tbTransportQueueProducer, never()) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, MONOLITH)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_CORE, MONOLITH)), any(TbProtoQueueMsg.class), isNull()); verify(producerProvider, never()).getTbCoreNotificationsMsgProducer(); } @@ -193,47 +193,47 @@ public class DefaultTbClusterServiceTest { clusterService.onQueueChange(createTestQueue()); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith1); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith2); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngine1); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngine2); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith1); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith2); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngine1); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngine2); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_CORE, core1); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_CORE, core2); - verify(notificationsTopicService, never()).getNotificationsTopic(ServiceType.TB_CORE, monolith1); - verify(notificationsTopicService, never()).getNotificationsTopic(ServiceType.TB_CORE, monolith2); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_CORE, core1); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_CORE, core2); + verify(topicService, never()).getNotificationsTopic(ServiceType.TB_CORE, monolith1); + verify(topicService, never()).getNotificationsTopic(ServiceType.TB_CORE, monolith2); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_TRANSPORT, transport1); - verify(notificationsTopicService, times(1)).getNotificationsTopic(ServiceType.TB_TRANSPORT, transport2); - verify(notificationsTopicService, never()).getNotificationsTopic(ServiceType.TB_TRANSPORT, monolith1); - verify(notificationsTopicService, never()).getNotificationsTopic(ServiceType.TB_TRANSPORT, monolith2); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_TRANSPORT, transport1); + verify(topicService, times(1)).getNotificationsTopic(ServiceType.TB_TRANSPORT, transport2); + verify(topicService, never()).getNotificationsTopic(ServiceType.TB_TRANSPORT, monolith1); + verify(topicService, never()).getNotificationsTopic(ServiceType.TB_TRANSPORT, monolith2); verify(tbREQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith1)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith1)), any(TbProtoQueueMsg.class), isNull()); verify(tbREQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith2)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, monolith2)), any(TbProtoQueueMsg.class), isNull()); verify(tbREQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngine1)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngine1)), any(TbProtoQueueMsg.class), isNull()); verify(tbREQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngine2)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, ruleEngine2)), any(TbProtoQueueMsg.class), isNull()); verify(tbCoreQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, core1)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_CORE, core1)), any(TbProtoQueueMsg.class), isNull()); verify(tbCoreQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, core2)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_CORE, core2)), any(TbProtoQueueMsg.class), isNull()); verify(tbCoreQueueProducer, never()) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, monolith1)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_CORE, monolith1)), any(TbProtoQueueMsg.class), isNull()); verify(tbCoreQueueProducer, never()) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, monolith2)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_CORE, monolith2)), any(TbProtoQueueMsg.class), isNull()); verify(tbTransportQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, transport1)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, transport1)), any(TbProtoQueueMsg.class), isNull()); verify(tbTransportQueueProducer, times(1)) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, transport2)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, transport2)), any(TbProtoQueueMsg.class), isNull()); verify(tbTransportQueueProducer, never()) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, monolith1)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, monolith1)), any(TbProtoQueueMsg.class), isNull()); verify(tbTransportQueueProducer, never()) - .send(eq(notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, monolith2)), any(TbProtoQueueMsg.class), isNull()); + .send(eq(topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, monolith2)), any(TbProtoQueueMsg.class), isNull()); } protected Queue createTestQueue() { diff --git a/application/src/test/java/org/thingsboard/server/service/queue/ProtoUtilsTest.java b/application/src/test/java/org/thingsboard/server/service/queue/ProtoUtilsTest.java index e235076635..1a696b730d 100644 --- a/application/src/test/java/org/thingsboard/server/service/queue/ProtoUtilsTest.java +++ b/application/src/test/java/org/thingsboard/server/service/queue/ProtoUtilsTest.java @@ -15,15 +15,43 @@ */ package org.thingsboard.server.service.queue; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.thingsboard.server.common.data.EntityType; +import org.thingsboard.server.common.data.id.DeviceId; +import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.EntityId; import org.thingsboard.server.common.data.id.RuleChainId; import org.thingsboard.server.common.data.id.TenantId; +import org.thingsboard.server.common.data.kv.AttributeKey; +import org.thingsboard.server.common.data.kv.BaseAttributeKvEntry; +import org.thingsboard.server.common.data.kv.BooleanDataEntry; +import org.thingsboard.server.common.data.kv.DoubleDataEntry; +import org.thingsboard.server.common.data.kv.JsonDataEntry; +import org.thingsboard.server.common.data.kv.StringDataEntry; import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; +import org.thingsboard.server.common.data.rpc.RpcError; +import org.thingsboard.server.common.data.rpc.ToDeviceRpcRequestBody; +import org.thingsboard.server.common.data.security.DeviceCredentials; +import org.thingsboard.server.common.data.security.DeviceCredentialsType; +import org.thingsboard.server.common.msg.edge.EdgeEventUpdateMsg; +import org.thingsboard.server.common.msg.edge.FromEdgeSyncResponse; +import org.thingsboard.server.common.msg.edge.ToEdgeSyncRequest; import org.thingsboard.server.common.msg.plugin.ComponentLifecycleMsg; +import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse; +import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponseActorMsg; +import org.thingsboard.server.common.msg.rpc.RemoveRpcActorMsg; +import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest; +import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequestActorMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceAttributesEventNotificationMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceCredentialsUpdateNotificationMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceEdgeUpdateMsg; +import org.thingsboard.server.common.msg.rule.engine.DeviceNameOrTypeUpdateMsg; import org.thingsboard.server.gen.transport.TransportProtos; -import java.util.UUID; + +import java.util.List; +import java.util.Set; +import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -31,6 +59,10 @@ class ProtoUtilsTest { TenantId tenantId = TenantId.fromUUID(UUID.fromString("35e10f77-16e7-424d-ae46-ee780f87ac4f")); EntityId entityId = new RuleChainId(UUID.fromString("c640b635-4f0f-41e6-b10b-25a86003094e")); + DeviceId deviceId = new DeviceId(UUID.fromString("ceebb9e5-4239-437c-a507-dc5f71f1232d")); + EdgeId edgeId = new EdgeId(UUID.fromString("364be452-2183-459b-af93-1ddb325feac1")); + UUID id = UUID.fromString("31a07d85-6ed5-46f8-83c0-6715cb0a8782"); + @Test void protoComponentLifecycleSerialization() { ComponentLifecycleMsg msg = new ComponentLifecycleMsg(tenantId, entityId, ComponentLifecycleEvent.UPDATED); @@ -41,9 +73,110 @@ class ProtoUtilsTest { @Test void protoEntityTypeSerialization() { - for(EntityType entityType : EntityType.values()){ + for (EntityType entityType : EntityType.values()) { assertThat(ProtoUtils.fromProto(ProtoUtils.toProto(entityType))).as(entityType.getNormalName()).isEqualTo(entityType); } } -} \ No newline at end of file + @Test + void protoEdgeEventUpdateSerialization() { + EdgeEventUpdateMsg msg = new EdgeEventUpdateMsg(tenantId, edgeId); + assertThat(ProtoUtils.fromProto(ProtoUtils.toProto(msg))).as("deserialized").isEqualTo(msg); + } + + @Test + void protoToEdgeSyncRequestSerialization() { + ToEdgeSyncRequest msg = new ToEdgeSyncRequest(id, tenantId, edgeId); + assertThat(ProtoUtils.fromProto(ProtoUtils.toProto(msg))).as("deserialized").isEqualTo(msg); + } + + @Test + void protoFromEdgeSyncResponseSerialization() { + FromEdgeSyncResponse msg = new FromEdgeSyncResponse(id, tenantId, edgeId, true); + assertThat(ProtoUtils.fromProto(ProtoUtils.toProto(msg))).as("deserialized").isEqualTo(msg); + } + + @Test + void protoDeviceEdgeUpdateSerialization() { + DeviceEdgeUpdateMsg msg = new DeviceEdgeUpdateMsg(tenantId, deviceId, edgeId); + TransportProtos.ToDeviceActorNotificationMsgProto serializedMsg = ProtoUtils.toProto(msg); + Assertions.assertNotNull(serializedMsg); + assertThat(ProtoUtils.fromProto(serializedMsg)).as("deserialized").isEqualTo(msg); + } + + @Test + void protoDeviceNameOrTypeSerialization() { + String deviceName = "test", deviceType = "test"; + DeviceNameOrTypeUpdateMsg msg = new DeviceNameOrTypeUpdateMsg(tenantId, deviceId, deviceName, deviceType); + TransportProtos.ToDeviceActorNotificationMsgProto serializedMsg = ProtoUtils.toProto(msg); + Assertions.assertNotNull(serializedMsg); + assertThat(ProtoUtils.fromProto(serializedMsg)).as("deserialized").isEqualTo(msg); + } + + @Test + void protoDeviceAttributesEventSerialization() { + DeviceAttributesEventNotificationMsg msg = new DeviceAttributesEventNotificationMsg(tenantId, deviceId, null, "CLIENT_SCOPE", + List.of(new BaseAttributeKvEntry(System.currentTimeMillis(), new StringDataEntry("key", "value"))), false); + TransportProtos.ToDeviceActorNotificationMsgProto serializedMsg = ProtoUtils.toProto(msg); + Assertions.assertNotNull(serializedMsg); + assertThat(ProtoUtils.fromProto(serializedMsg)).as("deserialized").isEqualTo(msg); + + msg = new DeviceAttributesEventNotificationMsg(tenantId, deviceId, null, "SERVER_SCOPE", + List.of(new BaseAttributeKvEntry(System.currentTimeMillis(), new DoubleDataEntry("doubleEntry", 231.5)), + new BaseAttributeKvEntry(System.currentTimeMillis(), new JsonDataEntry("jsonEntry", "jsonValue"))), false); + serializedMsg = ProtoUtils.toProto(msg); + Assertions.assertNotNull(serializedMsg); + assertThat(ProtoUtils.fromProto(serializedMsg)).as("deserialized").isEqualTo(msg); + + msg = new DeviceAttributesEventNotificationMsg(tenantId, deviceId, null, "SERVER_SCOPE", + List.of(new BaseAttributeKvEntry(System.currentTimeMillis(), new DoubleDataEntry("entry", 11.3)), + new BaseAttributeKvEntry(System.currentTimeMillis(), new BooleanDataEntry("jsonEntry", true))), false); + serializedMsg = ProtoUtils.toProto(msg); + Assertions.assertNotNull(serializedMsg); + assertThat(ProtoUtils.fromProto(serializedMsg)).as("deserialized").isEqualTo(msg); + + msg = new DeviceAttributesEventNotificationMsg(tenantId, deviceId, Set.of(new AttributeKey("SHARED_SCOPE", "attributeKey")), null, null, true); + serializedMsg = ProtoUtils.toProto(msg); + Assertions.assertNotNull(serializedMsg); + assertThat(ProtoUtils.fromProto(serializedMsg)).as("deserialized").isEqualTo(msg); + } + + @Test + void protoDeviceCredentialsUpdateSerialization() { + DeviceCredentials deviceCredentials = new DeviceCredentials(); + deviceCredentials.setDeviceId(deviceId); + deviceCredentials.setCredentialsType(DeviceCredentialsType.ACCESS_TOKEN); + deviceCredentials.setCredentialsValue("test"); + deviceCredentials.setCredentialsId("test"); + DeviceCredentialsUpdateNotificationMsg msg = new DeviceCredentialsUpdateNotificationMsg(tenantId, deviceId, deviceCredentials); + TransportProtos.ToDeviceActorNotificationMsgProto serializedMsg = ProtoUtils.toProto(msg); + Assertions.assertNotNull(serializedMsg); + assertThat(ProtoUtils.fromProto(serializedMsg)).as("deserialized").isEqualTo(msg); + } + + @Test + void protoToDeviceRpcRequestSerialization() { + String serviceId = "cadcaac6-85c3-4211-9756-f074dcd1e7f7"; + ToDeviceRpcRequest request = new ToDeviceRpcRequest(id, tenantId, deviceId, true, 0, new ToDeviceRpcRequestBody("method", "params"), false, 0, ""); + ToDeviceRpcRequestActorMsg msg = new ToDeviceRpcRequestActorMsg(serviceId, request); + TransportProtos.ToDeviceActorNotificationMsgProto serializedMsg = ProtoUtils.toProto(msg); + Assertions.assertNotNull(serializedMsg); + assertThat(ProtoUtils.fromProto(serializedMsg)).as("deserialized").isEqualTo(msg); + } + + @Test + void protoFromDeviceRpcResponseSerialization() { + FromDeviceRpcResponseActorMsg msg = new FromDeviceRpcResponseActorMsg(23, tenantId, deviceId, new FromDeviceRpcResponse(id, "response", RpcError.NOT_FOUND)); + TransportProtos.ToDeviceActorNotificationMsgProto serializedMsg = ProtoUtils.toProto(msg); + Assertions.assertNotNull(serializedMsg); + assertThat(ProtoUtils.fromProto(serializedMsg)).as("deserialized").isEqualTo(msg); + } + + @Test + void protoRemoveRpcActorSerialization() { + RemoveRpcActorMsg msg = new RemoveRpcActorMsg(tenantId, deviceId, id); + TransportProtos.ToDeviceActorNotificationMsgProto serializedMsg = ProtoUtils.toProto(msg); + Assertions.assertNotNull(serializedMsg); + assertThat(ProtoUtils.fromProto(serializedMsg)).as("deserialized").isEqualTo(msg); + } +} diff --git a/application/src/test/java/org/thingsboard/server/service/sync/ie/ExportImportServiceSqlTest.java b/application/src/test/java/org/thingsboard/server/service/sync/ie/ExportImportServiceSqlTest.java index dc95ab793b..093275f734 100644 --- a/application/src/test/java/org/thingsboard/server/service/sync/ie/ExportImportServiceSqlTest.java +++ b/application/src/test/java/org/thingsboard/server/service/sync/ie/ExportImportServiceSqlTest.java @@ -592,7 +592,7 @@ public class ExportImportServiceSqlTest extends BaseExportImportServiceTest { Customer updatedCustomer = importEntity(tenantAdmin2, updatedCustomerEntity).getSavedEntity(); verify(entityActionService).logEntityAction(any(), eq(importedCustomer.getId()), eq(updatedCustomer), any(), eq(ActionType.UPDATED), isNull()); - verify(tbClusterService).sendNotificationMsgToEdge(any(), any(), eq(importedCustomer.getId()), any(), any(), eq(EdgeEventActionType.UPDATED)); + verify(tbClusterService).sendNotificationMsgToEdge(any(), any(), eq(importedCustomer.getId()), any(), any(), eq(EdgeEventActionType.UPDATED), any()); Mockito.reset(entityActionService); @@ -609,7 +609,7 @@ public class ExportImportServiceSqlTest extends BaseExportImportServiceTest { verify(entityActionService).logEntityAction(any(), eq(importedAssetProfile.getId()), eq(importedAssetProfile), any(), eq(ActionType.ADDED), isNull()); verify(tbClusterService).broadcastEntityStateChangeEvent(any(), eq(importedAssetProfile.getId()), eq(ComponentLifecycleEvent.CREATED)); - verify(tbClusterService).sendNotificationMsgToEdge(any(), any(), eq(importedAssetProfile.getId()), any(), any(), eq(EdgeEventActionType.ADDED)); + verify(tbClusterService).sendNotificationMsgToEdge(any(), any(), eq(importedAssetProfile.getId()), any(), any(), eq(EdgeEventActionType.ADDED), any()); Asset importedAsset = (Asset) importEntity(tenantAdmin2, getAndClone(entitiesExportData, EntityType.ASSET)).getSavedEntity(); verify(entityActionService).logEntityAction(any(), eq(importedAsset.getId()), eq(importedAsset), @@ -625,14 +625,14 @@ public class ExportImportServiceSqlTest extends BaseExportImportServiceTest { verify(entityActionService).logEntityAction(any(), eq(importedAsset.getId()), eq(updatedAsset), any(), eq(ActionType.UPDATED), isNull()); - verify(tbClusterService).sendNotificationMsgToEdge(any(), any(), eq(importedAsset.getId()), any(), any(), eq(EdgeEventActionType.UPDATED)); + verify(tbClusterService).sendNotificationMsgToEdge(any(), any(), eq(importedAsset.getId()), any(), any(), eq(EdgeEventActionType.UPDATED), any()); DeviceProfile importedDeviceProfile = (DeviceProfile) importEntity(tenantAdmin2, getAndClone(entitiesExportData, EntityType.DEVICE_PROFILE)).getSavedEntity(); verify(entityActionService).logEntityAction(any(), eq(importedDeviceProfile.getId()), eq(importedDeviceProfile), any(), eq(ActionType.ADDED), isNull()); verify(tbClusterService).onDeviceProfileChange(eq(importedDeviceProfile), any()); verify(tbClusterService).broadcastEntityStateChangeEvent(any(), eq(importedDeviceProfile.getId()), eq(ComponentLifecycleEvent.CREATED)); - verify(tbClusterService).sendNotificationMsgToEdge(any(), any(), eq(importedDeviceProfile.getId()), any(), any(), eq(EdgeEventActionType.ADDED)); + verify(tbClusterService).sendNotificationMsgToEdge(any(), any(), eq(importedDeviceProfile.getId()), any(), any(), eq(EdgeEventActionType.ADDED), any()); verify(otaPackageStateService).update(eq(importedDeviceProfile), eq(false), eq(false)); Device importedDevice = (Device) importEntity(tenantAdmin2, getAndClone(entitiesExportData, EntityType.DEVICE)).getSavedEntity(); diff --git a/application/src/test/java/org/thingsboard/server/service/transport/DefaultTransportApiServiceTest.java b/application/src/test/java/org/thingsboard/server/service/transport/DefaultTransportApiServiceTest.java index 9687225bd1..33c11ea91d 100644 --- a/application/src/test/java/org/thingsboard/server/service/transport/DefaultTransportApiServiceTest.java +++ b/application/src/test/java/org/thingsboard/server/service/transport/DefaultTransportApiServiceTest.java @@ -16,7 +16,6 @@ package org.thingsboard.server.service.transport; -import com.google.common.util.concurrent.Futures; import lombok.extern.slf4j.Slf4j; import org.junit.Before; import org.junit.Test; @@ -46,6 +45,7 @@ import org.thingsboard.server.dao.ota.OtaPackageService; import org.thingsboard.server.dao.queue.QueueService; import org.thingsboard.server.dao.relation.RelationService; import org.thingsboard.server.dao.tenant.TbTenantProfileCache; +import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.queue.util.DataDecodingEncodingService; import org.thingsboard.server.service.apiusage.TbApiUsageStateService; import org.thingsboard.server.service.executors.DbCallbackExecutorService; @@ -62,6 +62,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.willReturn; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -123,11 +125,13 @@ public class DefaultTransportApiServiceTest { @Test public void validateExistingDeviceByX509CertificateStrategy() { var device = createDevice(); - when(deviceService.findDeviceByIdAsync(any(), any())).thenReturn(Futures.immediateFuture(device)); var deviceCredentials = createDeviceCredentials(chain[0], device.getId()); when(deviceCredentialsService.findDeviceCredentialsByCredentialsId(any())).thenReturn(deviceCredentials); + TransportProtos.TransportApiResponseMsg response = mock(TransportProtos.TransportApiResponseMsg.class); + willReturn(response).given(service).getDeviceInfo(deviceCredentials); + service.validateOrCreateDeviceX509Certificate(certificateChain); verify(deviceCredentialsService, times(1)).findDeviceCredentialsByCredentialsId(any()); } @@ -139,7 +143,6 @@ public class DefaultTransportApiServiceTest { var device = createDevice(); when(deviceService.findDeviceByTenantIdAndName(any(), any())).thenReturn(device); - when(deviceService.findDeviceByIdAsync(any(), any())).thenReturn(Futures.immediateFuture(device)); var deviceCredentials = createDeviceCredentials(chain[0], device.getId()); when(deviceCredentialsService.findDeviceCredentialsByCredentialsId(any())).thenReturn(null); @@ -148,9 +151,12 @@ public class DefaultTransportApiServiceTest { var provisionResponse = createProvisionResponse(deviceCredentials); when(deviceProvisionService.provisionDeviceViaX509Chain(any(), any())).thenReturn(provisionResponse); + TransportProtos.TransportApiResponseMsg response = mock(TransportProtos.TransportApiResponseMsg.class); + willReturn(response).given(service).getDeviceInfo(deviceCredentials); + service.validateOrCreateDeviceX509Certificate(certificateChain); verify(deviceProfileService, times(1)).findDeviceProfileByProvisionDeviceKey(any()); - verify(deviceService, times(1)).findDeviceByIdAsync(any(), any()); + verify(service, times(1)).getDeviceInfo(any()); verify(deviceCredentialsService, times(1)).findDeviceCredentialsByCredentialsId(any()); verify(deviceProvisionService, times(1)).provisionDeviceViaX509Chain(any(), any()); } diff --git a/application/src/test/resources/logback-test.xml b/application/src/test/resources/logback-test.xml index 981bcab132..3d0ce3f933 100644 --- a/application/src/test/resources/logback-test.xml +++ b/application/src/test/resources/logback-test.xml @@ -38,6 +38,8 @@ + + diff --git a/common/cluster-api/src/main/java/org/thingsboard/server/cluster/TbClusterService.java b/common/cluster-api/src/main/java/org/thingsboard/server/cluster/TbClusterService.java index e81aaed39d..5b1eb1ae4f 100644 --- a/common/cluster-api/src/main/java/org/thingsboard/server/cluster/TbClusterService.java +++ b/common/cluster-api/src/main/java/org/thingsboard/server/cluster/TbClusterService.java @@ -33,6 +33,7 @@ import org.thingsboard.server.common.msg.edge.FromEdgeSyncResponse; import org.thingsboard.server.common.msg.edge.ToEdgeSyncRequest; import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse; +import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.gen.transport.TransportProtos.ToCoreMsg; import org.thingsboard.server.gen.transport.TransportProtos.ToRuleEngineMsg; import org.thingsboard.server.gen.transport.TransportProtos.ToTransportMsg; @@ -50,6 +51,8 @@ public interface TbClusterService extends TbQueueClusterService { void pushMsgToCore(ToDeviceActorNotificationMsg msg, TbQueueCallback callback); + void broadcastToCore(TransportProtos.ToCoreNotificationMsg msg); + void pushMsgToVersionControl(TenantId tenantId, ToVersionControlServiceMsg msg, TbQueueCallback callback); void pushNotificationToCore(String targetServiceId, FromDeviceRpcResponse response, TbQueueCallback callback); @@ -92,6 +95,6 @@ public interface TbClusterService extends TbQueueClusterService { void pushEdgeSyncResponseToCore(FromEdgeSyncResponse fromEdgeSyncResponse); - void sendNotificationMsgToEdge(TenantId tenantId, EdgeId edgeId, EntityId entityId, String body, EdgeEventType type, EdgeEventActionType action); + void sendNotificationMsgToEdge(TenantId tenantId, EdgeId edgeId, EntityId entityId, String body, EdgeEventType type, EdgeEventActionType action, EdgeId sourceEdgeId); } diff --git a/common/cluster-api/src/main/proto/queue.proto b/common/cluster-api/src/main/proto/queue.proto index 8202f1c749..6116411b2e 100644 --- a/common/cluster-api/src/main/proto/queue.proto +++ b/common/cluster-api/src/main/proto/queue.proto @@ -132,6 +132,17 @@ message KeyValueProto { string json_v = 7; } +enum AttributeScopeProto { + CLIENT_SCOPE = 0; + SERVER_SCOPE = 1; + SHARED_SCOPE = 2; +} + +message AttributeKey { + AttributeScopeProto scope = 1; + string attributeKey = 2; +} + message AttributeValueProto { int64 lastUpdateTs = 1; KeyValueType type = 2; @@ -141,6 +152,7 @@ message AttributeValueProto { double double_v = 6; string string_v = 7; string json_v = 8; + optional string key = 9; } message TsKvProto { @@ -282,6 +294,12 @@ message QueueDeleteMsg { string queueName = 5; } +message CoreStartupMsg { + string serviceId = 1; + repeated int32 partitions = 2; + int64 ts = 3; +} + message LwM2MRegistrationRequestMsg { string tenantId = 1; string endpoint = 2; @@ -463,7 +481,7 @@ message DeviceCredentialsProto { int64 deviceIdLSB = 2; CredentialsType credentialsType = 3; string credentialsId = 4; - string credentialsValue = 5; + optional string credentialsValue = 5; } message CredentialsDataProto { @@ -567,7 +585,74 @@ message TransportToRuleEngineMsg { * TB Core Data Structures */ +message TbEntitySubEventProto { + string serviceId = 1; + int32 seqNumber = 2; + int64 tenantIdMSB = 3; + int64 tenantIdLSB = 4; + string entityType = 5; + int64 entityIdMSB = 6; + int64 entityIdLSB = 7; + string type = 8; + bool notifications = 9; + bool alarms = 10; + bool tsAllKeys = 11; + repeated string tsKeys = 12; + bool attrAllKeys = 13; + repeated string attrKeys = 14; +} + +message TbEntitySubEventCallbackProto { + int64 entityIdMSB = 1; + int64 entityIdLSB = 2; + int32 seqNumber = 3; + int64 attributesUpdateTs = 4; + int64 timeSeriesUpdateTs = 5; +} + +message TsValueProto { + int64 ts = 1; + KeyValueType type = 2; + bool bool_v = 3; + int64 long_v = 4; + double double_v = 5; + string string_v = 6; + string json_v = 7; +} + +message TsValueListProto { + string key = 1; + repeated TsValueProto tsValue = 2; +} + +message TbSubUpdateProto { + int64 entityIdMSB = 1; + int64 entityIdLSB = 2; + int32 errorCode = 3; + string errorMsg = 4; + repeated TsValueListProto data = 5; + string scope = 6; +} + +message TbAlarmSubUpdateProto { + int64 entityIdMSB = 1; + int64 entityIdLSB = 2; + int32 errorCode = 3; + string errorMsg = 4; + string alarm = 5; + bool deleted = 6; +} + +message NotificationsSubUpdateProto { + int64 entityIdMSB = 1; + int64 entityIdLSB = 2; + string notificationUpdate = 3; + string notificationRequestUpdate = 4; +} + +// DEPRECATED. FOR REMOVAL message TbSubscriptionProto { + option deprecated = true; string serviceId = 1; string sessionId = 2; int32 subscriptionId = 3; @@ -578,7 +663,9 @@ message TbSubscriptionProto { int64 entityIdLSB = 8; } +// DEPRECATED. FOR REMOVAL message TbTimeSeriesSubscriptionProto { + option deprecated = true; TbSubscriptionProto sub = 1; bool allKeys = 2; repeated TbSubscriptionKetStateProto keyStates = 3; @@ -587,28 +674,38 @@ message TbTimeSeriesSubscriptionProto { bool latestValues = 6; } +// DEPRECATED. FOR REMOVAL message TbAttributeSubscriptionProto { + option deprecated = true; TbSubscriptionProto sub = 1; bool allKeys = 2; repeated TbSubscriptionKetStateProto keyStates = 3; string scope = 4; } +// DEPRECATED. FOR REMOVAL message TbAlarmSubscriptionProto { + option deprecated = true; TbSubscriptionProto sub = 1; int64 ts = 2; } +// DEPRECATED. FOR REMOVAL message NotificationsSubscriptionProto { + option deprecated = true; TbSubscriptionProto sub = 1; int32 limit = 2; } +// DEPRECATED. FOR REMOVAL message NotificationsCountSubscriptionProto { + option deprecated = true; TbSubscriptionProto sub = 1; } +// DEPRECATED. FOR REMOVAL message TbSubscriptionUpdateProto { + option deprecated = true; string sessionId = 1; int32 subscriptionId = 2; int32 errorCode = 3; @@ -616,7 +713,9 @@ message TbSubscriptionUpdateProto { repeated TbSubscriptionUpdateValueListProto data = 5; } +// DEPRECATED. FOR REMOVAL message TbAlarmSubscriptionUpdateProto { + option deprecated = true; string sessionId = 1; int32 subscriptionId = 2; int32 errorCode = 3; @@ -625,7 +724,9 @@ message TbAlarmSubscriptionUpdateProto { bool deleted = 6; } +// DEPRECATED. FOR REMOVAL message NotificationsSubscriptionUpdateProto { + option deprecated = true; string sessionId = 1; int32 subscriptionId = 2; string notificationUpdate = 3; @@ -703,7 +804,9 @@ message TbTimeSeriesUpdateProto { repeated TsKvProto data = 6; } +// DEPRECATED. FOR REMOVAL message TbSubscriptionCloseProto { + option deprecated = true; string sessionId = 1; int32 subscriptionId = 2; } @@ -738,26 +841,32 @@ message DeviceStateServiceMsgProto { } message SubscriptionMgrMsgProto { - TbTimeSeriesSubscriptionProto telemetrySub = 1; - TbAttributeSubscriptionProto attributeSub = 2; - TbSubscriptionCloseProto subClose = 3; + TbTimeSeriesSubscriptionProto telemetrySub = 1 [deprecated = true]; // DEPRECATED. FOR REMOVAL + TbAttributeSubscriptionProto attributeSub = 2 [deprecated = true]; // DEPRECATED. FOR REMOVAL + TbSubscriptionCloseProto subClose = 3 [deprecated = true]; // DEPRECATED. FOR REMOVAL TbTimeSeriesUpdateProto tsUpdate = 4; TbAttributeUpdateProto attrUpdate = 5; TbAttributeDeleteProto attrDelete = 6; - TbAlarmSubscriptionProto alarmSub = 7; + TbAlarmSubscriptionProto alarmSub = 7 [deprecated = true]; // DEPRECATED. FOR REMOVAL TbAlarmUpdateProto alarmUpdate = 8; TbAlarmDeleteProto alarmDelete = 9; TbTimeSeriesDeleteProto tsDelete = 10; - NotificationsSubscriptionProto notificationsSub = 11; - NotificationsCountSubscriptionProto notificationsCountSub = 12; + NotificationsSubscriptionProto notificationsSub = 11 [deprecated = true]; // DEPRECATED. FOR REMOVAL + NotificationsCountSubscriptionProto notificationsCountSub = 12 [deprecated = true]; // DEPRECATED. FOR REMOVAL NotificationUpdateProto notificationUpdate = 13; NotificationRequestUpdateProto notificationRequestUpdate = 14; + TbEntitySubEventProto subEvent = 15; } message LocalSubscriptionServiceMsgProto { - TbSubscriptionUpdateProto subUpdate = 1; - TbAlarmSubscriptionUpdateProto alarmSubUpdate = 2; - NotificationsSubscriptionUpdateProto notificationsSubUpdate = 3; + TbSubscriptionUpdateProto subUpdate = 1 [deprecated = true]; // DEPRECATED. FOR REMOVAL + TbAlarmSubscriptionUpdateProto alarmSubUpdate = 2 [deprecated = true]; // DEPRECATED. FOR REMOVAL + NotificationsSubscriptionUpdateProto notificationsSubUpdate = 3 [deprecated = true]; // DEPRECATED. FOR REMOVAL + TbEntitySubEventCallbackProto subEventCallback = 4; + TbSubUpdateProto tsUpdate = 5; + TbSubUpdateProto attrUpdate = 6; + TbAlarmSubUpdateProto alarmUpdate = 7; + NotificationsSubUpdateProto notificationsUpdate = 8; } message FromDeviceRPCResponseProto { @@ -768,13 +877,15 @@ message FromDeviceRPCResponseProto { } enum ComponentLifecycleEvent { - CREATED = 0; - STARTED = 1; - ACTIVATED = 2; - SUSPENDED = 3; - UPDATED = 4; - STOPPED = 5; - DELETED = 6; + CREATED = 0; + STARTED = 1; + ACTIVATED = 2; + SUSPENDED = 3; + UPDATED = 4; + STOPPED = 5; + DELETED = 6; + FAILED = 7; + DEACTIVATED = 8; } message ComponentLifecycleMsgProto { @@ -799,6 +910,108 @@ message EdgeNotificationMsgProto { string body = 10; PostTelemetryMsg postTelemetryMsg = 11; PostAttributeMsg postAttributesMsg = 12; + int64 sourceEdgeIdMSB = 13; + int64 sourceEdgeIdLSB = 14; +} + +message EdgeEventUpdateMsgProto { + int64 tenantIdMSB = 1; + int64 tenantIdLSB = 2; + int64 edgeIdMSB = 3; + int64 edgeIdLSB = 4; +} + +message ToEdgeSyncRequestMsgProto { + int64 tenantIdMSB = 1; + int64 tenantIdLSB = 2; + int64 requestIdMSB = 3; + int64 requestIdLSB = 4; + int64 edgeIdMSB = 5; + int64 edgeIdLSB = 6; +} + +message FromEdgeSyncResponseMsgProto { + int64 tenantIdMSB = 1; + int64 tenantIdLSB = 2; + int64 responseIdMSB = 3; + int64 responseIdLSB = 4; + int64 edgeIdMSB = 5; + int64 edgeIdLSB = 6; + bool success = 7; +} + +message DeviceEdgeUpdateMsgProto { + int64 tenantIdMSB = 1; + int64 tenantIdLSB = 2; + int64 deviceIdMSB = 3; + int64 deviceIdLSB = 4; + int64 edgeIdMSB = 5; + int64 edgeIdLSB = 6; +} + +message DeviceNameOrTypeUpdateMsgProto { + int64 tenantIdMSB = 1; + int64 tenantIdLSB = 2; + int64 deviceIdMSB = 3; + int64 deviceIdLSB = 4; + string deviceName = 5; + string deviceType = 6; +} + +message DeviceAttributesEventMsgProto { + int64 tenantIdMSB = 1; + int64 tenantIdLSB = 2; + int64 deviceIdMSB = 3; + int64 deviceIdLSB = 4; + repeated AttributeKey deletedKeys = 5; + optional AttributeScopeProto scope = 6; + repeated AttributeValueProto values = 7; + bool deleted = 8; +} + +message DeviceCredentialsUpdateMsgProto { + int64 tenantIdMSB = 1; + int64 tenantIdLSB = 2; + int64 deviceIdMSB = 3; + int64 deviceIdLSB = 4; + DeviceCredentialsProto deviceCredentials = 5; +} + +message ToDeviceRpcRequestActorMsgProto { + int64 tenantIdMSB = 1; + int64 tenantIdLSB = 2; + int64 deviceIdMSB = 3; + int64 deviceIdLSB = 4; + string serviceId = 5; + ToDeviceRpcRequestMsg toDeviceRpcRequestMsg = 6; +} + +message FromDeviceRpcResponseActorMsgProto { + int64 tenantIdMSB = 1; + int64 tenantIdLSB = 2; + int64 deviceIdMSB = 3; + int64 deviceIdLSB = 4; + int32 requestId = 5; + FromDeviceRPCResponseProto rpcResponse = 6; +} + +message RemoveRpcActorMsgProto { + int64 tenantIdMSB = 1; + int64 tenantIdLSB = 2; + int64 requestIdMSB = 3; + int64 requestIdLSB = 4; + int64 deviceIdMSB = 5; + int64 deviceIdLSB = 6; +} + +message ToDeviceActorNotificationMsgProto { + DeviceEdgeUpdateMsgProto deviceEdgeUpdateMsg = 1; + DeviceNameOrTypeUpdateMsgProto deviceNameOrTypeMsg = 2; + DeviceAttributesEventMsgProto deviceAttributesEventMsg = 3; + DeviceCredentialsUpdateMsgProto deviceCredentialsUpdateMsg = 4; + ToDeviceRpcRequestActorMsgProto toDeviceRpcRequestMsg = 5; + FromDeviceRpcResponseActorMsgProto fromDeviceRpcResponseMsg = 6; + RemoveRpcActorMsgProto removeRpcActorMsg = 7; } /** @@ -1026,12 +1239,13 @@ message ToCoreMsg { TransportToDeviceActorMsg toDeviceActorMsg = 1; DeviceStateServiceMsgProto deviceStateServiceMsg = 2; SubscriptionMgrMsgProto toSubscriptionMgrMsg = 3; - bytes toDeviceActorNotificationMsg = 4; + bytes toDeviceActorNotificationMsg = 4 [deprecated = true]; EdgeNotificationMsgProto edgeNotificationMsg = 5; DeviceActivityProto deviceActivityMsg = 6; NotificationSchedulerServiceMsg notificationSchedulerServiceMsg = 7; LifecycleEventProto lifecycleEventMsg = 8; ErrorEventProto errorEventMsg = 9; + ToDeviceActorNotificationMsgProto toDeviceActorNotification = 10; } /* High priority messages with low latency are handled by ThingsBoard Core Service separately */ @@ -1039,16 +1253,20 @@ message ToCoreMsg { message ToCoreNotificationMsg { LocalSubscriptionServiceMsgProto toLocalSubscriptionServiceMsg = 1; FromDeviceRPCResponseProto fromDeviceRpcResponse = 2; - bytes componentLifecycleMsg = 3; //will be removed in 3.6.1 in favour of ComponentLifecycleMsgProto - bytes edgeEventUpdateMsg = 4; + bytes componentLifecycleMsg = 3 [deprecated = true]; + bytes edgeEventUpdateMsg = 4 [deprecated = true]; QueueUpdateMsg queueUpdateMsg = 5; QueueDeleteMsg queueDeleteMsg = 6; VersionControlResponseMsg vcResponseMsg = 7; - bytes toEdgeSyncRequestMsg = 8; - bytes fromEdgeSyncResponseMsg = 9; + bytes toEdgeSyncRequestMsg = 8 [deprecated = true]; + bytes fromEdgeSyncResponseMsg = 9 [deprecated = true]; SubscriptionMgrMsgProto toSubscriptionMgrMsg = 10; NotificationRuleProcessorMsg notificationRuleProcessorMsg = 11; ComponentLifecycleMsgProto componentLifecycle = 12; + CoreStartupMsg coreStartupMsg = 13; + EdgeEventUpdateMsgProto edgeEventUpdate = 14; + ToEdgeSyncRequestMsgProto toEdgeSyncRequest = 15; + FromEdgeSyncResponseMsgProto fromEdgeSyncResponse = 16; } /* Messages that are handled by ThingsBoard RuleEngine Service */ @@ -1061,7 +1279,7 @@ message ToRuleEngineMsg { } message ToRuleEngineNotificationMsg { - bytes componentLifecycleMsg = 1; // will be removed in 3.6.1 in favour of ComponentLifecycleMsgProto + bytes componentLifecycleMsg = 1 [deprecated = true]; FromDeviceRPCResponseProto fromDeviceRpcResponse = 2; QueueUpdateMsg queueUpdateMsg = 3; QueueDeleteMsg queueDeleteMsg = 4; diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeSynchronizationManager.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeSynchronizationManager.java index 8cce581098..812b30dc9d 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeSynchronizationManager.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/edge/EdgeSynchronizationManager.java @@ -15,9 +15,9 @@ */ package org.thingsboard.server.dao.edge; -public interface EdgeSynchronizationManager { +import org.thingsboard.server.common.data.id.EdgeId; - ThreadLocal getSync(); +public interface EdgeSynchronizationManager { - boolean isSync(); + ThreadLocal getEdgeId(); } diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/resource/ResourceService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/resource/ResourceService.java index c1ce27c266..40125087c2 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/resource/ResourceService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/resource/ResourceService.java @@ -32,6 +32,8 @@ public interface ResourceService extends EntityDaoService { TbResource saveResource(TbResource resource); + TbResource saveResource(TbResource resource, boolean doValidate); + TbResource findResourceByTenantIdAndKey(TenantId tenantId, ResourceType resourceType, String resourceId); TbResource findResourceById(TenantId tenantId, TbResourceId resourceId); @@ -40,6 +42,8 @@ public interface ResourceService extends EntityDaoService { TbResourceInfo findResourceInfoByTenantIdAndKey(TenantId tenantId, ResourceType resourceType, String resourceKey); + PageData findAllTenantResources(TenantId tenantId, PageLink pageLink); + ListenableFuture findResourceInfoByIdAsync(TenantId tenantId, TbResourceId resourceId); PageData findAllTenantResourcesByTenantId(TbResourceInfoFilter filter, PageLink pageLink); diff --git a/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleService.java b/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleService.java index 15fd4838dd..a836fb893d 100644 --- a/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleService.java +++ b/common/dao-api/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleService.java @@ -42,6 +42,8 @@ public interface WidgetsBundleService extends EntityDaoService { PageData findAllTenantWidgetsBundlesByTenantIdAndPageLink(TenantId tenantId, boolean fullSearch, PageLink pageLink); + PageData findTenantWidgetsBundlesByTenantIdAndPageLink(TenantId tenantId, boolean fullSearch, PageLink pageLink); + List findAllTenantWidgetsBundlesByTenantId(TenantId tenantId); void deleteWidgetsBundlesByTenantId(TenantId tenantId); diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeEventType.java b/common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeEventType.java index 1397deb5d7..5ecd8eab27 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeEventType.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/edge/EdgeEventType.java @@ -39,7 +39,8 @@ public enum EdgeEventType { WIDGET_TYPE(true, EntityType.WIDGET_TYPE), ADMIN_SETTINGS(true, null), OTA_PACKAGE(true, EntityType.OTA_PACKAGE), - QUEUE(true, EntityType.QUEUE); + QUEUE(true, EntityType.QUEUE), + TB_RESOURCE(true, EntityType.TB_RESOURCE); private final boolean allEdgesRelated; diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/id/EntityIdFactory.java b/common/data/src/main/java/org/thingsboard/server/common/data/id/EntityIdFactory.java index da92eb65d6..75e6abe273 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/id/EntityIdFactory.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/id/EntityIdFactory.java @@ -143,6 +143,8 @@ public class EntityIdFactory { return new EdgeId(uuid); case QUEUE: return new QueueId(uuid); + case TB_RESOURCE: + return new TbResourceId(uuid); } throw new IllegalArgumentException("EdgeEventType " + edgeEventType + " is not supported!"); } diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/plugin/ComponentLifecycleEvent.java b/common/data/src/main/java/org/thingsboard/server/common/data/plugin/ComponentLifecycleEvent.java index 969baee088..cbcf94445b 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/plugin/ComponentLifecycleEvent.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/plugin/ComponentLifecycleEvent.java @@ -22,5 +22,5 @@ import java.io.Serializable; */ public enum ComponentLifecycleEvent implements Serializable { // In sync with ComponentLifecycleEvent proto - CREATED, STARTED, ACTIVATED, SUSPENDED, UPDATED, STOPPED, DELETED -} \ No newline at end of file + CREATED, STARTED, ACTIVATED, SUSPENDED, UPDATED, STOPPED, DELETED, FAILED, DEACTIVATED +} diff --git a/common/data/src/main/java/org/thingsboard/server/common/data/widget/WidgetsBundle.java b/common/data/src/main/java/org/thingsboard/server/common/data/widget/WidgetsBundle.java index 3655eace53..9096207abe 100644 --- a/common/data/src/main/java/org/thingsboard/server/common/data/widget/WidgetsBundle.java +++ b/common/data/src/main/java/org/thingsboard/server/common/data/widget/WidgetsBundle.java @@ -70,6 +70,11 @@ public class WidgetsBundle extends BaseData implements HasName, @ApiModelProperty(position = 7, value = "Description", accessMode = ApiModelProperty.AccessMode.READ_ONLY) private String description; + @Getter + @Setter + @ApiModelProperty(position = 8, value = "Order", accessMode = ApiModelProperty.AccessMode.READ_ONLY) + private Integer order; + @Getter @Setter private WidgetsBundleId externalId; @@ -89,6 +94,7 @@ public class WidgetsBundle extends BaseData implements HasName, this.title = widgetsBundle.getTitle(); this.image = widgetsBundle.getImage(); this.description = widgetsBundle.getDescription(); + this.order = widgetsBundle.getOrder(); this.externalId = widgetsBundle.getExternalId(); } diff --git a/common/edge-api/src/main/proto/edge.proto b/common/edge-api/src/main/proto/edge.proto index bc0170b24b..f145ae3b98 100644 --- a/common/edge-api/src/main/proto/edge.proto +++ b/common/edge-api/src/main/proto/edge.proto @@ -361,7 +361,8 @@ message WidgetsBundleUpdateMsg { optional bytes image = 6; bool isSystem = 7; optional string description = 8; - optional string widgets = 9; + optional int32 order = 9; + optional string widgets = 10; } message WidgetTypeUpdateMsg { @@ -423,6 +424,19 @@ message TenantProfileUpdateMsg { bytes profileDataBytes = 8; } +message ResourceUpdateMsg { + UpdateMsgType msgType = 1; + int64 idMSB = 2; + int64 idLSB = 3; + string title = 4; + string resourceType = 5; + string resourceKey = 6; + string fileName = 7; + optional string data = 8; + optional string etag = 9; + bool isSystem = 10; +} + message RuleChainMetadataRequestMsg { int64 ruleChainIdMSB = 1; int64 ruleChainIdLSB = 2; @@ -574,6 +588,7 @@ message UplinkMsg { repeated EntityViewUpdateMsg entityViewUpdateMsg = 18; repeated AssetProfileUpdateMsg assetProfileUpdateMsg = 19; repeated DeviceProfileUpdateMsg deviceProfileUpdateMsg = 20; + repeated ResourceUpdateMsg resourceUpdateMsg = 21; } message UplinkResponseMsg { @@ -616,5 +631,6 @@ message DownlinkMsg { EdgeConfiguration edgeConfiguration = 25; repeated TenantUpdateMsg tenantUpdateMsg = 26; repeated TenantProfileUpdateMsg tenantProfileUpdateMsg = 27; + repeated ResourceUpdateMsg resourceUpdateMsg = 28; } diff --git a/common/message/src/main/java/org/thingsboard/server/common/msg/edge/EdgeEventUpdateMsg.java b/common/message/src/main/java/org/thingsboard/server/common/msg/edge/EdgeEventUpdateMsg.java index 30d95ac28c..f8c7bd437f 100644 --- a/common/message/src/main/java/org/thingsboard/server/common/msg/edge/EdgeEventUpdateMsg.java +++ b/common/message/src/main/java/org/thingsboard/server/common/msg/edge/EdgeEventUpdateMsg.java @@ -15,24 +15,19 @@ */ package org.thingsboard.server.common.msg.edge; -import lombok.Getter; -import lombok.ToString; +import lombok.Data; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.msg.MsgType; -@ToString +@Data public class EdgeEventUpdateMsg implements EdgeSessionMsg { - @Getter + + private static final long serialVersionUID = -8050114506822836537L; + private final TenantId tenantId; - @Getter private final EdgeId edgeId; - public EdgeEventUpdateMsg(TenantId tenantId, EdgeId edgeId) { - this.tenantId = tenantId; - this.edgeId = edgeId; - } - @Override public MsgType getMsgType() { return MsgType.EDGE_EVENT_UPDATE_TO_EDGE_SESSION_MSG; diff --git a/common/message/src/main/java/org/thingsboard/server/common/msg/edge/FromEdgeSyncResponse.java b/common/message/src/main/java/org/thingsboard/server/common/msg/edge/FromEdgeSyncResponse.java index 74c2d96b40..f9302fcb3f 100644 --- a/common/message/src/main/java/org/thingsboard/server/common/msg/edge/FromEdgeSyncResponse.java +++ b/common/message/src/main/java/org/thingsboard/server/common/msg/edge/FromEdgeSyncResponse.java @@ -15,18 +15,18 @@ */ package org.thingsboard.server.common.msg.edge; -import lombok.AllArgsConstructor; -import lombok.Getter; +import lombok.Data; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.msg.MsgType; import java.util.UUID; -@AllArgsConstructor -@Getter +@Data public class FromEdgeSyncResponse implements EdgeSessionMsg { + private static final long serialVersionUID = -6360890886315347486L; + private final UUID id; private final TenantId tenantId; private final EdgeId edgeId; diff --git a/common/message/src/main/java/org/thingsboard/server/common/msg/edge/ToEdgeSyncRequest.java b/common/message/src/main/java/org/thingsboard/server/common/msg/edge/ToEdgeSyncRequest.java index 06778089e2..f6324ba5d0 100644 --- a/common/message/src/main/java/org/thingsboard/server/common/msg/edge/ToEdgeSyncRequest.java +++ b/common/message/src/main/java/org/thingsboard/server/common/msg/edge/ToEdgeSyncRequest.java @@ -15,17 +15,18 @@ */ package org.thingsboard.server.common.msg.edge; -import lombok.AllArgsConstructor; -import lombok.Getter; +import lombok.Data; import org.thingsboard.server.common.data.id.EdgeId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.msg.MsgType; import java.util.UUID; -@AllArgsConstructor -@Getter +@Data public class ToEdgeSyncRequest implements EdgeSessionMsg { + + private static final long serialVersionUID = -7624597032448212259L; + private final UUID id; private final TenantId tenantId; private final EdgeId edgeId; diff --git a/common/message/src/main/java/org/thingsboard/server/common/msg/rpc/FromDeviceRpcResponse.java b/common/message/src/main/java/org/thingsboard/server/common/msg/rpc/FromDeviceRpcResponse.java index 75c2f35a5e..0ef89e460e 100644 --- a/common/message/src/main/java/org/thingsboard/server/common/msg/rpc/FromDeviceRpcResponse.java +++ b/common/message/src/main/java/org/thingsboard/server/common/msg/rpc/FromDeviceRpcResponse.java @@ -15,9 +15,7 @@ */ package org.thingsboard.server.common.msg.rpc; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.ToString; +import lombok.Data; import org.thingsboard.server.common.data.rpc.RpcError; import java.io.Serializable; @@ -27,10 +25,11 @@ import java.util.UUID; /** * @author Andrew Shvayka */ -@RequiredArgsConstructor -@ToString +@Data public class FromDeviceRpcResponse implements Serializable { - @Getter + + private static final long serialVersionUID = -3799452502112373491L; + private final UUID id; private final String response; private final RpcError error; diff --git a/application/src/main/java/org/thingsboard/server/service/rpc/FromDeviceRpcResponseActorMsg.java b/common/message/src/main/java/org/thingsboard/server/common/msg/rpc/FromDeviceRpcResponseActorMsg.java similarity index 85% rename from application/src/main/java/org/thingsboard/server/service/rpc/FromDeviceRpcResponseActorMsg.java rename to common/message/src/main/java/org/thingsboard/server/common/msg/rpc/FromDeviceRpcResponseActorMsg.java index 2a3e30adcf..28eb1b6a06 100644 --- a/application/src/main/java/org/thingsboard/server/service/rpc/FromDeviceRpcResponseActorMsg.java +++ b/common/message/src/main/java/org/thingsboard/server/common/msg/rpc/FromDeviceRpcResponseActorMsg.java @@ -13,29 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.thingsboard.server.service.rpc; +package org.thingsboard.server.common.msg.rpc; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.ToString; +import lombok.Data; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.msg.MsgType; import org.thingsboard.server.common.msg.ToDeviceActorNotificationMsg; import org.thingsboard.server.common.msg.rpc.FromDeviceRpcResponse; -@ToString -@RequiredArgsConstructor +@Data public class FromDeviceRpcResponseActorMsg implements ToDeviceActorNotificationMsg { - @Getter + private static final long serialVersionUID = -6648120137236354987L; + private final Integer requestId; - @Getter private final TenantId tenantId; - @Getter private final DeviceId deviceId; - - @Getter private final FromDeviceRpcResponse msg; @Override diff --git a/application/src/main/java/org/thingsboard/server/service/rpc/RemoveRpcActorMsg.java b/common/message/src/main/java/org/thingsboard/server/common/msg/rpc/RemoveRpcActorMsg.java similarity index 85% rename from application/src/main/java/org/thingsboard/server/service/rpc/RemoveRpcActorMsg.java rename to common/message/src/main/java/org/thingsboard/server/common/msg/rpc/RemoveRpcActorMsg.java index c0b0c64b2d..dc7db3e7fa 100644 --- a/application/src/main/java/org/thingsboard/server/service/rpc/RemoveRpcActorMsg.java +++ b/common/message/src/main/java/org/thingsboard/server/common/msg/rpc/RemoveRpcActorMsg.java @@ -13,11 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.thingsboard.server.service.rpc; +package org.thingsboard.server.common.msg.rpc; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.ToString; +import lombok.Data; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.msg.MsgType; @@ -25,16 +23,13 @@ import org.thingsboard.server.common.msg.ToDeviceActorNotificationMsg; import java.util.UUID; -@ToString -@RequiredArgsConstructor +@Data public class RemoveRpcActorMsg implements ToDeviceActorNotificationMsg { - @Getter + private static final long serialVersionUID = -6112720854949677477L; + private final TenantId tenantId; - @Getter private final DeviceId deviceId; - - @Getter private final UUID requestId; @Override diff --git a/common/message/src/main/java/org/thingsboard/server/common/msg/rpc/ToDeviceRpcRequest.java b/common/message/src/main/java/org/thingsboard/server/common/msg/rpc/ToDeviceRpcRequest.java index 08785e4c31..846022bdc8 100644 --- a/common/message/src/main/java/org/thingsboard/server/common/msg/rpc/ToDeviceRpcRequest.java +++ b/common/message/src/main/java/org/thingsboard/server/common/msg/rpc/ToDeviceRpcRequest.java @@ -29,6 +29,9 @@ import java.util.UUID; */ @Data public class ToDeviceRpcRequest implements Serializable { + + private static final long serialVersionUID = -7089247105087346214L; + private final UUID id; private final TenantId tenantId; private final DeviceId deviceId; @@ -40,4 +43,3 @@ public class ToDeviceRpcRequest implements Serializable { @JsonIgnore private final String additionalInfo; } - diff --git a/application/src/main/java/org/thingsboard/server/service/rpc/ToDeviceRpcRequestActorMsg.java b/common/message/src/main/java/org/thingsboard/server/common/msg/rpc/ToDeviceRpcRequestActorMsg.java similarity index 88% rename from application/src/main/java/org/thingsboard/server/service/rpc/ToDeviceRpcRequestActorMsg.java rename to common/message/src/main/java/org/thingsboard/server/common/msg/rpc/ToDeviceRpcRequestActorMsg.java index 64c8887edb..d5f8c6d797 100644 --- a/application/src/main/java/org/thingsboard/server/service/rpc/ToDeviceRpcRequestActorMsg.java +++ b/common/message/src/main/java/org/thingsboard/server/common/msg/rpc/ToDeviceRpcRequestActorMsg.java @@ -13,11 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.thingsboard.server.service.rpc; +package org.thingsboard.server.common.msg.rpc; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.ToString; +import lombok.Data; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.msg.MsgType; @@ -27,15 +25,12 @@ import org.thingsboard.server.common.msg.rpc.ToDeviceRpcRequest; /** * Created by ashvayka on 16.04.18. */ -@ToString -@RequiredArgsConstructor +@Data public class ToDeviceRpcRequestActorMsg implements ToDeviceActorNotificationMsg { private static final long serialVersionUID = -8592877558138716589L; - @Getter private final String serviceId; - @Getter private final ToDeviceRpcRequest msg; @Override diff --git a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/msg/DeviceAttributes.java b/common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceAttributes.java similarity index 98% rename from rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/msg/DeviceAttributes.java rename to common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceAttributes.java index 4d899c2845..00079558e6 100644 --- a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/msg/DeviceAttributes.java +++ b/common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceAttributes.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.thingsboard.rule.engine.api.msg; +package org.thingsboard.server.common.msg.rule.engine; import org.thingsboard.server.common.data.DataConstants; import org.thingsboard.server.common.data.kv.AttributeKey; diff --git a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/msg/DeviceAttributesEventNotificationMsg.java b/common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceAttributesEventNotificationMsg.java similarity index 90% rename from rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/msg/DeviceAttributesEventNotificationMsg.java rename to common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceAttributesEventNotificationMsg.java index 215322bde3..d0124fbb01 100644 --- a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/msg/DeviceAttributesEventNotificationMsg.java +++ b/common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceAttributesEventNotificationMsg.java @@ -13,11 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.thingsboard.rule.engine.api.msg; +package org.thingsboard.server.common.msg.rule.engine; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.ToString; +import lombok.Data; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.kv.AttributeKey; @@ -32,21 +30,16 @@ import java.util.Set; /** * @author Andrew Shvayka */ -@ToString -@AllArgsConstructor +@Data public class DeviceAttributesEventNotificationMsg implements ToDeviceActorNotificationMsg { - @Getter + private static final long serialVersionUID = 2422071590415277039L; + private final TenantId tenantId; - @Getter private final DeviceId deviceId; - @Getter private final Set deletedKeys; - @Getter private final String scope; - @Getter private final List values; - @Getter private final boolean deleted; public static DeviceAttributesEventNotificationMsg onUpdate(TenantId tenantId, DeviceId deviceId, String scope, List values) { diff --git a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/msg/DeviceCredentialsUpdateNotificationMsg.java b/common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceCredentialsUpdateNotificationMsg.java similarity index 96% rename from rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/msg/DeviceCredentialsUpdateNotificationMsg.java rename to common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceCredentialsUpdateNotificationMsg.java index 665ace9610..b13026ba38 100644 --- a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/msg/DeviceCredentialsUpdateNotificationMsg.java +++ b/common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceCredentialsUpdateNotificationMsg.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.thingsboard.rule.engine.api.msg; +package org.thingsboard.server.common.msg.rule.engine; import lombok.Data; import org.thingsboard.server.common.data.id.DeviceId; diff --git a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/msg/DeviceEdgeUpdateMsg.java b/common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceEdgeUpdateMsg.java similarity index 90% rename from rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/msg/DeviceEdgeUpdateMsg.java rename to common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceEdgeUpdateMsg.java index 96fc263b81..99e52e31b0 100644 --- a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/msg/DeviceEdgeUpdateMsg.java +++ b/common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceEdgeUpdateMsg.java @@ -13,9 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.thingsboard.rule.engine.api.msg; +package org.thingsboard.server.common.msg.rule.engine; -import lombok.AllArgsConstructor; import lombok.Data; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.EdgeId; @@ -24,9 +23,10 @@ import org.thingsboard.server.common.msg.MsgType; import org.thingsboard.server.common.msg.ToDeviceActorNotificationMsg; @Data -@AllArgsConstructor public class DeviceEdgeUpdateMsg implements ToDeviceActorNotificationMsg { + private static final long serialVersionUID = 4679029228395462172L; + private final TenantId tenantId; private final DeviceId deviceId; private final EdgeId edgeId; diff --git a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/msg/DeviceMetaData.java b/common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceMetaData.java similarity index 94% rename from rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/msg/DeviceMetaData.java rename to common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceMetaData.java index 16486552cc..f7fbb7b1ef 100644 --- a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/msg/DeviceMetaData.java +++ b/common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceMetaData.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.thingsboard.rule.engine.api.msg; +package org.thingsboard.server.common.msg.rule.engine; import lombok.Data; import org.thingsboard.server.common.data.id.DeviceId; diff --git a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/msg/DeviceNameOrTypeUpdateMsg.java b/common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceNameOrTypeUpdateMsg.java similarity index 92% rename from rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/msg/DeviceNameOrTypeUpdateMsg.java rename to common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceNameOrTypeUpdateMsg.java index b85899e06d..13b6a8558f 100644 --- a/rule-engine/rule-engine-api/src/main/java/org/thingsboard/rule/engine/api/msg/DeviceNameOrTypeUpdateMsg.java +++ b/common/message/src/main/java/org/thingsboard/server/common/msg/rule/engine/DeviceNameOrTypeUpdateMsg.java @@ -13,9 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.thingsboard.rule.engine.api.msg; +package org.thingsboard.server.common.msg.rule.engine; -import lombok.AllArgsConstructor; import lombok.Data; import org.thingsboard.server.common.data.id.DeviceId; import org.thingsboard.server.common.data.id.TenantId; @@ -23,7 +22,6 @@ import org.thingsboard.server.common.msg.MsgType; import org.thingsboard.server.common.msg.ToDeviceActorNotificationMsg; @Data -@AllArgsConstructor public class DeviceNameOrTypeUpdateMsg implements ToDeviceActorNotificationMsg { private static final long serialVersionUID = -5738949227650536685L; diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java index 5be5caf6ff..a02d4054ac 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/HashPartitionService.java @@ -71,6 +71,7 @@ public class HashPartitionService implements PartitionService { private final TbServiceInfoProvider serviceInfoProvider; private final TenantRoutingInfoService tenantRoutingInfoService; private final QueueRoutingInfoService queueRoutingInfoService; + private final TopicService topicService; protected volatile ConcurrentMap> myPartitions = new ConcurrentHashMap<>(); @@ -88,11 +89,13 @@ public class HashPartitionService implements PartitionService { public HashPartitionService(TbServiceInfoProvider serviceInfoProvider, TenantRoutingInfoService tenantRoutingInfoService, ApplicationEventPublisher applicationEventPublisher, - QueueRoutingInfoService queueRoutingInfoService) { + QueueRoutingInfoService queueRoutingInfoService, + TopicService topicService) { this.serviceInfoProvider = serviceInfoProvider; this.tenantRoutingInfoService = tenantRoutingInfoService; this.applicationEventPublisher = applicationEventPublisher; this.queueRoutingInfoService = queueRoutingInfoService; + this.topicService = topicService; } @PostConstruct @@ -118,6 +121,11 @@ public class HashPartitionService implements PartitionService { } } + @Override + public List getMyPartitions(QueueKey queueKey) { + return myPartitions.get(queueKey); + } + private void doInitRuleEnginePartitions() { List queueRoutingInfoList = getQueueRoutingInfos(); queueRoutingInfoList.forEach(queue -> { @@ -420,7 +428,7 @@ public class HashPartitionService implements PartitionService { private TopicPartitionInfo buildTopicPartitionInfo(QueueKey queueKey, int partition) { TopicPartitionInfo.TopicPartitionInfoBuilder tpi = TopicPartitionInfo.builder(); - tpi.topic(partitionTopicsMap.get(queueKey)); + tpi.topic(topicService.buildTopicName(partitionTopicsMap.get(queueKey))); tpi.partition(partition); tpi.tenantId(queueKey.getTenantId()); @@ -526,11 +534,7 @@ public class HashPartitionService implements PartitionService { servers = responsible; } - int hash = hashFunction.newHasher() - .putLong(tenantId.getId().getMostSignificantBits()) - .putLong(tenantId.getId().getLeastSignificantBits()) - .putString(queueKey.getQueueName(), StandardCharsets.UTF_8) - .hash().asInt(); + int hash = hash(tenantId.getId()); return servers.get(Math.abs((hash + partition) % servers.size())); } else { return servers.get(partition % servers.size()); diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/PartitionService.java b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/PartitionService.java index b55ba79f67..fe06db789b 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/PartitionService.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/PartitionService.java @@ -37,6 +37,8 @@ public interface PartitionService { boolean isMyPartition(ServiceType serviceType, TenantId tenantId, EntityId entityId); + List getMyPartitions(QueueKey queueKey); + /** * Received from the Discovery service when network topology is changed. * @param currentService - current service information {@link org.thingsboard.server.gen.transport.TransportProtos.ServiceInfo} diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/NotificationsTopicService.java b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/TopicService.java similarity index 75% rename from common/queue/src/main/java/org/thingsboard/server/queue/discovery/NotificationsTopicService.java rename to common/queue/src/main/java/org/thingsboard/server/queue/discovery/TopicService.java index c209bd1aee..40e19519b0 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/NotificationsTopicService.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/TopicService.java @@ -15,7 +15,9 @@ */ package org.thingsboard.server.queue.discovery; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.msg.queue.ServiceType; import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; @@ -23,7 +25,10 @@ import java.util.HashMap; import java.util.Map; @Service -public class NotificationsTopicService { +public class TopicService { + + @Value("${queue.prefix:}") + private String prefix; private Map tbCoreNotificationTopics = new HashMap<>(); private Map tbRuleEngineNotificationTopics = new HashMap<>(); @@ -49,6 +54,14 @@ public class NotificationsTopicService { } private TopicPartitionInfo buildNotificationsTopicPartitionInfo(ServiceType serviceType, String serviceId) { - return new TopicPartitionInfo(serviceType.name().toLowerCase() + ".notifications." + serviceId, null, null, false); + return buildTopicPartitionInfo(serviceType.name().toLowerCase() + ".notifications." + serviceId, null, null, false); + } + + public TopicPartitionInfo buildTopicPartitionInfo(String topic, TenantId tenantId, Integer partition, boolean myPartition) { + return new TopicPartitionInfo(buildTopicName(topic), tenantId, partition, myPartition); + } + + public String buildTopicName(String topic) { + return prefix.isBlank() ? topic : prefix + "." + topic; } } \ No newline at end of file diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/ZkDiscoveryService.java b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/ZkDiscoveryService.java index e99817de17..d94ff082d1 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/ZkDiscoveryService.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/ZkDiscoveryService.java @@ -35,10 +35,12 @@ import org.apache.zookeeper.KeeperException; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.util.Assert; import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.server.gen.transport.TransportProtos; +import org.thingsboard.server.queue.discovery.event.OtherServiceShutdownEvent; import org.thingsboard.server.queue.util.AfterStartUp; import javax.annotation.PostConstruct; @@ -74,6 +76,7 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi protected final ConcurrentHashMap> delayedTasks; + private final ApplicationEventPublisher applicationEventPublisher; private final TbServiceInfoProvider serviceInfoProvider; private final PartitionService partitionService; @@ -85,8 +88,10 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi private volatile boolean stopped = true; - public ZkDiscoveryService(TbServiceInfoProvider serviceInfoProvider, + public ZkDiscoveryService(ApplicationEventPublisher applicationEventPublisher, + TbServiceInfoProvider serviceInfoProvider, PartitionService partitionService) { + this.applicationEventPublisher = applicationEventPublisher; this.serviceInfoProvider = serviceInfoProvider; this.partitionService = partitionService; delayedTasks = new ConcurrentHashMap<>(); @@ -141,9 +146,11 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi return; } log.info("Going to publish current server..."); - zkExecutorService.scheduleAtFixedRate(this::publishCurrentServer, 0, 1, TimeUnit.MINUTES); + publishCurrentServer(); log.info("Going to recalculate partitions..."); recalculatePartitions(); + + zkExecutorService.scheduleAtFixedRate(this::publishCurrentServer, 1, 1, TimeUnit.MINUTES); } @SneakyThrows @@ -319,6 +326,7 @@ public class ZkDiscoveryService implements DiscoveryService, PathChildrenCacheLi } break; case CHILD_REMOVED: + zkExecutorService.submit(() -> applicationEventPublisher.publishEvent(new OtherServiceShutdownEvent(this, serviceId, serviceTypesList))); ScheduledFuture future = zkExecutorService.schedule(() -> { log.debug("[{}] Going to recalculate partitions due to removed node [{}]", serviceId, serviceTypesList); diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/discovery/event/OtherServiceShutdownEvent.java b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/event/OtherServiceShutdownEvent.java new file mode 100644 index 0000000000..5de09696c6 --- /dev/null +++ b/common/queue/src/main/java/org/thingsboard/server/queue/discovery/event/OtherServiceShutdownEvent.java @@ -0,0 +1,41 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.server.queue.discovery.event; + +import com.google.protobuf.ProtocolStringList; +import lombok.Getter; +import org.thingsboard.server.common.msg.queue.ServiceType; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +public class OtherServiceShutdownEvent extends TbApplicationEvent { + + private static final long serialVersionUID = -2441739930040282254L; + + @Getter + private final String serviceId; + @Getter + private final Set serviceTypes; + + public OtherServiceShutdownEvent(Object source, String serviceId, List serviceTypes) { + super(source); + this.serviceId = serviceId; + this.serviceTypes = serviceTypes.stream().map(ServiceType::valueOf).collect(Collectors.toSet()); + } +} diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/notification/RemoteNotificationRuleProcessor.java b/common/queue/src/main/java/org/thingsboard/server/queue/notification/RemoteNotificationRuleProcessor.java index 5304056a88..8ad5816b77 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/notification/RemoteNotificationRuleProcessor.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/notification/RemoteNotificationRuleProcessor.java @@ -26,7 +26,7 @@ import org.thingsboard.server.common.msg.queue.ServiceType; import org.thingsboard.server.common.msg.queue.TopicPartitionInfo; import org.thingsboard.server.gen.transport.TransportProtos; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.PartitionService; import org.thingsboard.server.queue.provider.TbQueueProducerProvider; import org.thingsboard.server.queue.util.DataDecodingEncodingService; @@ -41,7 +41,7 @@ public class RemoteNotificationRuleProcessor implements NotificationRuleProcesso private final NotificationDeduplicationService deduplicationService; private final TbQueueProducerProvider producerProvider; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final PartitionService partitionService; private final DataDecodingEncodingService encodingService; @@ -57,7 +57,7 @@ public class RemoteNotificationRuleProcessor implements NotificationRuleProcesso .setTrigger(ByteString.copyFrom(encodingService.encode(trigger))); partitionService.getAllServiceIds(ServiceType.TB_CORE).stream().findAny().ifPresent(serviceId -> { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceId); producerProvider.getTbCoreNotificationsMsgProducer().send(tpi, new TbProtoQueueMsg<>(UUID.randomUUID(), TransportProtos.ToCoreNotificationMsg.newBuilder() .setNotificationRuleProcessorMsg(msg) diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsMonolithQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsMonolithQueueFactory.java index 08609b13d0..5774e59d32 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsMonolithQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsMonolithQueueFactory.java @@ -40,7 +40,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings; @@ -61,7 +61,7 @@ import java.nio.charset.StandardCharsets; @ConditionalOnExpression("'${queue.type:null}'=='aws-sqs' && '${service.type:null}'=='monolith'") public class AwsSqsMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngineQueueFactory, TbVersionControlQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbQueueCoreSettings coreSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRuleEngineSettings ruleEngineSettings; @@ -79,7 +79,7 @@ public class AwsSqsMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng private final TbQueueAdmin otaAdmin; private final TbQueueAdmin vcAdmin; - public AwsSqsMonolithQueueFactory(NotificationsTopicService notificationsTopicService, TbQueueCoreSettings coreSettings, + public AwsSqsMonolithQueueFactory(TopicService topicService, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueTransportApiSettings transportApiSettings, @@ -88,7 +88,7 @@ public class AwsSqsMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng TbQueueVersionControlSettings vcSettings, TbAwsSqsQueueAttributes sqsQueueAttributes, TbQueueRemoteJsInvokeSettings jsInvokeSettings) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.coreSettings = coreSettings; this.serviceInfoProvider = serviceInfoProvider; this.ruleEngineSettings = ruleEngineSettings; @@ -109,71 +109,71 @@ public class AwsSqsMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbAwsSqsProducerTemplate<>(ruleEngineAdmin, sqsSettings, ruleEngineSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(ruleEngineAdmin, sqsSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, ruleEngineSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToVersionControlMsgConsumer() { - return new TbAwsSqsConsumerTemplate<>(vcAdmin, sqsSettings, vcSettings.getTopic(), + return new TbAwsSqsConsumerTemplate<>(vcAdmin, sqsSettings, topicService.buildTopicName(vcSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToVersionControlServiceMsg.parseFrom(msg.getData()), msg.getHeaders()) ); } @Override public TbQueueConsumer> createToRuleEngineMsgConsumer(Queue configuration) { - return new TbAwsSqsConsumerTemplate<>(ruleEngineAdmin, sqsSettings, configuration.getTopic(), + return new TbAwsSqsConsumerTemplate<>(ruleEngineAdmin, sqsSettings, topicService.buildTopicName(configuration.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { return new TbAwsSqsConsumerTemplate<>(notificationAdmin, sqsSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToCoreMsgConsumer() { - return new TbAwsSqsConsumerTemplate<>(coreAdmin, sqsSettings, coreSettings.getTopic(), + return new TbAwsSqsConsumerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { return new TbAwsSqsConsumerTemplate<>(notificationAdmin, sqsSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createTransportApiRequestConsumer() { - return new TbAwsSqsConsumerTemplate<>(transportApiAdmin, sqsSettings, transportApiSettings.getRequestsTopic(), + return new TbAwsSqsConsumerTemplate<>(transportApiAdmin, sqsSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiRequestMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createTransportApiResponseProducer() { - return new TbAwsSqsProducerTemplate<>(transportApiAdmin, sqsSettings, transportApiSettings.getResponsesTopic()); + return new TbAwsSqsProducerTemplate<>(transportApiAdmin, sqsSettings, topicService.buildTopicName(transportApiSettings.getResponsesTopic())); } @Override @@ -201,29 +201,29 @@ public class AwsSqsMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getUsageStatsTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueConsumer> createToUsageStatsServiceMsgConsumer() { - return new TbAwsSqsConsumerTemplate<>(coreAdmin, sqsSettings, coreSettings.getUsageStatsTopic(), + return new TbAwsSqsConsumerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToUsageStatsServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToOtaPackageStateServiceMsgConsumer() { - return new TbAwsSqsConsumerTemplate<>(otaAdmin, sqsSettings, coreSettings.getOtaPackageTopic(), + return new TbAwsSqsConsumerTemplate<>(otaAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbAwsSqsProducerTemplate<>(otaAdmin, sqsSettings, coreSettings.getOtaPackageTopic()); + return new TbAwsSqsProducerTemplate<>(otaAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @Override public TbQueueProducer> createVersionControlMsgProducer() { - return new TbAwsSqsProducerTemplate<>(vcAdmin, sqsSettings, vcSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(vcAdmin, sqsSettings, topicService.buildTopicName(vcSettings.getTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbCoreQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbCoreQueueFactory.java index 257ac37408..d7f7a0412f 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbCoreQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbCoreQueueFactory.java @@ -38,7 +38,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings; @@ -63,7 +63,7 @@ public class AwsSqsTbCoreQueueFactory implements TbCoreQueueFactory { private final TbQueueRuleEngineSettings ruleEngineSettings; private final TbQueueCoreSettings coreSettings; private final TbQueueTransportApiSettings transportApiSettings; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRemoteJsInvokeSettings jsInvokeSettings; private final TbQueueTransportNotificationSettings transportNotificationSettings; @@ -81,7 +81,7 @@ public class AwsSqsTbCoreQueueFactory implements TbCoreQueueFactory { TbQueueCoreSettings coreSettings, TbQueueTransportApiSettings transportApiSettings, TbQueueRuleEngineSettings ruleEngineSettings, - NotificationsTopicService notificationsTopicService, + TopicService topicService, TbQueueVersionControlSettings vcSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueRemoteJsInvokeSettings jsInvokeSettings, @@ -91,7 +91,7 @@ public class AwsSqsTbCoreQueueFactory implements TbCoreQueueFactory { this.coreSettings = coreSettings; this.transportApiSettings = transportApiSettings; this.ruleEngineSettings = ruleEngineSettings; - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.serviceInfoProvider = serviceInfoProvider; this.jsInvokeSettings = jsInvokeSettings; this.transportNotificationSettings = transportNotificationSettings; @@ -108,51 +108,51 @@ public class AwsSqsTbCoreQueueFactory implements TbCoreQueueFactory { @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, ruleEngineSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToCoreMsgConsumer() { - return new TbAwsSqsConsumerTemplate<>(coreAdmin, sqsSettings, coreSettings.getTopic(), + return new TbAwsSqsConsumerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { return new TbAwsSqsConsumerTemplate<>(notificationAdmin, sqsSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createTransportApiRequestConsumer() { - return new TbAwsSqsConsumerTemplate<>(transportApiAdmin, sqsSettings, transportApiSettings.getRequestsTopic(), + return new TbAwsSqsConsumerTemplate<>(transportApiAdmin, sqsSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiRequestMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createTransportApiResponseProducer() { - return new TbAwsSqsProducerTemplate<>(transportApiAdmin, sqsSettings, transportApiSettings.getResponsesTopic()); + return new TbAwsSqsProducerTemplate<>(transportApiAdmin, sqsSettings, topicService.buildTopicName(transportApiSettings.getResponsesTopic())); } @Override @@ -180,29 +180,29 @@ public class AwsSqsTbCoreQueueFactory implements TbCoreQueueFactory { @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getUsageStatsTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueConsumer> createToUsageStatsServiceMsgConsumer() { - return new TbAwsSqsConsumerTemplate<>(coreAdmin, sqsSettings, coreSettings.getUsageStatsTopic(), + return new TbAwsSqsConsumerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToUsageStatsServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToOtaPackageStateServiceMsgConsumer() { - return new TbAwsSqsConsumerTemplate<>(otaAdmin, sqsSettings, coreSettings.getOtaPackageTopic(), + return new TbAwsSqsConsumerTemplate<>(otaAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbAwsSqsProducerTemplate<>(otaAdmin, sqsSettings, coreSettings.getOtaPackageTopic()); + return new TbAwsSqsProducerTemplate<>(otaAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @Override public TbQueueProducer> createVersionControlMsgProducer() { - return new TbAwsSqsProducerTemplate<>(vcAdmin, sqsSettings, vcSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(vcAdmin, sqsSettings, topicService.buildTopicName(vcSettings.getTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbRuleEngineQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbRuleEngineQueueFactory.java index 9b1f9dba0d..9df4cc5c4a 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbRuleEngineQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbRuleEngineQueueFactory.java @@ -33,7 +33,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings; @@ -52,7 +52,7 @@ import java.nio.charset.StandardCharsets; @ConditionalOnExpression("'${queue.type:null}'=='aws-sqs' && '${service.type:null}'=='tb-rule-engine'") public class AwsSqsTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbQueueCoreSettings coreSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRuleEngineSettings ruleEngineSettings; @@ -66,14 +66,14 @@ public class AwsSqsTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory private final TbQueueAdmin notificationAdmin; private final TbQueueAdmin otaAdmin; - public AwsSqsTbRuleEngineQueueFactory(NotificationsTopicService notificationsTopicService, TbQueueCoreSettings coreSettings, + public AwsSqsTbRuleEngineQueueFactory(TopicService topicService, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, TbServiceInfoProvider serviceInfoProvider, TbAwsSqsSettings sqsSettings, TbAwsSqsQueueAttributes sqsQueueAttributes, TbQueueRemoteJsInvokeSettings jsInvokeSettings, TbQueueTransportNotificationSettings transportNotificationSettings) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.coreSettings = coreSettings; this.serviceInfoProvider = serviceInfoProvider; this.ruleEngineSettings = ruleEngineSettings; @@ -90,39 +90,39 @@ public class AwsSqsTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbAwsSqsProducerTemplate<>(ruleEngineAdmin, sqsSettings, ruleEngineSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(ruleEngineAdmin, sqsSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, ruleEngineSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToRuleEngineMsgConsumer(Queue configuration) { - return new TbAwsSqsConsumerTemplate<>(ruleEngineAdmin, sqsSettings, configuration.getTopic(), + return new TbAwsSqsConsumerTemplate<>(ruleEngineAdmin, sqsSettings, topicService.buildTopicName(configuration.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { return new TbAwsSqsConsumerTemplate<>(notificationAdmin, sqsSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @@ -151,12 +151,12 @@ public class AwsSqsTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getUsageStatsTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbAwsSqsProducerTemplate<>(otaAdmin, sqsSettings, coreSettings.getOtaPackageTopic()); + return new TbAwsSqsProducerTemplate<>(otaAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbVersionControlQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbVersionControlQueueFactory.java index 24453d3c5c..a8f69e6eab 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbVersionControlQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTbVersionControlQueueFactory.java @@ -22,6 +22,7 @@ import org.thingsboard.server.queue.TbQueueAdmin; import org.thingsboard.server.queue.TbQueueConsumer; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueVersionControlSettings; import org.thingsboard.server.queue.sqs.TbAwsSqsAdmin; @@ -39,6 +40,7 @@ public class AwsSqsTbVersionControlQueueFactory implements TbVersionControlQueue private final TbAwsSqsSettings sqsSettings; private final TbQueueCoreSettings coreSettings; private final TbQueueVersionControlSettings vcSettings; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; @@ -48,11 +50,13 @@ public class AwsSqsTbVersionControlQueueFactory implements TbVersionControlQueue public AwsSqsTbVersionControlQueueFactory(TbAwsSqsSettings sqsSettings, TbQueueCoreSettings coreSettings, TbQueueVersionControlSettings vcSettings, - TbAwsSqsQueueAttributes sqsQueueAttributes + TbAwsSqsQueueAttributes sqsQueueAttributes, + TopicService topicService ) { this.sqsSettings = sqsSettings; this.coreSettings = coreSettings; this.vcSettings = vcSettings; + this.topicService = topicService; this.coreAdmin = new TbAwsSqsAdmin(sqsSettings, sqsQueueAttributes.getCoreAttributes()); this.notificationAdmin = new TbAwsSqsAdmin(sqsSettings, sqsQueueAttributes.getNotificationsAttributes()); @@ -61,17 +65,17 @@ public class AwsSqsTbVersionControlQueueFactory implements TbVersionControlQueue @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getUsageStatsTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToVersionControlMsgConsumer() { - return new TbAwsSqsConsumerTemplate<>(vcAdmin, sqsSettings, vcSettings.getTopic(), + return new TbAwsSqsConsumerTemplate<>(vcAdmin, sqsSettings, topicService.buildTopicName(vcSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToVersionControlServiceMsg.parseFrom(msg.getData()), msg.getHeaders()) ); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTransportQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTransportQueueFactory.java index fa16ee9093..4818affc93 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTransportQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/AwsSqsTransportQueueFactory.java @@ -32,6 +32,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings; import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings; @@ -54,6 +55,7 @@ public class AwsSqsTransportQueueFactory implements TbTransportQueueFactory { private final TbQueueCoreSettings coreSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRuleEngineSettings ruleEngineSettings; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; private final TbQueueAdmin transportApiAdmin; @@ -66,13 +68,15 @@ public class AwsSqsTransportQueueFactory implements TbTransportQueueFactory { TbServiceInfoProvider serviceInfoProvider, TbQueueCoreSettings coreSettings, TbAwsSqsQueueAttributes sqsQueueAttributes, - TbQueueRuleEngineSettings ruleEngineSettings) { + TbQueueRuleEngineSettings ruleEngineSettings, + TopicService topicService) { this.transportApiSettings = transportApiSettings; this.transportNotificationSettings = transportNotificationSettings; this.sqsSettings = sqsSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; this.ruleEngineSettings = ruleEngineSettings; + this.topicService = topicService; this.coreAdmin = new TbAwsSqsAdmin(sqsSettings, sqsQueueAttributes.getCoreAttributes()); this.transportApiAdmin = new TbAwsSqsAdmin(sqsSettings, sqsQueueAttributes.getTransportApiAttributes()); @@ -83,11 +87,11 @@ public class AwsSqsTransportQueueFactory implements TbTransportQueueFactory { @Override public TbQueueRequestTemplate, TbProtoQueueMsg> createTransportApiRequestTemplate() { TbQueueProducer> producerTemplate = - new TbAwsSqsProducerTemplate<>(transportApiAdmin, sqsSettings, transportApiSettings.getRequestsTopic()); + new TbAwsSqsProducerTemplate<>(transportApiAdmin, sqsSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic())); TbQueueConsumer> consumerTemplate = new TbAwsSqsConsumerTemplate<>(transportApiAdmin, sqsSettings, - transportApiSettings.getResponsesTopic() + "_" + serviceInfoProvider.getServiceId(), + topicService.buildTopicName(transportApiSettings.getResponsesTopic() + "_" + serviceInfoProvider.getServiceId()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiResponseMsg.parseFrom(msg.getData()), msg.getHeaders())); DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder @@ -103,28 +107,28 @@ public class AwsSqsTransportQueueFactory implements TbTransportQueueFactory { @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbAwsSqsProducerTemplate<>(ruleEngineAdmin, sqsSettings, ruleEngineSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(ruleEngineAdmin, sqsSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, coreSettings.getTopic()); + return new TbAwsSqsProducerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createTransportNotificationsConsumer() { - return new TbAwsSqsConsumerTemplate<>(notificationAdmin, sqsSettings, transportNotificationSettings.getNotificationsTopic() + "_" + serviceInfoProvider.getServiceId(), + return new TbAwsSqsConsumerTemplate<>(notificationAdmin, sqsSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic() + "_" + serviceInfoProvider.getServiceId()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToTransportMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, coreSettings.getUsageStatsTopic()); + return new TbAwsSqsProducerTemplate<>(coreAdmin, sqsSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/InMemoryMonolithQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/InMemoryMonolithQueueFactory.java index 87fc8aa3db..933daac0df 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/InMemoryMonolithQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/InMemoryMonolithQueueFactory.java @@ -28,7 +28,7 @@ import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.memory.InMemoryStorage; import org.thingsboard.server.queue.memory.InMemoryTbQueueConsumer; @@ -44,7 +44,7 @@ import org.thingsboard.server.queue.settings.TbQueueVersionControlSettings; @ConditionalOnExpression("'${queue.type:null}'=='in-memory' && '${service.type:null}'=='monolith'") public class InMemoryMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngineQueueFactory, TbVersionControlQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbQueueCoreSettings coreSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRuleEngineSettings ruleEngineSettings; @@ -53,14 +53,14 @@ public class InMemoryMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE private final TbQueueTransportNotificationSettings transportNotificationSettings; private final InMemoryStorage storage; - public InMemoryMonolithQueueFactory(NotificationsTopicService notificationsTopicService, TbQueueCoreSettings coreSettings, + public InMemoryMonolithQueueFactory(TopicService topicService, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, TbQueueVersionControlSettings vcSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueTransportApiSettings transportApiSettings, TbQueueTransportNotificationSettings transportNotificationSettings, InMemoryStorage storage) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.coreSettings = coreSettings; this.vcSettings = vcSettings; this.serviceInfoProvider = serviceInfoProvider; @@ -72,62 +72,62 @@ public class InMemoryMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, transportNotificationSettings.getNotificationsTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, ruleEngineSettings.getTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, ruleEngineSettings.getTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, coreSettings.getTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, coreSettings.getTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToVersionControlMsgConsumer() { - return new InMemoryTbQueueConsumer<>(storage, vcSettings.getTopic()); + return new InMemoryTbQueueConsumer<>(storage, topicService.buildTopicName(vcSettings.getTopic())); } @Override public TbQueueConsumer> createToRuleEngineMsgConsumer(Queue configuration) { - return new InMemoryTbQueueConsumer<>(storage, configuration.getTopic()); + return new InMemoryTbQueueConsumer<>(storage, topicService.buildTopicName(configuration.getTopic())); } @Override public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { - return new InMemoryTbQueueConsumer<>(storage, notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName()); + return new InMemoryTbQueueConsumer<>(storage, topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName()); } @Override public TbQueueConsumer> createToCoreMsgConsumer() { - return new InMemoryTbQueueConsumer<>(storage, coreSettings.getTopic()); + return new InMemoryTbQueueConsumer<>(storage, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { - return new InMemoryTbQueueConsumer<>(storage, notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName()); + return new InMemoryTbQueueConsumer<>(storage, topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName()); } @Override public TbQueueConsumer> createTransportApiRequestConsumer() { - return new InMemoryTbQueueConsumer<>(storage, transportApiSettings.getRequestsTopic()); + return new InMemoryTbQueueConsumer<>(storage, topicService.buildTopicName(transportApiSettings.getRequestsTopic())); } @Override public TbQueueProducer> createTransportApiResponseProducer() { - return new InMemoryTbQueueProducer<>(storage, transportApiSettings.getResponsesTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(transportApiSettings.getResponsesTopic())); } @Override @@ -137,27 +137,27 @@ public class InMemoryMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE @Override public TbQueueConsumer> createToUsageStatsServiceMsgConsumer() { - return new InMemoryTbQueueConsumer<>(storage, coreSettings.getUsageStatsTopic()); + return new InMemoryTbQueueConsumer<>(storage, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueConsumer> createToOtaPackageStateServiceMsgConsumer() { - return new InMemoryTbQueueConsumer<>(storage, coreSettings.getOtaPackageTopic()); + return new InMemoryTbQueueConsumer<>(storage, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, coreSettings.getOtaPackageTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, coreSettings.getUsageStatsTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createVersionControlMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, vcSettings.getTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(vcSettings.getTopic())); } @Scheduled(fixedRateString = "${queue.in_memory.stats.print-interval-ms:60000}") diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/InMemoryTbTransportQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/InMemoryTbTransportQueueFactory.java index a789816c34..f578079a4f 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/InMemoryTbTransportQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/InMemoryTbTransportQueueFactory.java @@ -32,6 +32,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.memory.InMemoryStorage; import org.thingsboard.server.queue.memory.InMemoryTbQueueConsumer; import org.thingsboard.server.queue.memory.InMemoryTbQueueProducer; @@ -48,26 +49,29 @@ public class InMemoryTbTransportQueueFactory implements TbTransportQueueFactory private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueCoreSettings coreSettings; private final InMemoryStorage storage; + private final TopicService topicService; public InMemoryTbTransportQueueFactory(TbQueueTransportApiSettings transportApiSettings, TbQueueTransportNotificationSettings transportNotificationSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueCoreSettings coreSettings, - InMemoryStorage storage) { + InMemoryStorage storage, + TopicService topicService) { this.transportApiSettings = transportApiSettings; this.transportNotificationSettings = transportNotificationSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; this.storage = storage; + this.topicService = topicService; } @Override public TbQueueRequestTemplate, TbProtoQueueMsg> createTransportApiRequestTemplate() { InMemoryTbQueueProducer> producerTemplate = - new InMemoryTbQueueProducer<>(storage, transportApiSettings.getRequestsTopic()); + new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(transportApiSettings.getRequestsTopic())); InMemoryTbQueueConsumer> consumerTemplate = - new InMemoryTbQueueConsumer<>(storage, transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId()); + new InMemoryTbQueueConsumer<>(storage, topicService.buildTopicName(transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId())); DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder , TbProtoQueueMsg> templateBuilder = DefaultTbQueueRequestTemplate.builder(); @@ -93,27 +97,27 @@ public class InMemoryTbTransportQueueFactory implements TbTransportQueueFactory @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, transportApiSettings.getRequestsTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(transportApiSettings.getRequestsTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, coreSettings.getTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, coreSettings.getTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createTransportNotificationsConsumer() { - return new InMemoryTbQueueConsumer<>(storage, transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId()); + return new InMemoryTbQueueConsumer<>(storage, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new InMemoryTbQueueProducer<>(storage, coreSettings.getUsageStatsTopic()); + return new InMemoryTbQueueProducer<>(storage, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaMonolithQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaMonolithQueueFactory.java index 55050ce08c..0e3721d215 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaMonolithQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaMonolithQueueFactory.java @@ -39,7 +39,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.kafka.TbKafkaAdmin; import org.thingsboard.server.queue.kafka.TbKafkaConsumerStatsService; @@ -62,7 +62,7 @@ import java.util.concurrent.atomic.AtomicLong; @ConditionalOnExpression("'${queue.type:null}'=='kafka' && '${service.type:null}'=='monolith'") public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngineQueueFactory, TbVersionControlQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbKafkaSettings kafkaSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueCoreSettings coreSettings; @@ -85,7 +85,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi private final AtomicLong consumerCount = new AtomicLong(); - public KafkaMonolithQueueFactory(NotificationsTopicService notificationsTopicService, TbKafkaSettings kafkaSettings, + public KafkaMonolithQueueFactory(TopicService topicService, TbKafkaSettings kafkaSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, @@ -95,7 +95,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbQueueVersionControlSettings vcSettings, TbKafkaConsumerStatsService consumerStatsService, TbKafkaTopicConfigs kafkaTopicConfigs) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.kafkaSettings = kafkaSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; @@ -122,7 +122,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("monolith-transport-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(transportNotificationSettings.getNotificationsTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -132,7 +132,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("monolith-rule-engine-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(ruleEngineSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(ruleEngineSettings.getTopic())); requestBuilder.admin(ruleEngineAdmin); return requestBuilder.build(); } @@ -142,7 +142,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("monolith-rule-engine-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(ruleEngineSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(ruleEngineSettings.getTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -152,7 +152,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("monolith-core-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } @@ -162,7 +162,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("monolith-core-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -171,9 +171,9 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi public TbQueueConsumer> createToVersionControlMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(vcSettings.getTopic()); + consumerBuilder.topic(topicService.buildTopicName(vcSettings.getTopic())); consumerBuilder.clientId("monolith-vc-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("monolith-vc-node"); + consumerBuilder.groupId(topicService.buildTopicName("monolith-vc-node")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToVersionControlServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(vcAdmin); consumerBuilder.statsService(consumerStatsService); @@ -185,9 +185,9 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi String queueName = configuration.getName(); TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(configuration.getTopic()); + consumerBuilder.topic(topicService.buildTopicName(configuration.getTopic())); consumerBuilder.clientId("re-" + queueName + "-consumer-" + serviceInfoProvider.getServiceId() + "-" + consumerCount.incrementAndGet()); - consumerBuilder.groupId("re-" + queueName + (configuration.getTenantId().isSysTenantId() ? "" : ("-isolated-" + configuration.getTenantId())) + "-consumer"); + consumerBuilder.groupId(topicService.buildTopicName("re-" + queueName + (configuration.getTenantId().isSysTenantId() ? "" : ("-isolated-" + configuration.getTenantId())) + "-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(ruleEngineAdmin); consumerBuilder.statsService(consumerStatsService); @@ -198,9 +198,9 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName()); + consumerBuilder.topic(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName()); consumerBuilder.clientId("monolith-rule-engine-notifications-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("monolith-rule-engine-notifications-consumer-" + serviceInfoProvider.getServiceId()); + consumerBuilder.groupId(topicService.buildTopicName("monolith-rule-engine-notifications-consumer-" + serviceInfoProvider.getServiceId())); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(notificationAdmin); consumerBuilder.statsService(consumerStatsService); @@ -211,9 +211,9 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi public TbQueueConsumer> createToCoreMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(coreSettings.getTopic()); + consumerBuilder.topic(topicService.buildTopicName(coreSettings.getTopic())); consumerBuilder.clientId("monolith-core-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("monolith-core-consumer"); + consumerBuilder.groupId(topicService.buildTopicName("monolith-core-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(coreAdmin); consumerBuilder.statsService(consumerStatsService); @@ -224,9 +224,9 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName()); + consumerBuilder.topic(topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName()); consumerBuilder.clientId("monolith-core-notifications-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("monolith-core-notifications-consumer-" + serviceInfoProvider.getServiceId()); + consumerBuilder.groupId(topicService.buildTopicName("monolith-core-notifications-consumer-" + serviceInfoProvider.getServiceId())); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(notificationAdmin); consumerBuilder.statsService(consumerStatsService); @@ -237,9 +237,9 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi public TbQueueConsumer> createTransportApiRequestConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(transportApiSettings.getRequestsTopic()); + consumerBuilder.topic(topicService.buildTopicName(transportApiSettings.getRequestsTopic())); consumerBuilder.clientId("monolith-transport-api-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("monolith-transport-api-consumer"); + consumerBuilder.groupId(topicService.buildTopicName("monolith-transport-api-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiRequestMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(transportApiRequestAdmin); consumerBuilder.statsService(consumerStatsService); @@ -251,7 +251,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("monolith-transport-api-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(transportApiSettings.getResponsesTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(transportApiSettings.getResponsesTopic())); requestBuilder.admin(transportApiResponseAdmin); return requestBuilder.build(); } @@ -294,9 +294,9 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi public TbQueueConsumer> createToUsageStatsServiceMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(coreSettings.getUsageStatsTopic()); + consumerBuilder.topic(topicService.buildTopicName(coreSettings.getUsageStatsTopic())); consumerBuilder.clientId("monolith-us-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("monolith-us-consumer"); + consumerBuilder.groupId(topicService.buildTopicName("monolith-us-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToUsageStatsServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(coreAdmin); consumerBuilder.statsService(consumerStatsService); @@ -307,9 +307,9 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi public TbQueueConsumer> createToOtaPackageStateServiceMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(coreSettings.getOtaPackageTopic()); + consumerBuilder.topic(topicService.buildTopicName(coreSettings.getOtaPackageTopic())); consumerBuilder.clientId("monolith-ota-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("monolith-ota-consumer"); + consumerBuilder.groupId(topicService.buildTopicName("monolith-ota-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(fwUpdatesAdmin); consumerBuilder.statsService(consumerStatsService); @@ -321,7 +321,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("monolith-ota-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getOtaPackageTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getOtaPackageTopic())); requestBuilder.admin(fwUpdatesAdmin); return requestBuilder.build(); } @@ -331,7 +331,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("monolith-us-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getUsageStatsTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getUsageStatsTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } @@ -341,7 +341,7 @@ public class KafkaMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngi TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("monolith-vc-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(vcSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(vcSettings.getTopic())); requestBuilder.admin(vcAdmin); return requestBuilder.build(); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbCoreQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbCoreQueueFactory.java index 9c25a5d420..09dd7d8820 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbCoreQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbCoreQueueFactory.java @@ -38,7 +38,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.kafka.TbKafkaAdmin; import org.thingsboard.server.queue.kafka.TbKafkaConsumerStatsService; @@ -60,7 +60,7 @@ import java.nio.charset.StandardCharsets; @ConditionalOnExpression("'${queue.type:null}'=='kafka' && '${service.type:null}'=='tb-core'") public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbKafkaSettings kafkaSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueCoreSettings coreSettings; @@ -81,7 +81,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { private final TbQueueAdmin fwUpdatesAdmin; private final TbQueueAdmin vcAdmin; - public KafkaTbCoreQueueFactory(NotificationsTopicService notificationsTopicService, + public KafkaTbCoreQueueFactory(TopicService topicService, TbKafkaSettings kafkaSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueCoreSettings coreSettings, @@ -92,7 +92,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaConsumerStatsService consumerStatsService, TbQueueTransportNotificationSettings transportNotificationSettings, TbKafkaTopicConfigs kafkaTopicConfigs) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.kafkaSettings = kafkaSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; @@ -119,7 +119,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-core-transport-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(transportNotificationSettings.getNotificationsTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -129,7 +129,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-core-rule-engine-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } @@ -139,7 +139,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-core-rule-engine-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(ruleEngineSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(ruleEngineSettings.getTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -149,7 +149,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-core-to-core-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } @@ -159,7 +159,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-core-to-core-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -168,9 +168,9 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { public TbQueueConsumer> createToCoreMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(coreSettings.getTopic()); + consumerBuilder.topic(topicService.buildTopicName(coreSettings.getTopic())); consumerBuilder.clientId("tb-core-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("tb-core-node"); + consumerBuilder.groupId(topicService.buildTopicName("tb-core-node")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(coreAdmin); consumerBuilder.statsService(consumerStatsService); @@ -181,9 +181,9 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName()); + consumerBuilder.topic(topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName()); consumerBuilder.clientId("tb-core-notifications-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("tb-core-notifications-node-" + serviceInfoProvider.getServiceId()); + consumerBuilder.groupId(topicService.buildTopicName("tb-core-notifications-node-" + serviceInfoProvider.getServiceId())); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(notificationAdmin); consumerBuilder.statsService(consumerStatsService); @@ -194,9 +194,9 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { public TbQueueConsumer> createTransportApiRequestConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(transportApiSettings.getRequestsTopic()); + consumerBuilder.topic(topicService.buildTopicName(transportApiSettings.getRequestsTopic())); consumerBuilder.clientId("tb-core-transport-api-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("tb-core-transport-api-consumer"); + consumerBuilder.groupId(topicService.buildTopicName("tb-core-transport-api-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiRequestMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(transportApiRequestAdmin); consumerBuilder.statsService(consumerStatsService); @@ -208,7 +208,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-core-transport-api-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(transportApiSettings.getResponsesTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(transportApiSettings.getResponsesTopic())); requestBuilder.admin(transportApiResponseAdmin); return requestBuilder.build(); } @@ -251,9 +251,9 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { public TbQueueConsumer> createToUsageStatsServiceMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(coreSettings.getUsageStatsTopic()); + consumerBuilder.topic(topicService.buildTopicName(coreSettings.getUsageStatsTopic())); consumerBuilder.clientId("tb-core-us-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("tb-core-us-consumer"); + consumerBuilder.groupId(topicService.buildTopicName("tb-core-us-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToUsageStatsServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(coreAdmin); consumerBuilder.statsService(consumerStatsService); @@ -264,9 +264,9 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { public TbQueueConsumer> createToOtaPackageStateServiceMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(coreSettings.getOtaPackageTopic()); + consumerBuilder.topic(topicService.buildTopicName(coreSettings.getOtaPackageTopic())); consumerBuilder.clientId("tb-core-ota-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("tb-core-ota-consumer"); + consumerBuilder.groupId(topicService.buildTopicName("tb-core-ota-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(fwUpdatesAdmin); consumerBuilder.statsService(consumerStatsService); @@ -278,7 +278,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-core-ota-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getOtaPackageTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getOtaPackageTopic())); requestBuilder.admin(fwUpdatesAdmin); return requestBuilder.build(); } @@ -288,7 +288,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-core-us-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getUsageStatsTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getUsageStatsTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } @@ -298,7 +298,7 @@ public class KafkaTbCoreQueueFactory implements TbCoreQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-core-vc-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(vcSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(vcSettings.getTopic())); requestBuilder.admin(vcAdmin); return requestBuilder.build(); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbRuleEngineQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbRuleEngineQueueFactory.java index cb063b6a7f..2baaf08640 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbRuleEngineQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbRuleEngineQueueFactory.java @@ -36,7 +36,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.kafka.TbKafkaAdmin; import org.thingsboard.server.queue.kafka.TbKafkaConsumerStatsService; @@ -57,7 +57,7 @@ import java.util.concurrent.atomic.AtomicLong; @ConditionalOnExpression("'${queue.type:null}'=='kafka' && '${service.type:null}'=='tb-rule-engine'") public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbKafkaSettings kafkaSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueCoreSettings coreSettings; @@ -74,7 +74,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { private final TbQueueAdmin fwUpdatesAdmin; private final AtomicLong consumerCount = new AtomicLong(); - public KafkaTbRuleEngineQueueFactory(NotificationsTopicService notificationsTopicService, TbKafkaSettings kafkaSettings, + public KafkaTbRuleEngineQueueFactory(TopicService topicService, TbKafkaSettings kafkaSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, @@ -82,7 +82,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { TbKafkaConsumerStatsService consumerStatsService, TbQueueTransportNotificationSettings transportNotificationSettings, TbKafkaTopicConfigs kafkaTopicConfigs) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.kafkaSettings = kafkaSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; @@ -104,7 +104,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-rule-engine-transport-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(transportNotificationSettings.getNotificationsTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -114,7 +114,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-rule-engine-to-rule-engine-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(ruleEngineSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(ruleEngineSettings.getTopic())); requestBuilder.admin(ruleEngineAdmin); return requestBuilder.build(); } @@ -124,7 +124,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-rule-engine-to-rule-engine-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(ruleEngineSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(ruleEngineSettings.getTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -134,7 +134,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-rule-engine-to-core-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } @@ -144,7 +144,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-rule-engine-ota-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getOtaPackageTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getOtaPackageTopic())); requestBuilder.admin(fwUpdatesAdmin); return requestBuilder.build(); } @@ -154,7 +154,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-rule-engine-to-core-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -164,9 +164,9 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { String queueName = configuration.getName(); TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(configuration.getTopic()); + consumerBuilder.topic(topicService.buildTopicName(configuration.getTopic())); consumerBuilder.clientId("re-" + queueName + "-consumer-" + serviceInfoProvider.getServiceId() + "-" + consumerCount.incrementAndGet()); - consumerBuilder.groupId("re-" + queueName + (configuration.getTenantId().isSysTenantId() ? "" : ("-isolated-" + configuration.getTenantId())) + "-consumer"); + consumerBuilder.groupId(topicService.buildTopicName("re-" + queueName + (configuration.getTenantId().isSysTenantId() ? "" : ("-isolated-" + configuration.getTenantId())) + "-consumer")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(ruleEngineAdmin); consumerBuilder.statsService(consumerStatsService); @@ -177,7 +177,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName()); + consumerBuilder.topic(topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName()); consumerBuilder.clientId("tb-rule-engine-notifications-consumer-" + serviceInfoProvider.getServiceId()); consumerBuilder.groupId("tb-rule-engine-notifications-node-" + serviceInfoProvider.getServiceId()); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); @@ -225,7 +225,7 @@ public class KafkaTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-rule-engine-us-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getUsageStatsTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getUsageStatsTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbTransportQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbTransportQueueFactory.java index 300e0a44b6..11c038a2bc 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbTransportQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbTransportQueueFactory.java @@ -33,6 +33,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.kafka.TbKafkaAdmin; import org.thingsboard.server.queue.kafka.TbKafkaConsumerStatsService; import org.thingsboard.server.queue.kafka.TbKafkaConsumerTemplate; @@ -58,6 +59,7 @@ public class KafkaTbTransportQueueFactory implements TbTransportQueueFactory { private final TbQueueTransportApiSettings transportApiSettings; private final TbQueueTransportNotificationSettings transportNotificationSettings; private final TbKafkaConsumerStatsService consumerStatsService; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; private final TbQueueAdmin ruleEngineAdmin; @@ -72,7 +74,8 @@ public class KafkaTbTransportQueueFactory implements TbTransportQueueFactory { TbQueueTransportApiSettings transportApiSettings, TbQueueTransportNotificationSettings transportNotificationSettings, TbKafkaConsumerStatsService consumerStatsService, - TbKafkaTopicConfigs kafkaTopicConfigs) { + TbKafkaTopicConfigs kafkaTopicConfigs, + TopicService topicService) { this.kafkaSettings = kafkaSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; @@ -80,6 +83,7 @@ public class KafkaTbTransportQueueFactory implements TbTransportQueueFactory { this.transportApiSettings = transportApiSettings; this.transportNotificationSettings = transportNotificationSettings; this.consumerStatsService = consumerStatsService; + this.topicService = topicService; this.coreAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getCoreConfigs()); this.ruleEngineAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getRuleEngineConfigs()); @@ -93,14 +97,14 @@ public class KafkaTbTransportQueueFactory implements TbTransportQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("transport-api-request-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(transportApiSettings.getRequestsTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(transportApiSettings.getRequestsTopic())); requestBuilder.admin(transportApiRequestAdmin); TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> responseBuilder = TbKafkaConsumerTemplate.builder(); responseBuilder.settings(kafkaSettings); - responseBuilder.topic(transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId()); + responseBuilder.topic(topicService.buildTopicName(transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId())); responseBuilder.clientId("transport-api-response-" + serviceInfoProvider.getServiceId()); - responseBuilder.groupId("transport-node-" + serviceInfoProvider.getServiceId()); + responseBuilder.groupId(topicService.buildTopicName("transport-node-" + serviceInfoProvider.getServiceId())); responseBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiResponseMsg.parseFrom(msg.getData()), msg.getHeaders())); responseBuilder.admin(transportApiResponseAdmin); responseBuilder.statsService(consumerStatsService); @@ -121,7 +125,7 @@ public class KafkaTbTransportQueueFactory implements TbTransportQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("transport-node-rule-engine-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(ruleEngineSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(ruleEngineSettings.getTopic())); requestBuilder.admin(ruleEngineAdmin); return requestBuilder.build(); } @@ -131,7 +135,7 @@ public class KafkaTbTransportQueueFactory implements TbTransportQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("transport-node-core-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } @@ -141,7 +145,7 @@ public class KafkaTbTransportQueueFactory implements TbTransportQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("transport-node-to-core-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -150,9 +154,9 @@ public class KafkaTbTransportQueueFactory implements TbTransportQueueFactory { public TbQueueConsumer> createTransportNotificationsConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> responseBuilder = TbKafkaConsumerTemplate.builder(); responseBuilder.settings(kafkaSettings); - responseBuilder.topic(transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId()); + responseBuilder.topic(topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId())); responseBuilder.clientId("transport-api-notifications-" + serviceInfoProvider.getServiceId()); - responseBuilder.groupId("transport-node-" + serviceInfoProvider.getServiceId()); + responseBuilder.groupId(topicService.buildTopicName("transport-node-" + serviceInfoProvider.getServiceId())); responseBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToTransportMsg.parseFrom(msg.getData()), msg.getHeaders())); responseBuilder.admin(notificationAdmin); responseBuilder.statsService(consumerStatsService); @@ -164,7 +168,7 @@ public class KafkaTbTransportQueueFactory implements TbTransportQueueFactory { TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("transport-node-us-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getUsageStatsTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getUsageStatsTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbVersionControlQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbVersionControlQueueFactory.java index d851956420..952c9817a3 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbVersionControlQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/KafkaTbVersionControlQueueFactory.java @@ -25,6 +25,7 @@ import org.thingsboard.server.queue.TbQueueConsumer; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.kafka.TbKafkaAdmin; import org.thingsboard.server.queue.kafka.TbKafkaConsumerStatsService; import org.thingsboard.server.queue.kafka.TbKafkaConsumerTemplate; @@ -45,6 +46,7 @@ public class KafkaTbVersionControlQueueFactory implements TbVersionControlQueueF private final TbQueueCoreSettings coreSettings; private final TbQueueVersionControlSettings vcSettings; private final TbKafkaConsumerStatsService consumerStatsService; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; private final TbQueueAdmin vcAdmin; @@ -55,12 +57,14 @@ public class KafkaTbVersionControlQueueFactory implements TbVersionControlQueueF TbQueueCoreSettings coreSettings, TbQueueVersionControlSettings vcSettings, TbKafkaConsumerStatsService consumerStatsService, - TbKafkaTopicConfigs kafkaTopicConfigs) { + TbKafkaTopicConfigs kafkaTopicConfigs, + TopicService topicService) { this.kafkaSettings = kafkaSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; this.vcSettings = vcSettings; this.consumerStatsService = consumerStatsService; + this.topicService = topicService; this.coreAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getCoreConfigs()); this.vcAdmin = new TbKafkaAdmin(kafkaSettings, kafkaTopicConfigs.getVcConfigs()); @@ -73,7 +77,7 @@ public class KafkaTbVersionControlQueueFactory implements TbVersionControlQueueF TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-vc-to-core-notifications-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getTopic())); requestBuilder.admin(notificationAdmin); return requestBuilder.build(); } @@ -82,9 +86,9 @@ public class KafkaTbVersionControlQueueFactory implements TbVersionControlQueueF public TbQueueConsumer> createToVersionControlMsgConsumer() { TbKafkaConsumerTemplate.TbKafkaConsumerTemplateBuilder> consumerBuilder = TbKafkaConsumerTemplate.builder(); consumerBuilder.settings(kafkaSettings); - consumerBuilder.topic(vcSettings.getTopic()); + consumerBuilder.topic(topicService.buildTopicName(vcSettings.getTopic())); consumerBuilder.clientId("tb-vc-consumer-" + serviceInfoProvider.getServiceId()); - consumerBuilder.groupId("tb-vc-node"); + consumerBuilder.groupId(topicService.buildTopicName("tb-vc-node")); consumerBuilder.decoder(msg -> new TbProtoQueueMsg<>(msg.getKey(), ToVersionControlServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); consumerBuilder.admin(vcAdmin); consumerBuilder.statsService(consumerStatsService); @@ -96,7 +100,7 @@ public class KafkaTbVersionControlQueueFactory implements TbVersionControlQueueF TbKafkaProducerTemplate.TbKafkaProducerTemplateBuilder> requestBuilder = TbKafkaProducerTemplate.builder(); requestBuilder.settings(kafkaSettings); requestBuilder.clientId("tb-vc-us-producer-" + serviceInfoProvider.getServiceId()); - requestBuilder.defaultTopic(coreSettings.getUsageStatsTopic()); + requestBuilder.defaultTopic(topicService.buildTopicName(coreSettings.getUsageStatsTopic())); requestBuilder.admin(coreAdmin); return requestBuilder.build(); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubMonolithQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubMonolithQueueFactory.java index 857641098c..554d452556 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubMonolithQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubMonolithQueueFactory.java @@ -40,7 +40,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.pubsub.TbPubSubAdmin; import org.thingsboard.server.queue.pubsub.TbPubSubConsumerTemplate; @@ -66,7 +66,7 @@ public class PubSubMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng private final TbQueueRuleEngineSettings ruleEngineSettings; private final TbQueueTransportApiSettings transportApiSettings; private final TbQueueTransportNotificationSettings transportNotificationSettings; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRemoteJsInvokeSettings jsInvokeSettings; private final TbQueueVersionControlSettings vcSettings; @@ -83,7 +83,7 @@ public class PubSubMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng TbQueueRuleEngineSettings ruleEngineSettings, TbQueueTransportApiSettings transportApiSettings, TbQueueTransportNotificationSettings transportNotificationSettings, - NotificationsTopicService notificationsTopicService, + TopicService topicService, TbServiceInfoProvider serviceInfoProvider, TbPubSubSubscriptionSettings pubSubSubscriptionSettings, TbQueueRemoteJsInvokeSettings jsInvokeSettings, @@ -93,7 +93,7 @@ public class PubSubMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng this.ruleEngineSettings = ruleEngineSettings; this.transportApiSettings = transportApiSettings; this.transportNotificationSettings = transportNotificationSettings; - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.serviceInfoProvider = serviceInfoProvider; this.vcSettings = vcSettings; @@ -149,7 +149,7 @@ public class PubSubMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng @Override public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { return new TbPubSubConsumerTemplate<>(notificationAdmin, pubSubSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @@ -162,7 +162,7 @@ public class PubSubMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEng @Override public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { return new TbPubSubConsumerTemplate<>(notificationAdmin, pubSubSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbCoreQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbCoreQueueFactory.java index f197082829..3b45992e25 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbCoreQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbCoreQueueFactory.java @@ -38,7 +38,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.pubsub.TbPubSubAdmin; import org.thingsboard.server.queue.pubsub.TbPubSubConsumerTemplate; @@ -61,7 +61,7 @@ public class PubSubTbCoreQueueFactory implements TbCoreQueueFactory { private final TbPubSubSettings pubSubSettings; private final TbQueueCoreSettings coreSettings; private final TbQueueTransportApiSettings transportApiSettings; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRemoteJsInvokeSettings jsInvokeSettings; private final TbQueueTransportNotificationSettings transportNotificationSettings; @@ -76,7 +76,7 @@ public class PubSubTbCoreQueueFactory implements TbCoreQueueFactory { public PubSubTbCoreQueueFactory(TbPubSubSettings pubSubSettings, TbQueueCoreSettings coreSettings, TbQueueTransportApiSettings transportApiSettings, - NotificationsTopicService notificationsTopicService, + TopicService topicService, TbServiceInfoProvider serviceInfoProvider, TbQueueRemoteJsInvokeSettings jsInvokeSettings, TbQueueTransportNotificationSettings transportNotificationSettings, @@ -85,7 +85,7 @@ public class PubSubTbCoreQueueFactory implements TbCoreQueueFactory { this.pubSubSettings = pubSubSettings; this.coreSettings = coreSettings; this.transportApiSettings = transportApiSettings; - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.serviceInfoProvider = serviceInfoProvider; this.jsInvokeSettings = jsInvokeSettings; this.transportNotificationSettings = transportNotificationSettings; @@ -132,7 +132,7 @@ public class PubSubTbCoreQueueFactory implements TbCoreQueueFactory { @Override public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { return new TbPubSubConsumerTemplate<>(notificationAdmin, pubSubSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbRuleEngineQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbRuleEngineQueueFactory.java index 9766bf9915..a60f77852f 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbRuleEngineQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbRuleEngineQueueFactory.java @@ -36,7 +36,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.pubsub.TbPubSubAdmin; import org.thingsboard.server.queue.pubsub.TbPubSubConsumerTemplate; @@ -58,7 +58,7 @@ public class PubSubTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory private final TbPubSubSettings pubSubSettings; private final TbQueueCoreSettings coreSettings; private final TbQueueRuleEngineSettings ruleEngineSettings; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRemoteJsInvokeSettings jsInvokeSettings; private final TbQueueTransportNotificationSettings transportNotificationSettings; @@ -71,7 +71,7 @@ public class PubSubTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory public PubSubTbRuleEngineQueueFactory(TbPubSubSettings pubSubSettings, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, - NotificationsTopicService notificationsTopicService, + TopicService topicService, TbServiceInfoProvider serviceInfoProvider, TbQueueRemoteJsInvokeSettings jsInvokeSettings, TbQueueTransportNotificationSettings transportNotificationSettings, @@ -79,7 +79,7 @@ public class PubSubTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory this.pubSubSettings = pubSubSettings; this.coreSettings = coreSettings; this.ruleEngineSettings = ruleEngineSettings; - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.serviceInfoProvider = serviceInfoProvider; this.jsInvokeSettings = jsInvokeSettings; this.transportNotificationSettings = transportNotificationSettings; @@ -92,39 +92,39 @@ public class PubSubTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbPubSubProducerTemplate<>(ruleEngineAdmin, pubSubSettings, ruleEngineSettings.getTopic()); + return new TbPubSubProducerTemplate<>(ruleEngineAdmin, pubSubSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, ruleEngineSettings.getTopic()); + return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getTopic()); + return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, coreSettings.getTopic()); + return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToRuleEngineMsgConsumer(Queue configuration) { - return new TbPubSubConsumerTemplate<>(ruleEngineAdmin, pubSubSettings, configuration.getTopic(), + return new TbPubSubConsumerTemplate<>(ruleEngineAdmin, pubSubSettings, topicService.buildTopicName(configuration.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { return new TbPubSubConsumerTemplate<>(notificationAdmin, pubSubSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @@ -153,12 +153,12 @@ public class PubSubTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getUsageStatsTopic()); + return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getOtaPackageTopic()); + return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbVersionControlQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbVersionControlQueueFactory.java index 57db7b884c..8154d04d6d 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbVersionControlQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTbVersionControlQueueFactory.java @@ -22,6 +22,7 @@ import org.thingsboard.server.queue.TbQueueAdmin; import org.thingsboard.server.queue.TbQueueConsumer; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.pubsub.TbPubSubAdmin; import org.thingsboard.server.queue.pubsub.TbPubSubConsumerTemplate; import org.thingsboard.server.queue.pubsub.TbPubSubProducerTemplate; @@ -39,6 +40,7 @@ public class PubSubTbVersionControlQueueFactory implements TbVersionControlQueue private final TbPubSubSettings pubSubSettings; private final TbQueueCoreSettings coreSettings; private final TbQueueVersionControlSettings vcSettings; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; private final TbQueueAdmin notificationAdmin; @@ -47,11 +49,13 @@ public class PubSubTbVersionControlQueueFactory implements TbVersionControlQueue public PubSubTbVersionControlQueueFactory(TbPubSubSettings pubSubSettings, TbQueueCoreSettings coreSettings, TbQueueVersionControlSettings vcSettings, - TbPubSubSubscriptionSettings pubSubSubscriptionSettings + TbPubSubSubscriptionSettings pubSubSubscriptionSettings, + TopicService topicService ) { this.pubSubSettings = pubSubSettings; this.coreSettings = coreSettings; this.vcSettings = vcSettings; + this.topicService = topicService; this.coreAdmin = new TbPubSubAdmin(pubSubSettings, pubSubSubscriptionSettings.getCoreSettings()); this.notificationAdmin = new TbPubSubAdmin(pubSubSettings, pubSubSubscriptionSettings.getNotificationsSettings()); @@ -60,17 +64,17 @@ public class PubSubTbVersionControlQueueFactory implements TbVersionControlQueue @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getUsageStatsTopic()); + return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, coreSettings.getTopic()); + return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToVersionControlMsgConsumer() { - return new TbPubSubConsumerTemplate<>(vcAdmin, pubSubSettings, vcSettings.getTopic(), + return new TbPubSubConsumerTemplate<>(vcAdmin, pubSubSettings, topicService.buildTopicName(vcSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToVersionControlServiceMsg.parseFrom(msg.getData()), msg.getHeaders()) ); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTransportQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTransportQueueFactory.java index 5cafaa4c48..edcad873c4 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTransportQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/PubSubTransportQueueFactory.java @@ -33,6 +33,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.pubsub.TbPubSubAdmin; import org.thingsboard.server.queue.pubsub.TbPubSubConsumerTemplate; import org.thingsboard.server.queue.pubsub.TbPubSubProducerTemplate; @@ -56,6 +57,7 @@ public class PubSubTransportQueueFactory implements TbTransportQueueFactory { private final TbQueueRuleEngineSettings ruleEngineSettings; private final TbQueueTransportApiSettings transportApiSettings; private final TbQueueTransportNotificationSettings transportNotificationSettings; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; private final TbQueueAdmin ruleEngineAdmin; @@ -68,13 +70,15 @@ public class PubSubTransportQueueFactory implements TbTransportQueueFactory { TbQueueRuleEngineSettings ruleEngineSettings, TbQueueTransportApiSettings transportApiSettings, TbQueueTransportNotificationSettings transportNotificationSettings, - TbPubSubSubscriptionSettings pubSubSubscriptionSettings) { + TbPubSubSubscriptionSettings pubSubSubscriptionSettings, + TopicService topicService) { this.pubSubSettings = pubSubSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; this.ruleEngineSettings = ruleEngineSettings; this.transportApiSettings = transportApiSettings; this.transportNotificationSettings = transportNotificationSettings; + this.topicService = topicService; this.coreAdmin = new TbPubSubAdmin(pubSubSettings, pubSubSubscriptionSettings.getCoreSettings()); this.ruleEngineAdmin = new TbPubSubAdmin(pubSubSettings, pubSubSubscriptionSettings.getRuleEngineSettings()); @@ -84,9 +88,9 @@ public class PubSubTransportQueueFactory implements TbTransportQueueFactory { @Override public TbQueueRequestTemplate, TbProtoQueueMsg> createTransportApiRequestTemplate() { - TbQueueProducer> producer = new TbPubSubProducerTemplate<>(transportApiAdmin, pubSubSettings, transportApiSettings.getRequestsTopic()); + TbQueueProducer> producer = new TbPubSubProducerTemplate<>(transportApiAdmin, pubSubSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic())); TbQueueConsumer> consumer = new TbPubSubConsumerTemplate<>(transportApiAdmin, pubSubSettings, - transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId(), + topicService.buildTopicName(transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiResponseMsg.parseFrom(msg.getData()), msg.getHeaders())); DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder @@ -102,29 +106,29 @@ public class PubSubTransportQueueFactory implements TbTransportQueueFactory { @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbPubSubProducerTemplate<>(ruleEngineAdmin, pubSubSettings, ruleEngineSettings.getTopic()); + return new TbPubSubProducerTemplate<>(ruleEngineAdmin, pubSubSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getTopic()); + return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, coreSettings.getTopic()); + return new TbPubSubProducerTemplate<>(notificationAdmin, pubSubSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createTransportNotificationsConsumer() { return new TbPubSubConsumerTemplate<>(notificationAdmin, pubSubSettings, - transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId(), + topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToTransportMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, coreSettings.getUsageStatsTopic()); + return new TbPubSubProducerTemplate<>(coreAdmin, pubSubSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqMonolithQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqMonolithQueueFactory.java index 0318b5d06f..7e9833f56b 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqMonolithQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqMonolithQueueFactory.java @@ -40,7 +40,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqAdmin; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqConsumerTemplate; @@ -61,7 +61,7 @@ import java.nio.charset.StandardCharsets; @ConditionalOnExpression("'${queue.type:null}'=='rabbitmq' && '${service.type:null}'=='monolith'") public class RabbitMqMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngineQueueFactory, TbVersionControlQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbQueueCoreSettings coreSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRuleEngineSettings ruleEngineSettings; @@ -78,7 +78,7 @@ public class RabbitMqMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE private final TbQueueAdmin notificationAdmin; private final TbQueueAdmin vcAdmin; - public RabbitMqMonolithQueueFactory(NotificationsTopicService notificationsTopicService, TbQueueCoreSettings coreSettings, + public RabbitMqMonolithQueueFactory(TopicService topicService, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueTransportApiSettings transportApiSettings, @@ -87,7 +87,7 @@ public class RabbitMqMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE TbRabbitMqQueueArguments queueArguments, TbQueueRemoteJsInvokeSettings jsInvokeSettings, TbQueueVersionControlSettings vcSettings) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.coreSettings = coreSettings; this.serviceInfoProvider = serviceInfoProvider; this.ruleEngineSettings = ruleEngineSettings; @@ -107,71 +107,71 @@ public class RabbitMqMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbRabbitMqProducerTemplate<>(ruleEngineAdmin, rabbitMqSettings, ruleEngineSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(ruleEngineAdmin, rabbitMqSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, ruleEngineSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToVersionControlMsgConsumer() { - return new TbRabbitMqConsumerTemplate<>(vcAdmin, rabbitMqSettings, vcSettings.getTopic(), + return new TbRabbitMqConsumerTemplate<>(vcAdmin, rabbitMqSettings, topicService.buildTopicName(vcSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToVersionControlServiceMsg.parseFrom(msg.getData()), msg.getHeaders()) ); } @Override public TbQueueConsumer> createToRuleEngineMsgConsumer(Queue configuration) { - return new TbRabbitMqConsumerTemplate<>(ruleEngineAdmin, rabbitMqSettings, configuration.getTopic(), + return new TbRabbitMqConsumerTemplate<>(ruleEngineAdmin, rabbitMqSettings, topicService.buildTopicName(configuration.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { return new TbRabbitMqConsumerTemplate<>(notificationAdmin, rabbitMqSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToCoreMsgConsumer() { - return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getTopic(), + return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { return new TbRabbitMqConsumerTemplate<>(notificationAdmin, rabbitMqSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createTransportApiRequestConsumer() { - return new TbRabbitMqConsumerTemplate<>(transportApiAdmin, rabbitMqSettings, transportApiSettings.getRequestsTopic(), + return new TbRabbitMqConsumerTemplate<>(transportApiAdmin, rabbitMqSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiRequestMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createTransportApiResponseProducer() { - return new TbRabbitMqProducerTemplate<>(transportApiAdmin, rabbitMqSettings, transportApiSettings.getResponsesTopic()); + return new TbRabbitMqProducerTemplate<>(transportApiAdmin, rabbitMqSettings, topicService.buildTopicName(transportApiSettings.getResponsesTopic())); } @Override @@ -199,29 +199,29 @@ public class RabbitMqMonolithQueueFactory implements TbCoreQueueFactory, TbRuleE @Override public TbQueueConsumer> createToUsageStatsServiceMsgConsumer() { - return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getUsageStatsTopic(), + return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToUsageStatsServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToOtaPackageStateServiceMsgConsumer() { - return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getOtaPackageTopic(), + return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getOtaPackageTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getUsageStatsTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createVersionControlMsgProducer() { - return new TbRabbitMqProducerTemplate<>(vcAdmin, rabbitMqSettings, vcSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(vcAdmin, rabbitMqSettings, topicService.buildTopicName(vcSettings.getTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbCoreQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbCoreQueueFactory.java index 45f5a92980..8311560207 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbCoreQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbCoreQueueFactory.java @@ -38,7 +38,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqAdmin; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqConsumerTemplate; @@ -62,7 +62,7 @@ public class RabbitMqTbCoreQueueFactory implements TbCoreQueueFactory { private final TbQueueRuleEngineSettings ruleEngineSettings; private final TbQueueCoreSettings coreSettings; private final TbQueueTransportApiSettings transportApiSettings; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRemoteJsInvokeSettings jsInvokeSettings; private final TbQueueTransportNotificationSettings transportNotificationSettings; @@ -77,7 +77,7 @@ public class RabbitMqTbCoreQueueFactory implements TbCoreQueueFactory { TbQueueCoreSettings coreSettings, TbQueueTransportApiSettings transportApiSettings, TbQueueRuleEngineSettings ruleEngineSettings, - NotificationsTopicService notificationsTopicService, + TopicService topicService, TbServiceInfoProvider serviceInfoProvider, TbQueueRemoteJsInvokeSettings jsInvokeSettings, TbQueueTransportNotificationSettings transportNotificationSettings, @@ -86,7 +86,7 @@ public class RabbitMqTbCoreQueueFactory implements TbCoreQueueFactory { this.coreSettings = coreSettings; this.transportApiSettings = transportApiSettings; this.ruleEngineSettings = ruleEngineSettings; - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.serviceInfoProvider = serviceInfoProvider; this.jsInvokeSettings = jsInvokeSettings; this.transportNotificationSettings = transportNotificationSettings; @@ -100,51 +100,51 @@ public class RabbitMqTbCoreQueueFactory implements TbCoreQueueFactory { @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, ruleEngineSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToCoreMsgConsumer() { - return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getTopic(), + return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { return new TbRabbitMqConsumerTemplate<>(notificationAdmin, rabbitMqSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createTransportApiRequestConsumer() { - return new TbRabbitMqConsumerTemplate<>(transportApiAdmin, rabbitMqSettings, transportApiSettings.getRequestsTopic(), + return new TbRabbitMqConsumerTemplate<>(transportApiAdmin, rabbitMqSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiRequestMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createTransportApiResponseProducer() { - return new TbRabbitMqProducerTemplate<>(transportApiAdmin, rabbitMqSettings, transportApiSettings.getResponsesTopic()); + return new TbRabbitMqProducerTemplate<>(transportApiAdmin, rabbitMqSettings, topicService.buildTopicName(transportApiSettings.getResponsesTopic())); } @Override @@ -178,24 +178,24 @@ public class RabbitMqTbCoreQueueFactory implements TbCoreQueueFactory { @Override public TbQueueConsumer> createToUsageStatsServiceMsgConsumer() { - return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getUsageStatsTopic(), + return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToUsageStatsServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToOtaPackageStateServiceMsgConsumer() { - return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getOtaPackageTopic(), + return new TbRabbitMqConsumerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getOtaPackageTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getUsageStatsTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbRuleEngineQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbRuleEngineQueueFactory.java index 37633ced95..ae8a879782 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbRuleEngineQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbRuleEngineQueueFactory.java @@ -36,7 +36,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqAdmin; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqConsumerTemplate; @@ -55,7 +55,7 @@ import java.nio.charset.StandardCharsets; @ConditionalOnExpression("'${queue.type:null}'=='rabbitmq' && '${service.type:null}'=='tb-rule-engine'") public class RabbitMqTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbQueueCoreSettings coreSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRuleEngineSettings ruleEngineSettings; @@ -68,14 +68,14 @@ public class RabbitMqTbRuleEngineQueueFactory implements TbRuleEngineQueueFactor private final TbQueueAdmin jsExecutorAdmin; private final TbQueueAdmin notificationAdmin; - public RabbitMqTbRuleEngineQueueFactory(NotificationsTopicService notificationsTopicService, TbQueueCoreSettings coreSettings, + public RabbitMqTbRuleEngineQueueFactory(TopicService topicService, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, TbServiceInfoProvider serviceInfoProvider, TbRabbitMqSettings rabbitMqSettings, TbQueueRemoteJsInvokeSettings jsInvokeSettings, TbQueueTransportNotificationSettings transportNotificationSettings, TbRabbitMqQueueArguments queueArguments) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.coreSettings = coreSettings; this.serviceInfoProvider = serviceInfoProvider; this.ruleEngineSettings = ruleEngineSettings; @@ -91,39 +91,39 @@ public class RabbitMqTbRuleEngineQueueFactory implements TbRuleEngineQueueFactor @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbRabbitMqProducerTemplate<>(ruleEngineAdmin, rabbitMqSettings, ruleEngineSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(ruleEngineAdmin, rabbitMqSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, ruleEngineSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToRuleEngineMsgConsumer(Queue configuration) { - return new TbRabbitMqConsumerTemplate<>(ruleEngineAdmin, rabbitMqSettings, configuration.getTopic(), + return new TbRabbitMqConsumerTemplate<>(ruleEngineAdmin, rabbitMqSettings, topicService.buildTopicName(configuration.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { return new TbRabbitMqConsumerTemplate<>(notificationAdmin, rabbitMqSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @@ -152,12 +152,12 @@ public class RabbitMqTbRuleEngineQueueFactory implements TbRuleEngineQueueFactor @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getUsageStatsTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getOtaPackageTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbVersionControlQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbVersionControlQueueFactory.java index ed1da6a302..d32865a05c 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbVersionControlQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTbVersionControlQueueFactory.java @@ -22,6 +22,7 @@ import org.thingsboard.server.queue.TbQueueAdmin; import org.thingsboard.server.queue.TbQueueConsumer; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqAdmin; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqConsumerTemplate; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqProducerTemplate; @@ -39,6 +40,7 @@ public class RabbitMqTbVersionControlQueueFactory implements TbVersionControlQue private final TbRabbitMqSettings rabbitMqSettings; private final TbQueueCoreSettings coreSettings; private final TbQueueVersionControlSettings vcSettings; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; private final TbQueueAdmin notificationAdmin; @@ -47,11 +49,13 @@ public class RabbitMqTbVersionControlQueueFactory implements TbVersionControlQue public RabbitMqTbVersionControlQueueFactory(TbRabbitMqSettings rabbitMqSettings, TbQueueCoreSettings coreSettings, TbQueueVersionControlSettings vcSettings, - TbRabbitMqQueueArguments queueArguments + TbRabbitMqQueueArguments queueArguments, + TopicService topicService ) { this.rabbitMqSettings = rabbitMqSettings; this.coreSettings = coreSettings; this.vcSettings = vcSettings; + this.topicService = topicService; this.coreAdmin = new TbRabbitMqAdmin(this.rabbitMqSettings, queueArguments.getCoreArgs()); this.notificationAdmin = new TbRabbitMqAdmin(this.rabbitMqSettings, queueArguments.getNotificationsArgs()); @@ -60,17 +64,17 @@ public class RabbitMqTbVersionControlQueueFactory implements TbVersionControlQue @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getUsageStatsTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToVersionControlMsgConsumer() { - return new TbRabbitMqConsumerTemplate<>(vcAdmin, rabbitMqSettings, vcSettings.getTopic(), + return new TbRabbitMqConsumerTemplate<>(vcAdmin, rabbitMqSettings, topicService.buildTopicName(vcSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToVersionControlServiceMsg.parseFrom(msg.getData()), msg.getHeaders()) ); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTransportQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTransportQueueFactory.java index bcbd60a14e..1af28b629b 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTransportQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/RabbitMqTransportQueueFactory.java @@ -33,6 +33,7 @@ import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqAdmin; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqConsumerTemplate; import org.thingsboard.server.queue.rabbitmq.TbRabbitMqProducerTemplate; @@ -55,6 +56,7 @@ public class RabbitMqTransportQueueFactory implements TbTransportQueueFactory { private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueCoreSettings coreSettings; private final TbQueueRuleEngineSettings ruleEngineSettings; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; private final TbQueueAdmin ruleEngineAdmin; @@ -67,13 +69,15 @@ public class RabbitMqTransportQueueFactory implements TbTransportQueueFactory { TbServiceInfoProvider serviceInfoProvider, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, - TbRabbitMqQueueArguments queueArguments) { + TbRabbitMqQueueArguments queueArguments, + TopicService topicService) { this.transportApiSettings = transportApiSettings; this.transportNotificationSettings = transportNotificationSettings; this.rabbitMqSettings = rabbitMqSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; this.ruleEngineSettings = ruleEngineSettings; + this.topicService = topicService; this.coreAdmin = new TbRabbitMqAdmin(rabbitMqSettings, queueArguments.getCoreArgs()); this.ruleEngineAdmin = new TbRabbitMqAdmin(rabbitMqSettings, queueArguments.getRuleEngineArgs()); @@ -84,11 +88,11 @@ public class RabbitMqTransportQueueFactory implements TbTransportQueueFactory { @Override public TbQueueRequestTemplate, TbProtoQueueMsg> createTransportApiRequestTemplate() { TbQueueProducer> producerTemplate = - new TbRabbitMqProducerTemplate<>(transportApiAdmin, rabbitMqSettings, transportApiSettings.getRequestsTopic()); + new TbRabbitMqProducerTemplate<>(transportApiAdmin, rabbitMqSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic())); TbQueueConsumer> consumerTemplate = new TbRabbitMqConsumerTemplate<>(transportApiAdmin, rabbitMqSettings, - transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId(), + topicService.buildTopicName(transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiResponseMsg.parseFrom(msg.getData()), msg.getHeaders())); DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder @@ -104,28 +108,28 @@ public class RabbitMqTransportQueueFactory implements TbTransportQueueFactory { @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbRabbitMqProducerTemplate<>(ruleEngineAdmin, rabbitMqSettings, ruleEngineSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(ruleEngineAdmin, rabbitMqSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, coreSettings.getTopic()); + return new TbRabbitMqProducerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createTransportNotificationsConsumer() { - return new TbRabbitMqConsumerTemplate<>(notificationAdmin, rabbitMqSettings, transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId(), + return new TbRabbitMqConsumerTemplate<>(notificationAdmin, rabbitMqSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToTransportMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, coreSettings.getUsageStatsTopic()); + return new TbRabbitMqProducerTemplate<>(coreAdmin, rabbitMqSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusMonolithQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusMonolithQueueFactory.java index 950e49dc93..6f2dbdc72f 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusMonolithQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusMonolithQueueFactory.java @@ -44,7 +44,7 @@ import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings; @@ -60,7 +60,7 @@ import java.nio.charset.StandardCharsets; @ConditionalOnExpression("'${queue.type:null}'=='service-bus' && '${service.type:null}'=='monolith'") public class ServiceBusMonolithQueueFactory implements TbCoreQueueFactory, TbRuleEngineQueueFactory, TbVersionControlQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbQueueCoreSettings coreSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRuleEngineSettings ruleEngineSettings; @@ -77,7 +77,7 @@ public class ServiceBusMonolithQueueFactory implements TbCoreQueueFactory, TbRul private final TbQueueAdmin notificationAdmin; private final TbQueueAdmin vcAdmin; - public ServiceBusMonolithQueueFactory(NotificationsTopicService notificationsTopicService, TbQueueCoreSettings coreSettings, + public ServiceBusMonolithQueueFactory(TopicService topicService, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueTransportApiSettings transportApiSettings, @@ -86,7 +86,7 @@ public class ServiceBusMonolithQueueFactory implements TbCoreQueueFactory, TbRul TbQueueRemoteJsInvokeSettings jsInvokeSettings, TbQueueVersionControlSettings vcSettings, TbServiceBusQueueConfigs serviceBusQueueConfigs) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.coreSettings = coreSettings; this.serviceInfoProvider = serviceInfoProvider; this.ruleEngineSettings = ruleEngineSettings; @@ -106,32 +106,32 @@ public class ServiceBusMonolithQueueFactory implements TbCoreQueueFactory, TbRul @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbServiceBusProducerTemplate<>(ruleEngineAdmin, serviceBusSettings, ruleEngineSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(ruleEngineAdmin, serviceBusSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, ruleEngineSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToVersionControlMsgConsumer() { - return new TbServiceBusConsumerTemplate<>(vcAdmin, serviceBusSettings, vcSettings.getTopic(), + return new TbServiceBusConsumerTemplate<>(vcAdmin, serviceBusSettings, topicService.buildTopicName(vcSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToVersionControlServiceMsg.parseFrom(msg.getData()), msg.getHeaders()) ); } @@ -145,32 +145,32 @@ public class ServiceBusMonolithQueueFactory implements TbCoreQueueFactory, TbRul @Override public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { return new TbServiceBusConsumerTemplate<>(notificationAdmin, serviceBusSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToCoreMsgConsumer() { - return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getTopic(), + return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { return new TbServiceBusConsumerTemplate<>(notificationAdmin, serviceBusSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createTransportApiRequestConsumer() { - return new TbServiceBusConsumerTemplate<>(transportApiAdmin, serviceBusSettings, transportApiSettings.getRequestsTopic(), + return new TbServiceBusConsumerTemplate<>(transportApiAdmin, serviceBusSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiRequestMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createTransportApiResponseProducer() { - return new TbServiceBusProducerTemplate<>(transportApiAdmin, serviceBusSettings, transportApiSettings.getResponsesTopic()); + return new TbServiceBusProducerTemplate<>(transportApiAdmin, serviceBusSettings, topicService.buildTopicName(transportApiSettings.getResponsesTopic())); } @Override @@ -198,29 +198,29 @@ public class ServiceBusMonolithQueueFactory implements TbCoreQueueFactory, TbRul @Override public TbQueueConsumer> createToUsageStatsServiceMsgConsumer() { - return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getUsageStatsTopic(), + return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToUsageStatsServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToOtaPackageStateServiceMsgConsumer() { - return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getOtaPackageTopic(), + return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getOtaPackageTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getUsageStatsTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createVersionControlMsgProducer() { - return new TbServiceBusProducerTemplate<>(vcAdmin, serviceBusSettings, vcSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(vcAdmin, serviceBusSettings, topicService.buildTopicName(vcSettings.getTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbCoreQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbCoreQueueFactory.java index b92629633d..c86efee599 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbCoreQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbCoreQueueFactory.java @@ -43,7 +43,7 @@ import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings; @@ -62,7 +62,7 @@ public class ServiceBusTbCoreQueueFactory implements TbCoreQueueFactory { private final TbQueueRuleEngineSettings ruleEngineSettings; private final TbQueueCoreSettings coreSettings; private final TbQueueTransportApiSettings transportApiSettings; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRemoteJsInvokeSettings jsInvokeSettings; private final TbQueueTransportNotificationSettings transportNotificationSettings; @@ -77,7 +77,7 @@ public class ServiceBusTbCoreQueueFactory implements TbCoreQueueFactory { TbQueueCoreSettings coreSettings, TbQueueTransportApiSettings transportApiSettings, TbQueueRuleEngineSettings ruleEngineSettings, - NotificationsTopicService notificationsTopicService, + TopicService topicService, TbServiceInfoProvider serviceInfoProvider, TbQueueRemoteJsInvokeSettings jsInvokeSettings, TbQueueTransportNotificationSettings transportNotificationSettings, @@ -86,7 +86,7 @@ public class ServiceBusTbCoreQueueFactory implements TbCoreQueueFactory { this.coreSettings = coreSettings; this.transportApiSettings = transportApiSettings; this.ruleEngineSettings = ruleEngineSettings; - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.serviceInfoProvider = serviceInfoProvider; this.jsInvokeSettings = jsInvokeSettings; this.transportNotificationSettings = transportNotificationSettings; @@ -100,51 +100,51 @@ public class ServiceBusTbCoreQueueFactory implements TbCoreQueueFactory { @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, ruleEngineSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToCoreMsgConsumer() { - return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getTopic(), + return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToCoreNotificationsMsgConsumer() { return new TbServiceBusConsumerTemplate<>(notificationAdmin, serviceBusSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_CORE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToCoreNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createTransportApiRequestConsumer() { - return new TbServiceBusConsumerTemplate<>(transportApiAdmin, serviceBusSettings, transportApiSettings.getRequestsTopic(), + return new TbServiceBusConsumerTemplate<>(transportApiAdmin, serviceBusSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiRequestMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createTransportApiResponseProducer() { - return new TbServiceBusProducerTemplate<>(transportApiAdmin, serviceBusSettings, transportApiSettings.getResponsesTopic()); + return new TbServiceBusProducerTemplate<>(transportApiAdmin, serviceBusSettings, topicService.buildTopicName(transportApiSettings.getResponsesTopic())); } @Override @@ -172,24 +172,24 @@ public class ServiceBusTbCoreQueueFactory implements TbCoreQueueFactory { @Override public TbQueueConsumer> createToUsageStatsServiceMsgConsumer() { - return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getUsageStatsTopic(), + return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToUsageStatsServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToOtaPackageStateServiceMsgConsumer() { - return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getOtaPackageTopic(), + return new TbServiceBusConsumerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToOtaPackageStateServiceMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getOtaPackageTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getUsageStatsTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbRuleEngineQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbRuleEngineQueueFactory.java index a1571becc7..28e26ac080 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbRuleEngineQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbRuleEngineQueueFactory.java @@ -41,7 +41,7 @@ import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoJsQueueMsg; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueRemoteJsInvokeSettings; @@ -55,7 +55,7 @@ import java.nio.charset.StandardCharsets; @ConditionalOnExpression("'${queue.type:null}'=='service-bus' && '${service.type:null}'=='tb-rule-engine'") public class ServiceBusTbRuleEngineQueueFactory implements TbRuleEngineQueueFactory { - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbQueueCoreSettings coreSettings; private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueRuleEngineSettings ruleEngineSettings; @@ -68,14 +68,14 @@ public class ServiceBusTbRuleEngineQueueFactory implements TbRuleEngineQueueFact private final TbQueueAdmin jsExecutorAdmin; private final TbQueueAdmin notificationAdmin; - public ServiceBusTbRuleEngineQueueFactory(NotificationsTopicService notificationsTopicService, TbQueueCoreSettings coreSettings, + public ServiceBusTbRuleEngineQueueFactory(TopicService topicService, TbQueueCoreSettings coreSettings, TbQueueRuleEngineSettings ruleEngineSettings, TbServiceInfoProvider serviceInfoProvider, TbServiceBusSettings serviceBusSettings, TbQueueRemoteJsInvokeSettings jsInvokeSettings, TbQueueTransportNotificationSettings transportNotificationSettings, TbServiceBusQueueConfigs serviceBusQueueConfigs) { - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.coreSettings = coreSettings; this.serviceInfoProvider = serviceInfoProvider; this.ruleEngineSettings = ruleEngineSettings; @@ -91,39 +91,39 @@ public class ServiceBusTbRuleEngineQueueFactory implements TbRuleEngineQueueFact @Override public TbQueueProducer> createTransportNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, transportNotificationSettings.getNotificationsTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic())); } @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbServiceBusProducerTemplate<>(ruleEngineAdmin, serviceBusSettings, ruleEngineSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(ruleEngineAdmin, serviceBusSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createRuleEngineNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, ruleEngineSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToRuleEngineMsgConsumer(Queue configuration) { - return new TbServiceBusConsumerTemplate<>(ruleEngineAdmin, serviceBusSettings, configuration.getTopic(), + return new TbServiceBusConsumerTemplate<>(ruleEngineAdmin, serviceBusSettings, topicService.buildTopicName(configuration.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueConsumer> createToRuleEngineNotificationsMsgConsumer() { return new TbServiceBusConsumerTemplate<>(notificationAdmin, serviceBusSettings, - notificationsTopicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), + topicService.getNotificationsTopic(ServiceType.TB_RULE_ENGINE, serviceInfoProvider.getServiceId()).getFullTopicName(), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToRuleEngineNotificationMsg.parseFrom(msg.getData()), msg.getHeaders())); } @@ -152,12 +152,12 @@ public class ServiceBusTbRuleEngineQueueFactory implements TbRuleEngineQueueFact @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getUsageStatsTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createToOtaPackageStateServiceMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getOtaPackageTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getOtaPackageTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbVersionControlQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbVersionControlQueueFactory.java index 24cb4fe8bc..76149713ce 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbVersionControlQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTbVersionControlQueueFactory.java @@ -27,6 +27,7 @@ import org.thingsboard.server.queue.azure.servicebus.TbServiceBusProducerTemplat import org.thingsboard.server.queue.azure.servicebus.TbServiceBusQueueConfigs; import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings; import org.thingsboard.server.queue.common.TbProtoQueueMsg; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueVersionControlSettings; @@ -39,6 +40,7 @@ public class ServiceBusTbVersionControlQueueFactory implements TbVersionControlQ private final TbServiceBusSettings serviceBusSettings; private final TbQueueCoreSettings coreSettings; private final TbQueueVersionControlSettings vcSettings; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; private final TbQueueAdmin notificationAdmin; @@ -47,11 +49,13 @@ public class ServiceBusTbVersionControlQueueFactory implements TbVersionControlQ public ServiceBusTbVersionControlQueueFactory(TbServiceBusSettings serviceBusSettings, TbQueueCoreSettings coreSettings, TbQueueVersionControlSettings vcSettings, - TbServiceBusQueueConfigs serviceBusQueueConfigs + TbServiceBusQueueConfigs serviceBusQueueConfigs, + TopicService topicService ) { this.serviceBusSettings = serviceBusSettings; this.coreSettings = coreSettings; this.vcSettings = vcSettings; + this.topicService = topicService; this.coreAdmin = new TbServiceBusAdmin(serviceBusSettings, serviceBusQueueConfigs.getCoreConfigs()); this.notificationAdmin = new TbServiceBusAdmin(serviceBusSettings, serviceBusQueueConfigs.getNotificationsConfigs()); @@ -60,17 +64,17 @@ public class ServiceBusTbVersionControlQueueFactory implements TbVersionControlQ @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getUsageStatsTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createToVersionControlMsgConsumer() { - return new TbServiceBusConsumerTemplate<>(vcAdmin, serviceBusSettings, vcSettings.getTopic(), + return new TbServiceBusConsumerTemplate<>(vcAdmin, serviceBusSettings, topicService.buildTopicName(vcSettings.getTopic()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportProtos.ToVersionControlServiceMsg.parseFrom(msg.getData()), msg.getHeaders()) ); } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTransportQueueFactory.java b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTransportQueueFactory.java index 0a4bb59663..f6d85577e1 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTransportQueueFactory.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/provider/ServiceBusTransportQueueFactory.java @@ -38,6 +38,7 @@ import org.thingsboard.server.queue.azure.servicebus.TbServiceBusSettings; import org.thingsboard.server.queue.common.DefaultTbQueueRequestTemplate; import org.thingsboard.server.queue.common.TbProtoQueueMsg; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.settings.TbQueueCoreSettings; import org.thingsboard.server.queue.settings.TbQueueRuleEngineSettings; import org.thingsboard.server.queue.settings.TbQueueTransportApiSettings; @@ -55,6 +56,7 @@ public class ServiceBusTransportQueueFactory implements TbTransportQueueFactory private final TbServiceInfoProvider serviceInfoProvider; private final TbQueueCoreSettings coreSettings; private final TbQueueRuleEngineSettings ruleEngineSettings; + private final TopicService topicService; private final TbQueueAdmin coreAdmin; private final TbQueueAdmin transportApiAdmin; @@ -67,13 +69,15 @@ public class ServiceBusTransportQueueFactory implements TbTransportQueueFactory TbQueueRuleEngineSettings ruleEngineSettings, TbServiceInfoProvider serviceInfoProvider, TbQueueCoreSettings coreSettings, - TbServiceBusQueueConfigs serviceBusQueueConfigs) { + TbServiceBusQueueConfigs serviceBusQueueConfigs, + TopicService topicService) { this.transportApiSettings = transportApiSettings; this.transportNotificationSettings = transportNotificationSettings; this.serviceBusSettings = serviceBusSettings; this.serviceInfoProvider = serviceInfoProvider; this.coreSettings = coreSettings; this.ruleEngineSettings = ruleEngineSettings; + this.topicService = topicService; this.coreAdmin = new TbServiceBusAdmin(serviceBusSettings, serviceBusQueueConfigs.getCoreConfigs()); this.transportApiAdmin = new TbServiceBusAdmin(serviceBusSettings, serviceBusQueueConfigs.getTransportApiConfigs()); @@ -84,11 +88,11 @@ public class ServiceBusTransportQueueFactory implements TbTransportQueueFactory @Override public TbQueueRequestTemplate, TbProtoQueueMsg> createTransportApiRequestTemplate() { TbQueueProducer> producerTemplate = - new TbServiceBusProducerTemplate<>(transportApiAdmin, serviceBusSettings, transportApiSettings.getRequestsTopic()); + new TbServiceBusProducerTemplate<>(transportApiAdmin, serviceBusSettings, topicService.buildTopicName(transportApiSettings.getRequestsTopic())); TbQueueConsumer> consumerTemplate = new TbServiceBusConsumerTemplate<>(transportApiAdmin, serviceBusSettings, - transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId(), + topicService.buildTopicName(transportApiSettings.getResponsesTopic() + "." + serviceInfoProvider.getServiceId()), msg -> new TbProtoQueueMsg<>(msg.getKey(), TransportApiResponseMsg.parseFrom(msg.getData()), msg.getHeaders())); DefaultTbQueueRequestTemplate.DefaultTbQueueRequestTemplateBuilder @@ -104,29 +108,29 @@ public class ServiceBusTransportQueueFactory implements TbTransportQueueFactory @Override public TbQueueProducer> createRuleEngineMsgProducer() { - return new TbServiceBusProducerTemplate<>(ruleEngineAdmin, serviceBusSettings, ruleEngineSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(ruleEngineAdmin, serviceBusSettings, topicService.buildTopicName(ruleEngineSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueProducer> createTbCoreNotificationsMsgProducer() { - return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, coreSettings.getTopic()); + return new TbServiceBusProducerTemplate<>(notificationAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getTopic())); } @Override public TbQueueConsumer> createTransportNotificationsConsumer() { return new TbServiceBusConsumerTemplate<>(notificationAdmin, serviceBusSettings, - transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId(), + topicService.buildTopicName(transportNotificationSettings.getNotificationsTopic() + "." + serviceInfoProvider.getServiceId()), msg -> new TbProtoQueueMsg<>(msg.getKey(), ToTransportMsg.parseFrom(msg.getData()), msg.getHeaders())); } @Override public TbQueueProducer> createToUsageStatsServiceMsgProducer() { - return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, coreSettings.getUsageStatsTopic()); + return new TbServiceBusProducerTemplate<>(coreAdmin, serviceBusSettings, topicService.buildTopicName(coreSettings.getUsageStatsTopic())); } @PreDestroy diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/settings/TbQueueRemoteJsInvokeSettings.java b/common/queue/src/main/java/org/thingsboard/server/queue/settings/TbQueueRemoteJsInvokeSettings.java index 25f3244079..15ff55972d 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/settings/TbQueueRemoteJsInvokeSettings.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/settings/TbQueueRemoteJsInvokeSettings.java @@ -24,6 +24,9 @@ import org.springframework.stereotype.Component; @Data @Component public class TbQueueRemoteJsInvokeSettings { + + @Value("${queue.prefix:}") + private String prefix; @Value("${queue.js.request_topic}") private String requestTopic; @@ -38,4 +41,12 @@ public class TbQueueRemoteJsInvokeSettings { @Value("${queue.js.max_requests_timeout}") private long maxRequestsTimeout; + + public String getRequestTopic(){ + return prefix.isBlank() ? requestTopic : prefix + "." + requestTopic; + } + + public String getResponseTopic(){ + return prefix.isBlank() ? responseTopic : prefix + "." + responseTopic; + } } diff --git a/common/queue/src/main/java/org/thingsboard/server/queue/util/AfterStartUp.java b/common/queue/src/main/java/org/thingsboard/server/queue/util/AfterStartUp.java index e000735fba..d235acb4fa 100644 --- a/common/queue/src/main/java/org/thingsboard/server/queue/util/AfterStartUp.java +++ b/common/queue/src/main/java/org/thingsboard/server/queue/util/AfterStartUp.java @@ -34,6 +34,7 @@ public @interface AfterStartUp { int QUEUE_INFO_INITIALIZATION = 1; int DISCOVERY_SERVICE = 2; + int STARTUP_SERVICE = 8; int ACTOR_SYSTEM = 9; int REGULAR_SERVICE = 10; diff --git a/common/queue/src/test/java/org/thingsboard/server/queue/discovery/ZkDiscoveryServiceTest.java b/common/queue/src/test/java/org/thingsboard/server/queue/discovery/ZkDiscoveryServiceTest.java index a8810efd0e..3af4683ab3 100644 --- a/common/queue/src/test/java/org/thingsboard/server/queue/discovery/ZkDiscoveryServiceTest.java +++ b/common/queue/src/test/java/org/thingsboard/server/queue/discovery/ZkDiscoveryServiceTest.java @@ -26,6 +26,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.test.util.ReflectionTestUtils; import org.thingsboard.common.util.ThingsBoardThreadFactory; import org.thingsboard.server.gen.transport.TransportProtos; @@ -51,6 +52,8 @@ import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class ZkDiscoveryServiceTest { + @Mock + private ApplicationEventPublisher applicationEventPublisher; @Mock private TbServiceInfoProvider serviceInfoProvider; @@ -77,7 +80,7 @@ public class ZkDiscoveryServiceTest { @Before public void setup() { - zkDiscoveryService = Mockito.spy(new ZkDiscoveryService(serviceInfoProvider, partitionService)); + zkDiscoveryService = Mockito.spy(new ZkDiscoveryService(applicationEventPublisher, serviceInfoProvider, partitionService)); ScheduledExecutorService zkExecutorService = Executors.newSingleThreadScheduledExecutor(ThingsBoardThreadFactory.forName("zk-discovery")); when(client.getState()).thenReturn(CuratorFrameworkState.STARTED); ReflectionTestUtils.setField(zkDiscoveryService, "stopped", false); diff --git a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java index 3f79dc2cf7..87a6e1e0ed 100644 --- a/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java +++ b/common/script/script-api/src/main/java/org/thingsboard/script/api/tbel/TbDate.java @@ -15,79 +15,163 @@ */ package org.thingsboard.script.api.tbel; +import org.mvel2.ConversionException; import org.thingsboard.common.util.JacksonUtil; import org.thingsboard.server.common.data.StringUtils; +import java.io.Serializable; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.OffsetDateTime; import java.time.ZoneId; +import java.time.ZoneOffset; import java.time.ZonedDateTime; -import java.time.chrono.IsoChronology; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; +import java.time.format.DateTimeParseException; +import java.time.format.FormatStyle; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAccessor; -import java.util.Date; -import java.util.GregorianCalendar; +import java.util.Arrays; import java.util.Locale; import java.util.function.BiFunction; -public class TbDate extends Date { +public class TbDate implements Serializable, Cloneable { + + private Instant instant; + + private static final ZoneId zoneIdUTC = ZoneId.of("UTC"); + private static final Locale localeUTC = Locale.forLanguageTag("UTC"); private static final DateTimeFormatter isoDateFormatter = DateTimeFormatter.ofPattern( "yyyy-MM-dd[[ ]['T']HH:mm[:ss[.SSS]][ ][XXX][Z][z][VV][O]]").withZone(ZoneId.systemDefault()); - private static final ThreadLocal isoDateFormat = ThreadLocal.withInitial(() -> - new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ")); - public TbDate() { - super(); + this.instant = Instant.now(); } public TbDate(String s) { - super(parse(s)); + this.instant = parseInstant(s); } - public TbDate(long date) { - super(date); + public TbDate(String s, String pattern, Locale locale) { + instant = parseInstant(s, pattern, locale, zoneIdUTC); + } + public TbDate(String s, String pattern, Locale locale, String zoneIdStr) { + ZoneId zoneId = ZoneId.of(zoneIdStr); + instant = parseInstant(s, pattern, locale, zoneId); + } + public TbDate(String s, String pattern, Locale locale, ZoneId zoneId) { + instant = parseInstant(s, pattern, locale, zoneId); } - public TbDate(int year, int month, int date) { - this(year, month, date, 0, 0, 0); + public TbDate(long dateMilliSecond) { + instant = Instant.ofEpochMilli(dateMilliSecond); } - public TbDate(int year, int month, int date, int hrs, int min) { - this(year, month, date, hrs, min, 0); + public TbDate(int year, int month, int date, String... tz) { + this(year, month, date, 0, 0, 0, 0, tz); } - public TbDate(int year, int month, int date, - int hrs, int min, int second) { - super(new GregorianCalendar(year, month, date, hrs, min, second).getTimeInMillis()); + public TbDate(int year, int month, int date, int hrs, int min, String... tz) { + this(year, month, date, hrs, min, 0, 0, tz); } - public String toDateString() { - DateFormat formatter = DateFormat.getDateInstance(); - return formatter.format(this); + public TbDate(int year, int month, int date, int hrs, int min, int second, String... tz) { + this(year, month, date, hrs, min, second, 0, tz); + } + + public TbDate(int year, int month, int date, int hrs, int min, int second, int secondMilli, String... tz) { + ZoneId zoneId = tz.length > 0 ? ZoneId.of(Arrays.stream(tz).findFirst().get()) : ZoneId.systemDefault(); + instant = parseInstant(year, month, date, hrs, min, second, secondMilli, zoneId); + } + + public Instant getInstant() { + return instant; + } + + public ZonedDateTime getZonedDateTime() { + return getZonedDateTime(zoneIdUTC); + } + public ZonedDateTime getZonedDateTime(ZoneId zoneId) { + return instant.atZone(zoneId); + } + + public LocalDateTime getLocalDateTime() { + return LocalDateTime.ofInstant(this.instant, ZoneId.systemDefault()); + } + + public LocalDateTime getUTCDateTime() { + return LocalDateTime.ofInstant(this.instant, zoneIdUTC); } + public String toDateString() { + return toDateString(localeUTC.getLanguage()); + } + public String toDateString(String locale) { + return toDateString(locale, ZoneId.systemDefault().toString()); + } + public String toDateString(String localeStr, String optionsStr) { + return toLocaleString(localeStr, optionsStr, (locale, options) -> DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).withLocale(locale)); + } public String toTimeString() { - DateFormat formatter = DateFormat.getTimeInstance(DateFormat.LONG); - return formatter.format(this); + return toTimeString(Locale.getDefault().getLanguage()); + } + public String toTimeString(String locale) { + return toTimeString(locale, ZoneId.systemDefault().toString()); + } + public String toTimeString(String localeStr, String optionsStr) { + return toLocaleString(localeStr, optionsStr, (locale, options) -> DateTimeFormatter.ofLocalizedTime(FormatStyle.FULL).withLocale(locale)); } public String toISOString() { - return isoDateFormat.get().format(this); + return instant.toString(); + } + public String toJSON() { + return toISOString(); + } + public String toUTCString() { + return toUTCString(localeUTC.getLanguage()); + } + + public String toUTCString(String localeStr) { + return toLocaleString(localeStr, zoneIdUTC.getId(), (locale, options) -> DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.MEDIUM).withLocale(locale)); + } + + public String toString() { + return toString(Locale.getDefault().getLanguage()); + } + + public String toString(String locale) { + return toString(locale, ZoneId.systemDefault().toString()); + } + + public String toString(String localeStr, String optionsStr) { + return toLocaleString(localeStr, optionsStr, (locale, options) -> DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL, FormatStyle.FULL).withLocale(locale)); + } + public String toZonedDateTimeString() { + return getZonedDateTime().toString(); + } + public String toZonedDateTimeString(DateTimeFormatter formatter) { + return getZonedDateTime().format(formatter); + } + + public String toZonedDateTimeString(String zoneIdStr) { + return getZonedDateTime(ZoneId.of(zoneIdStr)).toString(); + } + public String toZonedDateTimeString(DateTimeFormatter formatter, String zoneIdStr) { + return getZonedDateTime(ZoneId.of(zoneIdStr)).format(formatter); } public String toLocaleDateString() { - return toLocaleDateString(null, null); + return toLocaleDateString(localeUTC.getLanguage()); } - public String toLocaleDateString(String locale) { - return toLocaleDateString(locale, null); + public String toLocaleDateString(String localeStr) { + return toLocaleString(localeStr, ZoneId.systemDefault().toString(), (locale, options) -> DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).withLocale(locale)); } public String toLocaleDateString(String localeStr, String optionsStr) { @@ -95,42 +179,34 @@ public class TbDate extends Date { } public String toLocaleTimeString() { - return toLocaleTimeString(null, null); + return toLocaleTimeString(Locale.getDefault().getLanguage()); } - public String toLocaleTimeString(String locale) { - return toLocaleTimeString(locale, null); + public String toLocaleTimeString(String localeStr) { + return toLocaleTimeString(localeStr, ZoneId.systemDefault().toString()); } public String toLocaleTimeString(String localeStr, String optionsStr) { return toLocaleString(localeStr, optionsStr, (locale, options) -> DateTimeFormatter.ofLocalizedTime(options.getTimeStyle()).withLocale(locale)); } - @Override public String toLocaleString() { - return toLocaleString(null, null); + return toLocaleString(localeUTC.getLanguage(), ZoneId.systemDefault().toString()); } public String toLocaleString(String locale) { - return toLocaleString(locale, null); + return toLocaleString(locale, ZoneId.systemDefault().toString()); } public String toLocaleString(String localeStr, String optionsStr) { - return toLocaleString(localeStr, optionsStr, (locale, options) -> { - String formatPattern = - DateTimeFormatterBuilder.getLocalizedDateTimePattern( - options.getDateStyle(), - options.getTimeStyle(), - IsoChronology.INSTANCE, - locale); - return DateTimeFormatter.ofPattern(formatPattern, locale); - }); + return toLocaleString(localeStr, optionsStr, (locale, options) -> + DateTimeFormatter.ofLocalizedDateTime(options.getDateStyle(), options.getTimeStyle()).withLocale(locale)); } public String toLocaleString(String localeStr, String optionsStr, BiFunction formatterBuilder) { Locale locale = StringUtils.isNotEmpty(localeStr) ? Locale.forLanguageTag(localeStr) : Locale.getDefault(); DateTimeFormatOptions options = getDateFormattingOptions(optionsStr); - ZonedDateTime zdt = this.toInstant().atZone(options.getTimeZone().toZoneId()); + ZonedDateTime zdt = this.getInstant().atZone(options.getTimeZone().toZoneId()); DateTimeFormatter formatter; if (StringUtils.isNotEmpty(options.getPattern())) { formatter = new DateTimeFormatterBuilder().appendPattern(options.getPattern()).toFormatter(locale); @@ -140,13 +216,13 @@ public class TbDate extends Date { return formatter.format(zdt); } - private static DateTimeFormatOptions getDateFormattingOptions(String options) { + private DateTimeFormatOptions getDateFormattingOptions(String optionsStr) { DateTimeFormatOptions opt = null; - if (StringUtils.isNotEmpty(options)) { + if (StringUtils.isNotEmpty(optionsStr)) { try { - opt = JacksonUtil.fromString(options, DateTimeFormatOptions.class); + opt = JacksonUtil.fromString(optionsStr, DateTimeFormatOptions.class); } catch (IllegalArgumentException iae) { - opt = new DateTimeFormatOptions(options); + opt = new DateTimeFormatOptions(optionsStr); } } if (opt == null) { @@ -155,8 +231,251 @@ public class TbDate extends Date { return opt; } - public static long now() { - return System.currentTimeMillis(); + public long now() { + return Instant.now().toEpochMilli(); + } + + public long parseSecond() { + return instant.getEpochSecond(); + } + + public long parseSecondMilli() { + return instant.toEpochMilli(); + } + + public static long UTC(int year) { + return UTC(year, 0, 0, 0, 0, 0, 0); + } + public static long UTC(int year, int month) { + return UTC(year, month, 0, 0, 0, 0, 0); + } + public static long UTC(int year, int month, int date) { + return UTC(year, month, date, 0, 0, 0, 0); + } + public static long UTC(int year, int month, int date, int hrs) { + return UTC(year, month, date, hrs, 0, 0, 0); + } + public static long UTC(int year, int month, int date, int hrs, int min) { + return UTC(year, month, date, hrs, min, 0, 0); + } + public static long UTC(int year, int month, int date, int hrs, int min, int sec) { + return UTC(year, month, date, hrs, min, sec, 0); + } + public static long UTC(int year, int month, int date, int hrs, int min, int sec, int ms) { + year = year == 0 ? year = 1899 : year; + month = month == 0 ? month = 12 : month; + date = date == 0 ? date = 31 : date; + return parseInstant(year, month, date, hrs, min, sec, ms, zoneIdUTC).toEpochMilli(); + } + public int getUTCFullYear() { + return getUTCDateTime().getYear(); + } + + public int getUTCMonth() { + return getUTCDateTime().getMonthValue(); + } + // day in month + public int getUTCDate() { + return getUTCDateTime().getDayOfMonth(); + } + // day in week + public int getUTCDay() { + return getUTCDateTime().getDayOfWeek().getValue(); + } + + public int getUTCHours() { + return getUTCDateTime().getHour(); + } + + public int getUTCMinutes() { + return getZonedDateTime().getMinute(); + } + + public int getUTCSeconds() { + return getUTCDateTime().getSecond(); + } + public int getUTCMilliseconds() { + return getUTCDateTime().getNano()/1000000; + } + + public void setUTCFullYear(int year) { + if (getUTCDate() > 28) { + long time = getZonedDateTime().withYear(year).withDayOfMonth(1).toInstant().toEpochMilli() + (getUTCDate() - 1) * 24 * 60 * 60 * 1000L; + this.instant = Instant.ofEpochMilli(time); + } else { + this.instant = getZonedDateTime().withYear(year).toInstant(); + } + } + public void setUTCFullYear(int year, int month) { + if (getUTCDate() > 28) { + long time = getZonedDateTime().withYear(year).withMonth(month).withDayOfMonth(1).toInstant().toEpochMilli() + (getUTCDate() - 1) * 24 * 60 * 60 * 1000L; + this.instant = Instant.ofEpochMilli(time); + } else { + this.instant = getZonedDateTime().withYear(year).withMonth(month).toInstant(); + } + } + public void setUTCFullYear(int year, int month, int date) { + this.instant = getZonedDateTime().withYear(year).withMonth(month).withDayOfMonth(date).toInstant(); + } + public void setUTCMonth(int month) { + if (getUTCDate() > 28) { + long time = getZonedDateTime().withMonth(month).withDayOfMonth(1).toInstant().toEpochMilli() + (getUTCDate() - 1) * 24 * 60 * 60 * 1000L; + this.instant = Instant.ofEpochMilli(time); + } else { + this.instant = getZonedDateTime().withMonth(month).toInstant(); + } + } + public void setUTCMonth(int month, int date) { + this.instant = getZonedDateTime().withMonth(month).withDayOfMonth(date).toInstant(); + } + public void setUTCDate(int date) { + this.instant = getZonedDateTime().withDayOfMonth(date).toInstant(); + } + public void setUTCHours(int hrs) { + this.instant = getZonedDateTime().withHour(hrs).toInstant(); + } + public void setUTCHours(int hrs, int minutes) { + this.instant = getZonedDateTime().withHour(hrs).withMinute(minutes).toInstant(); + } + public void setUTCHours(int hrs, int minutes, int seconds) { + this.instant = getZonedDateTime().withHour(hrs).withMinute(minutes).withSecond(seconds).toInstant(); + } + public void setUTCHours(int hrs, int minutes, int seconds, int ms) { + this.instant = getZonedDateTime().withHour(hrs).withMinute(minutes).withSecond(seconds).withNano(ms*1000000).toInstant(); + } + public void setUTCMinutes(int minutes) { + this.instant = getZonedDateTime().withMinute(minutes).toInstant(); + } + public void setUTCMinutes(int minutes, int seconds) { + this.instant = getZonedDateTime().withMinute(minutes).withSecond(seconds).toInstant(); } + public void setUTCMinutes(int minutes, int seconds, int ms) { + this.instant = parseInstant(getUTCFullYear(), getUTCMonth(), getUTCDate(), getUTCHours(), minutes, seconds, ms, zoneIdUTC); + } + public void setUTCSeconds(int seconds) { + this.instant = getZonedDateTime().withSecond(seconds).toInstant(); + } + public void setUTCSeconds(int seconds, int ms) { + this.instant = getZonedDateTime().withSecond(seconds).withNano(ms*1000000).toInstant(); + } + public void setUTCMilliseconds(int ms) { + this.instant = getZonedDateTime().withNano(ms*1000000).toInstant(); + } + public int getFullYear() { + return getLocalDateTime().getYear(); + } + + public int getMonth() { + return getLocalDateTime().getMonthValue(); + } + // day in month + public int getDate() { + return getLocalDateTime().getDayOfMonth(); + } + // day in week + public int getDay() { + return getLocalDateTime().getDayOfWeek().getValue(); + } + + public int getHours() { + return getLocalDateTime().getHour(); + } + + public int getMinutes() { + return getLocalDateTime().getMinute(); + } + + public int getSeconds() { + return getLocalDateTime().getSecond(); + } + public int getMilliseconds() { + return getLocalDateTime().getNano()/1000000; + } + // Milliseconds since Jan 1, 1970, 00:00:00.000 GMT + public long getTime() { + return instant.toEpochMilli(); + } + public long valueOf(){ + return getTime() ; + } + public void setFullYear(int year) { + Instant instantEpochWithYear = getZonedDateTime().withYear(year).toInstant(); + if (getDate() > 28) { + long time = getLocalDateTime().withYear(year).withDayOfMonth(1).toInstant(getLocaleZoneOffset(instantEpochWithYear)).toEpochMilli() + (getDate() - 1) * 24 * 60 * 60 * 1000L; + this.instant = Instant.ofEpochMilli(time); + } else { + this.instant = getLocalDateTime().withYear(year).toInstant(getLocaleZoneOffset(instantEpochWithYear)); + } + } + public void setFullYear(int year, int month) { + Instant instantEpochWithYear = getZonedDateTime().withYear(year).withMonth(month).toInstant(); + if (getDate() > 28) { + long time = getLocalDateTime().withYear(year).withMonth(month).withDayOfMonth(1).toInstant(getLocaleZoneOffset(instantEpochWithYear)).toEpochMilli() + (getDate() - 1) * 24 * 60 * 60 * 1000L; + this.instant = Instant.ofEpochMilli(time); + } else { + this.instant = getLocalDateTime().withYear(year).withMonth(month).toInstant(getLocaleZoneOffset(instantEpochWithYear)); + } + } + public void setFullYear(int year, int month, int date) { + Instant instantEpochWithYearMonthDate = getZonedDateTime().withYear(year).withMonth(month).withDayOfMonth(date).toInstant(); + this.instant = getLocalDateTime().withYear(year).withMonth(month).withDayOfMonth(date).toInstant(getLocaleZoneOffset(instantEpochWithYearMonthDate)); + } + public void setMonth(int month) { + Instant instantEpochWithYear = getZonedDateTime().withMonth(month).toInstant(); + if (getDate() > 28) { + long time = getLocalDateTime().withMonth(month).withDayOfMonth(1).toInstant(getLocaleZoneOffset(instantEpochWithYear)).toEpochMilli() + (getDate() - 1) * 24 * 60 * 60 * 1000L; + this.instant = Instant.ofEpochMilli(time); + } else { + this.instant = getLocalDateTime().withMonth(month).toInstant(getLocaleZoneOffset(instantEpochWithYear)); + } + + } + public void setMonth(int month, int date) { + Instant instantEpochWithMonthDate = getZonedDateTime().withMonth(month).withDayOfMonth(date).toInstant(); + this.instant = getLocalDateTime().withMonth(month).withDayOfMonth(date).toInstant(getLocaleZoneOffset(instantEpochWithMonthDate)); + } + public void setDate(int date) { + Instant instantEpochWithDate = getZonedDateTime().withDayOfMonth(date).toInstant(); + this.instant = getLocalDateTime().withDayOfMonth(date).toInstant(getLocaleZoneOffset(instantEpochWithDate)); + } + public void setHours(int hrs) { + this.instant = getLocalDateTime().withHour(hrs).toInstant(getLocaleZoneOffset(this.instant)); + } + public void setHours(int hrs, int minutes) { + this.instant = getLocalDateTime().withHour(hrs).withMinute(minutes).toInstant(getLocaleZoneOffset(this.instant)); + } + public void setHours(int hrs, int minutes, int seconds) { + this.instant = getLocalDateTime().withHour(hrs).withMinute(minutes).withSecond(seconds).toInstant(getLocaleZoneOffset(this.instant)); + } + public void setHours(int hrs, int minutes, int seconds, int ms) { + this.instant = getLocalDateTime().withHour(hrs).withMinute(minutes).withSecond(seconds).withNano(ms*1000000).toInstant(getLocaleZoneOffset(this.instant)); + } + public void setMinutes(int minutes) { + this.instant = getLocalDateTime().withMinute(minutes).toInstant(getLocaleZoneOffset(this.instant)); + } + public void setMinutes(int minutes, int seconds) { + this.instant = getLocalDateTime().withMinute(minutes).withSecond(seconds).toInstant(getLocaleZoneOffset(this.instant)); + + } + public void setMinutes(int minutes, int seconds, int ms) { + this.instant = getLocalDateTime().withMinute(minutes).withSecond(seconds).withNano(ms*1000000).toInstant(getLocaleZoneOffset(this.instant)); + } + public void setSeconds(int seconds) { + this.instant = getLocalDateTime().withSecond(seconds).toInstant(getLocaleZoneOffset(this.instant)); + } + public void setSeconds(int seconds, int ms) { + this.instant = getLocalDateTime().withSecond(seconds).withNano(ms*1000000).toInstant(getLocaleZoneOffset(this.instant)); + } + public void setMilliseconds(int ms) { + this.instant = getLocalDateTime().withNano(ms*1000000).toInstant(getLocaleZoneOffset(this.instant)); + } + + // Milliseconds since Jan 1, 1970, 00:00:00.000 GMT + public void setTime(long dateMilliSecond) { + instant = Instant.ofEpochMilli(dateMilliSecond); + } + + public ZoneOffset getLocaleZoneOffset(Instant... instants){ + return ZoneId.systemDefault().getRules().getOffset(instants.length > 0 ? instants[0] : this.instant); } public static long parse(String value, String format) { @@ -167,7 +486,6 @@ public class TbDate extends Date { return -1; } } - public static long parse(String value) { try { TemporalAccessor accessor = isoDateFormatter.parseBest(value, @@ -177,17 +495,35 @@ public class TbDate extends Date { Instant instant = Instant.from(accessor); return Instant.EPOCH.until(instant, ChronoUnit.MILLIS); } catch (Exception e) { - try { - return Date.parse(value); - } catch (IllegalArgumentException e2) { - return -1; - } + return -1; } } - public static long UTC(int year, int month, int date, - int hrs, int min, int sec) { - return Date.UTC(year - 1900, month, date, hrs, min, sec); + private static Instant parseInstant(String s) { + try{ + if (s.length() > 0 && Character.isDigit(s.charAt(0))) { + // assuming UTC instant "2007-12-03T10:15:30.00Z" + return OffsetDateTime.parse(s).toInstant(); + } + else { + // assuming RFC-1123 value "Tue, 3 Jun 2008 11:05:30 GMT-02:00" + return Instant.from(DateTimeFormatter.RFC_1123_DATE_TIME.parse(s)); + } + } catch (final DateTimeParseException ex) { + final ConversionException exception = new ConversionException("Cannot parse value [" + s + "] as instant", ex); + throw exception; + } } + private static Instant parseInstant(int year, int month, int date, int hrs, int min, int second, int secondMilli, ZoneId zoneId) { + year = year < 70 ? 2000 + year : year <= 99 ? 1900 + year : year; + ZonedDateTime zonedDateTime = ZonedDateTime.of(year, month, date, hrs, min, second, secondMilli*1000000, zoneId); + return zonedDateTime.toInstant(); + } + private static Instant parseInstant(String s, String pattern, Locale locale, ZoneId zoneId) { + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern, locale); + LocalDateTime localDateTime = LocalDateTime.parse(s, dateTimeFormatter); + ZonedDateTime zonedDateTime = localDateTime.atZone(zoneId); + return zonedDateTime.toInstant(); + } } diff --git a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java index 87dd4f0ebf..d3951dce0a 100644 --- a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java +++ b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTest.java @@ -24,21 +24,15 @@ import lombok.extern.slf4j.Slf4j; import org.junit.Assert; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; +import org.mvel2.ConversionException; import org.thingsboard.common.util.JacksonUtil; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.time.LocalDateTime; +import java.time.DateTimeException; import java.time.ZoneId; -import java.time.chrono.IsoChronology; import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; -import java.time.format.FormatStyle; import java.util.ArrayList; -import java.util.Calendar; import java.util.List; import java.util.Locale; -import java.util.TimeZone; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; @@ -46,6 +40,8 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; @Slf4j class TbDateTest { @@ -75,6 +71,11 @@ class TbDateTest { * at java.base/java.util.Calendar.setTimeInMillis(Calendar.java:1834) * at java.base/java.util.Calendar.setTime(Calendar.java:1800) * at java.base/java.text.SimpleDateFormat.format(SimpleDateFormat.java:974) + * Tests were checked with: + * -timezone Etc/GMT-14 + * -timezone Etc/GMT+12 + * -timezone America/New_York + * -timezone Europe/Kyiv */ @Test void testToISOStringConcurrently() throws ExecutionException, InterruptedException, TimeoutException { @@ -118,70 +119,106 @@ class TbDateTest { @Test void testToISOStringThreadLocalStaticFormatter() throws ExecutionException, InterruptedException, TimeoutException { executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(1)); + int hrs = 14; + int date = 29; + int month = 2; + String pattern = "2024-%s-%sT%s:35:42.987Z"; + String tsStr = String.format(pattern, String.format("%02d", month), date, hrs); //Thu Feb 29 2024 14:35:42.987 GMT+0000 + TbDate tbDate = new TbDate(tsStr); long ts = 1709217342987L; //Thu Feb 29 2024 14:35:42.987 GMT+0000 - int offset = Calendar.getInstance().get(Calendar.ZONE_OFFSET); // for example 3600000 for GMT + 1 - TbDate tbDate = new TbDate(ts - offset); - String datePrefix = "2024-02-29T14:35:42.987"; //without time zone + Assert.assertEquals(ts, tbDate.parseSecondMilli()); + int offsetLocalSecond = tbDate.getLocaleZoneOffset().getTotalSeconds(); // for example 7200 for GMT + 2 + + String datePrefix = tsStr; //without time zone assertThat(tbDate.toISOString()) .as("format in main thread") .startsWith(datePrefix); assertThat(executor.submit(tbDate::toISOString).get(30, TimeUnit.SECONDS)) .as("format in executor thread") .startsWith(datePrefix); - assertThat(new TbDate(ts - offset).toISOString()) + TbDateTestEntity tbDateTest = new TbDateTestEntity(tbDate.getFullYear(), month, date,hrs + offsetLocalSecond/60/60); + String datePrefixLocal = String.format(pattern, tbDateTest.geMonthStr(), tbDateTest.geDateStr(), tbDateTest.geHoursStr()); + long offsetLocalMilli = offsetLocalSecond*1000; + assertThat(new TbDate(ts + offsetLocalMilli).toISOString()) .as("new instance format in main thread") - .startsWith(datePrefix); - assertThat(executor.submit(() -> new TbDate(ts - offset).toISOString()).get(30, TimeUnit.SECONDS)) + .startsWith(datePrefixLocal); + assertThat(executor.submit(() -> new TbDate(ts + offsetLocalMilli).toISOString()).get(30, TimeUnit.SECONDS)) .as("new instance format in executor thread") - .startsWith(datePrefix); + .startsWith(datePrefixLocal); } @Test void testToLocaleDateString() { - TbDate d = new TbDate(1693962245000L); + String s = "09:15:30 PM, Sun 10/09/2022"; + String pattern = "hh:mm:ss a, EEE M/d/uuuu"; + TbDate d = new TbDate(s, pattern, Locale.US); + Assert.assertEquals("2022-10-09T21:15:30Z", d.toISOString()); + // tz = "-04:00" + d = new TbDate(s, pattern, Locale.US, "-04:00"); + Assert.assertEquals("2022-10-10T01:15:30Z", d.toISOString()); + d = new TbDate(s, pattern, Locale.US, "America/New_York"); + Assert.assertEquals("2022-10-10T01:15:30Z", d.toISOString()); + // tz = "+02:00" + /** + * For Java 11: + * String[2] { "vorm.", "nachm." } + * For Java 17: + * `{ "AM", "PM" }` + */ + s = "09:15:30 nachm., So. 10/09/2022"; + d = new TbDate(s, pattern, Locale.GERMAN, ZoneId.of("Europe/Berlin")); + Assert.assertEquals("2022-10-09T19:15:30Z", d.toISOString()); + + s = "09:15:30 пп, середа, 4 жовтня 2023 р."; + pattern = "hh:mm:ss a, EEEE, d MMMM y 'р.'"; + d = new TbDate(s, pattern, Locale.forLanguageTag("uk-UA")); + Assert.assertEquals("2023-10-04T21:15:30Z", d.toISOString()); + + d = new TbDate(1693962245000L); + Assert.assertEquals("2023-09-06T01:04:05Z", d.toISOString()); // Depends on time zone, so we just check it works; Assert.assertNotNull(d.toLocaleDateString()); Assert.assertNotNull(d.toLocaleDateString("en-US")); - Assert.assertEquals("9/5/23", d.toLocaleDateString("en-US", "America/New_York")); - Assert.assertEquals("23. 9. 5.", d.toLocaleDateString("ko-KR", "America/New_York")); - Assert.assertEquals("06.09.23", d.toLocaleDateString( "uk-UA", "Europe/Kiev")); - Assert.assertEquals("5\u200F/9\u200F/2023", d.toLocaleDateString( "ar-EG", "America/New_York")); + Assert.assertEquals("9/5/23", d.toLocaleDateString("en-US", "America/New_York")); + Assert.assertEquals("23. 9. 5.", d.toLocaleDateString("ko-KR", "America/New_York")); + Assert.assertEquals("06.09.23", d.toLocaleDateString( "uk-UA", "Europe/Kiev")); + Assert.assertEquals("5\u200F/9\u200F/2023", d.toLocaleDateString( "ar-EG", "America/New_York")); Assert.assertEquals("Tuesday, September 5, 2023", d.toLocaleDateString("en-US", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("dateStyle", "full") - .toString())); + .toString())); Assert.assertEquals("2023년 9월 5일 화요일", d.toLocaleDateString("ko-KR", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("dateStyle", "full") - .toString())); + .toString())); Assert.assertEquals("середа, 6 вересня 2023 р.", d.toLocaleDateString("uk-UA", JacksonUtil.newObjectNode() .put("timeZone", "Europe/Kiev") .put("dateStyle", "full") - .toString())); + .toString())); Assert.assertEquals("الثلاثاء، 5 سبتمبر 2023", d.toLocaleDateString("ar-EG", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("dateStyle", "full") - .toString())); + .toString())); Assert.assertEquals("Tuesday 9/5/2023", d.toLocaleDateString("en-US", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("pattern", "EEEE M/d/yyyy") - .toString())); + .toString())); Assert.assertEquals("화요일 9/5/2023", d.toLocaleDateString("ko-KR", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("pattern", "EEEE M/d/yyyy") - .toString())); + .toString())); Assert.assertEquals("середа 9/6/2023", d.toLocaleDateString("uk-UA", JacksonUtil.newObjectNode() .put("timeZone", "Europe/Kiev") .put("pattern", "EEEE M/d/yyyy") - .toString())); + .toString())); Assert.assertEquals("الثلاثاء 9/5/2023", d.toLocaleDateString("ar-EG", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("pattern", "EEEE M/d/yyyy") - .toString())); + .toString())); } @Test @@ -192,7 +229,6 @@ class TbDateTest { Assert.assertNotNull(d.toLocaleTimeString()); Assert.assertNotNull(d.toLocaleTimeString("en-US")); - Assert.assertEquals("9:04:05 PM", d.toLocaleTimeString("en-US", "America/New_York")); Assert.assertEquals("오후 9:04:05", d.toLocaleTimeString("ko-KR", "America/New_York")); Assert.assertEquals("04:04:05", d.toLocaleTimeString( "uk-UA", "Europe/Kiev")); @@ -201,36 +237,36 @@ class TbDateTest { Assert.assertEquals("9:04:05 PM Eastern Daylight Time", d.toLocaleTimeString("en-US", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("timeStyle", "full") - .toString())); + .toString())); Assert.assertEquals("오후 9시 4분 5초 미 동부 하계 표준시", d.toLocaleTimeString("ko-KR", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("timeStyle", "full") - .toString())); + .toString())); Assert.assertEquals("04:04:05 за східноєвропейським літнім часом", d.toLocaleTimeString("uk-UA", JacksonUtil.newObjectNode() .put("timeZone", "Europe/Kiev") .put("timeStyle", "full") - .toString())); + .toString())); Assert.assertEquals("9:04:05 م التوقيت الصيفي الشرقي لأمريكا الشمالية", d.toLocaleTimeString("ar-EG", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("timeStyle", "full") - .toString())); + .toString())); Assert.assertEquals("9:04:05 PM", d.toLocaleTimeString("en-US", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("pattern", "h:mm:ss a") - .toString())); + .toString())); Assert.assertEquals("9:04:05 오후", d.toLocaleTimeString("ko-KR", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("pattern", "h:mm:ss a") - .toString())); + .toString())); Assert.assertEquals("4:04:05 дп", d.toLocaleTimeString("uk-UA", JacksonUtil.newObjectNode() .put("timeZone", "Europe/Kiev") .put("pattern", "h:mm:ss a") - .toString())); + .toString())); Assert.assertEquals("9:04:05 م", d.toLocaleTimeString("ar-EG", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("pattern", "h:mm:ss a") - .toString())); + .toString())); } @Test @@ -241,16 +277,16 @@ class TbDateTest { Assert.assertNotNull(d.toLocaleString()); Assert.assertNotNull(d.toLocaleString("en-US")); - Assert.assertEquals("9/5/23, 9:04:05 PM", d.toLocaleString("en-US", "America/New_York")); - Assert.assertEquals("23. 9. 5. 오후 9:04:05", d.toLocaleString("ko-KR", "America/New_York")); - Assert.assertEquals("06.09.23, 04:04:05", d.toLocaleString( "uk-UA", "Europe/Kiev")); - Assert.assertEquals("5\u200F/9\u200F/2023 9:04:05 م", d.toLocaleString( "ar-EG", "America/New_York")); + Assert.assertEquals("9/5/23, 9:04:05 PM", d.toLocaleString("en-US", "America/New_York")); + Assert.assertEquals("23. 9. 5. 오후 9:04:05", d.toLocaleString("ko-KR", "America/New_York")); + Assert.assertEquals("06.09.23, 04:04:05", d.toLocaleString( "uk-UA", "Europe/Kiev")); + Assert.assertEquals("5\u200F/9\u200F/2023 9:04:05 م", d.toLocaleString( "ar-EG", "America/New_York")); Assert.assertEquals("Tuesday, September 5, 2023 at 9:04:05 PM Eastern Daylight Time", d.toLocaleString("en-US", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("dateStyle", "full") .put("timeStyle", "full") - .toString())); + .toString())); Assert.assertEquals("2023년 9월 5일 화요일 오후 9시 4분 5초 미 동부 하계 표준시", d.toLocaleString("ko-KR", JacksonUtil.newObjectNode() .put("timeZone", "America/New_York") .put("dateStyle", "full") @@ -285,25 +321,494 @@ class TbDateTest { .toString())); } - private static String toLocalString(TbDate d, Locale locale, ZoneId tz) { - LocalDateTime ldt = d.toInstant().atZone(tz).toLocalDateTime(); + @Test + void TestFromString () { + String stringDateUTC = "2023-09-06T01:04:05.00Z"; + TbDate d = new TbDate(stringDateUTC); + Assert.assertEquals("2023-09-06T01:04:05Z", d.toISOString()); + String stringDateTZ = "2023-09-06T01:04:05.00+04:00:00"; + d = new TbDate(stringDateTZ); + Assert.assertEquals("2023-09-05T21:04:05Z", d.toISOString()); + stringDateTZ = "2023-09-06T01:04:05.00+04"; + d = new TbDate(stringDateTZ); + Assert.assertEquals("2023-09-05T21:04:05Z", d.toISOString()); + stringDateTZ = "2023-09-06T01:04:05.00-04:00"; + d = new TbDate(stringDateTZ); + Assert.assertEquals("2023-09-06T05:04:05Z", d.toISOString()); + stringDateTZ = "2023-09-06T01:04:05.00+04:30:56"; + d = new TbDate(stringDateTZ); + Assert.assertEquals("2023-09-05T20:33:09Z", d.toISOString()); + stringDateTZ = "2023-09-06T01:04:05.00-02:00"; + d = new TbDate(stringDateTZ); + Assert.assertEquals("2023-09-06T03:04:05Z", d.toISOString()); + String stringDateRFC_1123 = "Sat, 3 Jun 2023 11:05:30 GMT"; + d = new TbDate(stringDateRFC_1123); + Assert.assertEquals("2023-06-03T11:05:30Z", d.toISOString()); + stringDateRFC_1123 = "Sat, 3 Jun 2023 01:04:05 +043056"; + d = new TbDate(stringDateRFC_1123); + Assert.assertEquals("2023-06-02T20:33:09Z", d.toISOString()); + stringDateRFC_1123 = "Sat, 3 Jun 2023 11:05:30 +0400"; + d = new TbDate(stringDateRFC_1123); + Assert.assertEquals("2023-06-03T07:05:30Z", d.toISOString()); + stringDateRFC_1123 = "Thu, 29 Feb 2024 11:05:30 -03"; + d = new TbDate(stringDateRFC_1123); + Assert.assertEquals("2024-02-29T14:05:30Z", d.toISOString()); + + String stringDateZ_error = "2023-09-06T01:04:05.00+045"; + Exception actual = assertThrows(ConversionException.class, () -> { + new TbDate(stringDateZ_error); + }); + String expectedMessage = "Cannot parse value"; + assertTrue(actual.getMessage().contains(expectedMessage)); + + String stringDateRFC_1123_error = "Tue, 3 Jun 2023 11:05:30 GMT"; + actual = assertThrows(ConversionException.class, () -> { + new TbDate(stringDateRFC_1123_error); + }); + assertTrue(actual.getMessage().contains(expectedMessage)); + } + + @Test + void TestDateTimeFormatterToString () { + TbDate d1 = new TbDate(23, 9, 7, 8, 4, 5, "+04:00"); + TbDate d2 = new TbDate(23, 9, 7, 8, 4, 5, "-03:00"); + + Assert.assertEquals("2023-09-07T04:04:05Z[UTC]", d1.toZonedDateTimeString()); + Assert.assertEquals("2023-09-07T04:04:05Z", d1.toZonedDateTimeString(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); + Assert.assertEquals("2023-09-07T04:04:05Z[UTC]", d1.toZonedDateTimeString(DateTimeFormatter.ISO_ZONED_DATE_TIME)); + Assert.assertEquals("2023-09-07T04:04:05", d1.toZonedDateTimeString(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); + Assert.assertEquals("Thu, 7 Sep 2023 04:04:05 GMT", d1.toZonedDateTimeString(DateTimeFormatter.RFC_1123_DATE_TIME)); + Assert.assertEquals("2023-09-07T04:04:05Z", d1.toZonedDateTimeString(DateTimeFormatter.ISO_INSTANT)); + + Assert.assertEquals("2023-09-07T11:04:05Z[UTC]", d2.toZonedDateTimeString()); + Assert.assertEquals("2023-09-07T11:04:05Z", d2.toZonedDateTimeString(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); + Assert.assertEquals("2023-09-07T11:04:05Z[UTC]", d2.toZonedDateTimeString(DateTimeFormatter.ISO_ZONED_DATE_TIME)); + Assert.assertEquals("2023-09-07T11:04:05", d2.toZonedDateTimeString(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); + Assert.assertEquals("Thu, 7 Sep 2023 11:04:05 GMT", d2.toZonedDateTimeString(DateTimeFormatter.RFC_1123_DATE_TIME)); + Assert.assertEquals("2023-09-07T11:04:05Z", d2.toZonedDateTimeString(DateTimeFormatter.ISO_INSTANT)); + } -// new DateTimeFormatterBuilder().appendPattern(pattern).toFormatter(locale) + @Test + void TestZoneDateTimeFormatterToString () { + TbDate d1 = new TbDate(23, 9, 7, 8, 4, 5, "-04:00"); + Assert.assertEquals("2023-09-07T12:04:05Z[UTC]", d1.toZonedDateTimeString()); + Assert.assertEquals("2023-09-07T12:04:05Z", d1.toZonedDateTimeString(DateTimeFormatter.ISO_INSTANT,"America/New_York")); + Assert.assertEquals("2023-09-07T08:04:05-04:00", d1.toZonedDateTimeString(DateTimeFormatter.ISO_OFFSET_DATE_TIME,"America/New_York")); + Assert.assertEquals("2023-09-07T08:04:05-04:00[America/New_York]", d1.toZonedDateTimeString("America/New_York")); + Assert.assertEquals("Thu, 7 Sep 2023 08:04:05 -0400", d1.toZonedDateTimeString(DateTimeFormatter.RFC_1123_DATE_TIME,"America/New_York")); + + Assert.assertEquals("2023-09-07T14:04:05+02:00[Europe/Berlin]", d1.toZonedDateTimeString("Europe/Berlin")); + Assert.assertEquals("2023-09-07T14:04:05+02:00", d1.toZonedDateTimeString(DateTimeFormatter.ISO_OFFSET_DATE_TIME,"Europe/Berlin")); + Assert.assertEquals("2023-09-08T02:04:05+14:00[Etc/GMT-14]", d1.toZonedDateTimeString("Etc/GMT-14")); + Assert.assertEquals("2023-09-07T00:04:05-12:00[Etc/GMT+12]", d1.toZonedDateTimeString("Etc/GMT+12")); + } - String formatPattern = - DateTimeFormatterBuilder.getLocalizedDateTimePattern( - FormatStyle.SHORT, - FormatStyle.MEDIUM, - IsoChronology.INSTANCE, - locale); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatPattern, locale); - return formatter.format(ldt); + @Test + void TestParse () { + String stringDateUTC = "2023-09-06T01:04:05.345Z"; + TbDate d = new TbDate(stringDateUTC); + Assert.assertEquals(1693962245345L, d.parseSecondMilli()); + Assert.assertEquals(1693962245L, d.parseSecond()); + String stringDateStart = "1970-01-01T00:00:00Z"; + d = new TbDate(stringDateStart); + long actualMillis = TbDate.parse("1970-01-01 T00:00:00"); + Assert.assertEquals(-d.getLocaleZoneOffset().getTotalSeconds() * 1000, actualMillis); + String pattern = "yyyy-MM-dd HH:mm:ss.SSS"; + String stringDate = "1995-12-04 00:12:00.000"; + Assert.assertNotEquals(-1L, TbDate.parse(stringDate, pattern)); } - private static String toLocalString2(TbDate d, Locale locale, ZoneId tz) { - DateFormat dateFormat = SimpleDateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM, locale); - dateFormat.setTimeZone(TimeZone.getTimeZone(tz)); - return dateFormat.format(d); + @Test + void TestMethodGetAsDateTimeLocal() { + TbDate d = new TbDate(1975, 12, 31, 23,15,30, 560); + TbDate d0 = new TbDate(1975, 12, 31, 23,15,30, 560,"UTC"); + TbDate d1 = new TbDate(1975, 12, 31, 23,15,30, 561,"+03:00"); + TbDate d2 = new TbDate(1975, 12, 31, 23,15,30, 562,"-02:00"); + TbDate dLocal = new TbDate(d.parseSecondMilli() + d.getLocaleZoneOffset().getTotalSeconds()*1000); + TbDate dLocal0 = new TbDate(d0.parseSecondMilli() + d0.getLocaleZoneOffset().getTotalSeconds()*1000); + TbDate dLocal1 = new TbDate(d1.parseSecondMilli() + d1.getLocaleZoneOffset().getTotalSeconds()*1000); + TbDate dLocal2 = new TbDate(d2.parseSecondMilli() + d2.getLocaleZoneOffset().getTotalSeconds()*1000); + + Assert.assertEquals(dLocal.getUTCFullYear(), d.getFullYear()); + Assert.assertEquals(dLocal0.getUTCFullYear(), d0.getFullYear()); + Assert.assertEquals(dLocal1.getUTCFullYear(), d1.getFullYear()); + Assert.assertEquals(dLocal2.getUTCFullYear(), d2.getFullYear()); + + Assert.assertEquals(dLocal.getUTCMonth(), d.getMonth()); + Assert.assertEquals(dLocal0.getUTCMonth(), d0.getMonth()); + Assert.assertEquals(dLocal1.getUTCMonth(), d1.getMonth()); + Assert.assertEquals(dLocal2.getUTCMonth(), d2.getMonth()); + + Assert.assertEquals(dLocal.getUTCDate(), d.getDate()); + Assert.assertEquals(dLocal0.getUTCDate(), d0.getDate()); + Assert.assertEquals(dLocal1.getUTCDate(), d1.getDate()); + Assert.assertEquals(dLocal2.getUTCDate(), d2.getDate()); + + Assert.assertEquals(dLocal.getUTCDay(), d.getDay()); + Assert.assertEquals(dLocal0.getUTCDay(), d0.getDay()); + Assert.assertEquals(dLocal1.getUTCDay(), d1.getDay()); + Assert.assertEquals(dLocal2.getUTCDay(), d2.getDay()); + + Assert.assertEquals(dLocal.getUTCHours(), d.getHours()); + Assert.assertEquals(dLocal0.getUTCHours(), d0.getHours()); + Assert.assertEquals(dLocal1.getUTCHours(), d1.getHours()); + Assert.assertEquals(dLocal2.getUTCHours(), d2.getHours()); + + Assert.assertEquals(dLocal.getUTCMinutes(), d.getMinutes()); + Assert.assertEquals(dLocal0.getUTCMinutes(), d0.getMinutes()); + Assert.assertEquals(dLocal1.getUTCMinutes(), d1.getMinutes()); + Assert.assertEquals(dLocal2.getUTCMinutes(), d2.getMinutes()); + + Assert.assertEquals(dLocal.getUTCSeconds(), d.getSeconds()); + Assert.assertEquals(dLocal0.getUTCSeconds(), d0.getSeconds()); + Assert.assertEquals(dLocal1.getUTCSeconds(), d1.getSeconds()); + Assert.assertEquals(dLocal2.getUTCSeconds(), d2.getSeconds()); + + Assert.assertEquals(dLocal.getUTCMilliseconds(), d.getMilliseconds()); + Assert.assertEquals(dLocal0.getUTCMilliseconds(), d0.getMilliseconds()); + Assert.assertEquals(dLocal1.getUTCMilliseconds(), d1.getMilliseconds()); + Assert.assertEquals(dLocal2.getUTCMilliseconds(), d2.getMilliseconds()); + } + + @Test + void Test_Year_Moth_Date_Hours_Min_Sec_Without_TZ() { + TbDate d = new TbDate(2023, 8, 18); + Assert.assertEquals("2023-08-18 00:00:00", d.toLocaleString()); + d = new TbDate(2023, 9, 17, 17, 34); + Assert.assertEquals("2023-09-17 17:34:00", d.toLocaleString()); + d = new TbDate(23, 9, 7, 8, 4); + Assert.assertEquals("2023-09-07 08:04:00", d.toLocaleString()); + d = new TbDate(23, 9, 7, 8, 4, 5); + Assert.assertEquals("2023-09-07 08:04:05", d.toLocaleString()); + d = new TbDate(23, 9, 7, 8, 4, 5, 567); + Assert.assertEquals("2023-09-07 08:04:05", d.toLocaleString()); + } + + @Test + void Test_Get_LocalDateTime_With_TZ() { + int hrs = 8; + int date = 7; + int tz = 0; + String pattern = "2023-09-%s %s:04:05"; + String tzStr = "UTC"; + TbDate d = new TbDate(23, 9, date, hrs, 4, 5); + int localOffsetHrs = 0; + TbDateTestEntity tbDateTest = new TbDateTestEntity(23, 9, date, hrs + localOffsetHrs - tz); + String expected = String.format(pattern, tbDateTest.geDateStr(), tbDateTest.geHoursStr()); + Assert.assertEquals(expected, d.toLocaleString()); + + d = new TbDate(23, 9, date, hrs, 4, 5, tzStr); + localOffsetHrs = ZoneId.systemDefault().getRules().getOffset(d.getInstant()).getTotalSeconds()/60/60; + tbDateTest = new TbDateTestEntity(23, 9, date, hrs + localOffsetHrs - tz); + expected = String.format(pattern, tbDateTest.geDateStr(), tbDateTest.geHoursStr()); + Assert.assertEquals(expected, d.toLocaleString()); + + tz = 3; + tzStr = "+03:00"; + d = new TbDate(23, 9, date, hrs, 4, 5, tzStr); + localOffsetHrs = ZoneId.systemDefault().getRules().getOffset(d.getInstant()).getTotalSeconds()/60/60; + tbDateTest = new TbDateTestEntity(23, 9, date, hrs + localOffsetHrs - tz); + expected = String.format(pattern, tbDateTest.geDateStr(), tbDateTest.geHoursStr()); + Assert.assertEquals(expected, d.toLocaleString()); + + tz = -4; + tzStr = "-04:00"; + d = new TbDate(23, 9, date, hrs, 4, 5, tzStr); + localOffsetHrs = ZoneId.systemDefault().getRules().getOffset(d.getInstant()).getTotalSeconds()/60/60; + tbDateTest = new TbDateTestEntity(23, 9, date, hrs + localOffsetHrs - tz); + expected = String.format(pattern, tbDateTest.geDateStr(), tbDateTest.geHoursStr()); + Assert.assertEquals(expected, d.toLocaleString()); + } + + @Test + public void TestToUTC() { + Assert.assertEquals(-2209075200000L, TbDate.UTC(0)); + Assert.assertEquals("1899-12-31T00:00:00Z", new TbDate(TbDate.UTC(0)).toJSON()); + Assert.assertEquals("1996-02-02T03:04:05Z", new TbDate(TbDate.UTC(96, 2, 2, 3, 4, 5)).toJSON()); + Assert.assertEquals("2022-12-31T03:04:05.678Z", new TbDate(TbDate.UTC(22, 0, 0, 3, 4, 5, 678)).toJSON()); + Assert.assertEquals("0903-12-31T03:04:05.678Z", new TbDate(TbDate.UTC(903, 0, 0, 3, 4, 5, 678)).toJSON()); + Assert.assertEquals("1958-12-31T03:04:05.678Z", new TbDate(TbDate.UTC(1958, 0, 0, 3, 4, 5, 678)).toJSON()); + Assert.assertEquals("2032-04-05T03:04:05.678Z", new TbDate(TbDate.UTC(2032, 4, 5, 3, 4, 5, 678)).toJSON()); + Assert.assertEquals("2024-02-29T03:04:05.678Z", new TbDate(TbDate.UTC(2024, 2, 29, 3, 4, 5, 678)).toJSON()); + Exception actual = assertThrows(DateTimeException.class, () -> { + TbDate.UTC(2023, 2, 29, 3, 4, 5, 678); + }); + String expectedMessage = "Invalid date 'February 29' as '2023' is not a leap year"; + assertTrue(actual.getMessage().contains(expectedMessage)); } + @Test + void TestMethodGetTimeUTC() { + TbDate ddUTC = new TbDate(TbDate.UTC(1996, 1, 2, 3, 4, 5)); + Assert.assertEquals(820551845000L, ddUTC.valueOf()); + TbDate dd = new TbDate(1996, 1, 2, 3, 4, 5); + int localOffsetMilli = ZoneId.systemDefault().getRules().getOffset(dd.getInstant()).getTotalSeconds()*1000; + Assert.assertEquals((dd.valueOf() + localOffsetMilli), ddUTC.valueOf()); + + ddUTC = new TbDate(TbDate.UTC(1969, 7, 20, 20, 17, 40)); + Assert.assertEquals(-14182940000L, ddUTC.valueOf()); + TbDate beforeStartUTC = new TbDate(1969, 7, 20, 20, 17, 40); + localOffsetMilli = ZoneId.systemDefault().getRules().getOffset(beforeStartUTC.getInstant()).getTotalSeconds()*1000; + Assert.assertEquals((beforeStartUTC.valueOf() + localOffsetMilli), ddUTC.valueOf()); + } + + @Test + void TestMethodSetUTCFullYearMonthDate() { + TbDate d1 = new TbDate(1975, 12, 31, 23,15,30, 567,"-04:00"); + TbDate d2 = new TbDate(1975, 12, 31, 23,15,30, 567,"+04:00"); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCFullYear(1969); + d2.setUTCFullYear(1969); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCFullYear(1975, 5); + d2.setUTCFullYear(2023, 11); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCFullYear(2023, 2, 28); + d2.setUTCFullYear(2023, 12, 31); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCMonth(11); + d2.setUTCMonth(2); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCMonth(5, 20); + d2.setUTCMonth(2, 8); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCDate(6); + d2.setUTCDate(15); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + } + + @Test + void TestMethodSetUTCHoursMinutesSecondsMilliSec() { + TbDate d1 = new TbDate(1975, 12, 31, 23, 15, 30, 567, "+02:00"); + TbDate d2 = new TbDate(1975, 12, 31, 23, 15, 30, 567, "-02:00"); + + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCHours(5); + d2.setUTCHours(23); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCHours(23, 45); + d2.setUTCHours(1, 5); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCHours(0, 12, 59); + d2.setUTCHours(4, 45, 01); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCHours(2, 32, 49, 123); + d2.setUTCHours(8, 45, 12, 234); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCMinutes(5); + d2.setUTCMinutes(15); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCMinutes(5, 34); + d2.setUTCMinutes(25, 43); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCMinutes(25, 14, 567); + d2.setUTCMinutes(45, 3, 876); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCSeconds(5); + d2.setUTCSeconds(23); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCSeconds(45, 987); + d2.setUTCSeconds(54, 842); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setUTCMilliseconds(675); + d1.setUTCMilliseconds(923); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + } + @Test + void TestMethodSetTime() { + TbDate d1 = new TbDate(1975, 12, 31, 23, 15, 30, 567, "-03:00"); + long dateMilliSecond = d1.getTime(); + int fiveMinutesInMillis = 5 * 60 * 1000; + Assert.assertEquals(15, d1.getUTCMinutes()); + Assert.assertEquals(4, d1.getUTCDay()); + d1.setTime(dateMilliSecond + fiveMinutesInMillis); + Assert.assertEquals(20, d1.getUTCMinutes()); + Assert.assertEquals(4, d1.getUTCDay()); + d1.setTime(-378682769433L); + Assert.assertEquals(1958, d1.getUTCFullYear()); + Assert.assertEquals(1, d1.getUTCMonth()); + Assert.assertEquals(1, d1.getUTCDate()); + Assert.assertEquals(2, d1.getUTCHours()); + Assert.assertEquals(20, d1.getUTCMinutes()); + Assert.assertEquals(30, d1.getUTCSeconds()); + Assert.assertEquals(567, d1.getUTCMilliseconds()); + Assert.assertEquals(3, d1.getUTCDay()); + } + @Test + void TestMethodSeFullYearMonthDate() { + TbDate d = new TbDate(2024, 1, 1, 1, 15, 30, 567); + testResultChangeDateTime(d); + + d = new TbDate(2023, 12, 31, 22, 15, 30, 567); + testResultChangeDateTime(d); + + d = new TbDate(1975, 12, 31, 1, 15, 30, 567); + testResultChangeDateTime(d); + + d.setFullYear(1969); + testResultChangeDateTime(d); + + d.setFullYear(1975, 2); + testResultChangeDateTime(d); + + d.setFullYear(2023, 6, 30); + testResultChangeDateTime(d); + + d.setMonth(2); + testResultChangeDateTime(d); + + d.setMonth(1, 24); + testResultChangeDateTime(d); + + d.setDate(6); + testResultChangeDateTime(d); + } + @Test + void TestMethodSeHoursMinutesSecondsMilliSec() { + TbDate d1 = new TbDate(1975, 12, 31, 23, 15, 30, 567, "+02:00"); + TbDate d2 = new TbDate(1975, 12, 31, 23, 15, 30, 567, "-02:00"); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setHours(5); + d2.setHours(23); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setHours(23, 45); + d2.setHours(1, 5); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setHours(0, 12, 59); + d2.setHours(4, 45, 1); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setHours(2, 32, 49, 123); + d2.setHours(8, 45, 12, 234); + testResultChangeDateTime(d1); + testResultChangeDateTime(d2); + + d1.setMinutes(5); + d2.setMinutes(15); + Assert.assertEquals(5, d1.getMinutes()); + Assert.assertEquals(15, d2.getMinutes()); + + d1.setMinutes(5, 34); + d2.setMinutes(25, 43); + Assert.assertEquals(5, d1.getMinutes()); + Assert.assertEquals(34, d1.getSeconds()); + Assert.assertEquals(25, d2.getMinutes()); + Assert.assertEquals(43, d2.getSeconds()); + + d1.setMinutes(25, 14, 567); + d2.setMinutes(45, 3, 876); + Assert.assertEquals(25, d1.getMinutes()); + Assert.assertEquals(14, d1.getSeconds()); + Assert.assertEquals(567, d1.getMilliseconds()); + Assert.assertEquals(45, d2.getMinutes()); + Assert.assertEquals(3, d2.getSeconds()); + Assert.assertEquals(876, d2.getMilliseconds()); + + d1.setSeconds(5); + d2.setSeconds(23); + Assert.assertEquals(5, d1.getSeconds()); + Assert.assertEquals(23, d2.getSeconds()); + + d1.setSeconds(45, 987); + d2.setSeconds(54, 842); + Assert.assertEquals(45, d1.getSeconds()); + Assert.assertEquals(987, d1.getMilliseconds()); + Assert.assertEquals(54, d2.getSeconds()); + Assert.assertEquals(842, d2.getMilliseconds()); + + d1.setMilliseconds(675); + d2.setMilliseconds(923); + Assert.assertEquals(675, d1.getMilliseconds()); + Assert.assertEquals(923, d2.getMilliseconds()); + } + @Test + public void toStringAsJs() { + TbDate d1 = new TbDate(1975, 12, 31, 23,15,30, 567,"-04:00"); + Assert.assertEquals("четвер, 1 січня 1976 р. о 06:15:30 за східноєвропейським стандартним часом", d1.toString("uk-UA", "Europe/Kyiv")); + Assert.assertEquals("Thursday, January 1, 1976 at 6:15:30 AM Eastern European Standard Time", d1.toString("en-US", "Europe/Kyiv")); + Assert.assertEquals("1976 Jan 1, Thu 06:15:30 Eastern European Time", d1.toString("UTC", "Europe/Kyiv")); + Assert.assertEquals("Wednesday, December 31, 1975 at 10:15:30 PM Eastern Standard Time", d1.toString("en-US", "America/New_York")); + Assert.assertEquals("1975 Dec 31, Wed 22:15:30 Eastern Standard Time", d1.toString("GMT", "America/New_York")); + Assert.assertEquals("1975 Dec 31, Wed 22:15:30 Eastern Standard Time", d1.toString("UTC", "America/New_York")); + + Assert.assertEquals(d1.toUTCString("UTC"), d1.toUTCString()); + Assert.assertEquals("четвер, 1 січня 1976 р., 03:15:30", d1.toUTCString("uk-UA")); + Assert.assertEquals("Thursday, January 1, 1976, 3:15:30 AM", d1.toUTCString("en-US")); + + Assert.assertEquals("1976-01-01T03:15:30.567Z", d1.toJSON()); + Assert.assertEquals("1976-01-01T03:15:30.567Z", d1.toISOString()); + + Assert.assertEquals("1976-01-01 06:15:30", d1.toLocaleString("UTC", "Europe/Kyiv")); + Assert.assertEquals("01.01.76, 06:15:30", d1.toLocaleString("uk-UA", "Europe/Kyiv")); + Assert.assertEquals("1975-12-31 22:15:30", d1.toLocaleString("UTC", "America/New_York")); + Assert.assertEquals("12/31/75, 10:15:30 PM", d1.toLocaleString("en-US", "America/New_York")); + + Assert.assertEquals("1976 Jan 1, Thu", d1.toDateString("UTC", "Europe/Kyiv")); + Assert.assertEquals("четвер, 1 січня 1976 р.", d1.toDateString("uk-UA", "Europe/Kyiv")); + Assert.assertEquals("1975 Dec 31, Wed", d1.toDateString("UTC", "America/New_York")); + Assert.assertEquals("Wednesday, December 31, 1975", d1.toDateString("en-US", "America/New_York")); + + Assert.assertEquals("06:15:30", d1.toLocaleTimeString("uk-UA", "Europe/Kyiv")); + Assert.assertEquals("06:15:30", d1.toLocaleTimeString("UTC", "Europe/Kyiv")); + Assert.assertEquals("10:15:30 PM", d1.toLocaleTimeString("en-US", "America/New_York")); + Assert.assertEquals("22:15:30", d1.toLocaleTimeString("UTC", "America/New_York")); + + Assert.assertEquals("06:15:30 за східноєвропейським стандартним часом", d1.toTimeString("uk-UA", "Europe/Kyiv")); + Assert.assertEquals("06:15:30 Eastern European Time", d1.toTimeString("UTC", "Europe/Kyiv")); + Assert.assertEquals("10:15:30 PM Eastern Standard Time", d1.toTimeString("en-US", "America/New_York")); + Assert.assertEquals("22:15:30 Eastern Standard Time", d1.toTimeString("UTC", "America/New_York")); + } + + private void testResultChangeDateTime(TbDate d) { + int localOffset = ZoneId.systemDefault().getRules().getOffset(d.getInstant()).getTotalSeconds(); + TbDateTestEntity tbDateTestEntity = new TbDateTestEntity(d.getFullYear(), d.getMonth(), d.getDate(), (d.getHours() - (localOffset/60/60))); + Assert.assertEquals(tbDateTestEntity.getYear(), d.getUTCFullYear()); + Assert.assertEquals(tbDateTestEntity.getMonth(), d.getUTCMonth()); + Assert.assertEquals(tbDateTestEntity.getDate(), d.getUTCDate()); + Assert.assertEquals(tbDateTestEntity.getHours(), d.getUTCHours()); + Assert.assertEquals(d.getMinutes(), d.getUTCMinutes()); + Assert.assertEquals(d.getSeconds(), d.getUTCSeconds()); + Assert.assertEquals(d.getMilliseconds(), d.getUTCMilliseconds()); + } } diff --git a/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTestEntity.java b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTestEntity.java new file mode 100644 index 0000000000..3c6c5f56ff --- /dev/null +++ b/common/script/script-api/src/test/java/org/thingsboard/script/api/tbel/TbDateTestEntity.java @@ -0,0 +1,92 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.thingsboard.script.api.tbel; + +import lombok.Data; + +import java.time.chrono.IsoChronology; + +@Data +public class TbDateTestEntity { + private int year; + private int month; + private int date; + private int hours; + public TbDateTestEntity(int year, int month, int date, int hours) { + this.year = year; + this.month = month; + this.date = date; + this.hours = hours; + if (hours > 23) { + if (date == 31) { + this.year++; + this.month = 1; + this.date = 1; + } else { + this.date++; + } + this.hours = hours - 24; + } else if (hours < 0) { + if (month== 1 && date == 1) { + this.year--; + this.month = 12; + this.date = 31; + } else { + this.date--; + } + this.hours = hours + 24; + } + + if (this.date > 28) { + int dom = 31; + switch (month) { + case 2: + dom = IsoChronology.INSTANCE.isLeapYear((long) year) ? 29 : 28; + case 3: + case 5: + case 7: + case 8: + case 10: + default: + break; + case 4: + case 6: + case 9: + case 11: + dom = 30; + } + if (this.date > dom) { + this.date = this.date - dom; + this.month++; + } + } + } + public int getYear(){ + return year < 70 ? 2000 + year : year <= 99 ? 1900 + year : year; + } + + public String geMonthStr(){ + return String.format("%02d", month); + } + + public String geDateStr(){ + return String.format("%02d", date); + } + + public String geHoursStr(){ + return String.format("%02d", hours); + } +} diff --git a/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/AbstractGatewaySessionHandler.java b/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/AbstractGatewaySessionHandler.java index 5cd6ba9145..fd0297203d 100644 --- a/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/AbstractGatewaySessionHandler.java +++ b/common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/session/AbstractGatewaySessionHandler.java @@ -188,7 +188,7 @@ public abstract class AbstractGatewaySessionHandler() { @Override public void onSuccess(@Nullable T result) { ack(msg, ReturnCode.SUCCESS); - log.trace("[{}] onDeviceConnectOk: {}", sessionId, deviceName); + log.trace("[{}][{}][{}] onDeviceConnectOk: [{}]", gateway.getTenantId(), gateway.getDeviceId(), sessionId, deviceName); } @Override public void onFailure(Throwable t) { - log.warn("[{}] Failed to process device connect command: {}", sessionId, deviceName, t); + log.warn("[{}][{}][{}] Failed to process device connect command: [{}]", gateway.getTenantId(), gateway.getDeviceId(), sessionId, deviceName, t); } }, context.getExecutor()); @@ -259,7 +259,7 @@ public abstract class AbstractGatewaySessionHandler checkDeviceConnected(String deviceName) { T ctx = devices.get(deviceName); if (ctx == null) { - log.debug("[{}] Missing device [{}] for the gateway session", sessionId, deviceName); + log.debug("[{}][{}][{}] Missing device [{}] for the gateway session", gateway.getTenantId(), gateway.getDeviceId(), sessionId, deviceName); return onDeviceConnect(deviceName, DEFAULT_DEVICE_TYPE); } else { return Futures.immediateFuture(ctx); @@ -733,7 +733,7 @@ public abstract class AbstractGatewaySessionHandler() { @Override public void onSuccess(Void dummy) { - log.trace("[{}][{}] Published msg: {}", sessionId, deviceName, msg); + log.trace("[{}][{}][{}][{}] Published msg: [{}]", gateway.getTenantId(), gateway.getDeviceId(), sessionId, deviceName, msg); if (msgId > 0) { ctx.writeAndFlush(MqttTransportHandler.createMqttPubAckMsg(deviceSessionCtx, msgId, ReturnCode.SUCCESS)); } @@ -757,7 +757,7 @@ public abstract class AbstractGatewaySessionHandler map = new WeakHashMap<>(); - - String deviceName = new String("device"); //constants are static and doesn't affected by GC, so use new instead - map.put(deviceName, new ReentrantLock()); - assertTrue(map.containsKey(deviceName)); - - deviceName = null; - System.gc(); - - await().atMost(10, TimeUnit.SECONDS).until(() -> !map.containsKey("device")); - } - - @Test - public void givenConcurrentReferenceHashMap_WhenGC_thenMapIsEmpty() { + public void givenGatewaySessionHandler_WhenCreateWeakMap_thenConcurrentReferenceHashMapClass() { GatewaySessionHandler gsh = mock(GatewaySessionHandler.class); willCallRealMethod().given(gsh).createWeakMap(); - ConcurrentMap map = gsh.createWeakMap(); - map.put("device", new ReentrantLock()); - assertTrue(map.containsKey("device")); - - System.gc(); - - await().atMost(10, TimeUnit.SECONDS).until(() -> !map.containsKey("device")); + assertThat(gsh.createWeakMap()).isInstanceOf(ConcurrentReferenceHashMap.class); } -} \ No newline at end of file +} diff --git a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java index bc11570fc1..cc4a1bc3df 100644 --- a/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java +++ b/common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/service/DefaultTransportService.java @@ -53,7 +53,6 @@ import org.thingsboard.server.common.data.limit.LimitedApi; import org.thingsboard.server.common.data.notification.rule.trigger.RateLimitsTrigger; import org.thingsboard.server.common.data.plugin.ComponentLifecycleEvent; import org.thingsboard.server.common.data.msg.TbMsgType; -import org.thingsboard.server.common.data.notification.rule.trigger.RateLimitsTrigger; import org.thingsboard.server.common.data.rpc.RpcStatus; import org.thingsboard.server.common.msg.TbMsg; import org.thingsboard.server.common.msg.TbMsgMetaData; @@ -95,7 +94,7 @@ import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.TbQueueRequestTemplate; import org.thingsboard.server.queue.common.AsyncCallbackTemplate; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.PartitionService; import org.thingsboard.server.queue.discovery.TbServiceInfoProvider; import org.thingsboard.server.queue.provider.TbQueueProducerProvider; @@ -172,7 +171,7 @@ public class DefaultTransportService implements TransportService { private final TbTransportQueueFactory queueProvider; private final TbQueueProducerProvider producerProvider; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final TbServiceInfoProvider serviceInfoProvider; private final StatsFactory statsFactory; private final TransportDeviceProfileCache deviceProfileCache; @@ -207,7 +206,7 @@ public class DefaultTransportService implements TransportService { TbServiceInfoProvider serviceInfoProvider, TbTransportQueueFactory queueProvider, TbQueueProducerProvider producerProvider, - NotificationsTopicService notificationsTopicService, + TopicService topicService, StatsFactory statsFactory, TransportDeviceProfileCache deviceProfileCache, TransportTenantProfileCache tenantProfileCache, @@ -218,7 +217,7 @@ public class DefaultTransportService implements TransportService { this.serviceInfoProvider = serviceInfoProvider; this.queueProvider = queueProvider; this.producerProvider = producerProvider; - this.notificationsTopicService = notificationsTopicService; + this.topicService = topicService; this.statsFactory = statsFactory; this.deviceProfileCache = deviceProfileCache; this.tenantProfileCache = tenantProfileCache; @@ -243,7 +242,7 @@ public class DefaultTransportService implements TransportService { ruleEngineMsgProducer = producerProvider.getRuleEngineMsgProducer(); tbCoreMsgProducer = producerProvider.getTbCoreMsgProducer(); transportNotificationsConsumer = queueProvider.createTransportNotificationsConsumer(); - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, serviceInfoProvider.getServiceId()); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_TRANSPORT, serviceInfoProvider.getServiceId()); transportNotificationsConsumer.subscribe(Collections.singleton(tpi)); transportApiRequestTemplate.init(); mainConsumerExecutor = Executors.newSingleThreadExecutor(ThingsBoardThreadFactory.forName("transport-consumer")); diff --git a/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultClusterVersionControlService.java b/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultClusterVersionControlService.java index ab2dc417ca..e98d49b1dc 100644 --- a/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultClusterVersionControlService.java +++ b/common/version-control/src/main/java/org/thingsboard/server/service/sync/vc/DefaultClusterVersionControlService.java @@ -67,7 +67,7 @@ import org.thingsboard.server.gen.transport.TransportProtos.VersionedEntityInfoP import org.thingsboard.server.queue.TbQueueConsumer; import org.thingsboard.server.queue.TbQueueProducer; import org.thingsboard.server.queue.common.TbProtoQueueMsg; -import org.thingsboard.server.queue.discovery.NotificationsTopicService; +import org.thingsboard.server.queue.discovery.TopicService; import org.thingsboard.server.queue.discovery.PartitionService; import org.thingsboard.server.queue.discovery.TbApplicationEventListener; import org.thingsboard.server.queue.discovery.event.PartitionChangeEvent; @@ -110,7 +110,7 @@ public class DefaultClusterVersionControlService extends TbApplicationEventListe private final TbVersionControlQueueFactory queueFactory; private final DataDecodingEncodingService encodingService; private final GitRepositoryService vcService; - private final NotificationsTopicService notificationsTopicService; + private final TopicService topicService; private final ConcurrentMap tenantRepoLocks = new ConcurrentHashMap<>(); private final Map pendingCommitMap = new HashMap<>(); @@ -520,7 +520,7 @@ public class DefaultClusterVersionControlService extends TbApplicationEventListe } private void reply(VersionControlRequestCtx ctx, Optional e, Function enrichFunction) { - TopicPartitionInfo tpi = notificationsTopicService.getNotificationsTopic(ServiceType.TB_CORE, ctx.getNodeId()); + TopicPartitionInfo tpi = topicService.getNotificationsTopic(ServiceType.TB_CORE, ctx.getNodeId()); VersionControlResponseMsg.Builder builder = VersionControlResponseMsg.newBuilder() .setRequestIdMSB(ctx.getRequestId().getMostSignificantBits()) .setRequestIdLSB(ctx.getRequestId().getLeastSignificantBits()); diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityConfiguration.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityConfiguration.java index 227b531be0..df55eee2e4 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityConfiguration.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityConfiguration.java @@ -25,6 +25,7 @@ import java.util.Map; @Configuration @ConfigurationProperties(prefix = "device") @Data +@Deprecated(since = "3.6.1") public class DeviceConnectivityConfiguration { private Map connectivity = new HashMap<>(); diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityInfo.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityInfo.java index b243be9995..0f8723fcfb 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityInfo.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityInfo.java @@ -22,5 +22,4 @@ public class DeviceConnectivityInfo { private boolean enabled; private String host; private String port; - private String pemCertFile; } diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityServiceImpl.java index 28d8f20b81..9f67093529 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceConnectivityServiceImpl.java @@ -18,14 +18,16 @@ package org.thingsboard.server.dao.device; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.bouncycastle.cert.X509CertificateHolder; import org.bouncycastle.openssl.PEMParser; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.Resource; import org.springframework.stereotype.Service; import org.thingsboard.common.util.JacksonUtil; +import org.thingsboard.server.common.data.AdminSettings; import org.thingsboard.server.common.data.Device; import org.thingsboard.server.common.data.DeviceProfile; import org.thingsboard.server.common.data.DeviceTransportType; @@ -33,11 +35,12 @@ import org.thingsboard.server.common.data.ResourceUtils; import org.thingsboard.server.common.data.StringUtils; import org.thingsboard.server.common.data.device.profile.MqttDeviceProfileTransportConfiguration; import org.thingsboard.server.common.data.id.DeviceId; +import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.security.DeviceCredentials; import org.thingsboard.server.common.data.security.DeviceCredentialsType; +import org.thingsboard.server.dao.settings.AdminSettingsService; import org.thingsboard.server.dao.util.DeviceConnectivityUtil; -import javax.annotation.PostConstruct; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URI; @@ -64,6 +67,7 @@ import static org.thingsboard.server.dao.util.DeviceConnectivityUtil.WINDOWS; @Service("DeviceConnectivityDaoService") @Slf4j +@RequiredArgsConstructor public class DeviceConnectivityServiceImpl implements DeviceConnectivityService { public static final String INCORRECT_TENANT_ID = "Incorrect tenantId "; @@ -74,26 +78,12 @@ public class DeviceConnectivityServiceImpl implements DeviceConnectivityService private final Map certs = new ConcurrentHashMap<>(); - @Autowired - private DeviceCredentialsService deviceCredentialsService; + private final DeviceCredentialsService deviceCredentialsService; + private final DeviceProfileService deviceProfileService; + private final AdminSettingsService adminSettingsService; - @Autowired - private DeviceProfileService deviceProfileService; - - @Autowired - private DeviceConnectivityConfiguration deviceConnectivityConfiguration; - - @PostConstruct - private void init() { - DeviceConnectivityInfo mqtts = deviceConnectivityConfiguration.getConnectivity(MQTTS); - if (mqtts != null && mqtts.isEnabled()) { - String certFilePath = mqtts.getPemCertFile(); - if (StringUtils.isBlank(certFilePath) || !ResourceUtils.resourceExists(this, certFilePath)) { - String error = StringUtils.isBlank(certFilePath) ? "path is empty" : "file is not exists"; - log.error("MQTTS is enabled but cert {}!", error); - } - } - } + @Value("${device.connectivity.mqtts.pem_cert_file:}") + private String mqttsPemCertFile; @Override public JsonNode findDevicePublishTelemetryCommands(String baseUrl, Device device) throws URISyntaxException { @@ -149,11 +139,11 @@ public class DeviceConnectivityServiceImpl implements DeviceConnectivityService DeviceCredentials creds = deviceCredentialsService.findDeviceCredentialsByDeviceId(device.getTenantId(), deviceId); ObjectNode commands = JacksonUtil.newObjectNode(); - if (deviceConnectivityConfiguration.isEnabled(MQTT)) { + if (isEnabled(MQTT)) { Optional.ofNullable(getGatewayDockerCommands(baseUrl, creds, MQTT)) .ifPresent(v -> commands.set(MQTT, v)); } - if (deviceConnectivityConfiguration.isEnabled(MQTTS)) { + if (isEnabled(MQTTS)) { Optional.ofNullable(getGatewayDockerCommands(baseUrl, creds, MQTTS)) .ifPresent(v -> commands.set(MQTTS, v)); } @@ -163,15 +153,15 @@ public class DeviceConnectivityServiceImpl implements DeviceConnectivityService @Override public Resource getPemCertFile(String protocol) { return certs.computeIfAbsent(protocol, key -> { - DeviceConnectivityInfo connectivity = deviceConnectivityConfiguration.getConnectivity(protocol); - if (connectivity == null) { + DeviceConnectivityInfo connectivity = getConnectivity(protocol); + if (!MQTTS.equals(protocol) || connectivity == null) { log.warn("Unknown connectivity protocol: {}", protocol); return null; } - String certFilePath = connectivity.getPemCertFile(); - if (StringUtils.isNotBlank(certFilePath) && ResourceUtils.resourceExists(this, certFilePath)) { + + if (StringUtils.isNotBlank(mqttsPemCertFile) && ResourceUtils.resourceExists(this, mqttsPemCertFile)) { try { - return getCert(certFilePath); + return getCert(mqttsPemCertFile); } catch (Exception e) { String msg = String.format("Failed to read %s server certificate!", protocol); log.warn(msg); @@ -183,6 +173,20 @@ public class DeviceConnectivityServiceImpl implements DeviceConnectivityService }); } + private DeviceConnectivityInfo getConnectivity(String protocol) { + AdminSettings connectivitySettings = adminSettingsService.findAdminSettingsByKey(TenantId.SYS_TENANT_ID, "connectivity"); + JsonNode connectivity; + if (connectivitySettings != null && (connectivity = connectivitySettings.getJsonValue()) != null) { + return JacksonUtil.convertValue(connectivity.get(protocol), DeviceConnectivityInfo.class); + } + return null; + } + + public boolean isEnabled(String protocol) { + var info = getConnectivity(protocol); + return info != null && info.isEnabled(); + } + private Resource getCert(String path) throws Exception { StringBuilder pemContentBuilder = new StringBuilder(); @@ -221,7 +225,7 @@ public class DeviceConnectivityServiceImpl implements DeviceConnectivityService } private String getHttpPublishCommand(String protocol, String baseUrl, DeviceCredentials deviceCredentials) throws URISyntaxException { - DeviceConnectivityInfo properties = deviceConnectivityConfiguration.getConnectivity(protocol); + DeviceConnectivityInfo properties = getConnectivity(protocol); if (properties == null || !properties.isEnabled() || deviceCredentials.getCredentialsType() != DeviceCredentialsType.ACCESS_TOKEN) { return null; @@ -247,7 +251,7 @@ public class DeviceConnectivityServiceImpl implements DeviceConnectivityService ObjectNode dockerMqttCommands = JacksonUtil.newObjectNode(); - if (deviceConnectivityConfiguration.isEnabled(MQTT)) { + if (isEnabled(MQTT)) { Optional.ofNullable(getMqttPublishCommand(baseUrl, topic, deviceCredentials)). ifPresent(v -> mqttCommands.put(MQTT, v)); @@ -255,7 +259,7 @@ public class DeviceConnectivityServiceImpl implements DeviceConnectivityService .ifPresent(v -> dockerMqttCommands.put(MQTT, v)); } - if (deviceConnectivityConfiguration.isEnabled(MQTTS)) { + if (isEnabled(MQTTS)) { List mqttsPublishCommand = getMqttsPublishCommand(baseUrl, topic, deviceCredentials); if (mqttsPublishCommand != null) { ArrayNode arrayNode = mqttCommands.putArray(MQTTS); @@ -273,14 +277,14 @@ public class DeviceConnectivityServiceImpl implements DeviceConnectivityService } private String getMqttPublishCommand(String baseUrl, String deviceTelemetryTopic, DeviceCredentials deviceCredentials) throws URISyntaxException { - DeviceConnectivityInfo properties = deviceConnectivityConfiguration.getConnectivity(MQTT); + DeviceConnectivityInfo properties = getConnectivity(MQTT); String mqttHost = getHost(baseUrl, properties); String mqttPort = properties.getPort().isEmpty() ? null : properties.getPort(); return DeviceConnectivityUtil.getMqttPublishCommand(MQTT, mqttHost, mqttPort, deviceTelemetryTopic, deviceCredentials); } private List getMqttsPublishCommand(String baseUrl, String deviceTelemetryTopic, DeviceCredentials deviceCredentials) throws URISyntaxException { - DeviceConnectivityInfo properties = deviceConnectivityConfiguration.getConnectivity(MQTTS); + DeviceConnectivityInfo properties = getConnectivity(MQTTS); String mqttHost = getHost(baseUrl, properties); String mqttPort = properties.getPort().isEmpty() ? null : properties.getPort(); String pubCommand = DeviceConnectivityUtil.getMqttPublishCommand(MQTTS, mqttHost, mqttPort, deviceTelemetryTopic, deviceCredentials); @@ -296,7 +300,7 @@ public class DeviceConnectivityServiceImpl implements DeviceConnectivityService private JsonNode getGatewayDockerCommands(String baseUrl, DeviceCredentials deviceCredentials, String mqttType) throws URISyntaxException { ObjectNode dockerLaunchCommands = JacksonUtil.newObjectNode(); - DeviceConnectivityInfo properties = deviceConnectivityConfiguration.getConnectivity().get(mqttType); + DeviceConnectivityInfo properties = getConnectivity(mqttType); String mqttHost = getHost(baseUrl, properties); String mqttPort = properties.getPort().isEmpty() ? null : properties.getPort(); Optional.ofNullable(DeviceConnectivityUtil.getGatewayLaunchCommand(LINUX, mqttHost, mqttPort, deviceCredentials)) @@ -307,7 +311,7 @@ public class DeviceConnectivityServiceImpl implements DeviceConnectivityService } private String getDockerMqttPublishCommand(String protocol, String baseUrl, String deviceTelemetryTopic, DeviceCredentials deviceCredentials) throws URISyntaxException { - DeviceConnectivityInfo properties = deviceConnectivityConfiguration.getConnectivity(protocol); + DeviceConnectivityInfo properties = getConnectivity(protocol); String mqttHost = getHost(baseUrl, properties); String mqttPort = properties.getPort().isEmpty() ? null : properties.getPort(); return DeviceConnectivityUtil.getDockerMqttPublishCommand(protocol, baseUrl, mqttHost, mqttPort, deviceTelemetryTopic, deviceCredentials); @@ -323,7 +327,7 @@ public class DeviceConnectivityServiceImpl implements DeviceConnectivityService ObjectNode dockerCoapCommands = JacksonUtil.newObjectNode(); - if (deviceConnectivityConfiguration.isEnabled(COAP)) { + if (isEnabled(COAP)) { Optional.ofNullable(getCoapPublishCommand(COAP, baseUrl, deviceCredentials)) .ifPresent(v -> coapCommands.put(COAP, v)); @@ -331,7 +335,7 @@ public class DeviceConnectivityServiceImpl implements DeviceConnectivityService .ifPresent(v -> dockerCoapCommands.put(COAP, v)); } - if (deviceConnectivityConfiguration.isEnabled(COAPS)) { + if (isEnabled(COAPS)) { Optional.ofNullable(getCoapPublishCommand(COAPS, baseUrl, deviceCredentials)) .ifPresent(v -> coapCommands.put(COAPS, v)); @@ -347,14 +351,14 @@ public class DeviceConnectivityServiceImpl implements DeviceConnectivityService } private String getCoapPublishCommand(String protocol, String baseUrl, DeviceCredentials deviceCredentials) throws URISyntaxException { - DeviceConnectivityInfo properties = deviceConnectivityConfiguration.getConnectivity(protocol); + DeviceConnectivityInfo properties = getConnectivity(protocol); String hostName = getHost(baseUrl, properties); String port = properties.getPort().isEmpty() ? "" : ":" + properties.getPort(); return DeviceConnectivityUtil.getCoapPublishCommand(protocol, hostName, port, deviceCredentials); } private String getDockerCoapPublishCommand(String protocol, String baseUrl, DeviceCredentials deviceCredentials) throws URISyntaxException { - DeviceConnectivityInfo properties = deviceConnectivityConfiguration.getConnectivity(protocol); + DeviceConnectivityInfo properties = getConnectivity(protocol); String host = getHost(baseUrl, properties); String port = properties.getPort().isEmpty() ? "" : ":" + properties.getPort(); return DeviceConnectivityUtil.getDockerCoapPublishCommand(protocol, host, port, deviceCredentials); diff --git a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java index 36850c7b7a..1d8935da44 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/device/DeviceCredentialsServiceImpl.java @@ -82,7 +82,7 @@ public class DeviceCredentialsServiceImpl extends AbstractCachedEntityService deviceCredentialsDao.findByCredentialsId(TenantId.SYS_TENANT_ID, credentialsId), - false); + true); // caching null values is essential for permanently invalid requests } @Override diff --git a/dao/src/main/java/org/thingsboard/server/dao/edge/DefaultEdgeSynchronizationManager.java b/dao/src/main/java/org/thingsboard/server/dao/edge/DefaultEdgeSynchronizationManager.java index 59fd2326d8..3d7c48efbd 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/edge/DefaultEdgeSynchronizationManager.java +++ b/dao/src/main/java/org/thingsboard/server/dao/edge/DefaultEdgeSynchronizationManager.java @@ -18,17 +18,12 @@ package org.thingsboard.server.dao.edge; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import org.thingsboard.server.common.data.id.EdgeId; @Component @Slf4j public class DefaultEdgeSynchronizationManager implements EdgeSynchronizationManager { @Getter - private final ThreadLocal sync = new ThreadLocal<>(); - - @Override - public boolean isSync() { - Boolean sync = this.sync.get(); - return sync != null && sync; - } + private final ThreadLocal edgeId = new ThreadLocal<>(); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/eventsourcing/DeleteEntityEvent.java b/dao/src/main/java/org/thingsboard/server/dao/eventsourcing/DeleteEntityEvent.java index 7d0499e8aa..7c4caa9618 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/eventsourcing/DeleteEntityEvent.java +++ b/dao/src/main/java/org/thingsboard/server/dao/eventsourcing/DeleteEntityEvent.java @@ -26,7 +26,6 @@ import org.thingsboard.server.common.data.id.TenantId; public class DeleteEntityEvent { private final TenantId tenantId; private final EntityId entityId; - private final EdgeId edgeId; private final T entity; @Builder.Default diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java index c5f6d839a0..1bbc978438 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/ModelConstants.java @@ -302,6 +302,7 @@ public class ModelConstants { public static final String WIDGETS_BUNDLE_TITLE_PROPERTY = TITLE_PROPERTY; public static final String WIDGETS_BUNDLE_IMAGE_PROPERTY = "image"; public static final String WIDGETS_BUNDLE_DESCRIPTION = "description"; + public static final String WIDGETS_BUNDLE_ORDER = "widgets_bundle_order"; /** * Widget_type constants. diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java index fedfa1471d..baa1140803 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java +++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/WidgetsBundleEntity.java @@ -50,6 +50,9 @@ public final class WidgetsBundleEntity extends BaseSqlEntity { @Column(name = ModelConstants.WIDGETS_BUNDLE_DESCRIPTION) private String description; + @Column(name = ModelConstants.WIDGETS_BUNDLE_ORDER) + private Integer order; + @Column(name = ModelConstants.EXTERNAL_ID_PROPERTY) private UUID externalId; @@ -69,6 +72,7 @@ public final class WidgetsBundleEntity extends BaseSqlEntity { this.title = widgetsBundle.getTitle(); this.image = widgetsBundle.getImage(); this.description = widgetsBundle.getDescription(); + this.order = widgetsBundle.getOrder(); if (widgetsBundle.getExternalId() != null) { this.externalId = widgetsBundle.getExternalId().getId(); } @@ -85,6 +89,7 @@ public final class WidgetsBundleEntity extends BaseSqlEntity { widgetsBundle.setTitle(title); widgetsBundle.setImage(image); widgetsBundle.setDescription(description); + widgetsBundle.setOrder(order); if (externalId != null) { widgetsBundle.setExternalId(new WidgetsBundleId(externalId)); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java b/dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java index 5585580a8a..af0a9e47a5 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java +++ b/dao/src/main/java/org/thingsboard/server/dao/resource/BaseResourceService.java @@ -37,6 +37,8 @@ import org.thingsboard.server.common.data.id.TenantId; import org.thingsboard.server.common.data.page.PageData; import org.thingsboard.server.common.data.page.PageLink; import org.thingsboard.server.dao.entity.AbstractCachedEntityService; +import org.thingsboard.server.dao.eventsourcing.DeleteEntityEvent; +import org.thingsboard.server.dao.eventsourcing.SaveEntityEvent; import org.thingsboard.server.dao.exception.DataValidationException; import org.thingsboard.server.dao.service.PaginatedRemover; import org.thingsboard.server.dao.service.Validator; @@ -60,10 +62,12 @@ public class BaseResourceService extends AbstractCachedEntityService findAllTenantResources(TenantId tenantId, PageLink pageLink) { + log.trace("Executing findAllTenantResources [{}][{}]", tenantId, pageLink); + validateId(tenantId, INCORRECT_TENANT_ID + tenantId); + return resourceDao.findAllByTenantId(tenantId, pageLink); + } + @Override public PageData findTenantResourcesByResourceTypeAndPageLink(TenantId tenantId, ResourceType resourceType, PageLink pageLink) { log.trace("Executing findTenantResourcesByResourceTypeAndPageLink [{}][{}][{}]", tenantId, resourceType, pageLink); diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceCredentialsDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceCredentialsDao.java index 2b07b0518e..80ea66d5bd 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceCredentialsDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/device/JpaDeviceCredentialsDao.java @@ -15,6 +15,7 @@ */ package org.thingsboard.server.dao.sql.device; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Component; @@ -33,6 +34,7 @@ import java.util.UUID; /** * Created by Valerii Sosliuk on 5/6/2017. */ +@Slf4j @Component @SqlDao public class JpaDeviceCredentialsDao extends JpaAbstractDao implements DeviceCredentialsDao { @@ -65,6 +67,7 @@ public class JpaDeviceCredentialsDao extends JpaAbstractDao findAllTenantWidgetsBundlesByTenantId(UUID tenantId, boolean fullSearch, PageLink pageLink) { + return findTenantWidgetsBundlesByTenantIds(Arrays.asList(tenantId, NULL_UUID), fullSearch, pageLink); + } + + @Override + public PageData findTenantWidgetsBundlesByTenantId(UUID tenantId, boolean fullSearch, PageLink pageLink) { + return findTenantWidgetsBundlesByTenantIds(Collections.singletonList(tenantId), fullSearch, pageLink); + } + + private PageData findTenantWidgetsBundlesByTenantIds(List tenantIds, boolean fullSearch, PageLink pageLink) { if (fullSearch) { return DaoUtil.toPageData( widgetsBundleRepository - .findAllTenantWidgetsBundlesByTenantIdFullSearch( - tenantId, - NULL_UUID, + .findAllTenantWidgetsBundlesByTenantIdsFullSearch( + tenantIds, pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } else { return DaoUtil.toPageData( widgetsBundleRepository - .findAllTenantWidgetsBundlesByTenantId( - tenantId, - NULL_UUID, + .findAllTenantWidgetsBundlesByTenantIds( + tenantIds, pageLink.getTextSearch(), DaoUtil.toPageable(pageLink))); } diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetTypeInfoRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetTypeInfoRepository.java index f3f3bf5139..f9114a9e40 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetTypeInfoRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetTypeInfoRepository.java @@ -33,14 +33,29 @@ public interface WidgetTypeInfoRepository extends JpaRepository findSystemWidgetTypes(@Param("systemTenantId") UUID systemTenantId, @Param("searchText") String searchText, @@ -57,13 +72,29 @@ public interface WidgetTypeInfoRepository extends JpaRepository findAllTenantWidgetTypesByTenantId(@Param("tenantId") UUID tenantId, @Param("nullTenantId") UUID nullTenantId, @@ -81,13 +112,29 @@ public interface WidgetTypeInfoRepository extends JpaRepository findTenantWidgetTypesByTenantId(@Param("tenantId") UUID tenantId, @Param("searchText") String searchText, @@ -111,7 +158,15 @@ public interface WidgetTypeInfoRepository extends JpaRepository findWidgetTypesInfosByWidgetsBundleId(@Param("widgetsBundleId") UUID widgetsBundleId, @Param("searchText") String searchText, diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java index 53bda50ba4..9db39aab8f 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java +++ b/dao/src/main/java/org/thingsboard/server/dao/sql/widget/WidgetsBundleRepository.java @@ -23,6 +23,7 @@ import org.springframework.data.repository.query.Param; import org.thingsboard.server.dao.ExportableEntityRepository; import org.thingsboard.server.dao.model.sql.WidgetsBundleEntity; +import java.util.List; import java.util.UUID; /** @@ -40,21 +41,37 @@ public interface WidgetsBundleRepository extends JpaRepository findSystemWidgetsBundlesFullSearch(@Param("systemTenantId") UUID systemTenantId, @Param("textSearch") String textSearch, @@ -66,33 +83,48 @@ public interface WidgetsBundleRepository extends JpaRepository findAllTenantWidgetsBundlesByTenantId(@Param("tenantId") UUID tenantId, - @Param("nullTenantId") UUID nullTenantId, + Page findAllTenantWidgetsBundlesByTenantIds(@Param("tenantIds") List tenantIds, @Param("textSearch") String textSearch, Pageable pageable); @Query(nativeQuery = true, - value = "SELECT * FROM widgets_bundle wb WHERE wb.tenant_id IN (:tenantId, :nullTenantId) " + - "AND (wb.title ILIKE CONCAT('%', :textSearch, '%') " + + value = "SELECT * FROM widgets_bundle wb WHERE wb.tenant_id IN (:tenantIds) " + + "AND (:textSearch IS NULL OR wb.title ILIKE CONCAT('%', :textSearch, '%') " + "OR wb.description ILIKE CONCAT('%', :textSearch, '%') " + "OR wb.id in (SELECT wbw.widgets_bundle_id FROM widgets_bundle_widget wbw, widget_type wtd " + "WHERE wtd.id = wbw.widget_type_id " + - "AND (wtd.name ILIKE CONCAT('%', :textSearch, '%') " + + "AND (:textSearch IS NULL OR wtd.name ILIKE CONCAT('%', :textSearch, '%') " + "OR wtd.description ILIKE CONCAT('%', :textSearch, '%') " + - "OR lower(wtd.tags\\:\\:text)\\:\\:text[] && string_to_array(lower(:textSearch), ' '))))", - countQuery = "SELECT count(*) FROM widgets_bundle wb WHERE wb.tenant_id IN (:tenantId, :nullTenantId) " + - "AND (wb.title ILIKE CONCAT('%', :textSearch, '%') " + + "OR EXISTS (" + + "SELECT 1 " + + "FROM unnest(wtd.tags) AS currentTag " + + "WHERE :textSearch ILIKE '%' || currentTag || '%' " + + "AND (length(:textSearch) = length(currentTag) " + + "OR :textSearch ILIKE currentTag || ' %' " + + "OR :textSearch ILIKE '% ' || currentTag " + + "OR :textSearch ILIKE '% ' || currentTag || ' %')" + + ")))) " + + "ORDER BY wb.widgets_bundle_order ASC NULLS LAST", + countQuery = "SELECT count(*) FROM widgets_bundle wb WHERE wb.tenant_id IN (:tenantIds) " + + "AND (:textSearch IS NULL OR wb.title ILIKE CONCAT('%', :textSearch, '%') " + "OR wb.description ILIKE CONCAT('%', :textSearch, '%') " + "OR wb.id in (SELECT wbw.widgets_bundle_id FROM widgets_bundle_widget wbw, widget_type wtd " + "WHERE wtd.id = wbw.widget_type_id " + - "AND (wtd.name ILIKE CONCAT('%', :textSearch, '%') " + + "AND (:textSearch IS NULL OR wtd.name ILIKE CONCAT('%', :textSearch, '%') " + "OR wtd.description ILIKE CONCAT('%', :textSearch, '%') " + - "OR lower(wtd.tags\\:\\:text)\\:\\:text[] && string_to_array(lower(:textSearch), ' '))))" + "OR EXISTS (" + + "SELECT 1 " + + "FROM unnest(wtd.tags) AS currentTag " + + "WHERE :textSearch ILIKE '%' || currentTag || '%' " + + "AND (length(:textSearch) = length(currentTag) " + + "OR :textSearch ILIKE currentTag || ' %' " + + "OR :textSearch ILIKE '% ' || currentTag " + + "OR :textSearch ILIKE '% ' || currentTag || ' %')" + + "))))" ) - Page findAllTenantWidgetsBundlesByTenantIdFullSearch(@Param("tenantId") UUID tenantId, - @Param("nullTenantId") UUID nullTenantId, + Page findAllTenantWidgetsBundlesByTenantIdsFullSearch(@Param("tenantIds") List tenantIds, @Param("textSearch") String textSearch, Pageable pageable); diff --git a/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleDao.java b/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleDao.java index b5486b61b1..9e0d70dcd8 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleDao.java +++ b/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleDao.java @@ -74,5 +74,14 @@ public interface WidgetsBundleDao extends Dao, ExportableEntityDa */ PageData findAllTenantWidgetsBundlesByTenantId(UUID tenantId, boolean fullSearch, PageLink pageLink); + /** + * Find all tenant widgets bundles (does not include system) by tenantId and page link. + * + * @param tenantId the tenantId + * @param pageLink the page link + * @return the list of widgets bundles objects + */ + PageData findTenantWidgetsBundlesByTenantId(UUID tenantId, boolean fullSearch, PageLink pageLink); + } diff --git a/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java b/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java index 998cbb6e31..87a507873d 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java +++ b/dao/src/main/java/org/thingsboard/server/dao/widget/WidgetsBundleServiceImpl.java @@ -142,6 +142,14 @@ public class WidgetsBundleServiceImpl implements WidgetsBundleService { return widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId.getId(), fullSearch, pageLink); } + @Override + public PageData findTenantWidgetsBundlesByTenantIdAndPageLink(TenantId tenantId, boolean fullSearch, PageLink pageLink) { + log.trace("Executing findTenantWidgetsBundlesByTenantIdAndPageLink, tenantId [{}], fullSearch [{}], pageLink [{}]", tenantId, fullSearch, pageLink); + Validator.validateId(tenantId, INCORRECT_TENANT_ID + tenantId); + Validator.validatePageLink(pageLink); + return widgetsBundleDao.findTenantWidgetsBundlesByTenantId(tenantId.getId(), fullSearch, pageLink); + } + @Override public List findAllTenantWidgetsBundlesByTenantId(TenantId tenantId) { log.trace("Executing findAllTenantWidgetsBundlesByTenantId, tenantId [{}]", tenantId); diff --git a/dao/src/main/resources/sql/schema-entities.sql b/dao/src/main/resources/sql/schema-entities.sql index 89052c952b..06af032f6b 100644 --- a/dao/src/main/resources/sql/schema-entities.sql +++ b/dao/src/main/resources/sql/schema-entities.sql @@ -503,6 +503,7 @@ CREATE TABLE IF NOT EXISTS widgets_bundle ( title varchar(255), image varchar(1000000), description varchar(1024), + widgets_bundle_order int, external_id uuid, CONSTRAINT uq_widgets_bundle_alias UNIQUE (tenant_id, alias), CONSTRAINT widgets_bundle_external_id_unq_key UNIQUE (tenant_id, external_id) diff --git a/dao/src/test/java/org/thingsboard/server/dao/service/DeviceCredentialsCacheTest.java b/dao/src/test/java/org/thingsboard/server/dao/service/DeviceCredentialsCacheTest.java index 44119af87a..000ab3728b 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/service/DeviceCredentialsCacheTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/service/DeviceCredentialsCacheTest.java @@ -127,10 +127,10 @@ public class DeviceCredentialsCacheTest extends AbstractServiceTest { when(deviceCredentialsDao.findByCredentialsId(SYSTEM_TENANT_ID, CREDENTIALS_ID_1)).thenReturn(null); - deviceCredentialsService.findDeviceCredentialsByCredentialsId(CREDENTIALS_ID_1); - deviceCredentialsService.findDeviceCredentialsByCredentialsId(CREDENTIALS_ID_1); + deviceCredentialsService.findDeviceCredentialsByCredentialsId(CREDENTIALS_ID_1); // cache miss, DB read (not found), Cache put null value + deviceCredentialsService.findDeviceCredentialsByCredentialsId(CREDENTIALS_ID_1); // cache hit (null value, credentials not found) - verify(deviceCredentialsDao, times(3)).findByCredentialsId(SYSTEM_TENANT_ID, CREDENTIALS_ID_1); + verify(deviceCredentialsDao, times(2)).findByCredentialsId(SYSTEM_TENANT_ID, CREDENTIALS_ID_1); } private DeviceCredentialsService unwrapDeviceCredentialsService() throws Exception { diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDaoTest.java index 7f4b2c6cfa..e6d46bb942 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetTypeDaoTest.java @@ -41,8 +41,10 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.UUID; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -51,6 +53,26 @@ import static org.junit.Assert.assertNotNull; */ public class JpaWidgetTypeDaoTest extends AbstractJpaDaoTest { + // given search text should find a widget with tags, when searching by tags + final Map SHOULD_FIND_SEARCH_TO_TAGS_MAP = Map.of( + "A", new String[]{"a", "b", "c"}, + "test A test", new String[]{"a", "b", "c"}, + "test x y test", new String[]{"x y", "b", "c"}, + "x y test", new String[]{"x y", "b", "c"}, + "x y", new String[]{"x y", "b", "c"}, + "test x y", new String[]{"x y", "b", "c"} + ); + + // given search text should not find a widget with tags, when searching by tags + final Map SHOULDNT_FIND_SEARCH_TO_TAGS_MAP = Map.of( + "testA test", new String[]{"a", "b", "c"}, + "testx y test", new String[]{"x y", "b", "c"}, + "testx ytest", new String[]{"x y", "b", "c"}, + "x ytest", new String[]{"x y", "b", "c"}, + "testx y", new String[]{"x y", "b", "c"}, + "x", new String[]{"x y", "b", "c"} + ); + final String BUNDLE_ALIAS = "BUNDLE_ALIAS"; final int WIDGET_TYPE_COUNT = 3; List widgetTypeList; @@ -96,6 +118,19 @@ public class JpaWidgetTypeDaoTest extends AbstractJpaDaoTest { return widgetTypeDao.save(TenantId.SYS_TENANT_ID, widgetType); } + WidgetTypeDetails createAndSaveWidgetType(TenantId tenantId, int number, String[] tags) { + WidgetTypeDetails widgetType = new WidgetTypeDetails(); + widgetType.setTenantId(tenantId); + widgetType.setName("WIDGET_TYPE_" + number); + widgetType.setDescription("WIDGET_TYPE_DESCRIPTION" + number); + widgetType.setFqn("FQN_" + number); + var descriptor = JacksonUtil.newObjectNode(); + descriptor.put("type", number % 2 == 0 ? "latest" : "static"); + widgetType.setDescriptor(descriptor); + widgetType.setTags(tags); + return widgetTypeDao.save(TenantId.SYS_TENANT_ID, widgetType); + } + @After public void tearDown() { widgetsBundleDao.removeById(TenantId.SYS_TENANT_ID, widgetsBundle.getUuidId()); @@ -123,6 +158,40 @@ public class JpaWidgetTypeDaoTest extends AbstractJpaDaoTest { assertEquals(new WidgetTypeInfo(widgetTypeList.get(2)), widgetTypes.getData().get(0)); } + @Test + public void testTagsSearchInFindBySystemWidgetTypes() { + for (var entry : SHOULD_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetTypeDetails savedWidgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, WIDGET_TYPE_COUNT + 1, tags); + + PageData widgetTypes = widgetTypeDao.findSystemWidgetTypes( + TenantId.SYS_TENANT_ID, true, DeprecatedFilter.ALL, null, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(1); + assertThat(widgetTypes.getData().get(0).getId()).isEqualTo(savedWidgetType.getId()); + + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, savedWidgetType.getUuidId()); + } + + for (var entry : SHOULDNT_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetTypeDetails savedWidgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, WIDGET_TYPE_COUNT + 1, tags); + + PageData widgetTypes = widgetTypeDao.findSystemWidgetTypes( + TenantId.SYS_TENANT_ID, true, DeprecatedFilter.ALL, null, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(0); + + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, savedWidgetType.getUuidId()); + } + } + @Test public void testFindTenantWidgetTypesByTenantId() { UUID tenantId = Uuids.timeBased(); @@ -138,6 +207,74 @@ public class JpaWidgetTypeDaoTest extends AbstractJpaDaoTest { assertEquals(new WidgetTypeInfo(widgetTypeList.get(5)), widgetTypes.getData().get(2)); } + @Test + public void testTagsSearchInFindTenantWidgetTypesByTenantId() { + for (var entry : SHOULD_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetTypeDetails savedWidgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, WIDGET_TYPE_COUNT + 1, tags); + + PageData widgetTypes = widgetTypeDao.findTenantWidgetTypesByTenantId( + TenantId.SYS_TENANT_ID.getId(), true, DeprecatedFilter.ALL, null, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(1); + assertThat(widgetTypes.getData().get(0).getId()).isEqualTo(savedWidgetType.getId()); + + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, savedWidgetType.getUuidId()); + } + + for (var entry : SHOULDNT_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetTypeDetails savedWidgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, WIDGET_TYPE_COUNT + 1, tags); + + PageData widgetTypes = widgetTypeDao.findTenantWidgetTypesByTenantId( + TenantId.SYS_TENANT_ID.getId(), true, DeprecatedFilter.ALL, null, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(0); + + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, savedWidgetType.getUuidId()); + } + } + + @Test + public void testTagsSearchInFindAllTenantWidgetTypesByTenantId() { + for (var entry : SHOULD_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetTypeDetails savedWidgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, WIDGET_TYPE_COUNT + 1, tags); + + PageData widgetTypes = widgetTypeDao.findAllTenantWidgetTypesByTenantId( + TenantId.SYS_TENANT_ID.getId(), true, DeprecatedFilter.ALL, null, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(1); + assertThat(widgetTypes.getData().get(0).getId()).isEqualTo(savedWidgetType.getId()); + + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, savedWidgetType.getUuidId()); + } + + for (var entry : SHOULDNT_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetTypeDetails savedWidgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, WIDGET_TYPE_COUNT + 1, tags); + + PageData widgetTypes = widgetTypeDao.findAllTenantWidgetTypesByTenantId( + TenantId.SYS_TENANT_ID.getId(), true, DeprecatedFilter.ALL, null, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(0); + + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, savedWidgetType.getUuidId()); + } + } + @Test public void testFindByWidgetTypeInfosByBundleId() { PageData widgetTypes = widgetTypeDao.findWidgetTypesInfosByWidgetsBundleId(TenantId.SYS_TENANT_ID.getId(), widgetsBundle.getUuidId(),true, DeprecatedFilter.ALL, Collections.singletonList("latest"), @@ -152,6 +289,42 @@ public class JpaWidgetTypeDaoTest extends AbstractJpaDaoTest { assertEquals(new WidgetTypeInfo(widgetTypeList.get(0)), widgetTypes.getData().get(0)); } + @Test + public void testTagsSearchInFindByWidgetTypeInfosByBundleId() { + for (var entry : SHOULD_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetTypeDetails savedWidgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, WIDGET_TYPE_COUNT + 1, tags); + widgetTypeDao.saveWidgetsBundleWidget(new WidgetsBundleWidget(this.widgetsBundle.getId(), savedWidgetType.getId(), WIDGET_TYPE_COUNT + 1)); + + PageData widgetTypes = widgetTypeDao.findWidgetTypesInfosByWidgetsBundleId( + TenantId.SYS_TENANT_ID.getId(), widgetsBundle.getUuidId(), true, DeprecatedFilter.ALL, null, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(1); + assertThat(widgetTypes.getData().get(0).getId()).isEqualTo(savedWidgetType.getId()); + + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, savedWidgetType.getUuidId()); + } + + for (var entry : SHOULDNT_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetTypeDetails savedWidgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, WIDGET_TYPE_COUNT + 1, tags); + widgetTypeDao.saveWidgetsBundleWidget(new WidgetsBundleWidget(this.widgetsBundle.getId(), savedWidgetType.getId(), WIDGET_TYPE_COUNT + 1)); + + PageData widgetTypes = widgetTypeDao.findWidgetTypesInfosByWidgetsBundleId( + TenantId.SYS_TENANT_ID.getId(), widgetsBundle.getUuidId(), true, DeprecatedFilter.ALL, null, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(0); + + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, savedWidgetType.getUuidId()); + } + } + @Test public void testFindByTenantIdAndFqn() { WidgetType result = widgetTypeList.get(0); diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java index 424bda88f7..08ad0df630 100644 --- a/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java +++ b/dao/src/test/java/org/thingsboard/server/dao/sql/widget/JpaWidgetsBundleDaoTest.java @@ -36,16 +36,36 @@ import org.thingsboard.server.dao.widget.WidgetsBundleDao; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; -/** - * Created by Valerii Sosliuk on 4/23/2017. - */ public class JpaWidgetsBundleDaoTest extends AbstractJpaDaoTest { + + // given search text should find a widget with tags, when searching by tags + final Map SHOULD_FIND_SEARCH_TO_TAGS_MAP = Map.of( + "A", new String[]{"a", "b", "c"}, + "test A test", new String[]{"a", "b", "c"}, + "test x y test", new String[]{"x y", "b", "c"}, + "x y test", new String[]{"x y", "b", "c"}, + "x y", new String[]{"x y", "b", "c"}, + "test x y", new String[]{"x y", "b", "c"} + ); + + // given search text should not find a widget with tags, when searching by tags + final Map SHOULDNT_FIND_SEARCH_TO_TAGS_MAP = Map.of( + "testA test", new String[]{"a", "b", "c"}, + "testx y test", new String[]{"x y", "b", "c"}, + "testx ytest", new String[]{"x y", "b", "c"}, + "x ytest", new String[]{"x y", "b", "c"}, + "testx y", new String[]{"x y", "b", "c"}, + "x", new String[]{"x y", "b", "c"} + ); + List widgetsBundles; List widgetTypeList; @@ -140,6 +160,51 @@ public class JpaWidgetsBundleDaoTest extends AbstractJpaDaoTest { assertEquals(widgetsBundle3, widgetsBundles3.getData().get(1)); } + @Test + public void testTagsSearchInFindBySystemWidgetTypes() { + for (var entry : SHOULD_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetsBundle systemWidgetBundle = createSystemWidgetBundle("Test Widget Bundle Alias", "Test Widget Bundle Title"); + WidgetType widgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, 0, "Test Widget Type Name", "Test Widget Type Description", tags); + widgetTypeDao.saveWidgetsBundleWidget(new WidgetsBundleWidget(systemWidgetBundle.getId(), widgetType.getId(), 0)); + + PageData widgetTypes = widgetsBundleDao.findSystemWidgetsBundles( + TenantId.SYS_TENANT_ID, true, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(1); + assertThat(widgetTypes.getData().get(0).getId()).isEqualTo(systemWidgetBundle.getId()); + + widgetTypeDao.removeWidgetTypeFromWidgetsBundle(systemWidgetBundle.getUuidId(), widgetType.getUuidId()); + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, widgetType.getUuidId()); + widgetsBundleDao.removeById(TenantId.SYS_TENANT_ID, systemWidgetBundle.getUuidId()); + } + + for (var entry : SHOULDNT_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetsBundle systemWidgetBundle = createSystemWidgetBundle("Test Widget Bundle Alias", "Test Widget Bundle Title"); + WidgetType widgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, 0, "Test Widget Type Name", "Test Widget Type Description", tags); + widgetTypeDao.saveWidgetsBundleWidget(new WidgetsBundleWidget(systemWidgetBundle.getId(), widgetType.getId(), 0)); + + PageData widgetTypes = widgetsBundleDao.findSystemWidgetsBundles( + TenantId.SYS_TENANT_ID, true, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(0); + + widgetTypeDao.removeWidgetTypeFromWidgetsBundle(systemWidgetBundle.getUuidId(), widgetType.getUuidId()); + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, widgetType.getUuidId()); + widgetsBundleDao.removeById(TenantId.SYS_TENANT_ID, systemWidgetBundle.getUuidId()); + } + + widgetsBundles = new ArrayList<>(); + widgetTypeList = new ArrayList<>(); + } + @Test public void testFindWidgetsBundlesByTenantId() { UUID tenantId1 = Uuids.timeBased(); @@ -206,7 +271,7 @@ public class JpaWidgetsBundleDaoTest extends AbstractJpaDaoTest { createSystemWidgetBundles(2, "WB_SYS_" + i + "_"); } widgetsBundles = widgetsBundleDao.find(TenantId.SYS_TENANT_ID).stream().sorted(Comparator.comparing(WidgetsBundle::getTitle)).collect(Collectors.toList());; - assertEquals(100, widgetsBundleDao.find(TenantId.SYS_TENANT_ID).size()); + assertEquals(100, widgetsBundles.size()); var widgetType1 = createAndSaveWidgetType(new TenantId(tenantId1), 1, "Test widget type 1", "This is the widget type 1", new String[]{"tag1", "Tag2", "TEST_TAG"}); var widgetType2 = createAndSaveWidgetType(new TenantId(tenantId2), 2, "Test widget type 2", "This is the widget type 2", new String[]{"tag3", "Tag5", "TEST_Tag2"}); @@ -245,6 +310,79 @@ public class JpaWidgetsBundleDaoTest extends AbstractJpaDaoTest { assertEquals(widgetsBundle3, widgetsBundles5.getData().get(0)); } + @Test + public void testTagsSearchInFindAllWidgetsBundlesByTenantId() { + for (var entry : SHOULD_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetsBundle systemWidgetBundle = createSystemWidgetBundle("Test Widget Bundle Alias", "Test Widget Bundle Title"); + WidgetType widgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, 0, "Test Widget Type Name", "Test Widget Type Description", tags); + widgetTypeDao.saveWidgetsBundleWidget(new WidgetsBundleWidget(systemWidgetBundle.getId(), widgetType.getId(), 0)); + + PageData widgetTypes = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId( + TenantId.SYS_TENANT_ID.getId(), true, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(1); + assertThat(widgetTypes.getData().get(0).getId()).isEqualTo(systemWidgetBundle.getId()); + + widgetTypeDao.removeWidgetTypeFromWidgetsBundle(systemWidgetBundle.getUuidId(), widgetType.getUuidId()); + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, widgetType.getUuidId()); + widgetsBundleDao.removeById(TenantId.SYS_TENANT_ID, systemWidgetBundle.getUuidId()); + } + + for (var entry : SHOULDNT_FIND_SEARCH_TO_TAGS_MAP.entrySet()) { + String searchText = entry.getKey(); + String[] tags = entry.getValue(); + + WidgetsBundle systemWidgetBundle = createSystemWidgetBundle("Test Widget Bundle Alias", "Test Widget Bundle Title"); + WidgetType widgetType = createAndSaveWidgetType(TenantId.SYS_TENANT_ID, 0, "Test Widget Type Name", "Test Widget Type Description", tags); + widgetTypeDao.saveWidgetsBundleWidget(new WidgetsBundleWidget(systemWidgetBundle.getId(), widgetType.getId(), 0)); + + PageData widgetTypes = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId( + TenantId.SYS_TENANT_ID.getId(), true, new PageLink(10, 0, searchText) + ); + + assertThat(widgetTypes.getData()).hasSize(0); + + widgetTypeDao.removeWidgetTypeFromWidgetsBundle(systemWidgetBundle.getUuidId(), widgetType.getUuidId()); + widgetTypeDao.removeById(TenantId.SYS_TENANT_ID, widgetType.getUuidId()); + widgetsBundleDao.removeById(TenantId.SYS_TENANT_ID, systemWidgetBundle.getUuidId()); + } + + widgetsBundles = new ArrayList<>(); + widgetTypeList = new ArrayList<>(); + } + + @Test + public void testOrderInFindAllWidgetsBundlesByTenantIdFullSearch() { + UUID tenantId1 = Uuids.timeBased(); + for (int i = 0; i < 10; i++) { + createWidgetsBundle(TenantId.fromUUID(tenantId1), "WB1_" + i, "WB1_" + (10-i), i % 2 == 1 ? null : (int)(Math.random() * 1000)); + createWidgetsBundle(TenantId.SYS_TENANT_ID, "WB_SYS_" + i, "WB_SYS_" + (10-i), i % 2 == 0 ? null : (int)(Math.random() * 1000)); + } + widgetsBundles = widgetsBundleDao.find(TenantId.SYS_TENANT_ID).stream().sorted((o1, o2) -> { + int result = 0; + if (o1.getOrder() != null && o2.getOrder() != null) { + result = o1.getOrder() - o2.getOrder(); + } else if (o1.getOrder() == null && o2.getOrder() != null) { + result = 1; + } else if (o1.getOrder() != null) { + result = -1; + } + if (result == 0) { + result = o1.getTitle().compareTo(o2.getTitle()); + } + return result; + }).collect(Collectors.toList());; + assertEquals(20, widgetsBundles.size()); + PageLink pageLink = new PageLink(100, 0, "", new SortOrder("title")); + PageData widgetsBundlesData = widgetsBundleDao.findAllTenantWidgetsBundlesByTenantId(tenantId1, true, pageLink); + assertEquals(20, widgetsBundlesData.getData().size()); + assertEquals(widgetsBundles, widgetsBundlesData.getData()); + } + @Test public void testSearchTextNotFound() { UUID tenantId = Uuids.timeBased(); @@ -259,26 +397,30 @@ public class JpaWidgetsBundleDaoTest extends AbstractJpaDaoTest { private void createWidgetBundles(int count, UUID tenantId, String prefix) { for (int i = 0; i < count; i++) { - WidgetsBundle widgetsBundle = new WidgetsBundle(); - widgetsBundle.setAlias(prefix + i); - widgetsBundle.setTitle(prefix + i); - widgetsBundle.setId(new WidgetsBundleId(Uuids.timeBased())); - widgetsBundle.setTenantId(TenantId.fromUUID(tenantId)); - widgetsBundleDao.save(TenantId.SYS_TENANT_ID, widgetsBundle); + createWidgetsBundle(TenantId.fromUUID(tenantId), prefix + i, prefix + i, null); } } private void createSystemWidgetBundles(int count, String prefix) { for (int i = 0; i < count; i++) { - WidgetsBundle widgetsBundle = new WidgetsBundle(); - widgetsBundle.setAlias(prefix + i); - widgetsBundle.setTitle(prefix + i); - widgetsBundle.setTenantId(TenantId.SYS_TENANT_ID); - widgetsBundle.setId(new WidgetsBundleId(Uuids.timeBased())); - widgetsBundleDao.save(TenantId.SYS_TENANT_ID, widgetsBundle); + createWidgetsBundle(TenantId.SYS_TENANT_ID, prefix + i, prefix + i, null); } } + private WidgetsBundle createSystemWidgetBundle(String alias, String title) { + return createWidgetsBundle(TenantId.SYS_TENANT_ID, alias, title, null); + } + + private WidgetsBundle createWidgetsBundle(TenantId tenantId, String alias, String title, Integer order) { + WidgetsBundle widgetsBundle = new WidgetsBundle(); + widgetsBundle.setAlias(alias); + widgetsBundle.setTitle(title); + widgetsBundle.setTenantId(tenantId); + widgetsBundle.setId(new WidgetsBundleId(Uuids.timeBased())); + widgetsBundle.setOrder(order); + return widgetsBundleDao.save(TenantId.SYS_TENANT_ID, widgetsBundle); + } + WidgetType createAndSaveWidgetType(TenantId tenantId, int number, String name, String description, String[] tags) { WidgetTypeDetails widgetType = new WidgetTypeDetails(); widgetType.setTenantId(tenantId); diff --git a/dao/src/test/resources/sql/system-data.sql b/dao/src/test/resources/sql/system-data.sql index debf698623..7a79f1114d 100644 --- a/dao/src/test/resources/sql/system-data.sql +++ b/dao/src/test/resources/sql/system-data.sql @@ -43,6 +43,16 @@ VALUES ( '6eaaefa6-4612-11e7-a919-92ebcb67fe33', 1592576748000, '13814000-1dd2-1 "password": "" }' ); +INSERT INTO admin_settings ( id, created_time, tenant_id, key, json_value ) +VALUES ( '23199d80-6e7e-11ee-8829-ef9fd52a6141', 1697719852888, '13814000-1dd2-11b2-8080-808080808080', 'connectivity', '{ + "http":{"enabled":true,"host":"","port":"8080"}, + "https":{"enabled":false,"host":"","port":"443"}, + "mqtt":{"enabled":true,"host":"","port":"1883"}, + "mqtts":{"enabled":false,"host":"","port":"8883"}, + "coap":{"enabled":true,"host":"","port":"5683"}, + "coaps":{"enabled":false,"host":"","port":"5684"} +}' ); + INSERT INTO queue ( id, created_time, tenant_id, name, topic, poll_interval, partitions, consumer_per_partition, pack_processing_timeout, submit_strategy, processing_strategy ) VALUES ( '6eaaefa6-4612-11e7-a919-92ebcb67fe33', 1592576748000 ,'13814000-1dd2-11b2-8080-808080808080', 'Main' ,'tb_rule_engine.main', 25, 10, true, 2000, '{"type": "BURST", "batchSize": 1000}', diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 78ca337e0a..942be3782a 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -300,7 +300,7 @@ services: haproxy: restart: always container_name: "${LOAD_BALANCER_NAME}" - image: thingsboard/haproxy-certbot:1.3.0 + image: thingsboard/haproxy-certbot:2.2.31-alpine3.18 volumes: - ./haproxy/config:/config - ./haproxy/letsencrypt:/etc/letsencrypt diff --git a/msa/js-executor/config/custom-environment-variables.yml b/msa/js-executor/config/custom-environment-variables.yml index 5ca66d71a1..c92ae78553 100644 --- a/msa/js-executor/config/custom-environment-variables.yml +++ b/msa/js-executor/config/custom-environment-variables.yml @@ -15,6 +15,7 @@ # queue_type: "TB_QUEUE_TYPE" #kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) +queue_prefix: "TB_QUEUE_PREFIX" request_topic: "REMOTE_JS_EVAL_REQUEST_TOPIC" http_port: "HTTP_PORT" # /livenessProbe diff --git a/msa/js-executor/config/default.yml b/msa/js-executor/config/default.yml index 43712f0f61..e6927c0bff 100644 --- a/msa/js-executor/config/default.yml +++ b/msa/js-executor/config/default.yml @@ -16,6 +16,7 @@ queue_type: "kafka" request_topic: "js_eval.requests" +queue_prefix: "" http_port: "8888" # /livenessProbe js: diff --git a/msa/js-executor/docker/Dockerfile b/msa/js-executor/docker/Dockerfile index f934628a96..ef22343442 100644 --- a/msa/js-executor/docker/Dockerfile +++ b/msa/js-executor/docker/Dockerfile @@ -14,7 +14,7 @@ # limitations under the License. # -FROM thingsboard/node:16.17.0-bullseye-slim +FROM thingsboard/node:16.20.2-bookworm-slim ENV NODE_ENV production ENV DOCKER_MODE true diff --git a/msa/js-executor/pom.xml b/msa/js-executor/pom.xml index 128479e5eb..1cf55d9795 100644 --- a/msa/js-executor/pom.xml +++ b/msa/js-executor/pom.xml @@ -71,7 +71,7 @@ install-node-and-yarn - v16.15.1 + v16.20.2 v1.22.17 diff --git a/msa/js-executor/queue/awsSqsTemplate.ts b/msa/js-executor/queue/awsSqsTemplate.ts index c9951008c7..1486df802b 100644 --- a/msa/js-executor/queue/awsSqsTemplate.ts +++ b/msa/js-executor/queue/awsSqsTemplate.ts @@ -38,7 +38,8 @@ import uuid from 'uuid-random'; export class AwsSqsTemplate implements IQueue { private logger = _logger(`awsSqsTemplate`); - private requestTopic: string = config.get('request_topic'); + private queuePrefix: string = config.get('queue_prefix'); + private requestTopic: string = this.queuePrefix ? this.queuePrefix + "." + config.get('request_topic') : config.get('request_topic'); private accessKeyId: string = config.get('aws_sqs.access_key_id'); private secretAccessKey: string = config.get('aws_sqs.secret_access_key'); private region: string = config.get('aws_sqs.region'); diff --git a/msa/js-executor/queue/kafkaTemplate.ts b/msa/js-executor/queue/kafkaTemplate.ts index 5d1b6cc6c1..9759c095c9 100644 --- a/msa/js-executor/queue/kafkaTemplate.ts +++ b/msa/js-executor/queue/kafkaTemplate.ts @@ -61,7 +61,8 @@ export class KafkaTemplate implements IQueue { async init(): Promise { const kafkaBootstrapServers: string = config.get('kafka.bootstrap.servers'); - const requestTopic: string = config.get('request_topic'); + const queuePrefix: string = config.get('queue_prefix'); + const requestTopic: string = queuePrefix ? queuePrefix + "." + config.get('request_topic') : config.get('request_topic'); const useConfluent = config.get('kafka.use_confluent_cloud'); this.logger.info('Kafka Bootstrap Servers: %s', kafkaBootstrapServers); diff --git a/msa/js-executor/queue/pubSubTemplate.ts b/msa/js-executor/queue/pubSubTemplate.ts index 71c9b72d5f..a1b05ab7bf 100644 --- a/msa/js-executor/queue/pubSubTemplate.ts +++ b/msa/js-executor/queue/pubSubTemplate.ts @@ -26,7 +26,8 @@ export class PubSubTemplate implements IQueue { private logger = _logger(`pubSubTemplate`); private projectId: string = config.get('pubsub.project_id'); private credentials = JSON.parse(config.get('pubsub.service_account')); - private requestTopic: string = config.get('request_topic'); + private queuePrefix: string = config.get('queue_prefix'); + private requestTopic: string = this.queuePrefix ? this.queuePrefix + "." + config.get('request_topic') : config.get('request_topic'); private queueProperties: string = config.get('pubsub.queue_properties'); private pubSubClient: PubSub; diff --git a/msa/js-executor/queue/rabbitmqTemplate.ts b/msa/js-executor/queue/rabbitmqTemplate.ts index fca4b1e5bd..7bb078c047 100644 --- a/msa/js-executor/queue/rabbitmqTemplate.ts +++ b/msa/js-executor/queue/rabbitmqTemplate.ts @@ -24,7 +24,8 @@ import { Options, Replies } from 'amqplib/properties'; export class RabbitMqTemplate implements IQueue { private logger = _logger(`rabbitmqTemplate`); - private requestTopic: string = config.get('request_topic'); + private queuePrefix: string = config.get('queue_prefix'); + private requestTopic: string = this.queuePrefix ? this.queuePrefix + "." + config.get('request_topic') : config.get('request_topic'); private host = config.get('rabbitmq.host'); private port = config.get('rabbitmq.port'); private vhost = config.get('rabbitmq.virtual_host'); diff --git a/msa/js-executor/queue/serviceBusTemplate.ts b/msa/js-executor/queue/serviceBusTemplate.ts index 16950b7bce..70f0d68d3b 100644 --- a/msa/js-executor/queue/serviceBusTemplate.ts +++ b/msa/js-executor/queue/serviceBusTemplate.ts @@ -31,7 +31,8 @@ import { export class ServiceBusTemplate implements IQueue { private logger = _logger(`serviceBusTemplate`); - private requestTopic: string = config.get('request_topic'); + private queuePrefix: string = config.get('queue_prefix'); + private requestTopic: string = this.queuePrefix ? this.queuePrefix + "." + config.get('request_topic') : config.get('request_topic'); private namespaceName = config.get('service_bus.namespace_name'); private sasKeyName = config.get('service_bus.sas_key_name'); private sasKey = config.get('service_bus.sas_key'); diff --git a/msa/tb-node/docker/Dockerfile b/msa/tb-node/docker/Dockerfile index 68e428992a..86fd04cad2 100644 --- a/msa/tb-node/docker/Dockerfile +++ b/msa/tb-node/docker/Dockerfile @@ -18,8 +18,7 @@ FROM thingsboard/openjdk11:bullseye-slim COPY start-tb-node.sh ${pkg.name}.deb /tmp/ -RUN echo 'networkaddress.cache.ttl=60' >> /etc/java-11-openjdk/security/java.security \ - && chmod a+x /tmp/*.sh \ +RUN chmod a+x /tmp/*.sh \ && mv /tmp/start-tb-node.sh /usr/bin && \ (yes | dpkg -i /tmp/${pkg.name}.deb) && \ rm /tmp/${pkg.name}.deb && \ diff --git a/msa/vc-executor-docker/docker/Dockerfile b/msa/vc-executor-docker/docker/Dockerfile index 653a5f2d35..81febe89f7 100644 --- a/msa/vc-executor-docker/docker/Dockerfile +++ b/msa/vc-executor-docker/docker/Dockerfile @@ -16,6 +16,11 @@ FROM thingsboard/openjdk11:bullseye-slim +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update \ + && apt-get install -yq --no-install-recommends ncdu \ + && rm -rf /var/lib/apt/lists/* + COPY start-tb-vc-executor.sh ${pkg.name}.deb /tmp/ RUN mkdir -p /home/thingsboard/.config/jgit \ diff --git a/msa/vc-executor/src/main/resources/tb-vc-executor.yml b/msa/vc-executor/src/main/resources/tb-vc-executor.yml index 2a35ee73fd..4ffa1ab702 100644 --- a/msa/vc-executor/src/main/resources/tb-vc-executor.yml +++ b/msa/vc-executor/src/main/resources/tb-vc-executor.yml @@ -48,6 +48,7 @@ zk: # Queue configuration parameters queue: type: "${TB_QUEUE_TYPE:kafka}" # in-memory or kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka) except of js executor topics (please use REMOTE_JS_EVAL_REQUEST_TOPIC and REMOTE_JS_EVAL_RESPONSE_TOPIC to specify custom topic names) in_memory: stats: # For debug lvl diff --git a/msa/web-ui/docker/Dockerfile b/msa/web-ui/docker/Dockerfile index cf5df5ee2c..18a19e0ead 100644 --- a/msa/web-ui/docker/Dockerfile +++ b/msa/web-ui/docker/Dockerfile @@ -14,7 +14,7 @@ # limitations under the License. # -FROM thingsboard/node:16.17.0-bullseye-slim +FROM thingsboard/node:16.20.2-bookworm-slim ENV NODE_ENV production ENV DOCKER_MODE true diff --git a/msa/web-ui/pom.xml b/msa/web-ui/pom.xml index cbee67c12e..02772a68e3 100644 --- a/msa/web-ui/pom.xml +++ b/msa/web-ui/pom.xml @@ -80,7 +80,7 @@ install-node-and-yarn - v16.15.1 + v16.20.2 v1.22.17 diff --git a/pom.xml b/pom.xml index 7dd8bf2741..d5b517c48e 100755 --- a/pom.xml +++ b/pom.xml @@ -78,7 +78,7 @@ 3.8.1 3.21.9 1.42.1 - 1.1.2 + 1.1.3 1.18.18 1.2.4 1.2.5 diff --git a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rpc/TbSendRPCReplyNode.java b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rpc/TbSendRPCReplyNode.java index 373e314577..66a26e33fa 100644 --- a/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rpc/TbSendRPCReplyNode.java +++ b/rule-engine/rule-engine-components/src/main/java/org/thingsboard/rule/engine/rpc/TbSendRPCReplyNode.java @@ -104,7 +104,7 @@ public class TbSendRPCReplyNode implements TbNode { body.put("requestId", requestIdStr); body.put("response", msg.getData()); EdgeEvent edgeEvent = EdgeUtils.constructEdgeEvent(ctx.getTenantId(), edgeId, EdgeEventType.DEVICE, - EdgeEventActionType.RPC_CALL, deviceId, JacksonUtil.OBJECT_MAPPER.valueToTree(body)); + EdgeEventActionType.RPC_CALL, deviceId, JacksonUtil.valueToTree(body)); ListenableFuture future = ctx.getEdgeEventService().saveAsync(edgeEvent); Futures.addCallback(future, new FutureCallback<>() { @Override diff --git a/rule-engine/rule-engine-components/src/main/resources/public/static/rulenode/rulenode-core-config.js b/rule-engine/rule-engine-components/src/main/resources/public/static/rulenode/rulenode-core-config.js index 98e5af7232..2410b0639b 100644 --- a/rule-engine/rule-engine-components/src/main/resources/public/static/rulenode/rulenode-core-config.js +++ b/rule-engine/rule-engine-components/src/main/resources/public/static/rulenode/rulenode-core-config.js @@ -1 +1 @@ -System.register(["@angular/core","@shared/public-api","@ngrx/store","@angular/forms","@angular/common","@angular/material/checkbox","@angular/material/input","@angular/material/form-field","@angular/flex-layout/flex","@ngx-translate/core","@angular/material/select","@angular/material/core","@angular/material/slide-toggle","@shared/components/hint-tooltip-icon.component","@shared/components/queue/queue-autocomplete.component","@core/public-api","@shared/components/js-func.component","@angular/material/button","@angular/material/icon","@angular/material/tooltip","@shared/components/script-lang.component","@angular/cdk/keycodes","@angular/material/chips","@shared/pipe/safe.pipe","@shared/components/entity/entity-type-select.component","@shared/components/entity/entity-select.component","@angular/cdk/coercion","@shared/components/tb-error.component","@angular/flex-layout/extended","@angular/material/list","@angular/cdk/drag-drop","rxjs/operators","@angular/material/autocomplete","@shared/pipe/highlight.pipe","@angular/material/expansion","tslib","rxjs","@home/components/public-api","@shared/components/help-popup.component","@shared/components/entity/entity-subtype-list.component","@shared/components/relation/relation-type-autocomplete.component","@home/components/relation/relation-filters.component","@shared/components/file-input.component","@shared/components/button/toggle-password.component","@shared/components/string-items-list.component","@shared/components/toggle-header.component","@shared/components/toggle-select.component","@shared/components/entity/entity-list.component","@shared/components/notification/template-autocomplete.component","@shared/components/tb-checkbox.component","@home/components/sms/sms-provider-configuration.component","@angular/material/radio","@shared/components/slack-conversation-autocomplete.component","@shared/components/entity/entity-autocomplete.component","@shared/components/entity/entity-type-list.component"],(function(e){"use strict";var t,n,r,o,a,i,l,s,m,u,p,d,c,f,g,y,x,b,h,v,C,F,k,L,T,I,N,S,q,A,M,G,E,D,V,P,w,R,O,B,K,U,_,H,z,j,Q,$,J,Y,W,X,Z,ee,te,ne,re,oe,ae,ie,le,se,me,ue,pe,de,ce,fe,ge,ye,xe,be,he,ve,Ce,Fe,ke,Le,Te,Ie,Ne,Se,qe,Ae,Me,Ge,Ee,De,Ve,Pe,we,Re,Oe,Be,Ke,Ue,_e,He,ze,je,Qe,$e;return{setters:[function(e){t=e,n=e.Component,r=e.EventEmitter,o=e.ViewChild,a=e.forwardRef,i=e.Input,l=e.NgModule},function(e){s=e.RuleNodeConfigurationComponent,m=e.AttributeScope,u=e.telemetryTypeTranslations,p=e.ServiceType,d=e.ScriptLanguage,c=e.AlarmSeverity,f=e.alarmSeverityTranslations,g=e.EntitySearchDirection,y=e.entitySearchDirectionTranslations,x=e.EntityType,b=e.PageComponent,h=e.coerceBoolean,v=e.MessageType,C=e.messageTypeNames,F=e,k=e.AlarmStatus,L=e.alarmStatusTranslations,T=e.SharedModule,I=e.AggregationType,N=e.aggregationTranslations,S=e.entityFields,q=e.NotificationType,A=e.SlackChanelType,M=e.SlackChanelTypesTranslateMap},function(e){G=e},function(e){E=e,D=e.Validators,V=e.NgControl,P=e.NG_VALUE_ACCESSOR,w=e.NG_VALIDATORS},function(e){R=e,O=e.CommonModule},function(e){B=e},function(e){K=e},function(e){U=e},function(e){_=e},function(e){H=e},function(e){z=e},function(e){j=e},function(e){Q=e},function(e){$=e},function(e){J=e},function(e){Y=e.getCurrentAuthState,W=e,X=e.isDefinedAndNotNull,Z=e.deepTrim,ee=e.isObject,te=e.isNotEmptyStr},function(e){ne=e},function(e){re=e},function(e){oe=e},function(e){ae=e},function(e){ie=e},function(e){le=e.ENTER,se=e.COMMA,me=e.SEMICOLON},function(e){ue=e},function(e){pe=e},function(e){de=e},function(e){ce=e},function(e){fe=e.coerceBooleanProperty},function(e){ge=e},function(e){ye=e},function(e){xe=e},function(e){be=e},function(e){he=e.tap,ve=e.map,Ce=e.mergeMap,Fe=e.startWith,ke=e.share,Le=e.takeUntil},function(e){Te=e},function(e){Ie=e},function(e){Ne=e},function(e){Se=e.__decorate},function(e){qe=e.of,Ae=e.Subject},function(e){Me=e.HomeComponentsModule},function(e){Ge=e},function(e){Ee=e},function(e){De=e},function(e){Ve=e},function(e){Pe=e},function(e){we=e},function(e){Re=e},function(e){Oe=e},function(e){Be=e},function(e){Ke=e},function(e){Ue=e},function(e){_e=e},function(e){He=e},function(e){ze=e},function(e){je=e},function(e){Qe=e},function(e){$e=e}],execute:function(){class Je extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.emptyConfigForm}onConfigurationSet(e){this.emptyConfigForm=this.fb.group({})}}e("EmptyConfigComponent",Je),Je.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Je,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Je.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Je,selector:"tb-node-empty-config",usesInheritance:!0,ngImport:t,template:"
",isInline:!0}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Je,decorators:[{type:n,args:[{selector:"tb-node-empty-config",template:"
"}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Ye extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.assignCustomerConfigForm}onConfigurationSet(e){this.assignCustomerConfigForm=this.fb.group({customerNamePattern:[e?e.customerNamePattern:null,[D.required,D.pattern(/.*\S.*/)]],createCustomerIfNotExists:[!!e&&e.createCustomerIfNotExists,[]],customerCacheExpiration:[e?e.customerCacheExpiration:null,[D.required,D.min(0)]]})}prepareOutputConfig(e){return e.customerNamePattern=e.customerNamePattern.trim(),e}}e("AssignCustomerConfigComponent",Ye),Ye.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Ye,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Ye.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Ye,selector:"tb-action-node-assign-to-customer-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.customer-name-pattern\n \n \n {{ \'tb.rulenode.customer-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.create-customer-if-not-exists\' | translate }}\n \n \n tb.rulenode.customer-cache-expiration\n \n \n {{ \'tb.rulenode.customer-cache-expiration-required\' | translate }}\n \n \n {{ \'tb.rulenode.customer-cache-expiration-range\' | translate }}\n \n tb.rulenode.customer-cache-expiration-hint\n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Ye,decorators:[{type:n,args:[{selector:"tb-action-node-assign-to-customer-config",template:'
\n \n tb.rulenode.customer-name-pattern\n \n \n {{ \'tb.rulenode.customer-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.create-customer-if-not-exists\' | translate }}\n \n \n tb.rulenode.customer-cache-expiration\n \n \n {{ \'tb.rulenode.customer-cache-expiration-required\' | translate }}\n \n \n {{ \'tb.rulenode.customer-cache-expiration-range\' | translate }}\n \n tb.rulenode.customer-cache-expiration-hint\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class We extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.attributeScopeMap=m,this.attributeScopes=Object.keys(m),this.telemetryTypeTranslationsMap=u}configForm(){return this.attributesConfigForm}onConfigurationSet(e){this.attributesConfigForm=this.fb.group({scope:[e?e.scope:null,[D.required]],notifyDevice:[!e||e.notifyDevice,[]],sendAttributesUpdatedNotification:[!!e&&e.sendAttributesUpdatedNotification,[]],updateAttributesOnlyOnValueChange:[!!e&&e.updateAttributesOnlyOnValueChange,[]]}),this.attributesConfigForm.get("scope").valueChanges.subscribe((e=>{e!==m.SHARED_SCOPE&&this.attributesConfigForm.get("notifyDevice").patchValue(!1,{emitEvent:!1}),e===m.CLIENT_SCOPE&&this.attributesConfigForm.get("sendAttributesUpdatedNotification").patchValue(!1,{emitEvent:!1}),this.attributesConfigForm.get("updateAttributesOnlyOnValueChange").patchValue(!1,{emitEvent:!1})}))}}e("AttributesConfigComponent",We),We.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:We,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),We.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:We,selector:"tb-action-node-attributes-config",usesInheritance:!0,ngImport:t,template:'
\n \n attribute.attributes-scope\n \n \n {{ telemetryTypeTranslationsMap.get(scope) | translate }}\n \n \n \n
\n
\n \n {{ \'tb.rulenode.update-attributes-only-on-value-change\' | translate }}\n \n
\n
\n \n {{ \'tb.rulenode.send-attributes-updated-notification\' | translate }}\n \n
\n
\n \n {{ \'tb.rulenode.notify-device\' | translate }}\n \n
\n
\n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:We,decorators:[{type:n,args:[{selector:"tb-action-node-attributes-config",template:'
\n \n attribute.attributes-scope\n \n \n {{ telemetryTypeTranslationsMap.get(scope) | translate }}\n \n \n \n
\n
\n \n {{ \'tb.rulenode.update-attributes-only-on-value-change\' | translate }}\n \n
\n
\n \n {{ \'tb.rulenode.send-attributes-updated-notification\' | translate }}\n \n
\n
\n \n {{ \'tb.rulenode.notify-device\' | translate }}\n \n
\n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Xe extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.serviceType=p.TB_RULE_ENGINE}configForm(){return this.checkPointConfigForm}onConfigurationSet(e){this.checkPointConfigForm=this.fb.group({queueName:[e?e.queueName:null,[D.required]]})}}e("CheckPointConfigComponent",Xe),Xe.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Xe,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Xe.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Xe,selector:"tb-action-node-check-point-config",usesInheritance:!0,ngImport:t,template:'
\n \n \n
\n',dependencies:[{kind:"component",type:J.QueueAutocompleteComponent,selector:"tb-queue-autocomplete",inputs:["labelText","requiredText","autocompleteHint","subscriptSizing","required","queueType","disabled"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Xe,decorators:[{type:n,args:[{selector:"tb-action-node-check-point-config",template:'
\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Ze extends s{constructor(e,t,n,o){super(e),this.store=e,this.fb=t,this.nodeScriptTestService=n,this.translate=o,this.tbelEnabled=Y(this.store).tbelEnabled,this.scriptLanguage=d,this.changeScript=new r,this.hasScript=!0,this.testScriptLabel="tb.rulenode.test-details-function"}configForm(){return this.clearAlarmConfigForm}onConfigurationSet(e){this.clearAlarmConfigForm=this.fb.group({scriptLang:[e?e.scriptLang:d.JS,[D.required]],alarmDetailsBuildJs:[e?e.alarmDetailsBuildJs:null,[]],alarmDetailsBuildTbel:[e?e.alarmDetailsBuildTbel:null,[]],alarmType:[e?e.alarmType:null,[D.required]]})}validatorTriggers(){return["scriptLang"]}updateValidators(e){let t=this.clearAlarmConfigForm.get("scriptLang").value;t!==d.TBEL||this.tbelEnabled||(t=d.JS,this.clearAlarmConfigForm.get("scriptLang").patchValue(t,{emitEvent:!1}),setTimeout((()=>{this.clearAlarmConfigForm.updateValueAndValidity({emitEvent:!0})}))),this.clearAlarmConfigForm.get("alarmDetailsBuildJs").setValidators(t===d.JS?[D.required]:[]),this.clearAlarmConfigForm.get("alarmDetailsBuildJs").updateValueAndValidity({emitEvent:e}),this.clearAlarmConfigForm.get("alarmDetailsBuildTbel").setValidators(t===d.TBEL?[D.required]:[]),this.clearAlarmConfigForm.get("alarmDetailsBuildTbel").updateValueAndValidity({emitEvent:e})}prepareInputConfig(e){return e&&(e.scriptLang||(e.scriptLang=d.JS)),e}testScript(e){const t=this.clearAlarmConfigForm.get("scriptLang").value,n=t===d.JS?"alarmDetailsBuildJs":"alarmDetailsBuildTbel",r=t===d.JS?"rulenode/clear_alarm_node_script_fn":"rulenode/tbel/clear_alarm_node_script_fn",o=this.clearAlarmConfigForm.get(n).value;this.nodeScriptTestService.testNodeScript(o,"json",this.translate.instant("tb.rulenode.details"),"Details",["msg","metadata","msgType"],this.ruleNodeId,r,t,e).subscribe((e=>{e&&(this.clearAlarmConfigForm.get(n).setValue(e),this.changeScript.emit())}))}onValidate(){this.clearAlarmConfigForm.get("scriptLang").value===d.JS&&this.jsFuncComponent.validateOnSubmit()}}e("ClearAlarmConfigComponent",Ze),Ze.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Ze,deps:[{token:G.Store},{token:E.UntypedFormBuilder},{token:W.NodeScriptTestService},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),Ze.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Ze,selector:"tb-action-node-clear-alarm-config",viewQueries:[{propertyName:"jsFuncComponent",first:!0,predicate:["jsFuncComponent"],descendants:!0},{propertyName:"tbelFuncComponent",first:!0,predicate:["tbelFuncComponent"],descendants:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n \n \n \n \n \n \n
\n \n
\n \n tb.rulenode.alarm-type\n \n \n {{ \'tb.rulenode.alarm-type-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:ne.JsFuncComponent,selector:"tb-js-func",inputs:["functionTitle","functionName","functionArgs","validationArgs","resultType","disabled","fillHeight","minHeight","editorCompleter","globalVariables","disableUndefinedCheck","helpId","scriptLanguage","noValidate","required"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:ie.TbScriptLangComponent,selector:"tb-script-lang",inputs:["disabled"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Ze,decorators:[{type:n,args:[{selector:"tb-action-node-clear-alarm-config",template:'
\n \n \n \n \n \n \n \n
\n \n
\n \n tb.rulenode.alarm-type\n \n \n {{ \'tb.rulenode.alarm-type-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder},{type:W.NodeScriptTestService},{type:H.TranslateService}]},propDecorators:{jsFuncComponent:[{type:o,args:["jsFuncComponent",{static:!1}]}],tbelFuncComponent:[{type:o,args:["tbelFuncComponent",{static:!1}]}]}});class et extends s{constructor(e,t,n,o){super(e),this.store=e,this.fb=t,this.nodeScriptTestService=n,this.translate=o,this.alarmSeverities=Object.keys(c),this.alarmSeverityTranslationMap=f,this.separatorKeysCodes=[le,se,me],this.tbelEnabled=Y(this.store).tbelEnabled,this.scriptLanguage=d,this.changeScript=new r,this.hasScript=!0,this.testScriptLabel="tb.rulenode.test-details-function"}configForm(){return this.createAlarmConfigForm}onConfigurationSet(e){this.createAlarmConfigForm=this.fb.group({scriptLang:[e?e.scriptLang:d.JS,[D.required]],alarmDetailsBuildJs:[e?e.alarmDetailsBuildJs:null,[]],alarmDetailsBuildTbel:[e?e.alarmDetailsBuildTbel:null,[]],useMessageAlarmData:[!!e&&e.useMessageAlarmData,[]],overwriteAlarmDetails:[!!e&&e.overwriteAlarmDetails,[]],alarmType:[e?e.alarmType:null,[]],severity:[e?e.severity:null,[]],propagate:[!!e&&e.propagate,[]],relationTypes:[e?e.relationTypes:null,[]],propagateToOwner:[!!e&&e.propagateToOwner,[]],propagateToTenant:[!!e&&e.propagateToTenant,[]],dynamicSeverity:!1}),this.createAlarmConfigForm.get("dynamicSeverity").valueChanges.subscribe((e=>{e?this.createAlarmConfigForm.get("severity").patchValue("",{emitEvent:!1}):this.createAlarmConfigForm.get("severity").patchValue(this.alarmSeverities[0],{emitEvent:!1})}))}validatorTriggers(){return["useMessageAlarmData","overwriteAlarmDetails","scriptLang"]}updateValidators(e){const t=this.createAlarmConfigForm.get("useMessageAlarmData").value,n=this.createAlarmConfigForm.get("overwriteAlarmDetails").value;t?(this.createAlarmConfigForm.get("alarmType").setValidators([]),this.createAlarmConfigForm.get("severity").setValidators([])):(this.createAlarmConfigForm.get("alarmType").setValidators([D.required]),this.createAlarmConfigForm.get("severity").setValidators([D.required])),this.createAlarmConfigForm.get("alarmType").updateValueAndValidity({emitEvent:e}),this.createAlarmConfigForm.get("severity").updateValueAndValidity({emitEvent:e});let r=this.createAlarmConfigForm.get("scriptLang").value;r!==d.TBEL||this.tbelEnabled||(r=d.JS,this.createAlarmConfigForm.get("scriptLang").patchValue(r,{emitEvent:!1}),setTimeout((()=>{this.createAlarmConfigForm.updateValueAndValidity({emitEvent:!0})})));const o=!1===t||!0===n;this.createAlarmConfigForm.get("alarmDetailsBuildJs").setValidators(o&&r===d.JS?[D.required]:[]),this.createAlarmConfigForm.get("alarmDetailsBuildTbel").setValidators(o&&r===d.TBEL?[D.required]:[]),this.createAlarmConfigForm.get("alarmDetailsBuildJs").updateValueAndValidity({emitEvent:e}),this.createAlarmConfigForm.get("alarmDetailsBuildTbel").updateValueAndValidity({emitEvent:e})}prepareInputConfig(e){return e&&(e.scriptLang||(e.scriptLang=d.JS)),e}testScript(e){const t=this.createAlarmConfigForm.get("scriptLang").value,n=t===d.JS?"alarmDetailsBuildJs":"alarmDetailsBuildTbel",r=t===d.JS?"rulenode/create_alarm_node_script_fn":"rulenode/tbel/create_alarm_node_script_fn",o=this.createAlarmConfigForm.get(n).value;this.nodeScriptTestService.testNodeScript(o,"json",this.translate.instant("tb.rulenode.details"),"Details",["msg","metadata","msgType"],this.ruleNodeId,r,t,e).subscribe((e=>{e&&(this.createAlarmConfigForm.get(n).setValue(e),this.changeScript.emit())}))}removeKey(e,t){const n=this.createAlarmConfigForm.get(t).value,r=n.indexOf(e);r>=0&&(n.splice(r,1),this.createAlarmConfigForm.get(t).setValue(n,{emitEvent:!0}))}addKey(e,t){const n=e.input;let r=e.value;if((r||"").trim()){r=r.trim();let e=this.createAlarmConfigForm.get(t).value;e&&-1!==e.indexOf(r)||(e||(e=[]),e.push(r),this.createAlarmConfigForm.get(t).setValue(e,{emitEvent:!0}))}n&&(n.value="")}onValidate(){const e=this.createAlarmConfigForm.get("useMessageAlarmData").value,t=this.createAlarmConfigForm.get("overwriteAlarmDetails").value;if(!e||t){this.createAlarmConfigForm.get("scriptLang").value===d.JS&&this.jsFuncComponent.validateOnSubmit()}}}e("CreateAlarmConfigComponent",et),et.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:et,deps:[{token:G.Store},{token:E.UntypedFormBuilder},{token:W.NodeScriptTestService},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),et.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:et,selector:"tb-action-node-create-alarm-config",viewQueries:[{propertyName:"jsFuncComponent",first:!0,predicate:["jsFuncComponent"],descendants:!0},{propertyName:"tbelFuncComponent",first:!0,predicate:["tbelFuncComponent"],descendants:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n {{ \'tb.rulenode.use-message-alarm-data\' | translate }}\n \n \n {{ \'tb.rulenode.overwrite-alarm-details\' | translate }}\n \n
\n \n \n \n \n \n \n \n
\n \n
\n
\n
\n \n tb.rulenode.alarm-type\n \n \n {{ \'tb.rulenode.alarm-type-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.use-alarm-severity-pattern\' | translate }}\n \n \n tb.rulenode.alarm-severity\n \n \n {{ alarmSeverityTranslationMap.get(severity) | translate }}\n \n \n \n {{ \'tb.rulenode.alarm-severity-required\' | translate }}\n \n \n \n tb.rulenode.alarm-severity-pattern\n \n \n {{ \'tb.rulenode.alarm-severity-required\' | translate }}\n \n \n \n \n {{ \'tb.rulenode.propagate\' | translate }}\n \n
\n \n tb.rulenode.relation-types-list\n \n \n {{key}}\n close\n \n \n \n tb.rulenode.relation-types-list-hint\n \n
\n \n {{ \'tb.rulenode.propagate-to-owner\' | translate }}\n \n \n {{ \'tb.rulenode.propagate-to-tenant\' | translate }}\n \n
\n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:ne.JsFuncComponent,selector:"tb-js-func",inputs:["functionTitle","functionName","functionArgs","validationArgs","resultType","disabled","fillHeight","minHeight","editorCompleter","globalVariables","disableUndefinedCheck","helpId","scriptLanguage","noValidate","required"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"component",type:ue.MatChipGrid,selector:"mat-chip-grid",inputs:["tabIndex","disabled","placeholder","required","value","errorStateMatcher"],outputs:["change","valueChange"]},{kind:"directive",type:ue.MatChipInput,selector:"input[matChipInputFor]",inputs:["matChipInputFor","matChipInputAddOnBlur","matChipInputSeparatorKeyCodes","placeholder","id","disabled"],outputs:["matChipInputTokenEnd"],exportAs:["matChipInput","matChipInputFor"]},{kind:"directive",type:ue.MatChipRemove,selector:"[matChipRemove]"},{kind:"component",type:ue.MatChipRow,selector:"mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]",inputs:["color","disabled","disableRipple","tabIndex","editable"],outputs:["edited"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:ie.TbScriptLangComponent,selector:"tb-script-lang",inputs:["disabled"]},{kind:"pipe",type:pe.SafePipe,name:"safe"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:et,decorators:[{type:n,args:[{selector:"tb-action-node-create-alarm-config",template:'
\n \n {{ \'tb.rulenode.use-message-alarm-data\' | translate }}\n \n \n {{ \'tb.rulenode.overwrite-alarm-details\' | translate }}\n \n
\n \n \n \n \n \n \n \n
\n \n
\n
\n
\n \n tb.rulenode.alarm-type\n \n \n {{ \'tb.rulenode.alarm-type-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.use-alarm-severity-pattern\' | translate }}\n \n \n tb.rulenode.alarm-severity\n \n \n {{ alarmSeverityTranslationMap.get(severity) | translate }}\n \n \n \n {{ \'tb.rulenode.alarm-severity-required\' | translate }}\n \n \n \n tb.rulenode.alarm-severity-pattern\n \n \n {{ \'tb.rulenode.alarm-severity-required\' | translate }}\n \n \n \n \n {{ \'tb.rulenode.propagate\' | translate }}\n \n
\n \n tb.rulenode.relation-types-list\n \n \n {{key}}\n close\n \n \n \n tb.rulenode.relation-types-list-hint\n \n
\n \n {{ \'tb.rulenode.propagate-to-owner\' | translate }}\n \n \n {{ \'tb.rulenode.propagate-to-tenant\' | translate }}\n \n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder},{type:W.NodeScriptTestService},{type:H.TranslateService}]},propDecorators:{jsFuncComponent:[{type:o,args:["jsFuncComponent",{static:!1}]}],tbelFuncComponent:[{type:o,args:["tbelFuncComponent",{static:!1}]}]}});class tt extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.directionTypes=Object.keys(g),this.directionTypeTranslations=y,this.entityType=x}configForm(){return this.createRelationConfigForm}onConfigurationSet(e){this.createRelationConfigForm=this.fb.group({direction:[e?e.direction:null,[D.required]],entityType:[e?e.entityType:null,[D.required]],entityNamePattern:[e?e.entityNamePattern:null,[]],entityTypePattern:[e?e.entityTypePattern:null,[]],relationType:[e?e.relationType:null,[D.required]],createEntityIfNotExists:[!!e&&e.createEntityIfNotExists,[]],removeCurrentRelations:[!!e&&e.removeCurrentRelations,[]],changeOriginatorToRelatedEntity:[!!e&&e.changeOriginatorToRelatedEntity,[]],entityCacheExpiration:[e?e.entityCacheExpiration:null,[D.required,D.min(0)]]})}validatorTriggers(){return["entityType"]}updateValidators(e){const t=this.createRelationConfigForm.get("entityType").value;t?this.createRelationConfigForm.get("entityNamePattern").setValidators([D.required,D.pattern(/.*\S.*/)]):this.createRelationConfigForm.get("entityNamePattern").setValidators([]),!t||t!==x.DEVICE&&t!==x.ASSET?this.createRelationConfigForm.get("entityTypePattern").setValidators([]):this.createRelationConfigForm.get("entityTypePattern").setValidators([D.required,D.pattern(/.*\S.*/)]),this.createRelationConfigForm.get("entityNamePattern").updateValueAndValidity({emitEvent:e}),this.createRelationConfigForm.get("entityTypePattern").updateValueAndValidity({emitEvent:e})}prepareOutputConfig(e){return e.entityNamePattern=e.entityNamePattern?e.entityNamePattern.trim():null,e.entityTypePattern=e.entityTypePattern?e.entityTypePattern.trim():null,e}}e("CreateRelationConfigComponent",tt),tt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:tt,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),tt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:tt,selector:"tb-action-node-create-relation-config",usesInheritance:!0,ngImport:t,template:'
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }}\n \n \n \n
\n \n \n \n tb.rulenode.entity-name-pattern\n \n \n {{ \'tb.rulenode.entity-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.entity-type-pattern\n \n \n {{ \'tb.rulenode.entity-type-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n \n tb.rulenode.relation-type-pattern\n \n \n {{ \'tb.rulenode.relation-type-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n \n {{ \'tb.rulenode.create-entity-if-not-exists\' | translate }}\n \n
tb.rulenode.create-entity-if-not-exists-hint
\n
\n \n {{ \'tb.rulenode.remove-current-relations\' | translate }}\n \n
tb.rulenode.remove-current-relations-hint
\n \n {{ \'tb.rulenode.change-originator-to-related-entity\' | translate }}\n \n
tb.rulenode.change-originator-to-related-entity-hint
\n \n tb.rulenode.entity-cache-expiration\n \n \n {{ \'tb.rulenode.entity-cache-expiration-required\' | translate }}\n \n \n {{ \'tb.rulenode.entity-cache-expiration-range\' | translate }}\n \n tb.rulenode.entity-cache-expiration-hint\n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:de.EntityTypeSelectComponent,selector:"tb-entity-type-select",inputs:["allowedEntityTypes","useAliasEntityTypes","filterAllowedEntityTypes","showLabel","required","disabled"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:tt,decorators:[{type:n,args:[{selector:"tb-action-node-create-relation-config",template:'
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }}\n \n \n \n
\n \n \n \n tb.rulenode.entity-name-pattern\n \n \n {{ \'tb.rulenode.entity-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.entity-type-pattern\n \n \n {{ \'tb.rulenode.entity-type-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n \n tb.rulenode.relation-type-pattern\n \n \n {{ \'tb.rulenode.relation-type-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n \n {{ \'tb.rulenode.create-entity-if-not-exists\' | translate }}\n \n
tb.rulenode.create-entity-if-not-exists-hint
\n
\n \n {{ \'tb.rulenode.remove-current-relations\' | translate }}\n \n
tb.rulenode.remove-current-relations-hint
\n \n {{ \'tb.rulenode.change-originator-to-related-entity\' | translate }}\n \n
tb.rulenode.change-originator-to-related-entity-hint
\n \n tb.rulenode.entity-cache-expiration\n \n \n {{ \'tb.rulenode.entity-cache-expiration-required\' | translate }}\n \n \n {{ \'tb.rulenode.entity-cache-expiration-range\' | translate }}\n \n tb.rulenode.entity-cache-expiration-hint\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class nt extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.directionTypes=Object.keys(g),this.directionTypeTranslations=y,this.entityType=x}configForm(){return this.deleteRelationConfigForm}onConfigurationSet(e){this.deleteRelationConfigForm=this.fb.group({deleteForSingleEntity:[!!e&&e.deleteForSingleEntity,[]],direction:[e?e.direction:null,[D.required]],entityType:[e?e.entityType:null,[]],entityNamePattern:[e?e.entityNamePattern:null,[]],relationType:[e?e.relationType:null,[D.required]],entityCacheExpiration:[e?e.entityCacheExpiration:null,[D.required,D.min(0)]]})}validatorTriggers(){return["deleteForSingleEntity","entityType"]}updateValidators(e){const t=this.deleteRelationConfigForm.get("deleteForSingleEntity").value,n=this.deleteRelationConfigForm.get("entityType").value;t?this.deleteRelationConfigForm.get("entityType").setValidators([D.required]):this.deleteRelationConfigForm.get("entityType").setValidators([]),t&&n?this.deleteRelationConfigForm.get("entityNamePattern").setValidators([D.required,D.pattern(/.*\S.*/)]):this.deleteRelationConfigForm.get("entityNamePattern").setValidators([]),this.deleteRelationConfigForm.get("entityType").updateValueAndValidity({emitEvent:!1}),this.deleteRelationConfigForm.get("entityNamePattern").updateValueAndValidity({emitEvent:e})}prepareOutputConfig(e){return e.entityNamePattern=e.entityNamePattern?e.entityNamePattern.trim():null,e}}e("DeleteRelationConfigComponent",nt),nt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:nt,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),nt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:nt,selector:"tb-action-node-delete-relation-config",usesInheritance:!0,ngImport:t,template:'
\n \n {{ \'tb.rulenode.delete-relation-to-specific-entity\' | translate }}\n \n
tb.rulenode.delete-relation-hint
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }}\n \n \n \n
\n \n \n \n tb.rulenode.entity-name-pattern\n \n \n {{ \'tb.rulenode.entity-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n \n tb.rulenode.relation-type-pattern\n \n \n {{ \'tb.rulenode.relation-type-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.entity-cache-expiration\n \n \n {{ \'tb.rulenode.entity-cache-expiration-required\' | translate }}\n \n \n {{ \'tb.rulenode.entity-cache-expiration-range\' | translate }}\n \n tb.rulenode.entity-cache-expiration-hint\n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:de.EntityTypeSelectComponent,selector:"tb-entity-type-select",inputs:["allowedEntityTypes","useAliasEntityTypes","filterAllowedEntityTypes","showLabel","required","disabled"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:nt,decorators:[{type:n,args:[{selector:"tb-action-node-delete-relation-config",template:'
\n \n {{ \'tb.rulenode.delete-relation-to-specific-entity\' | translate }}\n \n
tb.rulenode.delete-relation-hint
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }}\n \n \n \n
\n \n \n \n tb.rulenode.entity-name-pattern\n \n \n {{ \'tb.rulenode.entity-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n \n tb.rulenode.relation-type-pattern\n \n \n {{ \'tb.rulenode.relation-type-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.entity-cache-expiration\n \n \n {{ \'tb.rulenode.entity-cache-expiration-required\' | translate }}\n \n \n {{ \'tb.rulenode.entity-cache-expiration-range\' | translate }}\n \n tb.rulenode.entity-cache-expiration-hint\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class rt extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.deviceProfile}onConfigurationSet(e){this.deviceProfile=this.fb.group({persistAlarmRulesState:[!!e&&e.persistAlarmRulesState,D.required],fetchAlarmRulesStateOnStart:[!!e&&e.fetchAlarmRulesStateOnStart,D.required]})}}e("DeviceProfileConfigComponent",rt),rt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:rt,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),rt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:rt,selector:"tb-device-profile-config",usesInheritance:!0,ngImport:t,template:'
\n \n {{ \'tb.rulenode.persist-alarm-rules\' | translate }}\n \n \n {{ \'tb.rulenode.fetch-alarm-rules\' | translate }}\n \n
\n',dependencies:[{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:rt,decorators:[{type:n,args:[{selector:"tb-device-profile-config",template:'
\n \n {{ \'tb.rulenode.persist-alarm-rules\' | translate }}\n \n \n {{ \'tb.rulenode.fetch-alarm-rules\' | translate }}\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class ot extends s{constructor(e,t,n,o){super(e),this.store=e,this.fb=t,this.nodeScriptTestService=n,this.translate=o,this.tbelEnabled=Y(this.store).tbelEnabled,this.scriptLanguage=d,this.changeScript=new r,this.hasScript=!0,this.testScriptLabel="tb.rulenode.test-generator-function",this.serviceType=p.TB_RULE_ENGINE}configForm(){return this.generatorConfigForm}onConfigurationSet(e){this.generatorConfigForm=this.fb.group({msgCount:[e?e.msgCount:null,[D.required,D.min(0)]],periodInSeconds:[e?e.periodInSeconds:null,[D.required,D.min(1)]],originator:[e?e.originator:null,[]],scriptLang:[e?e.scriptLang:d.JS,[D.required]],jsScript:[e?e.jsScript:null,[]],tbelScript:[e?e.tbelScript:null,[]],queueName:[e?e.queueName:null,[]]})}validatorTriggers(){return["scriptLang"]}updateValidators(e){let t=this.generatorConfigForm.get("scriptLang").value;t!==d.TBEL||this.tbelEnabled||(t=d.JS,this.generatorConfigForm.get("scriptLang").patchValue(t,{emitEvent:!1}),setTimeout((()=>{this.generatorConfigForm.updateValueAndValidity({emitEvent:!0})}))),this.generatorConfigForm.get("jsScript").setValidators(t===d.JS?[D.required]:[]),this.generatorConfigForm.get("jsScript").updateValueAndValidity({emitEvent:e}),this.generatorConfigForm.get("tbelScript").setValidators(t===d.TBEL?[D.required]:[]),this.generatorConfigForm.get("tbelScript").updateValueAndValidity({emitEvent:e})}prepareInputConfig(e){return e&&(e.scriptLang||(e.scriptLang=d.JS),e.originatorId&&e.originatorType?e.originator={id:e.originatorId,entityType:e.originatorType}:e.originator=null,delete e.originatorId,delete e.originatorType),e}prepareOutputConfig(e){return e.originator?(e.originatorId=e.originator.id,e.originatorType=e.originator.entityType):(e.originatorId=null,e.originatorType=null),delete e.originator,e}testScript(e){const t=this.generatorConfigForm.get("scriptLang").value,n=t===d.JS?"jsScript":"tbelScript",r=t===d.JS?"rulenode/generator_node_script_fn":"rulenode/tbel/generator_node_script_fn",o=this.generatorConfigForm.get(n).value;this.nodeScriptTestService.testNodeScript(o,"generate",this.translate.instant("tb.rulenode.generator"),"Generate",["prevMsg","prevMetadata","prevMsgType"],this.ruleNodeId,r,t,e).subscribe((e=>{e&&(this.generatorConfigForm.get(n).setValue(e),this.changeScript.emit())}))}onValidate(){this.generatorConfigForm.get("scriptLang").value===d.JS&&this.jsFuncComponent.validateOnSubmit()}}var at;e("GeneratorConfigComponent",ot),ot.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ot,deps:[{token:G.Store},{token:E.UntypedFormBuilder},{token:W.NodeScriptTestService},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),ot.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:ot,selector:"tb-action-node-generator-config",viewQueries:[{propertyName:"jsFuncComponent",first:!0,predicate:["jsFuncComponent"],descendants:!0},{propertyName:"tbelFuncComponent",first:!0,predicate:["tbelFuncComponent"],descendants:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.message-count\n \n \n {{ \'tb.rulenode.message-count-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-message-count-message\' | translate }}\n \n \n \n tb.rulenode.period-seconds\n \n \n {{ \'tb.rulenode.period-seconds-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-period-seconds-message\' | translate }}\n \n \n
\n \n \n \n
\n\n \n \n\n \n \n \n \n \n \n \n
\n \n
\n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:ce.EntitySelectComponent,selector:"tb-entity-select",inputs:["allowedEntityTypes","useAliasEntityTypes","required","disabled"]},{kind:"component",type:J.QueueAutocompleteComponent,selector:"tb-queue-autocomplete",inputs:["labelText","requiredText","autocompleteHint","subscriptSizing","required","queueType","disabled"]},{kind:"component",type:ne.JsFuncComponent,selector:"tb-js-func",inputs:["functionTitle","functionName","functionArgs","validationArgs","resultType","disabled","fillHeight","minHeight","editorCompleter","globalVariables","disableUndefinedCheck","helpId","scriptLanguage","noValidate","required"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:ie.TbScriptLangComponent,selector:"tb-script-lang",inputs:["disabled"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ot,decorators:[{type:n,args:[{selector:"tb-action-node-generator-config",template:'
\n \n tb.rulenode.message-count\n \n \n {{ \'tb.rulenode.message-count-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-message-count-message\' | translate }}\n \n \n \n tb.rulenode.period-seconds\n \n \n {{ \'tb.rulenode.period-seconds-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-period-seconds-message\' | translate }}\n \n \n
\n \n \n \n
\n\n \n \n\n \n \n \n \n \n \n \n
\n \n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder},{type:W.NodeScriptTestService},{type:H.TranslateService}]},propDecorators:{jsFuncComponent:[{type:o,args:["jsFuncComponent",{static:!1}]}],tbelFuncComponent:[{type:o,args:["tbelFuncComponent",{static:!1}]}]}}),function(e){e.CUSTOMER="CUSTOMER",e.TENANT="TENANT",e.RELATED="RELATED",e.ALARM_ORIGINATOR="ALARM_ORIGINATOR",e.ENTITY="ENTITY"}(at||(at={}));const it=new Map([[at.CUSTOMER,"tb.rulenode.originator-customer"],[at.TENANT,"tb.rulenode.originator-tenant"],[at.RELATED,"tb.rulenode.originator-related"],[at.ALARM_ORIGINATOR,"tb.rulenode.originator-alarm-originator"],[at.ENTITY,"tb.rulenode.originator-entity"]]);var lt;!function(e){e.CIRCLE="CIRCLE",e.POLYGON="POLYGON"}(lt||(lt={}));const st=new Map([[lt.CIRCLE,"tb.rulenode.perimeter-circle"],[lt.POLYGON,"tb.rulenode.perimeter-polygon"]]);var mt;!function(e){e.MILLISECONDS="MILLISECONDS",e.SECONDS="SECONDS",e.MINUTES="MINUTES",e.HOURS="HOURS",e.DAYS="DAYS"}(mt||(mt={}));const ut=new Map([[mt.MILLISECONDS,"tb.rulenode.time-unit-milliseconds"],[mt.SECONDS,"tb.rulenode.time-unit-seconds"],[mt.MINUTES,"tb.rulenode.time-unit-minutes"],[mt.HOURS,"tb.rulenode.time-unit-hours"],[mt.DAYS,"tb.rulenode.time-unit-days"]]);var pt;!function(e){e.METER="METER",e.KILOMETER="KILOMETER",e.FOOT="FOOT",e.MILE="MILE",e.NAUTICAL_MILE="NAUTICAL_MILE"}(pt||(pt={}));const dt=new Map([[pt.METER,"tb.rulenode.range-unit-meter"],[pt.KILOMETER,"tb.rulenode.range-unit-kilometer"],[pt.FOOT,"tb.rulenode.range-unit-foot"],[pt.MILE,"tb.rulenode.range-unit-mile"],[pt.NAUTICAL_MILE,"tb.rulenode.range-unit-nautical-mile"]]);var ct;!function(e){e.ID="ID",e.TITLE="TITLE",e.COUNTRY="COUNTRY",e.STATE="STATE",e.CITY="CITY",e.ZIP="ZIP",e.ADDRESS="ADDRESS",e.ADDRESS2="ADDRESS2",e.PHONE="PHONE",e.EMAIL="EMAIL",e.ADDITIONAL_INFO="ADDITIONAL_INFO"}(ct||(ct={}));const ft=new Map([[ct.ID,"tb.rulenode.entity-details-id"],[ct.TITLE,"tb.rulenode.entity-details-title"],[ct.COUNTRY,"tb.rulenode.entity-details-country"],[ct.STATE,"tb.rulenode.entity-details-state"],[ct.CITY,"tb.rulenode.entity-details-city"],[ct.ZIP,"tb.rulenode.entity-details-zip"],[ct.ADDRESS,"tb.rulenode.entity-details-address"],[ct.ADDRESS2,"tb.rulenode.entity-details-address2"],[ct.PHONE,"tb.rulenode.entity-details-phone"],[ct.EMAIL,"tb.rulenode.entity-details-email"],[ct.ADDITIONAL_INFO,"tb.rulenode.entity-details-additional_info"]]);var gt;!function(e){e.FIRST="FIRST",e.LAST="LAST",e.ALL="ALL"}(gt||(gt={}));const yt=new Map([[gt.FIRST,"tb.rulenode.first"],[gt.LAST,"tb.rulenode.last"],[gt.ALL,"tb.rulenode.all"]]),xt=new Map([[gt.FIRST,"tb.rulenode.first-mode-hint"],[gt.LAST,"tb.rulenode.last-mode-hint"],[gt.ALL,"tb.rulenode.all-mode-hint"]]);var bt,ht;!function(e){e.ASC="ASC",e.DESC="DESC"}(bt||(bt={})),function(e){e.ATTRIBUTES="ATTRIBUTES",e.LATEST_TELEMETRY="LATEST_TELEMETRY",e.FIELDS="FIELDS"}(ht||(ht={}));const vt=new Map([[ht.ATTRIBUTES,"tb.rulenode.attributes"],[ht.LATEST_TELEMETRY,"tb.rulenode.latest-telemetry"],[ht.FIELDS,"tb.rulenode.fields"]]),Ct=new Map([[ht.ATTRIBUTES,"tb.rulenode.add-mapped-attribute-to"],[ht.LATEST_TELEMETRY,"tb.rulenode.add-mapped-latest-telemetry-to"],[ht.FIELDS,"tb.rulenode.add-mapped-fields-to"]]),Ft=new Map([[bt.ASC,"tb.rulenode.ascending"],[bt.DESC,"tb.rulenode.descending"]]);var kt;!function(e){e.STANDARD="STANDARD",e.FIFO="FIFO"}(kt||(kt={}));const Lt=new Map([[kt.STANDARD,"tb.rulenode.sqs-queue-standard"],[kt.FIFO,"tb.rulenode.sqs-queue-fifo"]]),Tt=["anonymous","basic","cert.PEM"],It=new Map([["anonymous","tb.rulenode.credentials-anonymous"],["basic","tb.rulenode.credentials-basic"],["cert.PEM","tb.rulenode.credentials-pem"]]),Nt=["sas","cert.PEM"],St=new Map([["sas","tb.rulenode.credentials-sas"],["cert.PEM","tb.rulenode.credentials-pem"]]);var qt;!function(e){e.GET="GET",e.POST="POST",e.PUT="PUT",e.DELETE="DELETE"}(qt||(qt={}));const At=["US-ASCII","ISO-8859-1","UTF-8","UTF-16BE","UTF-16LE","UTF-16"],Mt=new Map([["US-ASCII","tb.rulenode.charset-us-ascii"],["ISO-8859-1","tb.rulenode.charset-iso-8859-1"],["UTF-8","tb.rulenode.charset-utf-8"],["UTF-16BE","tb.rulenode.charset-utf-16be"],["UTF-16LE","tb.rulenode.charset-utf-16le"],["UTF-16","tb.rulenode.charset-utf-16"]]);var Gt;!function(e){e.CUSTOM="CUSTOM",e.ADD="ADD",e.SUB="SUB",e.MULT="MULT",e.DIV="DIV",e.SIN="SIN",e.SINH="SINH",e.COS="COS",e.COSH="COSH",e.TAN="TAN",e.TANH="TANH",e.ACOS="ACOS",e.ASIN="ASIN",e.ATAN="ATAN",e.ATAN2="ATAN2",e.EXP="EXP",e.EXPM1="EXPM1",e.SQRT="SQRT",e.CBRT="CBRT",e.GET_EXP="GET_EXP",e.HYPOT="HYPOT",e.LOG="LOG",e.LOG10="LOG10",e.LOG1P="LOG1P",e.CEIL="CEIL",e.FLOOR="FLOOR",e.FLOOR_DIV="FLOOR_DIV",e.FLOOR_MOD="FLOOR_MOD",e.ABS="ABS",e.MIN="MIN",e.MAX="MAX",e.POW="POW",e.SIGNUM="SIGNUM",e.RAD="RAD",e.DEG="DEG"}(Gt||(Gt={}));const Et=new Map([[Gt.CUSTOM,{value:Gt.CUSTOM,name:"Custom Function",description:"Use this function to specify complex mathematical expression.",minArgs:1,maxArgs:16}],[Gt.ADD,{value:Gt.ADD,name:"Addition",description:"x + y",minArgs:2,maxArgs:2}],[Gt.SUB,{value:Gt.SUB,name:"Subtraction",description:"x - y",minArgs:2,maxArgs:2}],[Gt.MULT,{value:Gt.MULT,name:"Multiplication",description:"x * y",minArgs:2,maxArgs:2}],[Gt.DIV,{value:Gt.DIV,name:"Division",description:"x / y",minArgs:2,maxArgs:2}],[Gt.SIN,{value:Gt.SIN,name:"Sine",description:"Returns the trigonometric sine of an angle in radians.",minArgs:1,maxArgs:1}],[Gt.SINH,{value:Gt.SINH,name:"Hyperbolic sine",description:"Returns the hyperbolic sine of an argument.",minArgs:1,maxArgs:1}],[Gt.COS,{value:Gt.COS,name:"Cosine",description:"Returns the trigonometric cosine of an angle in radians.",minArgs:1,maxArgs:1}],[Gt.COSH,{value:Gt.COSH,name:"Hyperbolic cosine",description:"Returns the hyperbolic cosine of an argument.",minArgs:1,maxArgs:1}],[Gt.TAN,{value:Gt.TAN,name:"Tangent",description:"Returns the trigonometric tangent of an angle in radians",minArgs:1,maxArgs:1}],[Gt.TANH,{value:Gt.TANH,name:"Hyperbolic tangent",description:"Returns the hyperbolic tangent of an argument",minArgs:1,maxArgs:1}],[Gt.ACOS,{value:Gt.ACOS,name:"Arc cosine",description:"Returns the arc cosine of an argument",minArgs:1,maxArgs:1}],[Gt.ASIN,{value:Gt.ASIN,name:"Arc sine",description:"Returns the arc sine of an argument",minArgs:1,maxArgs:1}],[Gt.ATAN,{value:Gt.ATAN,name:"Arc tangent",description:"Returns the arc tangent of an argument",minArgs:1,maxArgs:1}],[Gt.ATAN2,{value:Gt.ATAN2,name:"2-argument arc tangent",description:"Returns the angle theta from the conversion of rectangular coordinates (x, y) to polar coordinates (r, theta)",minArgs:2,maxArgs:2}],[Gt.EXP,{value:Gt.EXP,name:"Exponential",description:"Returns Euler's number e raised to the power of an argument",minArgs:1,maxArgs:1}],[Gt.EXPM1,{value:Gt.EXPM1,name:"Exponential minus one",description:"Returns Euler's number e raised to the power of an argument minus one",minArgs:1,maxArgs:1}],[Gt.SQRT,{value:Gt.SQRT,name:"Square",description:"Returns the correctly rounded positive square root of an argument",minArgs:1,maxArgs:1}],[Gt.CBRT,{value:Gt.CBRT,name:"Cube root",description:"Returns the cube root of an argument",minArgs:1,maxArgs:1}],[Gt.GET_EXP,{value:Gt.GET_EXP,name:"Get exponent",description:"Returns the unbiased exponent used in the representation of an argument",minArgs:1,maxArgs:1}],[Gt.HYPOT,{value:Gt.HYPOT,name:"Square root",description:"Returns the square root of the squares of the arguments",minArgs:2,maxArgs:2}],[Gt.LOG,{value:Gt.LOG,name:"Logarithm",description:"Returns the natural logarithm of an argument",minArgs:1,maxArgs:1}],[Gt.LOG10,{value:Gt.LOG10,name:"Base 10 logarithm",description:"Returns the base 10 logarithm of an argument",minArgs:1,maxArgs:1}],[Gt.LOG1P,{value:Gt.LOG1P,name:"Logarithm of the sum",description:"Returns the natural logarithm of the sum of an argument",minArgs:1,maxArgs:1}],[Gt.CEIL,{value:Gt.CEIL,name:"Ceiling",description:"Returns the smallest (closest to negative infinity) of an argument",minArgs:1,maxArgs:1}],[Gt.FLOOR,{value:Gt.FLOOR,name:"Floor",description:"Returns the largest (closest to positive infinity) of an argument",minArgs:1,maxArgs:1}],[Gt.FLOOR_DIV,{value:Gt.FLOOR_DIV,name:"Floor division",description:"Returns the largest (closest to positive infinity) of the arguments",minArgs:2,maxArgs:2}],[Gt.FLOOR_MOD,{value:Gt.FLOOR_MOD,name:"Floor modulus",description:"Returns the floor modulus of the arguments",minArgs:2,maxArgs:2}],[Gt.ABS,{value:Gt.ABS,name:"Absolute",description:"Returns the absolute value of an argument",minArgs:1,maxArgs:1}],[Gt.MIN,{value:Gt.MIN,name:"Min",description:"Returns the smaller of the arguments",minArgs:2,maxArgs:2}],[Gt.MAX,{value:Gt.MAX,name:"Max",description:"Returns the greater of the arguments",minArgs:2,maxArgs:2}],[Gt.POW,{value:Gt.POW,name:"Raise to a power",description:"Returns the value of the first argument raised to the power of the second argument",minArgs:2,maxArgs:2}],[Gt.SIGNUM,{value:Gt.SIGNUM,name:"Sign of a real number",description:"Returns the signum function of the argument",minArgs:1,maxArgs:1}],[Gt.RAD,{value:Gt.RAD,name:"Radian",description:"Converts an angle measured in degrees to an approximately equivalent angle measured in radians",minArgs:1,maxArgs:1}],[Gt.DEG,{value:Gt.DEG,name:"Degrees",description:"Converts an angle measured in radians to an approximately equivalent angle measured in degrees.",minArgs:1,maxArgs:1}]]);var Dt,Vt,Pt;!function(e){e.MESSAGE_BODY="MESSAGE_BODY",e.MESSAGE_METADATA="MESSAGE_METADATA",e.ATTRIBUTE="ATTRIBUTE",e.TIME_SERIES="TIME_SERIES",e.CONSTANT="CONSTANT"}(Dt||(Dt={})),function(e){e.MESSAGE_BODY="MESSAGE_BODY",e.MESSAGE_METADATA="MESSAGE_METADATA",e.ATTRIBUTE="ATTRIBUTE",e.TIME_SERIES="TIME_SERIES"}(Vt||(Vt={})),function(e){e.DATA="DATA",e.METADATA="METADATA"}(Pt||(Pt={}));const wt=new Map([[Pt.DATA,"tb.rulenode.message"],[Pt.METADATA,"tb.rulenode.metadata"]]),Rt=new Map([[Dt.MESSAGE_BODY,{name:"tb.rulenode.message-body-type",description:"Fetch argument value from incoming message"}],[Dt.MESSAGE_METADATA,{name:"tb.rulenode.message-metadata-type",description:"Fetch argument value from incoming message metadata"}],[Dt.ATTRIBUTE,{name:"tb.rulenode.attribute-type",description:"Fetch attribute value from database"}],[Dt.TIME_SERIES,{name:"tb.rulenode.time-series-type",description:"Fetch latest time-series value from database"}],[Dt.CONSTANT,{name:"tb.rulenode.constant-type",description:"Define constant value"}]]),Ot=new Map([[Vt.MESSAGE_BODY,{name:"tb.rulenode.message-body-type",description:"Add result to the outgoing message"}],[Vt.MESSAGE_METADATA,{name:"tb.rulenode.message-metadata-type",description:"Add result to the outgoing message metadata"}],[Vt.ATTRIBUTE,{name:"tb.rulenode.attribute-type",description:"Store result as an entity attribute in the database"}],[Vt.TIME_SERIES,{name:"tb.rulenode.time-series-type",description:"Store result as an entity time-series in the database"}]]),Bt=["x","y","z","a","b","c","d","k","l","m","n","o","p","r","s","t"];var Kt,Ut;!function(e){e.SHARED_SCOPE="SHARED_SCOPE",e.SERVER_SCOPE="SERVER_SCOPE",e.CLIENT_SCOPE="CLIENT_SCOPE"}(Kt||(Kt={})),function(e){e.SHARED_SCOPE="SHARED_SCOPE",e.SERVER_SCOPE="SERVER_SCOPE"}(Ut||(Ut={}));const _t=new Map([[Kt.SHARED_SCOPE,"tb.rulenode.shared-scope"],[Kt.SERVER_SCOPE,"tb.rulenode.server-scope"],[Kt.CLIENT_SCOPE,"tb.rulenode.client-scope"]]);class Ht extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.perimeterType=lt,this.perimeterTypes=Object.keys(lt),this.perimeterTypeTranslationMap=st,this.rangeUnits=Object.keys(pt),this.rangeUnitTranslationMap=dt,this.timeUnits=Object.keys(mt),this.timeUnitsTranslationMap=ut}configForm(){return this.geoActionConfigForm}onConfigurationSet(e){this.geoActionConfigForm=this.fb.group({latitudeKeyName:[e?e.latitudeKeyName:null,[D.required]],longitudeKeyName:[e?e.longitudeKeyName:null,[D.required]],perimeterType:[e?e.perimeterType:null,[D.required]],fetchPerimeterInfoFromMessageMetadata:[!!e&&e.fetchPerimeterInfoFromMessageMetadata,[]],perimeterKeyName:[e?e.perimeterKeyName:null,[]],centerLatitude:[e?e.centerLatitude:null,[]],centerLongitude:[e?e.centerLatitude:null,[]],range:[e?e.range:null,[]],rangeUnit:[e?e.rangeUnit:null,[]],polygonsDefinition:[e?e.polygonsDefinition:null,[]],minInsideDuration:[e?e.minInsideDuration:null,[D.required,D.min(1),D.max(2147483647)]],minInsideDurationTimeUnit:[e?e.minInsideDurationTimeUnit:null,[D.required]],minOutsideDuration:[e?e.minOutsideDuration:null,[D.required,D.min(1),D.max(2147483647)]],minOutsideDurationTimeUnit:[e?e.minOutsideDurationTimeUnit:null,[D.required]]})}validatorTriggers(){return["fetchPerimeterInfoFromMessageMetadata","perimeterType"]}updateValidators(e){const t=this.geoActionConfigForm.get("fetchPerimeterInfoFromMessageMetadata").value,n=this.geoActionConfigForm.get("perimeterType").value;t?this.geoActionConfigForm.get("perimeterKeyName").setValidators([D.required]):this.geoActionConfigForm.get("perimeterKeyName").setValidators([]),t||n!==lt.CIRCLE?(this.geoActionConfigForm.get("centerLatitude").setValidators([]),this.geoActionConfigForm.get("centerLongitude").setValidators([]),this.geoActionConfigForm.get("range").setValidators([]),this.geoActionConfigForm.get("rangeUnit").setValidators([])):(this.geoActionConfigForm.get("centerLatitude").setValidators([D.required,D.min(-90),D.max(90)]),this.geoActionConfigForm.get("centerLongitude").setValidators([D.required,D.min(-180),D.max(180)]),this.geoActionConfigForm.get("range").setValidators([D.required,D.min(0)]),this.geoActionConfigForm.get("rangeUnit").setValidators([D.required])),t||n!==lt.POLYGON?this.geoActionConfigForm.get("polygonsDefinition").setValidators([]):this.geoActionConfigForm.get("polygonsDefinition").setValidators([D.required]),this.geoActionConfigForm.get("perimeterKeyName").updateValueAndValidity({emitEvent:e}),this.geoActionConfigForm.get("centerLatitude").updateValueAndValidity({emitEvent:e}),this.geoActionConfigForm.get("centerLongitude").updateValueAndValidity({emitEvent:e}),this.geoActionConfigForm.get("range").updateValueAndValidity({emitEvent:e}),this.geoActionConfigForm.get("rangeUnit").updateValueAndValidity({emitEvent:e}),this.geoActionConfigForm.get("polygonsDefinition").updateValueAndValidity({emitEvent:e})}}e("GpsGeoActionConfigComponent",Ht),Ht.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Ht,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Ht.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Ht,selector:"tb-action-node-gps-geofencing-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.latitude-key-name\n \n \n {{ \'tb.rulenode.latitude-key-name-required\' | translate }}\n \n \n \n tb.rulenode.longitude-key-name\n \n \n {{ \'tb.rulenode.longitude-key-name-required\' | translate }}\n \n \n \n tb.rulenode.perimeter-type\n \n \n {{ perimeterTypeTranslationMap.get(type) | translate }}\n \n \n \n \n {{ \'tb.rulenode.fetch-perimeter-info-from-metadata\' | translate }}\n \n \n tb.rulenode.perimeter-key-name\n \n \n {{ \'tb.rulenode.perimeter-key-name-required\' | translate }}\n \n \n
\n
\n \n tb.rulenode.circle-center-latitude\n \n \n {{ \'tb.rulenode.circle-center-latitude-required\' | translate }}\n \n \n \n tb.rulenode.circle-center-longitude\n \n \n {{ \'tb.rulenode.circle-center-longitude-required\' | translate }}\n \n \n
\n
\n \n tb.rulenode.range\n \n \n {{ \'tb.rulenode.range-required\' | translate }}\n \n \n \n tb.rulenode.range-units\n \n \n {{ rangeUnitTranslationMap.get(type) | translate }}\n \n \n \n
\n
\n
\n \n tb.rulenode.polygon-definition\n \n \n {{ \'tb.rulenode.polygon-definition-required\' | translate }}\n \n \n
\n
\n \n tb.rulenode.min-inside-duration\n \n \n {{ \'tb.rulenode.min-inside-duration-value-required\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n \n tb.rulenode.min-inside-duration-time-unit\n \n \n {{ timeUnitsTranslationMap.get(timeUnit) | translate }}\n \n \n \n
\n
\n \n tb.rulenode.min-outside-duration\n \n \n {{ \'tb.rulenode.min-outside-duration-value-required\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n \n tb.rulenode.min-outside-duration-time-unit\n \n \n {{ timeUnitsTranslationMap.get(timeUnit) | translate }}\n \n \n \n
\n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.MaxValidator,selector:"input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",inputs:["max"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Ht,decorators:[{type:n,args:[{selector:"tb-action-node-gps-geofencing-config",template:'
\n \n tb.rulenode.latitude-key-name\n \n \n {{ \'tb.rulenode.latitude-key-name-required\' | translate }}\n \n \n \n tb.rulenode.longitude-key-name\n \n \n {{ \'tb.rulenode.longitude-key-name-required\' | translate }}\n \n \n \n tb.rulenode.perimeter-type\n \n \n {{ perimeterTypeTranslationMap.get(type) | translate }}\n \n \n \n \n {{ \'tb.rulenode.fetch-perimeter-info-from-metadata\' | translate }}\n \n \n tb.rulenode.perimeter-key-name\n \n \n {{ \'tb.rulenode.perimeter-key-name-required\' | translate }}\n \n \n
\n
\n \n tb.rulenode.circle-center-latitude\n \n \n {{ \'tb.rulenode.circle-center-latitude-required\' | translate }}\n \n \n \n tb.rulenode.circle-center-longitude\n \n \n {{ \'tb.rulenode.circle-center-longitude-required\' | translate }}\n \n \n
\n
\n \n tb.rulenode.range\n \n \n {{ \'tb.rulenode.range-required\' | translate }}\n \n \n \n tb.rulenode.range-units\n \n \n {{ rangeUnitTranslationMap.get(type) | translate }}\n \n \n \n
\n
\n
\n \n tb.rulenode.polygon-definition\n \n \n {{ \'tb.rulenode.polygon-definition-required\' | translate }}\n \n \n
\n
\n \n tb.rulenode.min-inside-duration\n \n \n {{ \'tb.rulenode.min-inside-duration-value-required\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n \n tb.rulenode.min-inside-duration-time-unit\n \n \n {{ timeUnitsTranslationMap.get(timeUnit) | translate }}\n \n \n \n
\n
\n \n tb.rulenode.min-outside-duration\n \n \n {{ \'tb.rulenode.min-outside-duration-value-required\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n \n tb.rulenode.min-outside-duration-time-unit\n \n \n {{ timeUnitsTranslationMap.get(timeUnit) | translate }}\n \n \n \n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class zt extends s{constructor(e,t,n,o){super(e),this.store=e,this.fb=t,this.nodeScriptTestService=n,this.translate=o,this.tbelEnabled=Y(this.store).tbelEnabled,this.scriptLanguage=d,this.changeScript=new r,this.hasScript=!0,this.testScriptLabel="tb.rulenode.test-to-string-function"}configForm(){return this.logConfigForm}onConfigurationSet(e){this.logConfigForm=this.fb.group({scriptLang:[e?e.scriptLang:d.JS,[D.required]],jsScript:[e?e.jsScript:null,[]],tbelScript:[e?e.tbelScript:null,[]]})}validatorTriggers(){return["scriptLang"]}updateValidators(e){let t=this.logConfigForm.get("scriptLang").value;t!==d.TBEL||this.tbelEnabled||(t=d.JS,this.logConfigForm.get("scriptLang").patchValue(t,{emitEvent:!1}),setTimeout((()=>{this.logConfigForm.updateValueAndValidity({emitEvent:!0})}))),this.logConfigForm.get("jsScript").setValidators(t===d.JS?[D.required]:[]),this.logConfigForm.get("jsScript").updateValueAndValidity({emitEvent:e}),this.logConfigForm.get("tbelScript").setValidators(t===d.TBEL?[D.required]:[]),this.logConfigForm.get("tbelScript").updateValueAndValidity({emitEvent:e})}prepareInputConfig(e){return e&&(e.scriptLang||(e.scriptLang=d.JS)),e}testScript(e){const t=this.logConfigForm.get("scriptLang").value,n=t===d.JS?"jsScript":"tbelScript",r=t===d.JS?"rulenode/log_node_script_fn":"rulenode/tbel/log_node_script_fn",o=this.logConfigForm.get(n).value;this.nodeScriptTestService.testNodeScript(o,"string",this.translate.instant("tb.rulenode.to-string"),"ToString",["msg","metadata","msgType"],this.ruleNodeId,r,t,e).subscribe((e=>{e&&(this.logConfigForm.get(n).setValue(e),this.changeScript.emit())}))}onValidate(){this.logConfigForm.get("scriptLang").value===d.JS&&this.jsFuncComponent.validateOnSubmit()}}e("LogConfigComponent",zt),zt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:zt,deps:[{token:G.Store},{token:E.UntypedFormBuilder},{token:W.NodeScriptTestService},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),zt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:zt,selector:"tb-action-node-log-config",viewQueries:[{propertyName:"jsFuncComponent",first:!0,predicate:["jsFuncComponent"],descendants:!0},{propertyName:"tbelFuncComponent",first:!0,predicate:["tbelFuncComponent"],descendants:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n \n \n \n \n \n \n
\n \n
\n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:ne.JsFuncComponent,selector:"tb-js-func",inputs:["functionTitle","functionName","functionArgs","validationArgs","resultType","disabled","fillHeight","minHeight","editorCompleter","globalVariables","disableUndefinedCheck","helpId","scriptLanguage","noValidate","required"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:ie.TbScriptLangComponent,selector:"tb-script-lang",inputs:["disabled"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:zt,decorators:[{type:n,args:[{selector:"tb-action-node-log-config",template:'
\n \n \n \n \n \n \n \n
\n \n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder},{type:W.NodeScriptTestService},{type:H.TranslateService}]},propDecorators:{jsFuncComponent:[{type:o,args:["jsFuncComponent",{static:!1}]}],tbelFuncComponent:[{type:o,args:["tbelFuncComponent",{static:!1}]}]}});class jt extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.msgCountConfigForm}onConfigurationSet(e){this.msgCountConfigForm=this.fb.group({interval:[e?e.interval:null,[D.required,D.min(1)]],telemetryPrefix:[e?e.telemetryPrefix:null,[D.required]]})}}e("MsgCountConfigComponent",jt),jt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:jt,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),jt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:jt,selector:"tb-action-node-msg-count-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.interval-seconds\n \n \n {{ \'tb.rulenode.interval-seconds-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-interval-seconds-message\' | translate }}\n \n \n \n tb.rulenode.output-timeseries-key-prefix\n \n \n {{ \'tb.rulenode.output-timeseries-key-prefix-required\' | translate }}\n \n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:jt,decorators:[{type:n,args:[{selector:"tb-action-node-msg-count-config",template:'
\n \n tb.rulenode.interval-seconds\n \n \n {{ \'tb.rulenode.interval-seconds-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-interval-seconds-message\' | translate }}\n \n \n \n tb.rulenode.output-timeseries-key-prefix\n \n \n {{ \'tb.rulenode.output-timeseries-key-prefix-required\' | translate }}\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Qt extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.msgDelayConfigForm}onConfigurationSet(e){this.msgDelayConfigForm=this.fb.group({useMetadataPeriodInSecondsPatterns:[!!e&&e.useMetadataPeriodInSecondsPatterns,[]],periodInSeconds:[e?e.periodInSeconds:null,[]],periodInSecondsPattern:[e?e.periodInSecondsPattern:null,[]],maxPendingMsgs:[e?e.maxPendingMsgs:null,[D.required,D.min(1),D.max(1e5)]]})}validatorTriggers(){return["useMetadataPeriodInSecondsPatterns"]}updateValidators(e){this.msgDelayConfigForm.get("useMetadataPeriodInSecondsPatterns").value?(this.msgDelayConfigForm.get("periodInSecondsPattern").setValidators([D.required]),this.msgDelayConfigForm.get("periodInSeconds").setValidators([])):(this.msgDelayConfigForm.get("periodInSecondsPattern").setValidators([]),this.msgDelayConfigForm.get("periodInSeconds").setValidators([D.required,D.min(0)])),this.msgDelayConfigForm.get("periodInSecondsPattern").updateValueAndValidity({emitEvent:e}),this.msgDelayConfigForm.get("periodInSeconds").updateValueAndValidity({emitEvent:e})}}e("MsgDelayConfigComponent",Qt),Qt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Qt,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Qt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Qt,selector:"tb-action-node-msg-delay-config",usesInheritance:!0,ngImport:t,template:'
\n \n {{ \'tb.rulenode.use-metadata-period-in-seconds-patterns\' | translate }}\n \n
tb.rulenode.use-metadata-period-in-seconds-patterns-hint
\n \n tb.rulenode.period-seconds\n \n \n {{ \'tb.rulenode.period-seconds-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-period-0-seconds-message\' | translate }}\n \n \n \n \n tb.rulenode.period-in-seconds-pattern\n \n \n {{ \'tb.rulenode.period-in-seconds-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n \n tb.rulenode.max-pending-messages\n \n \n {{ \'tb.rulenode.max-pending-messages-required\' | translate }}\n \n \n {{ \'tb.rulenode.max-pending-messages-range\' | translate }}\n \n \n {{ \'tb.rulenode.max-pending-messages-range\' | translate }}\n \n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.MaxValidator,selector:"input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",inputs:["max"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Qt,decorators:[{type:n,args:[{selector:"tb-action-node-msg-delay-config",template:'
\n \n {{ \'tb.rulenode.use-metadata-period-in-seconds-patterns\' | translate }}\n \n
tb.rulenode.use-metadata-period-in-seconds-patterns-hint
\n \n tb.rulenode.period-seconds\n \n \n {{ \'tb.rulenode.period-seconds-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-period-0-seconds-message\' | translate }}\n \n \n \n \n tb.rulenode.period-in-seconds-pattern\n \n \n {{ \'tb.rulenode.period-in-seconds-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n \n tb.rulenode.max-pending-messages\n \n \n {{ \'tb.rulenode.max-pending-messages-required\' | translate }}\n \n \n {{ \'tb.rulenode.max-pending-messages-range\' | translate }}\n \n \n {{ \'tb.rulenode.max-pending-messages-range\' | translate }}\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class $t extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.attributeScopes=Object.keys(m),this.telemetryTypeTranslationsMap=u}configForm(){return this.pushToCloudConfigForm}onConfigurationSet(e){this.pushToCloudConfigForm=this.fb.group({scope:[e?e.scope:null,[D.required]]})}}e("PushToCloudConfigComponent",$t),$t.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:$t,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),$t.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:$t,selector:"tb-action-node-push-to-cloud-config",usesInheritance:!0,ngImport:t,template:'
\n \n attribute.attributes-scope\n \n \n {{ telemetryTypeTranslationsMap.get(scope) | translate }}\n \n \n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:$t,decorators:[{type:n,args:[{selector:"tb-action-node-push-to-cloud-config",template:'
\n \n attribute.attributes-scope\n \n \n {{ telemetryTypeTranslationsMap.get(scope) | translate }}\n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Jt extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.attributeScopes=Object.keys(m),this.telemetryTypeTranslationsMap=u}configForm(){return this.pushToEdgeConfigForm}onConfigurationSet(e){this.pushToEdgeConfigForm=this.fb.group({scope:[e?e.scope:null,[D.required]]})}}e("PushToEdgeConfigComponent",Jt),Jt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Jt,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Jt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Jt,selector:"tb-action-node-push-to-edge-config",usesInheritance:!0,ngImport:t,template:'
\n \n attribute.attributes-scope\n \n \n {{ telemetryTypeTranslationsMap.get(scope) | translate }}\n \n \n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Jt,decorators:[{type:n,args:[{selector:"tb-action-node-push-to-edge-config",template:'
\n \n attribute.attributes-scope\n \n \n {{ telemetryTypeTranslationsMap.get(scope) | translate }}\n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Yt extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.rpcReplyConfigForm}onConfigurationSet(e){this.rpcReplyConfigForm=this.fb.group({requestIdMetaDataAttribute:[e?e.requestIdMetaDataAttribute:null,[]]})}}e("RpcReplyConfigComponent",Yt),Yt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Yt,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Yt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Yt,selector:"tb-action-node-rpc-reply-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.request-id-metadata-attribute\n \n \n
\n',dependencies:[{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Yt,decorators:[{type:n,args:[{selector:"tb-action-node-rpc-reply-config",template:'
\n \n tb.rulenode.request-id-metadata-attribute\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Wt extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.rpcRequestConfigForm}onConfigurationSet(e){this.rpcRequestConfigForm=this.fb.group({timeoutInSeconds:[e?e.timeoutInSeconds:null,[D.required,D.min(0)]]})}}e("RpcRequestConfigComponent",Wt),Wt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Wt,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Wt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Wt,selector:"tb-action-node-rpc-request-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.timeout-sec\n \n \n {{ \'tb.rulenode.timeout-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-timeout-message\' | translate }}\n \n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Wt,decorators:[{type:n,args:[{selector:"tb-action-node-rpc-request-config",template:'
\n \n tb.rulenode.timeout-sec\n \n \n {{ \'tb.rulenode.timeout-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-timeout-message\' | translate }}\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Xt extends b{get required(){return this.requiredValue}set required(e){this.requiredValue=fe(e)}constructor(e,t,n,r){super(e),this.store=e,this.translate=t,this.injector=n,this.fb=r,this.propagateChange=null,this.valueChangeSubscription=null}ngOnInit(){this.ngControl=this.injector.get(V),null!=this.ngControl&&(this.ngControl.valueAccessor=this),this.kvListFormGroup=this.fb.group({}),this.kvListFormGroup.addControl("keyVals",this.fb.array([]))}keyValsFormArray(){return this.kvListFormGroup.get("keyVals")}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}setDisabledState(e){this.disabled=e,this.disabled?this.kvListFormGroup.disable({emitEvent:!1}):this.kvListFormGroup.enable({emitEvent:!1})}writeValue(e){this.valueChangeSubscription&&this.valueChangeSubscription.unsubscribe();const t=[];if(e)for(const n of Object.keys(e))Object.prototype.hasOwnProperty.call(e,n)&&t.push(this.fb.group({key:[n,[D.required]],value:[e[n],[D.required]]}));this.kvListFormGroup.setControl("keyVals",this.fb.array(t)),this.valueChangeSubscription=this.kvListFormGroup.valueChanges.subscribe((()=>{this.updateModel()}))}removeKeyVal(e){this.kvListFormGroup.get("keyVals").removeAt(e)}addKeyVal(){this.kvListFormGroup.get("keyVals").push(this.fb.group({key:["",[D.required]],value:["",[D.required]]}))}validate(e){const t=this.kvListFormGroup.get("keyVals").value;if(!t.length&&this.required)return{kvMapRequired:!0};if(!this.kvListFormGroup.valid)return{kvFieldsRequired:!0};if(this.uniqueKeyValuePairValidator)for(const e of t)if(e.key===e.value)return{uniqueKeyValuePair:!0};return null}updateModel(){const e=this.kvListFormGroup.get("keyVals").value;if(this.required&&!e.length||!this.kvListFormGroup.valid)this.propagateChange(null);else{const t={};e.forEach((e=>{t[e.key]=e.value})),this.propagateChange(t)}}}e("KvMapConfigOldComponent",Xt),Xt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Xt,deps:[{token:G.Store},{token:H.TranslateService},{token:t.Injector},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),Xt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Xt,selector:"tb-kv-map-config-old",inputs:{disabled:"disabled",uniqueKeyValuePairValidator:"uniqueKeyValuePairValidator",requiredText:"requiredText",keyText:"keyText",keyRequiredText:"keyRequiredText",valText:"valText",valRequiredText:"valRequiredText",hintText:"hintText",required:"required"},providers:[{provide:P,useExisting:a((()=>Xt)),multi:!0},{provide:w,useExisting:a((()=>Xt)),multi:!0}],usesInheritance:!0,ngImport:t,template:'
\n
\n {{ keyText | translate }}\n {{ valText | translate }}\n \n
\n
\n
\n \n \n \n {{ keyRequiredText | translate }}\n \n \n \n \n \n {{ valRequiredText | translate }}\n \n \n \n
\n
\n
\n \n
\n \n
\n
\n',styles:[":host .tb-kv-map-config{margin-bottom:16px}:host .tb-kv-map-config .header{padding-left:5px;padding-right:5px;padding-bottom:5px}:host .tb-kv-map-config .header .cell{padding-left:5px;padding-right:5px;color:#757575;font-size:12px;font-weight:700;white-space:nowrap}:host .tb-kv-map-config .body{padding-left:5px;padding-right:5px;padding-bottom:0;max-height:300px;overflow:auto}:host .tb-kv-map-config .body .cell{padding-left:5px;padding-right:5px}:host .tb-kv-map-config tb-error{display:block;margin-top:-12px}\n"],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:ge.TbErrorComponent,selector:"tb-error",inputs:["noMargin","error"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultLayoutAlignDirective,selector:" [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]",inputs:["fxLayoutAlign","fxLayoutAlign.xs","fxLayoutAlign.sm","fxLayoutAlign.md","fxLayoutAlign.lg","fxLayoutAlign.xl","fxLayoutAlign.lt-sm","fxLayoutAlign.lt-md","fxLayoutAlign.lt-lg","fxLayoutAlign.lt-xl","fxLayoutAlign.gt-xs","fxLayoutAlign.gt-sm","fxLayoutAlign.gt-md","fxLayoutAlign.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:ye.DefaultShowHideDirective,selector:" [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]",inputs:["fxShow","fxShow.print","fxShow.xs","fxShow.sm","fxShow.md","fxShow.lg","fxShow.xl","fxShow.lt-sm","fxShow.lt-md","fxShow.lt-lg","fxShow.lt-xl","fxShow.gt-xs","fxShow.gt-sm","fxShow.gt-md","fxShow.gt-lg","fxHide","fxHide.print","fxHide.xs","fxHide.sm","fxHide.md","fxHide.lg","fxHide.xl","fxHide.lt-sm","fxHide.lt-md","fxHide.lt-lg","fxHide.lt-xl","fxHide.gt-xs","fxHide.gt-sm","fxHide.gt-md","fxHide.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormControlDirective,selector:"[formControl]",inputs:["formControl","disabled","ngModel"],outputs:["ngModelChange"],exportAs:["ngForm"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormArrayName,selector:"[formArrayName]",inputs:["formArrayName"]},{kind:"pipe",type:R.AsyncPipe,name:"async"},{kind:"pipe",type:pe.SafePipe,name:"safe"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Xt,decorators:[{type:n,args:[{selector:"tb-kv-map-config-old",providers:[{provide:P,useExisting:a((()=>Xt)),multi:!0},{provide:w,useExisting:a((()=>Xt)),multi:!0}],template:'
\n
\n {{ keyText | translate }}\n {{ valText | translate }}\n \n
\n
\n
\n \n \n \n {{ keyRequiredText | translate }}\n \n \n \n \n \n {{ valRequiredText | translate }}\n \n \n \n
\n
\n
\n \n
\n \n
\n
\n',styles:[":host .tb-kv-map-config{margin-bottom:16px}:host .tb-kv-map-config .header{padding-left:5px;padding-right:5px;padding-bottom:5px}:host .tb-kv-map-config .header .cell{padding-left:5px;padding-right:5px;color:#757575;font-size:12px;font-weight:700;white-space:nowrap}:host .tb-kv-map-config .body{padding-left:5px;padding-right:5px;padding-bottom:0;max-height:300px;overflow:auto}:host .tb-kv-map-config .body .cell{padding-left:5px;padding-right:5px}:host .tb-kv-map-config tb-error{display:block;margin-top:-12px}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:t.Injector},{type:E.FormBuilder}]},propDecorators:{disabled:[{type:i}],uniqueKeyValuePairValidator:[{type:i}],requiredText:[{type:i}],keyText:[{type:i}],keyRequiredText:[{type:i}],valText:[{type:i}],valRequiredText:[{type:i}],hintText:[{type:i}],required:[{type:i}]}});class Zt extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.saveToCustomTableConfigForm}onConfigurationSet(e){this.saveToCustomTableConfigForm=this.fb.group({tableName:[e?e.tableName:null,[D.required,D.pattern(/.*\S.*/)]],fieldsMapping:[e?e.fieldsMapping:null,[D.required]]})}prepareOutputConfig(e){return e.tableName=e.tableName.trim(),e}}e("SaveToCustomTableConfigComponent",Zt),Zt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Zt,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Zt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Zt,selector:"tb-action-node-custom-table-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.custom-table-name\n \n \n {{ \'tb.rulenode.custom-table-name-required\' | translate }}\n \n tb.rulenode.custom-table-hint\n \n \n \n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:Xt,selector:"tb-kv-map-config-old",inputs:["disabled","uniqueKeyValuePairValidator","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","required"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Zt,decorators:[{type:n,args:[{selector:"tb-action-node-custom-table-config",template:'
\n \n tb.rulenode.custom-table-name\n \n \n {{ \'tb.rulenode.custom-table-name-required\' | translate }}\n \n tb.rulenode.custom-table-hint\n \n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class en extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.timeseriesConfigForm}onConfigurationSet(e){this.timeseriesConfigForm=this.fb.group({defaultTTL:[e?e.defaultTTL:null,[D.required,D.min(0)]],skipLatestPersistence:[!!e&&e.skipLatestPersistence,[]],useServerTs:[!!e&&e.useServerTs,[]]})}}e("TimeseriesConfigComponent",en),en.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:en,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),en.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:en,selector:"tb-action-node-timeseries-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.default-ttl\n \n \n {{ \'tb.rulenode.default-ttl-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-default-ttl-message\' | translate }}\n \n \n \n {{ \'tb.rulenode.skip-latest-persistence\' | translate }}\n \n \n {{ \'tb.rulenode.use-server-ts\' | translate }}\n \n
tb.rulenode.use-server-ts-hint
\n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:en,decorators:[{type:n,args:[{selector:"tb-action-node-timeseries-config",template:'
\n \n tb.rulenode.default-ttl\n \n \n {{ \'tb.rulenode.default-ttl-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-default-ttl-message\' | translate }}\n \n \n \n {{ \'tb.rulenode.skip-latest-persistence\' | translate }}\n \n \n {{ \'tb.rulenode.use-server-ts\' | translate }}\n \n
tb.rulenode.use-server-ts-hint
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class tn extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.unassignCustomerConfigForm}onConfigurationSet(e){this.unassignCustomerConfigForm=this.fb.group({customerNamePattern:[e?e.customerNamePattern:null,[D.required,D.pattern(/.*\S.*/)]],customerCacheExpiration:[e?e.customerCacheExpiration:null,[D.required,D.min(0)]]})}prepareOutputConfig(e){return e.customerNamePattern=e.customerNamePattern.trim(),e}}e("UnassignCustomerConfigComponent",tn),tn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:tn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),tn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:tn,selector:"tb-action-node-un-assign-to-customer-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.customer-name-pattern\n \n \n {{ \'tb.rulenode.customer-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.customer-cache-expiration\n \n \n {{ \'tb.rulenode.customer-cache-expiration-required\' | translate }}\n \n \n {{ \'tb.rulenode.customer-cache-expiration-range\' | translate }}\n \n tb.rulenode.customer-cache-expiration-hint\n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:tn,decorators:[{type:n,args:[{selector:"tb-action-node-un-assign-to-customer-config",template:'
\n \n tb.rulenode.customer-name-pattern\n \n \n {{ \'tb.rulenode.customer-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.customer-cache-expiration\n \n \n {{ \'tb.rulenode.customer-cache-expiration-required\' | translate }}\n \n \n {{ \'tb.rulenode.customer-cache-expiration-range\' | translate }}\n \n tb.rulenode.customer-cache-expiration-hint\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class nn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.attributeScopeMap=m,this.attributeScopes=Object.keys(m),this.telemetryTypeTranslationsMap=u,this.separatorKeysCodes=[le,se,me]}configForm(){return this.deleteAttributesConfigForm}onConfigurationSet(e){this.deleteAttributesConfigForm=this.fb.group({scope:[e?e.scope:null,[D.required]],keys:[e?e.keys:null,[D.required]],sendAttributesDeletedNotification:[!!e&&e.sendAttributesDeletedNotification,[]],notifyDevice:[!!e&&e.notifyDevice,[]]}),this.deleteAttributesConfigForm.get("scope").valueChanges.subscribe((e=>{e!==m.SHARED_SCOPE&&this.deleteAttributesConfigForm.get("notifyDevice").patchValue(!1,{emitEvent:!1})}))}removeKey(e){const t=this.deleteAttributesConfigForm.get("keys").value,n=t.indexOf(e);n>=0&&(t.splice(n,1),this.deleteAttributesConfigForm.get("keys").patchValue(t,{emitEvent:!0}))}addKey(e){const t=e.input;let n=e.value;if((n||"").trim()){n=n.trim();let e=this.deleteAttributesConfigForm.get("keys").value;e&&-1!==e.indexOf(n)||(e||(e=[]),e.push(n),this.deleteAttributesConfigForm.get("keys").patchValue(e,{emitEvent:!0}))}t&&(t.value="")}}e("DeleteAttributesConfigComponent",nn),nn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:nn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),nn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:nn,selector:"tb-action-node-delete-attributes-config",viewQueries:[{propertyName:"attributeChipList",first:!0,predicate:["attributeChipList"],descendants:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n {{ \'attribute.attributes-scope\' | translate }}\n \n \n {{ telemetryTypeTranslationsMap.get(scope) | translate }}\n \n \n \n \n \n \n {{key}}\n close\n \n \n \n {{ \'tb.rulenode.attributes-keys-required\' | translate }}\n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.send-attributes-deleted-notification\' | translate }}\n \n
tb.rulenode.send-attributes-deleted-notification-hint
\n
\n \n {{ \'tb.rulenode.notify-device\' | translate }}\n \n
tb.rulenode.notify-device-delete-hint
\n
\n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"component",type:ue.MatChipGrid,selector:"mat-chip-grid",inputs:["tabIndex","disabled","placeholder","required","value","errorStateMatcher"],outputs:["change","valueChange"]},{kind:"directive",type:ue.MatChipInput,selector:"input[matChipInputFor]",inputs:["matChipInputFor","matChipInputAddOnBlur","matChipInputSeparatorKeyCodes","placeholder","id","disabled"],outputs:["matChipInputTokenEnd"],exportAs:["matChipInput","matChipInputFor"]},{kind:"directive",type:ue.MatChipRemove,selector:"[matChipRemove]"},{kind:"component",type:ue.MatChipRow,selector:"mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]",inputs:["color","disabled","disableRipple","tabIndex","editable"],outputs:["edited"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:nn,decorators:[{type:n,args:[{selector:"tb-action-node-delete-attributes-config",template:'
\n \n {{ \'attribute.attributes-scope\' | translate }}\n \n \n {{ telemetryTypeTranslationsMap.get(scope) | translate }}\n \n \n \n \n \n \n {{key}}\n close\n \n \n \n {{ \'tb.rulenode.attributes-keys-required\' | translate }}\n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.send-attributes-deleted-notification\' | translate }}\n \n
tb.rulenode.send-attributes-deleted-notification-hint
\n
\n \n {{ \'tb.rulenode.notify-device\' | translate }}\n \n
tb.rulenode.notify-device-delete-hint
\n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]},propDecorators:{attributeChipList:[{type:o,args:["attributeChipList"]}]}});class rn extends b{get function(){return this.functionValue}set function(e){e&&this.functionValue!==e&&(this.functionValue=e,this.setupArgumentsFormGroup(!0))}constructor(e,t,n,r){super(e),this.store=e,this.translate=t,this.injector=n,this.fb=r,this.maxArgs=16,this.minArgs=1,this.displayArgumentName=!1,this.mathFunctionMap=Et,this.ArgumentType=Dt,this.attributeScopeMap=_t,this.argumentTypeMap=Rt,this.arguments=Object.values(Dt),this.attributeScope=Object.values(Kt),this.propagateChange=null,this.valueChangeSubscription=[]}ngOnInit(){this.ngControl=this.injector.get(V),null!=this.ngControl&&(this.ngControl.valueAccessor=this),this.argumentsFormGroup=this.fb.group({arguments:this.fb.array([])}),this.valueChangeSubscription.push(this.argumentsFormGroup.valueChanges.subscribe((()=>{this.updateModel()}))),this.setupArgumentsFormGroup()}onDrop(e){const t=this.argumentsFormArray(),n=t.at(e.previousIndex);t.removeAt(e.previousIndex),t.insert(e.currentIndex,n),this.updateArgumentNames()}argumentsFormArray(){return this.argumentsFormGroup.get("arguments")}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}setDisabledState(e){this.disabled=e,this.disabled?this.argumentsFormGroup.disable({emitEvent:!1}):(this.argumentsFormGroup.enable({emitEvent:!1}),this.argumentsFormGroup.get("arguments").controls.forEach((e=>this.updateArgumentControlValidators(e))))}ngOnDestroy(){this.valueChangeSubscription.length&&this.valueChangeSubscription.forEach((e=>e.unsubscribe()))}writeValue(e){const t=[];e&&e.forEach(((e,n)=>{t.push(this.createArgumentControl(e,n))})),this.argumentsFormGroup.setControl("arguments",this.fb.array(t),{emitEvent:!1}),this.setupArgumentsFormGroup()}removeArgument(e){this.argumentsFormGroup.get("arguments").removeAt(e),this.updateArgumentNames()}addArgument(e=!0){const t=this.argumentsFormGroup.get("arguments"),n=this.createArgumentControl(null,t.length);t.push(n,{emitEvent:e})}validate(e){return this.argumentsFormGroup.valid?null:{argumentsRequired:!0}}setupArgumentsFormGroup(e=!1){if(this.function&&(this.maxArgs=this.mathFunctionMap.get(this.function).maxArgs,this.minArgs=this.mathFunctionMap.get(this.function).minArgs,this.displayArgumentName=this.function===Gt.CUSTOM),this.argumentsFormGroup){for(this.argumentsFormGroup.get("arguments").setValidators([D.minLength(this.minArgs),D.maxLength(this.maxArgs)]),this.argumentsFormGroup.get("arguments").value.length>this.maxArgs&&(this.argumentsFormGroup.get("arguments").controls.length=this.maxArgs);this.argumentsFormGroup.get("arguments").value.length{this.updateArgumentControlValidators(n),n.get("attributeScope").updateValueAndValidity({emitEvent:!1}),n.get("defaultValue").updateValueAndValidity({emitEvent:!1})}))),n}updateArgumentControlValidators(e){const t=e.get("type").value;t===Dt.ATTRIBUTE?e.get("attributeScope").enable({emitEvent:!1}):e.get("attributeScope").disable({emitEvent:!1}),t&&t!==Dt.CONSTANT?e.get("defaultValue").enable({emitEvent:!1}):e.get("defaultValue").disable({emitEvent:!1})}updateArgumentNames(){this.argumentsFormGroup.get("arguments").controls.forEach(((e,t)=>{e.get("name").setValue(Bt[t])}))}updateModel(){const e=this.argumentsFormGroup.get("arguments").value;e.length&&this.argumentsFormGroup.valid?this.propagateChange(e):this.propagateChange(null)}}e("ArgumentsMapConfigComponent",rn),rn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:rn,deps:[{token:G.Store},{token:H.TranslateService},{token:t.Injector},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),rn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:rn,selector:"tb-arguments-map-config",inputs:{disabled:"disabled",function:"function"},providers:[{provide:P,useExisting:a((()=>rn)),multi:!0},{provide:w,useExisting:a((()=>rn)),multi:!0}],usesInheritance:!0,ngImport:t,template:'
\n\n
\n \n \n
\n \n
\n {{argumentControl.get(\'name\').value}}.\n
\n \n tb.rulenode.argument-source-field-input\n \n \n {{ argumentTypeMap.get(argumentControl.get(\'type\').value)?.name | translate }}\n \n \n {{ argumentTypeMap.get(argument).name | translate }}\n \n {{ argumentTypeMap.get(argument).description }}\n \n \n \n \n tb.rulenode.argument-source-field-input-required\n \n \n
\n \n tb.rulenode.argument-key-field-input\n \n \n help\n \n \n tb.rulenode.argument-key-field-input-required\n \n \n \n tb.rulenode.constant-value-field-input\n \n \n tb.rulenode.constant-value-field-input-required\n \n \n \n tb.rulenode.default-value-field-input\n \n \n
\n \n tb.rulenode.attribute-scope-field-input\n \n \n {{ attributeScopeMap.get(scope) | translate }}\n \n \n \n tb.rulenode.attribute-scope-field-input-required\n \n \n
\n \n
\n
\n
\n
\n
\n
\n tb.rulenode.no-arguments-prompt\n
\n \n
\n',styles:[":host .mat-mdc-list-item.tb-argument{border:solid rgba(0,0,0,.25) 1px;border-radius:4px;padding:10px 0;margin-bottom:16px}:host .arguments-list{padding:0}\n"],dependencies:[{kind:"directive",type:R.NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"directive",type:z.MatSelectTrigger,selector:"mat-select-trigger"},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"component",type:xe.MatList,selector:"mat-list",exportAs:["matList"]},{kind:"component",type:xe.MatListItem,selector:"mat-list-item, a[mat-list-item], button[mat-list-item]",inputs:["activated"],exportAs:["matListItem"]},{kind:"directive",type:be.CdkDropList,selector:"[cdkDropList], cdk-drop-list",inputs:["cdkDropListConnectedTo","cdkDropListData","cdkDropListOrientation","id","cdkDropListLockAxis","cdkDropListDisabled","cdkDropListSortingDisabled","cdkDropListEnterPredicate","cdkDropListSortPredicate","cdkDropListAutoScrollDisabled","cdkDropListAutoScrollStep"],outputs:["cdkDropListDropped","cdkDropListEntered","cdkDropListExited","cdkDropListSorted"],exportAs:["cdkDropList"]},{kind:"directive",type:be.CdkDrag,selector:"[cdkDrag]",inputs:["cdkDragData","cdkDragLockAxis","cdkDragRootElement","cdkDragBoundary","cdkDragStartDelay","cdkDragFreeDragPosition","cdkDragDisabled","cdkDragConstrainPosition","cdkDragPreviewClass","cdkDragPreviewContainer"],outputs:["cdkDragStarted","cdkDragReleased","cdkDragEnded","cdkDragEntered","cdkDragExited","cdkDragDropped","cdkDragMoved"],exportAs:["cdkDrag"]},{kind:"directive",type:be.CdkDragHandle,selector:"[cdkDragHandle]",inputs:["cdkDragHandleDisabled"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultLayoutAlignDirective,selector:" [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]",inputs:["fxLayoutAlign","fxLayoutAlign.xs","fxLayoutAlign.sm","fxLayoutAlign.md","fxLayoutAlign.lg","fxLayoutAlign.xl","fxLayoutAlign.lt-sm","fxLayoutAlign.lt-md","fxLayoutAlign.lt-lg","fxLayoutAlign.lt-xl","fxLayoutAlign.gt-xs","fxLayoutAlign.gt-sm","fxLayoutAlign.gt-md","fxLayoutAlign.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:ye.DefaultClassDirective,selector:" [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]",inputs:["ngClass","ngClass.xs","ngClass.sm","ngClass.md","ngClass.lg","ngClass.xl","ngClass.lt-sm","ngClass.lt-md","ngClass.lt-lg","ngClass.lt-xl","ngClass.gt-xs","ngClass.gt-sm","ngClass.gt-md","ngClass.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormControlDirective,selector:"[formControl]",inputs:["formControl","disabled","ngModel"],outputs:["ngModelChange"],exportAs:["ngForm"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormArrayName,selector:"[formArrayName]",inputs:["formArrayName"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:rn,decorators:[{type:n,args:[{selector:"tb-arguments-map-config",providers:[{provide:P,useExisting:a((()=>rn)),multi:!0},{provide:w,useExisting:a((()=>rn)),multi:!0}],template:'
\n\n
\n \n \n
\n \n
\n {{argumentControl.get(\'name\').value}}.\n
\n \n tb.rulenode.argument-source-field-input\n \n \n {{ argumentTypeMap.get(argumentControl.get(\'type\').value)?.name | translate }}\n \n \n {{ argumentTypeMap.get(argument).name | translate }}\n \n {{ argumentTypeMap.get(argument).description }}\n \n \n \n \n tb.rulenode.argument-source-field-input-required\n \n \n
\n \n tb.rulenode.argument-key-field-input\n \n \n help\n \n \n tb.rulenode.argument-key-field-input-required\n \n \n \n tb.rulenode.constant-value-field-input\n \n \n tb.rulenode.constant-value-field-input-required\n \n \n \n tb.rulenode.default-value-field-input\n \n \n
\n \n tb.rulenode.attribute-scope-field-input\n \n \n {{ attributeScopeMap.get(scope) | translate }}\n \n \n \n tb.rulenode.attribute-scope-field-input-required\n \n \n
\n \n
\n
\n
\n
\n
\n
\n tb.rulenode.no-arguments-prompt\n
\n \n
\n',styles:[":host .mat-mdc-list-item.tb-argument{border:solid rgba(0,0,0,.25) 1px;border-radius:4px;padding:10px 0;margin-bottom:16px}:host .arguments-list{padding:0}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:t.Injector},{type:E.FormBuilder}]},propDecorators:{disabled:[{type:i}],function:[{type:i}]}});class on extends b{get required(){return this.requiredValue}set required(e){this.requiredValue=fe(e)}constructor(e,t,n,r){super(e),this.store=e,this.translate=t,this.injector=n,this.fb=r,this.searchText="",this.dirty=!1,this.mathOperation=[...Et.values()],this.propagateChange=null}ngOnInit(){this.mathFunctionForm=this.fb.group({operation:[""]}),this.filteredOptions=this.mathFunctionForm.get("operation").valueChanges.pipe(he((e=>{let t;t="string"==typeof e&&Gt[e]?Gt[e]:null,this.updateView(t)})),ve((e=>(this.searchText=e||"",e?this._filter(e):this.mathOperation.slice()))))}_filter(e){const t=e.toLowerCase();return this.mathOperation.filter((e=>e.name.toLowerCase().includes(t)||e.value.toLowerCase().includes(t)))}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}setDisabledState(e){this.disabled=e,this.disabled?this.mathFunctionForm.disable({emitEvent:!1}):this.mathFunctionForm.enable({emitEvent:!1})}mathFunctionDisplayFn(e){if(e){const t=Et.get(e);return t.value+" | "+t.name}return""}writeValue(e){this.modelValue=e,this.mathFunctionForm.get("operation").setValue(e,{emitEvent:!1}),this.dirty=!0}updateView(e){this.modelValue!==e&&(this.modelValue=e,this.propagateChange(this.modelValue))}onFocus(){this.dirty&&(this.mathFunctionForm.get("operation").updateValueAndValidity({onlySelf:!0}),this.dirty=!1)}clear(){this.mathFunctionForm.get("operation").patchValue(""),setTimeout((()=>{this.operationInput.nativeElement.blur(),this.operationInput.nativeElement.focus()}),0)}}e("MathFunctionAutocompleteComponent",on),on.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:on,deps:[{token:G.Store},{token:H.TranslateService},{token:t.Injector},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),on.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:on,selector:"tb-math-function-autocomplete",inputs:{required:"required",disabled:"disabled"},providers:[{provide:P,useExisting:a((()=>on)),multi:!0}],viewQueries:[{propertyName:"operationInput",first:!0,predicate:["operationInput"],descendants:!0,static:!0}],usesInheritance:!0,ngImport:t,template:'\n tb.rulenode.functions-field-input\n \n \n \n \n \n \n {{ option.description }}\n \n \n \n tb.rulenode.no-option-found\n \n \n\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"component",type:Te.MatAutocomplete,selector:"mat-autocomplete",inputs:["disableRipple","hideSingleSelectionIndicator"],exportAs:["matAutocomplete"]},{kind:"directive",type:Te.MatAutocompleteTrigger,selector:"input[matAutocomplete], textarea[matAutocomplete]",exportAs:["matAutocompleteTrigger"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:R.AsyncPipe,name:"async"},{kind:"pipe",type:Ie.HighlightPipe,name:"highlight"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:on,decorators:[{type:n,args:[{selector:"tb-math-function-autocomplete",providers:[{provide:P,useExisting:a((()=>on)),multi:!0}],template:'\n tb.rulenode.functions-field-input\n \n \n \n \n \n \n {{ option.description }}\n \n \n \n tb.rulenode.no-option-found\n \n \n\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:t.Injector},{type:E.UntypedFormBuilder}]},propDecorators:{required:[{type:i}],disabled:[{type:i}],operationInput:[{type:o,args:["operationInput",{static:!0}]}]}});class an extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.MathFunction=Gt,this.ArgumentTypeResult=Vt,this.argumentTypeResultMap=Ot,this.attributeScopeMap=_t,this.argumentsResult=Object.values(Vt),this.attributeScopeResult=Object.values(Ut)}configForm(){return this.mathFunctionConfigForm}onConfigurationSet(e){this.mathFunctionConfigForm=this.fb.group({operation:[e?e.operation:null,[D.required]],arguments:[e?e.arguments:null,[D.required]],customFunction:[e?e.customFunction:"",[D.required]],result:this.fb.group({type:[e?e.result.type:null,[D.required]],attributeScope:[e?e.result.attributeScope:null,[D.required]],key:[e?e.result.key:"",[D.required]],resultValuePrecision:[e?e.result.resultValuePrecision:0],addToBody:[!!e&&e.result.addToBody],addToMetadata:[!!e&&e.result.addToMetadata]})})}updateValidators(e){const t=this.mathFunctionConfigForm.get("operation").value,n=this.mathFunctionConfigForm.get("result.type").value;t===Gt.CUSTOM?this.mathFunctionConfigForm.get("customFunction").enable({emitEvent:!1}):this.mathFunctionConfigForm.get("customFunction").disable({emitEvent:!1}),n===Vt.ATTRIBUTE?this.mathFunctionConfigForm.get("result.attributeScope").enable({emitEvent:!1}):this.mathFunctionConfigForm.get("result.attributeScope").disable({emitEvent:!1}),this.mathFunctionConfigForm.get("customFunction").updateValueAndValidity({emitEvent:e}),this.mathFunctionConfigForm.get("result.attributeScope").updateValueAndValidity({emitEvent:e})}validatorTriggers(){return["operation","result.type"]}}e("MathFunctionConfigComponent",an),an.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:an,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),an.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:an,selector:"tb-action-node-math-function-config",usesInheritance:!0,ngImport:t,template:'
\n \n \n
\n tb.rulenode.argument-tile\n \n \n
\n
\n {{\'tb.rulenode.custom-expression-field-input\' | translate }} *\n \n \n \n tb.rulenode.custom-expression-field-input-required\n \n tb.rulenode.custom-expression-field-input-hint\n \n
\n
\n tb.rulenode.result-title\n
\n \n tb.rulenode.type-field-input\n \n \n {{ argumentTypeResultMap.get(mathFunctionConfigForm.get(\'result.type\').value)?.name | translate }}\n \n \n {{ argumentTypeResultMap.get(argument).name | translate }}\n \n {{ argumentTypeResultMap.get(argument).description }}\n \n \n \n \n tb.rulenode.type-field-input-required\n \n \n
\n \n tb.rulenode.attribute-scope-field-input\n \n \n {{ attributeScopeMap.get(scope) | translate }}\n \n \n \n \n tb.rulenode.key-field-input\n \n help\n \n tb.rulenode.key-field-input-required\n \n \n
\n
\n \n tb.rulenode.number-floating-point-field-input\n \n \n \n
\n
\n \n {{\'tb.rulenode.add-to-message-field-input\' | translate }}\n \n \n {{\'tb.rulenode.add-to-metadata-field-input\' | translate}}\n \n
\n
\n
\n
\n',styles:[":host ::ng-deep .fields-group{padding:0 16px 8px;margin:10px 0;border:1px groove rgba(0,0,0,.25);border-radius:4px}:host ::ng-deep .fields-group .mat-mdc-form-field .mat-mdc-form-field-infix{width:100%}:host ::ng-deep .fields-group legend{color:#000000b3;width:-moz-fit-content;width:fit-content}:host ::ng-deep .fields-group legend+*{display:block}:host ::ng-deep .fields-group legend+*.no-margin-top{margin-top:0}\n"],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"directive",type:z.MatSelectTrigger,selector:"mat-select-trigger"},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultLayoutAlignDirective,selector:" [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]",inputs:["fxLayoutAlign","fxLayoutAlign.xs","fxLayoutAlign.sm","fxLayoutAlign.md","fxLayoutAlign.lg","fxLayoutAlign.xl","fxLayoutAlign.lt-sm","fxLayoutAlign.lt-md","fxLayoutAlign.lt-lg","fxLayoutAlign.lt-xl","fxLayoutAlign.gt-xs","fxLayoutAlign.gt-sm","fxLayoutAlign.gt-md","fxLayoutAlign.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:E.FormGroupName,selector:"[formGroupName]",inputs:["formGroupName"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:rn,selector:"tb-arguments-map-config",inputs:["disabled","function"]},{kind:"component",type:on,selector:"tb-math-function-autocomplete",inputs:["required","disabled"]},{kind:"pipe",type:pe.SafePipe,name:"safe"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:an,decorators:[{type:n,args:[{selector:"tb-action-node-math-function-config",template:'
\n \n \n
\n tb.rulenode.argument-tile\n \n \n
\n
\n {{\'tb.rulenode.custom-expression-field-input\' | translate }} *\n \n \n \n tb.rulenode.custom-expression-field-input-required\n \n tb.rulenode.custom-expression-field-input-hint\n \n
\n
\n tb.rulenode.result-title\n
\n \n tb.rulenode.type-field-input\n \n \n {{ argumentTypeResultMap.get(mathFunctionConfigForm.get(\'result.type\').value)?.name | translate }}\n \n \n {{ argumentTypeResultMap.get(argument).name | translate }}\n \n {{ argumentTypeResultMap.get(argument).description }}\n \n \n \n \n tb.rulenode.type-field-input-required\n \n \n
\n \n tb.rulenode.attribute-scope-field-input\n \n \n {{ attributeScopeMap.get(scope) | translate }}\n \n \n \n \n tb.rulenode.key-field-input\n \n help\n \n tb.rulenode.key-field-input-required\n \n \n
\n
\n \n tb.rulenode.number-floating-point-field-input\n \n \n \n
\n
\n \n {{\'tb.rulenode.add-to-message-field-input\' | translate }}\n \n \n {{\'tb.rulenode.add-to-metadata-field-input\' | translate}}\n \n
\n
\n
\n
\n',styles:[":host ::ng-deep .fields-group{padding:0 16px 8px;margin:10px 0;border:1px groove rgba(0,0,0,.25);border-radius:4px}:host ::ng-deep .fields-group .mat-mdc-form-field .mat-mdc-form-field-infix{width:100%}:host ::ng-deep .fields-group legend{color:#000000b3;width:-moz-fit-content;width:fit-content}:host ::ng-deep .fields-group legend+*{display:block}:host ::ng-deep .fields-group legend+*.no-margin-top{margin-top:0}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class ln extends b{set required(e){this.requiredValue!==e&&(this.requiredValue=e,this.updateValidators())}get required(){return this.requiredValue}constructor(e,t){super(e),this.store=e,this.fb=t,this.subscriptSizing="fixed",this.searchText="",this.dirty=!1,this.messageTypes=["POST_ATTRIBUTES_REQUEST","POST_TELEMETRY_REQUEST"],this.propagateChange=e=>{},this.messageTypeFormGroup=this.fb.group({messageType:[null,[D.maxLength(255)]]})}registerOnTouched(e){}registerOnChange(e){this.propagateChange=e}ngOnInit(){this.outputMessageTypes=this.messageTypeFormGroup.get("messageType").valueChanges.pipe(he((e=>{this.updateView(e)})),ve((e=>e||"")),Ce((e=>this.fetchMessageTypes(e))))}writeValue(e){this.searchText="",this.modelValue=e,this.messageTypeFormGroup.get("messageType").patchValue(e,{emitEvent:!1}),this.dirty=!0}onFocus(){this.dirty&&(this.messageTypeFormGroup.get("messageType").updateValueAndValidity({onlySelf:!0,emitEvent:!0}),this.dirty=!1)}updateView(e){this.modelValue!==e&&(this.modelValue=e,this.propagateChange(this.modelValue))}displayMessageTypeFn(e){return e||void 0}fetchMessageTypes(e,t=!1){return this.searchText=e,qe(this.messageTypes).pipe(ve((n=>n.filter((n=>t?!!e&&n===e:!e||n.toUpperCase().startsWith(e.toUpperCase()))))))}clear(){this.messageTypeFormGroup.get("messageType").patchValue(null,{emitEvent:!0}),setTimeout((()=>{this.messageTypeInput.nativeElement.blur(),this.messageTypeInput.nativeElement.focus()}),0)}setDisabledState(e){e?this.messageTypeFormGroup.disable({emitEvent:!1}):this.messageTypeFormGroup.enable({emitEvent:!1})}updateValidators(){this.messageTypeFormGroup.get("messageType").setValidators(this.required?[D.required,D.maxLength(255)]:[D.maxLength(255)]),this.messageTypeFormGroup.get("messageType").updateValueAndValidity({emitEvent:!1})}}e("OutputMessageTypeAutocompleteComponent",ln),ln.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ln,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),ln.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:ln,selector:"tb-output-message-type-autocomplete",inputs:{autocompleteHint:"autocompleteHint",subscriptSizing:"subscriptSizing",required:"required"},providers:[{provide:P,useExisting:a((()=>ln)),multi:!0}],viewQueries:[{propertyName:"messageTypeInput",first:!0,predicate:["messageTypeInput"],descendants:!0,static:!0}],usesInheritance:!0,ngImport:t,template:'\n {{\'tb.rulenode.output-message-type\' | translate}}\n \n \n \n \n \n \n \n {{autocompleteHint | translate}}\n \n {{ \'tb.rulenode.output-message-type-required\' | translate }}\n \n \n {{ \'tb.rulenode.output-message-type-max-length\' | translate }}\n \n\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"component",type:Te.MatAutocomplete,selector:"mat-autocomplete",inputs:["disableRipple","hideSingleSelectionIndicator"],exportAs:["matAutocomplete"]},{kind:"directive",type:Te.MatAutocompleteTrigger,selector:"input[matAutocomplete], textarea[matAutocomplete]",exportAs:["matAutocompleteTrigger"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"pipe",type:R.AsyncPipe,name:"async"},{kind:"pipe",type:Ie.HighlightPipe,name:"highlight"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),Se([h()],ln.prototype,"required",null),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ln,decorators:[{type:n,args:[{selector:"tb-output-message-type-autocomplete",providers:[{provide:P,useExisting:a((()=>ln)),multi:!0}],template:'\n {{\'tb.rulenode.output-message-type\' | translate}}\n \n \n \n \n \n \n \n {{autocompleteHint | translate}}\n \n {{ \'tb.rulenode.output-message-type-required\' | translate }}\n \n \n {{ \'tb.rulenode.output-message-type-max-length\' | translate }}\n \n\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]},propDecorators:{messageTypeInput:[{type:o,args:["messageTypeInput",{static:!0}]}],autocompleteHint:[{type:i}],subscriptSizing:[{type:i}],required:[{type:i}]}});class sn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.serviceType=p.TB_RULE_ENGINE,this.deduplicationStrategie=gt,this.deduplicationStrategies=Object.keys(this.deduplicationStrategie),this.deduplicationStrategiesTranslations=yt}configForm(){return this.deduplicationConfigForm}onConfigurationSet(e){this.deduplicationConfigForm=this.fb.group({interval:[X(e?.interval)?e.interval:null,[D.required,D.min(1)]],strategy:[X(e?.strategy)?e.strategy:null,[D.required]],outMsgType:[X(e?.outMsgType)?e.outMsgType:null,[D.required]],queueName:[X(e?.queueName)?e.queueName:null,[D.required]],maxPendingMsgs:[X(e?.maxPendingMsgs)?e.maxPendingMsgs:null,[D.required,D.min(1),D.max(1e3)]],maxRetries:[X(e?.maxRetries)?e.maxRetries:null,[D.required,D.min(0),D.max(100)]]})}updateValidators(e){this.deduplicationConfigForm.get("strategy").value===this.deduplicationStrategie.ALL?(this.deduplicationConfigForm.get("outMsgType").enable({emitEvent:!1}),this.deduplicationConfigForm.get("queueName").enable({emitEvent:!1})):(this.deduplicationConfigForm.get("outMsgType").disable({emitEvent:!1}),this.deduplicationConfigForm.get("queueName").disable({emitEvent:!1})),this.deduplicationConfigForm.get("outMsgType").updateValueAndValidity({emitEvent:e}),this.deduplicationConfigForm.get("queueName").updateValueAndValidity({emitEvent:e})}validatorTriggers(){return["strategy"]}}e("DeduplicationConfigComponent",sn),sn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:sn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),sn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:sn,selector:"tb-action-node-msg-deduplication-config",usesInheritance:!0,ngImport:t,template:"
\n \n {{'tb.rulenode.interval' | translate}}\n \n {{'tb.rulenode.interval-hint' | translate}}\n \n {{'tb.rulenode.interval-required' | translate}}\n \n \n {{'tb.rulenode.interval-min-error' | translate}}\n \n \n \n {{'tb.rulenode.strategy' | translate}}\n \n \n {{ deduplicationStrategiesTranslations.get(strategy) | translate }}\n \n \n \n {{'tb.rulenode.strategy-first-hint' | translate}}\n {{'tb.rulenode.strategy-last-hint' | translate}}\n \n {{'tb.rulenode.strategy-required' | translate}}\n \n \n
\n \n \n \n \n
\n \n \n \n
\n
Advanced settings
\n
\n
\n
\n \n \n {{'tb.rulenode.max-pending-msgs' | translate}}\n \n {{'tb.rulenode.max-pending-msgs-hint' | translate}}\n \n {{'tb.rulenode.max-pending-msgs-required' | translate}}\n \n \n {{'tb.rulenode.max-pending-msgs-max-error' | translate}}\n \n \n {{'tb.rulenode.max-pending-msgs-min-error' | translate}}\n \n \n \n {{'tb.rulenode.max-retries' | translate}}\n \n {{'tb.rulenode.max-retries-hint' | translate}}\n \n {{'tb.rulenode.max-retries-required' | translate}}\n \n \n {{'tb.rulenode.max-retries-max-error' | translate}}\n \n \n {{'tb.rulenode.max-retries-min-error' | translate}}\n \n \n \n
\n
\n",styles:[":host ::ng-deep .mat-expansion-panel.advanced-settings{border:none;box-shadow:none;padding:0}:host ::ng-deep .mat-expansion-panel.advanced-settings .mat-expansion-panel-body{padding:0}:host ::ng-deep .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:white}\n"],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:J.QueueAutocompleteComponent,selector:"tb-queue-autocomplete",inputs:["labelText","requiredText","autocompleteHint","subscriptSizing","required","queueType","disabled"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"component",type:Ne.MatExpansionPanel,selector:"mat-expansion-panel",inputs:["disabled","expanded","hideToggle","togglePosition"],outputs:["opened","closed","expandedChange","afterExpand","afterCollapse"],exportAs:["matExpansionPanel"]},{kind:"component",type:Ne.MatExpansionPanelHeader,selector:"mat-expansion-panel-header",inputs:["tabIndex","expandedHeight","collapsedHeight"]},{kind:"directive",type:Ne.MatExpansionPanelTitle,selector:"mat-panel-title"},{kind:"directive",type:Ne.MatExpansionPanelContent,selector:"ng-template[matExpansionPanelContent]"},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutAlignDirective,selector:" [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]",inputs:["fxLayoutAlign","fxLayoutAlign.xs","fxLayoutAlign.sm","fxLayoutAlign.md","fxLayoutAlign.lg","fxLayoutAlign.xl","fxLayoutAlign.lt-sm","fxLayoutAlign.lt-md","fxLayoutAlign.lt-lg","fxLayoutAlign.lt-xl","fxLayoutAlign.gt-xs","fxLayoutAlign.gt-sm","fxLayoutAlign.gt-md","fxLayoutAlign.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:ln,selector:"tb-output-message-type-autocomplete",inputs:["autocompleteHint","subscriptSizing","required"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:sn,decorators:[{type:n,args:[{selector:"tb-action-node-msg-deduplication-config",template:"
\n \n {{'tb.rulenode.interval' | translate}}\n \n {{'tb.rulenode.interval-hint' | translate}}\n \n {{'tb.rulenode.interval-required' | translate}}\n \n \n {{'tb.rulenode.interval-min-error' | translate}}\n \n \n \n {{'tb.rulenode.strategy' | translate}}\n \n \n {{ deduplicationStrategiesTranslations.get(strategy) | translate }}\n \n \n \n {{'tb.rulenode.strategy-first-hint' | translate}}\n {{'tb.rulenode.strategy-last-hint' | translate}}\n \n {{'tb.rulenode.strategy-required' | translate}}\n \n \n
\n \n \n \n \n
\n \n \n \n
\n
Advanced settings
\n
\n
\n
\n \n \n {{'tb.rulenode.max-pending-msgs' | translate}}\n \n {{'tb.rulenode.max-pending-msgs-hint' | translate}}\n \n {{'tb.rulenode.max-pending-msgs-required' | translate}}\n \n \n {{'tb.rulenode.max-pending-msgs-max-error' | translate}}\n \n \n {{'tb.rulenode.max-pending-msgs-min-error' | translate}}\n \n \n \n {{'tb.rulenode.max-retries' | translate}}\n \n {{'tb.rulenode.max-retries-hint' | translate}}\n \n {{'tb.rulenode.max-retries-required' | translate}}\n \n \n {{'tb.rulenode.max-retries-max-error' | translate}}\n \n \n {{'tb.rulenode.max-retries-min-error' | translate}}\n \n \n \n
\n
\n",styles:[":host ::ng-deep .mat-expansion-panel.advanced-settings{border:none;box-shadow:none;padding:0}:host ::ng-deep .mat-expansion-panel.advanced-settings .mat-expansion-panel-body{padding:0}:host ::ng-deep .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:white}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class mn{}e("ExampleHintComponent",mn),mn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:mn,deps:[],target:t.ɵɵFactoryTarget.Component}),mn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:mn,selector:"tb-example-hint",inputs:{hintText:"hintText",popupHelpLink:"popupHelpLink"},ngImport:t,template:'
\n
{{ hintText }}
\n
\n
\n
\n',styles:[":host .space-between{display:flex;justify-content:space-between;gap:20px}:host .space-between .see-example{display:flex;flex-shrink:0}\n"],dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:Ge.HelpPopupComponent,selector:"[tb-help-popup], [tb-help-popup-content]",inputs:["tb-help-popup","tb-help-popup-content","trigger-text","trigger-style","tb-help-popup-placement","tb-help-popup-style","hintMode"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:mn,decorators:[{type:n,args:[{selector:"tb-example-hint",template:'
\n
{{ hintText }}
\n
\n
\n
\n',styles:[":host .space-between{display:flex;justify-content:space-between;gap:20px}:host .space-between .see-example{display:flex;flex-shrink:0}\n"]}]}],propDecorators:{hintText:[{type:i}],popupHelpLink:[{type:i}]}});class un extends b{constructor(e,t,n,r){super(e),this.store=e,this.translate=t,this.injector=n,this.fb=r,this.propagateChange=null,this.valueChangeSubscription=null,this.disabled=!1,this.uniqueKeyValuePairValidator=!1,this.required=!1}ngOnInit(){this.ngControl=this.injector.get(V),null!=this.ngControl&&(this.ngControl.valueAccessor=this),this.kvListFormGroup=this.fb.group({}),this.kvListFormGroup.addControl("keyVals",this.fb.array([]))}keyValsFormArray(){return this.kvListFormGroup.get("keyVals")}errorTrigger(){const e=this.keyValsFormArray();for(const t of e.controls)for(const e of Object.keys(t.value))if(t.get(e).touched&&t.get(e).invalid)return!0;return!1}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}setDisabledState(e){this.disabled=e,this.disabled?this.kvListFormGroup.disable({emitEvent:!1}):this.kvListFormGroup.enable({emitEvent:!1})}writeValue(e){this.valueChangeSubscription&&this.valueChangeSubscription.unsubscribe();const t=[];if(e)for(const n of Object.keys(e))Object.prototype.hasOwnProperty.call(e,n)&&t.push(this.fb.group({key:[n,[D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)]],value:[e[n],[D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)]]}));this.kvListFormGroup.setControl("keyVals",this.fb.array(t)),this.valueChangeSubscription=this.kvListFormGroup.valueChanges.subscribe((()=>{this.updateModel()}))}removeKeyVal(e){this.kvListFormGroup.get("keyVals").removeAt(e)}addKeyVal(){this.kvListFormGroup.get("keyVals").push(this.fb.group({key:["",[D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)]],value:["",[D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)]]}))}validate(e){const t=this.kvListFormGroup.get("keyVals").value;if(!t.length&&this.required)return{kvMapRequired:!0};if(!this.kvListFormGroup.valid)return{kvFieldsRequired:!0};if(this.uniqueKeyValuePairValidator)for(const e of t)if(e.key===e.value)return{uniqueKeyValuePair:!0};return null}updateModel(){const e=this.kvListFormGroup.get("keyVals").value;if(this.required&&!e.length||!this.kvListFormGroup.valid)this.propagateChange(null);else{const t={};e.forEach((e=>{t[e.key]=e.value})),this.propagateChange(t)}}}e("KvMapConfigComponent",un),un.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:un,deps:[{token:G.Store},{token:H.TranslateService},{token:t.Injector},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),un.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:un,selector:"tb-kv-map-config",inputs:{disabled:"disabled",uniqueKeyValuePairValidator:"uniqueKeyValuePairValidator",labelText:"labelText",requiredText:"requiredText",keyText:"keyText",keyRequiredText:"keyRequiredText",valText:"valText",valRequiredText:"valRequiredText",hintText:"hintText",popupHelpLink:"popupHelpLink",required:"required"},providers:[{provide:P,useExisting:a((()=>un)),multi:!0},{provide:w,useExisting:a((()=>un)),multi:!0}],usesInheritance:!0,ngImport:t,template:'
\n
\n
{{ labelText }}
\n
\n tb.rulenode.map-fields-required\n
\n
\n
\n
\n
\n
{{ keyText }}
\n
{{ valText }}
\n
\n
\n
\n
\n \n \n \n \n \n \n
\n \n
\n
\n
\n
\n
\n
\n \n
\n \n
\n',styles:[":host .field-space{flex:1 1 50%}:host .actions-header{width:40px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"directive",type:R.NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:ye.DefaultClassDirective,selector:" [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]",inputs:["ngClass","ngClass.xs","ngClass.sm","ngClass.md","ngClass.lg","ngClass.xl","ngClass.lt-sm","ngClass.lt-md","ngClass.lt-lg","ngClass.lt-xl","ngClass.gt-xs","ngClass.gt-sm","ngClass.gt-md","ngClass.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormControlDirective,selector:"[formControl]",inputs:["formControl","disabled","ngModel"],outputs:["ngModelChange"],exportAs:["ngForm"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:mn,selector:"tb-example-hint",inputs:["hintText","popupHelpLink"]},{kind:"pipe",type:R.AsyncPipe,name:"async"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),Se([h()],un.prototype,"disabled",void 0),Se([h()],un.prototype,"uniqueKeyValuePairValidator",void 0),Se([h()],un.prototype,"required",void 0),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:un,decorators:[{type:n,args:[{selector:"tb-kv-map-config",providers:[{provide:P,useExisting:a((()=>un)),multi:!0},{provide:w,useExisting:a((()=>un)),multi:!0}],template:'
\n
\n
{{ labelText }}
\n
\n tb.rulenode.map-fields-required\n
\n
\n
\n
\n
\n
{{ keyText }}
\n
{{ valText }}
\n
\n
\n
\n
\n \n \n \n \n \n \n
\n \n
\n
\n
\n
\n
\n
\n \n
\n \n
\n',styles:[":host .field-space{flex:1 1 50%}:host .actions-header{width:40px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:t.Injector},{type:E.FormBuilder}]},propDecorators:{disabled:[{type:i}],uniqueKeyValuePairValidator:[{type:i}],labelText:[{type:i}],requiredText:[{type:i}],keyText:[{type:i}],keyRequiredText:[{type:i}],valText:[{type:i}],valRequiredText:[{type:i}],hintText:[{type:i}],popupHelpLink:[{type:i}],required:[{type:i}]}});class pn extends b{get required(){return this.requiredValue}set required(e){this.requiredValue=fe(e)}constructor(e,t){super(e),this.store=e,this.fb=t,this.directionTypes=Object.values(g),this.directionTypeTranslations=y,this.entityType=x,this.propagateChange=null}ngOnInit(){this.deviceRelationsQueryFormGroup=this.fb.group({fetchLastLevelOnly:[!1,[]],direction:[null,[D.required]],maxLevel:[null,[D.min(1)]],relationType:[null],deviceTypes:[null,[D.required]]}),this.deviceRelationsQueryFormGroup.valueChanges.subscribe((e=>{this.deviceRelationsQueryFormGroup.valid?this.propagateChange(e):this.propagateChange(null)}))}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}setDisabledState(e){this.disabled=e,this.disabled?this.deviceRelationsQueryFormGroup.disable({emitEvent:!1}):this.deviceRelationsQueryFormGroup.enable({emitEvent:!1})}writeValue(e){this.deviceRelationsQueryFormGroup.reset(e,{emitEvent:!1})}}e("DeviceRelationsQueryConfigComponent",pn),pn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:pn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),pn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:pn,selector:"tb-device-relations-query-config",inputs:{disabled:"disabled",required:"required"},providers:[{provide:P,useExisting:a((()=>pn)),multi:!0}],usesInheritance:!0,ngImport:t,template:'
\n
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }}\n \n \n \n \n tb.rulenode.max-relation-level\n \n \n {{ \'tb.rulenode.max-relation-level-error\' | translate }}\n \n \n
\n
\n \n {{ \'alias.last-level-relation\' | translate }}\n \n
\n \n \n \n help\n \n
\n',styles:[":host .last-level-slide-toggle{margin:8px 0 24px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:Ee.EntitySubTypeListComponent,selector:"tb-entity-subtype-list",inputs:["required","floatLabel","label","disabled","entityType","emptyInputPlaceholder","filledInputPlaceholder","appearance","subscriptSizing","additionalClasses"]},{kind:"component",type:De.RelationTypeAutocompleteComponent,selector:"tb-relation-type-autocomplete",inputs:["showLabel","additionalClasses","appearance","required","disabled","subscriptSizing"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:pn,decorators:[{type:n,args:[{selector:"tb-device-relations-query-config",providers:[{provide:P,useExisting:a((()=>pn)),multi:!0}],template:'
\n
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }}\n \n \n \n \n tb.rulenode.max-relation-level\n \n \n {{ \'tb.rulenode.max-relation-level-error\' | translate }}\n \n \n
\n
\n \n {{ \'alias.last-level-relation\' | translate }}\n \n
\n \n \n \n help\n \n
\n',styles:[":host .last-level-slide-toggle{margin:8px 0 24px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]},propDecorators:{disabled:[{type:i}],required:[{type:i}]}});class dn extends b{get required(){return this.requiredValue}set required(e){this.requiredValue=fe(e)}constructor(e,t){super(e),this.store=e,this.fb=t,this.directionTypes=Object.values(g),this.directionTypeTranslations=y,this.propagateChange=null}ngOnInit(){this.relationsQueryFormGroup=this.fb.group({fetchLastLevelOnly:[!1,[]],direction:[null,[D.required]],maxLevel:[null,[D.min(1)]],filters:[null]}),this.relationsQueryFormGroup.valueChanges.subscribe((e=>{this.relationsQueryFormGroup.valid?this.propagateChange(e):this.propagateChange(null)}))}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}setDisabledState(e){this.disabled=e,this.disabled?this.relationsQueryFormGroup.disable({emitEvent:!1}):this.relationsQueryFormGroup.enable({emitEvent:!1})}writeValue(e){this.relationsQueryFormGroup.reset(e||{},{emitEvent:!1})}}e("RelationsQueryConfigComponent",dn),dn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:dn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),dn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:dn,selector:"tb-relations-query-config",inputs:{disabled:"disabled",required:"required"},providers:[{provide:P,useExisting:a((()=>dn)),multi:!0}],usesInheritance:!0,ngImport:t,template:'
\n
tb.rulenode.relations-query
\n
\n
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }}\n \n \n \n \n tb.rulenode.max-relation-level\n \n \n {{ \'tb.rulenode.max-relation-level-error\' | translate }}\n \n \n
\n
\n \n {{ \'alias.last-level-relation\' | translate }}\n \n
\n
\n
\n
relation.relation-filters
\n \n \n
\n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"component",type:Ve.RelationFiltersComponent,selector:"tb-relation-filters",inputs:["disabled","allowedEntityTypes"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:dn,decorators:[{type:n,args:[{selector:"tb-relations-query-config",providers:[{provide:P,useExisting:a((()=>dn)),multi:!0}],template:'
\n
tb.rulenode.relations-query
\n
\n
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }}\n \n \n \n \n tb.rulenode.max-relation-level\n \n \n {{ \'tb.rulenode.max-relation-level-error\' | translate }}\n \n \n
\n
\n \n {{ \'alias.last-level-relation\' | translate }}\n \n
\n
\n
\n
relation.relation-filters
\n \n \n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]},propDecorators:{disabled:[{type:i}],required:[{type:i}]}});class cn extends b{get required(){return this.requiredValue}set required(e){this.requiredValue=fe(e)}constructor(e,t,n,r){super(e),this.store=e,this.translate=t,this.truncate=n,this.fb=r,this.placeholder="tb.rulenode.add-message-type",this.separatorKeysCodes=[le,se,me],this.messageTypes=[],this.messageTypesList=[],this.searchText="",this.propagateChange=e=>{},this.messageTypeConfigForm=this.fb.group({messageType:[null]});for(const e of Object.keys(v))this.messageTypesList.push({name:C.get(v[e]),value:e})}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}ngOnInit(){this.filteredMessageTypes=this.messageTypeConfigForm.get("messageType").valueChanges.pipe(Fe(""),ve((e=>e||"")),Ce((e=>this.fetchMessageTypes(e))),ke())}setDisabledState(e){this.disabled=e,this.disabled?this.messageTypeConfigForm.disable({emitEvent:!1}):this.messageTypeConfigForm.enable({emitEvent:!1})}writeValue(e){this.searchText="",this.messageTypes.length=0,e&&e.forEach((e=>{const t=this.messageTypesList.find((t=>t.value===e));t?this.messageTypes.push({name:t.name,value:t.value}):this.messageTypes.push({name:e,value:e})}))}displayMessageTypeFn(e){return e?e.name:void 0}textIsNotEmpty(e){return e&&e.length>0}createMessageType(e,t){e.preventDefault(),this.transformMessageType(t)}add(e){this.transformMessageType(e.value)}fetchMessageTypes(e){if(this.searchText=e,this.searchText&&this.searchText.length){const e=this.searchText.toUpperCase();return qe(this.messageTypesList.filter((t=>t.name.toUpperCase().includes(e))))}return qe(this.messageTypesList)}transformMessageType(e){if((e||"").trim()){let t;const n=e.trim(),r=this.messageTypesList.find((e=>e.name===n));t=r?{name:r.name,value:r.value}:{name:n,value:n},t&&this.addMessageType(t)}this.clear("")}remove(e){const t=this.messageTypes.indexOf(e);t>=0&&(this.messageTypes.splice(t,1),this.updateModel())}selected(e){this.addMessageType(e.option.value),this.clear("")}addMessageType(e){-1===this.messageTypes.findIndex((t=>t.value===e.value))&&(this.messageTypes.push(e),this.updateModel())}onFocus(){this.messageTypeConfigForm.get("messageType").updateValueAndValidity({onlySelf:!0,emitEvent:!0})}clear(e=""){this.messageTypeInput.nativeElement.value=e,this.messageTypeConfigForm.get("messageType").patchValue(null,{emitEvent:!0}),setTimeout((()=>{this.messageTypeInput.nativeElement.blur(),this.messageTypeInput.nativeElement.focus()}),0)}updateModel(){const e=this.messageTypes.map((e=>e.value));this.required?(this.chipList.errorState=!e.length,this.propagateChange(e.length>0?e:null)):(this.chipList.errorState=!1,this.propagateChange(e))}}e("MessageTypesConfigComponent",cn),cn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:cn,deps:[{token:G.Store},{token:H.TranslateService},{token:F.TruncatePipe},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),cn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:cn,selector:"tb-message-types-config",inputs:{required:"required",label:"label",placeholder:"placeholder",disabled:"disabled"},providers:[{provide:P,useExisting:a((()=>cn)),multi:!0}],viewQueries:[{propertyName:"chipList",first:!0,predicate:["chipList"],descendants:!0},{propertyName:"matAutocomplete",first:!0,predicate:["messageTypeAutocomplete"],descendants:!0},{propertyName:"messageTypeInput",first:!0,predicate:["messageTypeInput"],descendants:!0}],usesInheritance:!0,ngImport:t,template:'\n {{ label }}\n \n \n {{messageType.name}}\n close\n \n \n \n \n \n \n \n \n
\n
\n tb.rulenode.no-message-types-found\n
\n \n \n {{ \'tb.rulenode.no-message-type-matching\' | translate :\n {messageType: truncate.transform(searchText, true, 6, '...')}\n }}\n \n \n \n tb.rulenode.create-new-message-type\n \n
\n
\n
\n help\n \n {{ \'tb.rulenode.select-message-types-required\' | translate }}\n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"component",type:Te.MatAutocomplete,selector:"mat-autocomplete",inputs:["disableRipple","hideSingleSelectionIndicator"],exportAs:["matAutocomplete"]},{kind:"directive",type:Te.MatAutocompleteTrigger,selector:"input[matAutocomplete], textarea[matAutocomplete]",exportAs:["matAutocompleteTrigger"]},{kind:"directive",type:Te.MatAutocompleteOrigin,selector:"[matAutocompleteOrigin]",exportAs:["matAutocompleteOrigin"]},{kind:"component",type:ue.MatChipGrid,selector:"mat-chip-grid",inputs:["tabIndex","disabled","placeholder","required","value","errorStateMatcher"],outputs:["change","valueChange"]},{kind:"directive",type:ue.MatChipInput,selector:"input[matChipInputFor]",inputs:["matChipInputFor","matChipInputAddOnBlur","matChipInputSeparatorKeyCodes","placeholder","id","disabled"],outputs:["matChipInputTokenEnd"],exportAs:["matChipInput","matChipInputFor"]},{kind:"directive",type:ue.MatChipRemove,selector:"[matChipRemove]"},{kind:"component",type:ue.MatChipRow,selector:"mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]",inputs:["color","disabled","disableRipple","tabIndex","editable"],outputs:["edited"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:R.AsyncPipe,name:"async"},{kind:"pipe",type:Ie.HighlightPipe,name:"highlight"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:cn,decorators:[{type:n,args:[{selector:"tb-message-types-config",providers:[{provide:P,useExisting:a((()=>cn)),multi:!0}],template:'\n {{ label }}\n \n \n {{messageType.name}}\n close\n \n \n \n \n \n \n \n \n
\n
\n tb.rulenode.no-message-types-found\n
\n \n \n {{ \'tb.rulenode.no-message-type-matching\' | translate :\n {messageType: truncate.transform(searchText, true, 6, '...')}\n }}\n \n \n \n tb.rulenode.create-new-message-type\n \n
\n
\n
\n help\n \n {{ \'tb.rulenode.select-message-types-required\' | translate }}\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:F.TruncatePipe},{type:E.FormBuilder}]},propDecorators:{required:[{type:i}],label:[{type:i}],placeholder:[{type:i}],disabled:[{type:i}],chipList:[{type:o,args:["chipList",{static:!1}]}],matAutocomplete:[{type:o,args:["messageTypeAutocomplete",{static:!1}]}],messageTypeInput:[{type:o,args:["messageTypeInput",{static:!1}]}]}});class fn extends b{get required(){return this.requiredValue}set required(e){this.requiredValue=fe(e)}constructor(e,t){super(e),this.store=e,this.fb=t,this.subscriptions=[],this.disableCertPemCredentials=!1,this.passwordFieldRequired=!0,this.allCredentialsTypes=Tt,this.credentialsTypeTranslationsMap=It,this.propagateChange=e=>{}}ngOnInit(){this.credentialsConfigFormGroup=this.fb.group({type:[null,[D.required]],username:[null,[]],password:[null,[]],caCert:[null,[]],caCertFileName:[null,[]],privateKey:[null,[]],privateKeyFileName:[null,[]],cert:[null,[]],certFileName:[null,[]]}),this.subscriptions.push(this.credentialsConfigFormGroup.valueChanges.subscribe((()=>{this.updateView()}))),this.subscriptions.push(this.credentialsConfigFormGroup.get("type").valueChanges.subscribe((()=>{this.credentialsTypeChanged()})))}ngOnChanges(e){for(const t of Object.keys(e)){const n=e[t];if(!n.firstChange&&n.currentValue!==n.previousValue&&n.currentValue&&"disableCertPemCredentials"===t){"cert.PEM"===this.credentialsConfigFormGroup.get("type").value&&setTimeout((()=>{this.credentialsConfigFormGroup.get("type").patchValue("anonymous",{emitEvent:!0})}))}}}ngOnDestroy(){this.subscriptions.forEach((e=>e.unsubscribe()))}writeValue(e){X(e)&&(this.credentialsConfigFormGroup.reset(e,{emitEvent:!1}),this.updateValidators())}setDisabledState(e){e?this.credentialsConfigFormGroup.disable({emitEvent:!1}):(this.credentialsConfigFormGroup.enable({emitEvent:!1}),this.updateValidators())}updateView(){let e=this.credentialsConfigFormGroup.value;const t=e.type;switch(t){case"anonymous":e={type:t};break;case"basic":e={type:t,username:e.username,password:e.password};break;case"cert.PEM":delete e.username}this.propagateChange(e)}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}validate(e){return this.credentialsConfigFormGroup.valid?null:{credentialsConfig:{valid:!1}}}credentialsTypeChanged(){this.credentialsConfigFormGroup.patchValue({username:null,password:null,caCert:null,caCertFileName:null,privateKey:null,privateKeyFileName:null,cert:null,certFileName:null}),this.updateValidators()}updateValidators(e=!1){const t=this.credentialsConfigFormGroup.get("type").value;switch(e&&this.credentialsConfigFormGroup.reset({type:t},{emitEvent:!1}),this.credentialsConfigFormGroup.setValidators([]),this.credentialsConfigFormGroup.get("username").setValidators([]),this.credentialsConfigFormGroup.get("password").setValidators([]),t){case"anonymous":break;case"basic":this.credentialsConfigFormGroup.get("username").setValidators([D.required]),this.credentialsConfigFormGroup.get("password").setValidators(this.passwordFieldRequired?[D.required]:[]);break;case"cert.PEM":this.credentialsConfigFormGroup.setValidators([this.requiredFilesSelected(D.required,[["caCert","caCertFileName"],["privateKey","privateKeyFileName","cert","certFileName"]])])}this.credentialsConfigFormGroup.get("username").updateValueAndValidity({emitEvent:e}),this.credentialsConfigFormGroup.get("password").updateValueAndValidity({emitEvent:e}),this.credentialsConfigFormGroup.updateValueAndValidity({emitEvent:e})}requiredFilesSelected(e,t=null){return n=>{t||(t=[Object.keys(n.controls)]);return n?.controls&&t.some((t=>t.every((t=>!e(n.controls[t])))))?null:{notAllRequiredFilesSelected:!0}}}}e("CredentialsConfigComponent",fn),fn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:fn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),fn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:fn,selector:"tb-credentials-config",inputs:{required:"required",disableCertPemCredentials:"disableCertPemCredentials",passwordFieldRequired:"passwordFieldRequired"},providers:[{provide:P,useExisting:a((()=>fn)),multi:!0},{provide:w,useExisting:a((()=>fn)),multi:!0}],usesInheritance:!0,usesOnChanges:!0,ngImport:t,template:'
\n \n \n tb.rulenode.credentials\n \n {{ credentialsTypeTranslationsMap.get(credentialsConfigFormGroup.get(\'type\').value) | translate }}\n \n \n \n \n tb.rulenode.credentials-type\n \n \n {{ credentialsTypeTranslationsMap.get(credentialsType) | translate }}\n \n \n \n {{ \'tb.rulenode.credentials-type-required\' | translate }}\n \n \n
\n \n \n \n \n tb.rulenode.username\n \n \n {{ \'tb.rulenode.username-required\' | translate }}\n \n \n \n tb.rulenode.password\n \n \n \n {{ \'tb.rulenode.password-required\' | translate }}\n \n \n \n \n
{{ \'tb.rulenode.credentials-pem-hint\' | translate }}
\n \n \n \n \n \n \n \n tb.rulenode.private-key-password\n \n \n \n
\n
\n
\n
\n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:R.NgSwitch,selector:"[ngSwitch]",inputs:["ngSwitch"]},{kind:"directive",type:R.NgSwitchCase,selector:"[ngSwitchCase]",inputs:["ngSwitchCase"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"component",type:Ne.MatExpansionPanel,selector:"mat-expansion-panel",inputs:["disabled","expanded","hideToggle","togglePosition"],outputs:["opened","closed","expandedChange","afterExpand","afterCollapse"],exportAs:["matExpansionPanel"]},{kind:"component",type:Ne.MatExpansionPanelHeader,selector:"mat-expansion-panel-header",inputs:["tabIndex","expandedHeight","collapsedHeight"]},{kind:"directive",type:Ne.MatExpansionPanelTitle,selector:"mat-panel-title"},{kind:"directive",type:Ne.MatExpansionPanelDescription,selector:"mat-panel-description"},{kind:"directive",type:Ne.MatExpansionPanelContent,selector:"ng-template[matExpansionPanelContent]"},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:Pe.FileInputComponent,selector:"tb-file-input",inputs:["label","hint","accept","noFileText","inputId","allowedExtensions","dropLabel","contentConvertFunction","required","requiredAsError","disabled","existingFileName","readAsBinary","workFromFileObj","multipleFile"],outputs:["fileNameChanged"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:we.TogglePasswordComponent,selector:"tb-toggle-password"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:fn,decorators:[{type:n,args:[{selector:"tb-credentials-config",providers:[{provide:P,useExisting:a((()=>fn)),multi:!0},{provide:w,useExisting:a((()=>fn)),multi:!0}],template:'
\n \n \n tb.rulenode.credentials\n \n {{ credentialsTypeTranslationsMap.get(credentialsConfigFormGroup.get(\'type\').value) | translate }}\n \n \n \n \n tb.rulenode.credentials-type\n \n \n {{ credentialsTypeTranslationsMap.get(credentialsType) | translate }}\n \n \n \n {{ \'tb.rulenode.credentials-type-required\' | translate }}\n \n \n
\n \n \n \n \n tb.rulenode.username\n \n \n {{ \'tb.rulenode.username-required\' | translate }}\n \n \n \n tb.rulenode.password\n \n \n \n {{ \'tb.rulenode.password-required\' | translate }}\n \n \n \n \n
{{ \'tb.rulenode.credentials-pem-hint\' | translate }}
\n \n \n \n \n \n \n \n tb.rulenode.private-key-password\n \n \n \n
\n
\n
\n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]},propDecorators:{required:[{type:i}],disableCertPemCredentials:[{type:i}],passwordFieldRequired:[{type:i}]}});class gn{constructor(e,t){this.fb=e,this.translate=t,this.propagateChange=e=>{},this.destroy$=new Ae,this.selectOptions=[];for(const e of wt.keys())this.selectOptions.push({value:e,name:this.translate.instant(wt.get(e))})}ngOnInit(){this.chipControlGroup=this.fb.group({chipControl:[null,[]]}),this.chipControlGroup.get("chipControl").valueChanges.pipe(Le(this.destroy$)).subscribe((e=>{e&&this.propagateChange(e)}))}writeValue(e){this.chipControlGroup.get("chipControl").patchValue(e,{emitEvent:!1})}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}setDisabledState(e){e?this.chipControlGroup.disable({emitEvent:!1}):this.chipControlGroup.enable({emitEvent:!1})}ngOnDestroy(){this.destroy$.next(),this.destroy$.complete()}}e("MsgMetadataChipComponent",gn),gn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:gn,deps:[{token:E.FormBuilder},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),gn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:gn,selector:"tb-msg-metadata-chip",inputs:{labelText:"labelText"},providers:[{provide:P,useExisting:a((()=>gn)),multi:!0}],ngImport:t,template:'
\n
{{ labelText }}
\n \n {{ option.name }}\n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"component",type:ue.MatChipListbox,selector:"mat-chip-listbox",inputs:["tabIndex","multiple","aria-orientation","selectable","compareWith","required","hideSingleSelectionIndicator","value"],outputs:["change"]},{kind:"component",type:ue.MatChipOption,selector:"mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]",inputs:["color","disabled","disableRipple","tabIndex","selectable","selected"],outputs:["selectionChange"]},{kind:"directive",type:ye.DefaultClassDirective,selector:" [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]",inputs:["ngClass","ngClass.xs","ngClass.sm","ngClass.md","ngClass.lg","ngClass.xl","ngClass.lt-sm","ngClass.lt-md","ngClass.lt-lg","ngClass.lt-xl","ngClass.gt-xs","ngClass.gt-sm","ngClass.gt-md","ngClass.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:gn,decorators:[{type:n,args:[{selector:"tb-msg-metadata-chip",providers:[{provide:P,useExisting:a((()=>gn)),multi:!0}],template:'
\n
{{ labelText }}
\n \n {{ option.name }}\n \n
\n'}]}],ctorParameters:function(){return[{type:E.FormBuilder},{type:H.TranslateService}]},propDecorators:{labelText:[{type:i}]}});class yn extends b{constructor(e,t,n,r){super(e),this.store=e,this.translate=t,this.injector=n,this.fb=r,this.destroy$=new Ae,this.sourceFieldSubcritption=[],this.propagateChange=null,this.valueChangeSubscription=null,this.disabled=!1,this.required=!1}ngOnInit(){this.ngControl=this.injector.get(V),null!=this.ngControl&&(this.ngControl.valueAccessor=this),this.svListFormGroup=this.fb.group({}),this.svListFormGroup.addControl("keyVals",this.fb.array([]))}keyValsFormArray(){return this.svListFormGroup.get("keyVals")}ngOnDestroy(){this.destroy$.next(),this.destroy$.complete()}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}setDisabledState(e){this.disabled=e,this.disabled?this.svListFormGroup.disable({emitEvent:!1}):this.svListFormGroup.enable({emitEvent:!1})}writeValue(e){this.valueChangeSubscription&&this.valueChangeSubscription.unsubscribe();const t=[];if(e)for(const n of Object.keys(e))Object.prototype.hasOwnProperty.call(e,n)&&t.push(this.fb.group({key:[n,[D.required]],value:[e[n],[D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)]]}));this.svListFormGroup.setControl("keyVals",this.fb.array(t));for(const e of this.keyValsFormArray().controls)this.keyChangeSubscribe(e);this.valueChangeSubscription=this.svListFormGroup.valueChanges.pipe(Le(this.destroy$)).subscribe((()=>{this.updateModel()}))}errorTrigger(){const e=this.keyValsFormArray();for(const t of e.controls)for(const e of Object.keys(t.value))if(t.get(e).touched&&t.get(e).invalid)return!0;return!1}filterSelectOptions(e){const t=[];for(const e of this.svListFormGroup.get("keyVals").value){const n=this.selectOptions.find((t=>t.value===e.key));n&&t.push(n)}const n=[];for(const r of this.selectOptions)X(t.find((e=>e.value===r.value)))&&r.value!==e?.get("key").value||n.push(r);return n}removeKeyVal(e){this.svListFormGroup.get("keyVals").removeAt(e),this.sourceFieldSubcritption[e].unsubscribe(),this.sourceFieldSubcritption.splice(e,1)}addKeyVal(){const e=this.svListFormGroup.get("keyVals");e.push(this.fb.group({key:["",[D.required]],value:["",[D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)]]})),this.keyChangeSubscribe(e.at(e.length-1))}keyChangeSubscribe(e){this.sourceFieldSubcritption.push(e.get("key").valueChanges.pipe(Le(this.destroy$)).subscribe((t=>{e.get("value").patchValue(this.targetKeyPrefix+t[0].toUpperCase()+t.slice(1))})))}validate(e){return!this.svListFormGroup.get("keyVals").value.length&&this.required?{svMapRequired:!0}:this.svListFormGroup.valid?null:{svFieldsRequired:!0}}updateModel(){const e=this.svListFormGroup.get("keyVals").value;if(this.required&&!e.length||!this.svListFormGroup.valid)this.propagateChange(null);else{const t={};e.forEach((e=>{t[e.key]=e.value})),this.propagateChange(t)}}}e("SvMapConfigComponent",yn),yn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:yn,deps:[{token:G.Store},{token:H.TranslateService},{token:t.Injector},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),yn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:yn,selector:"tb-sv-map-config",inputs:{selectOptions:"selectOptions",disabled:"disabled",labelText:"labelText",requiredText:"requiredText",targetKeyPrefix:"targetKeyPrefix",selectText:"selectText",selectRequiredText:"selectRequiredText",valText:"valText",valRequiredText:"valRequiredText",hintText:"hintText",popupHelpLink:"popupHelpLink",required:"required"},providers:[{provide:P,useExisting:a((()=>yn)),multi:!0},{provide:w,useExisting:a((()=>yn)),multi:!0}],usesInheritance:!0,ngImport:t,template:'
\n
\n
tb.rulenode.originator-fields-mapping
\n
\n tb.rulenode.map-fields-required\n
\n
\n
\n
\n
\n
{{ selectText }}
\n
{{ valText }}
\n
\n
\n
\n
\n \n \n \n {{option.name}}\n \n \n \n \n \n \n
\n \n
\n
\n
\n
\n
\n
\n \n
\n \n
\n',styles:[":host .field-space{flex:1 1 50%}:host .actions-header{width:40px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"directive",type:R.NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:ye.DefaultClassDirective,selector:" [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]",inputs:["ngClass","ngClass.xs","ngClass.sm","ngClass.md","ngClass.lg","ngClass.xl","ngClass.lt-sm","ngClass.lt-md","ngClass.lt-lg","ngClass.lt-xl","ngClass.gt-xs","ngClass.gt-sm","ngClass.gt-md","ngClass.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormControlDirective,selector:"[formControl]",inputs:["formControl","disabled","ngModel"],outputs:["ngModelChange"],exportAs:["ngForm"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:mn,selector:"tb-example-hint",inputs:["hintText","popupHelpLink"]},{kind:"pipe",type:R.AsyncPipe,name:"async"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),Se([h()],yn.prototype,"disabled",void 0),Se([h()],yn.prototype,"required",void 0),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:yn,decorators:[{type:n,args:[{selector:"tb-sv-map-config",providers:[{provide:P,useExisting:a((()=>yn)),multi:!0},{provide:w,useExisting:a((()=>yn)),multi:!0}],template:'
\n
\n
tb.rulenode.originator-fields-mapping
\n
\n tb.rulenode.map-fields-required\n
\n
\n
\n
\n
\n
{{ selectText }}
\n
{{ valText }}
\n
\n
\n
\n
\n \n \n \n {{option.name}}\n \n \n \n \n \n \n
\n \n
\n
\n
\n
\n
\n
\n \n
\n \n
\n',styles:[":host .field-space{flex:1 1 50%}:host .actions-header{width:40px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:t.Injector},{type:E.FormBuilder}]},propDecorators:{selectOptions:[{type:i}],disabled:[{type:i}],labelText:[{type:i}],requiredText:[{type:i}],targetKeyPrefix:[{type:i}],selectText:[{type:i}],selectRequiredText:[{type:i}],valText:[{type:i}],valRequiredText:[{type:i}],hintText:[{type:i}],popupHelpLink:[{type:i}],required:[{type:i}]}});class xn extends b{get required(){return this.requiredValue}set required(e){this.requiredValue=fe(e)}constructor(e,t){super(e),this.store=e,this.fb=t,this.directionTypes=Object.keys(g),this.directionTypeTranslations=y,this.propagateChange=null}ngOnInit(){this.relationsQueryFormGroup=this.fb.group({fetchLastLevelOnly:[!1,[]],direction:[null,[D.required]],maxLevel:[null,[]],filters:[null]}),this.relationsQueryFormGroup.valueChanges.subscribe((e=>{this.relationsQueryFormGroup.valid?this.propagateChange(e):this.propagateChange(null)}))}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}setDisabledState(e){this.disabled=e,this.disabled?this.relationsQueryFormGroup.disable({emitEvent:!1}):this.relationsQueryFormGroup.enable({emitEvent:!1})}writeValue(e){this.relationsQueryFormGroup.reset(e||{},{emitEvent:!1})}}e("RelationsQueryConfigOldComponent",xn),xn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:xn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),xn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:xn,selector:"tb-relations-query-config-old",inputs:{disabled:"disabled",required:"required"},providers:[{provide:P,useExisting:a((()=>xn)),multi:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n {{ \'alias.last-level-relation\' | translate }}\n \n
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }}\n \n \n \n \n tb.rulenode.max-relation-level\n \n \n
\n
relation.relation-filters
\n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:Ve.RelationFiltersComponent,selector:"tb-relation-filters",inputs:["disabled","allowedEntityTypes"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:xn,decorators:[{type:n,args:[{selector:"tb-relations-query-config-old",providers:[{provide:P,useExisting:a((()=>xn)),multi:!0}],template:'
\n \n {{ \'alias.last-level-relation\' | translate }}\n \n
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }}\n \n \n \n \n tb.rulenode.max-relation-level\n \n \n
\n
relation.relation-filters
\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]},propDecorators:{disabled:[{type:i}],required:[{type:i}]}});class bn{constructor(e,t){this.translate=e,this.fb=t,this.propagateChange=e=>{},this.destroy$=new Ae,this.separatorKeysCodes=[le,se,me],this.onTouched=()=>{}}ngOnInit(){this.attributeControlGroup=this.fb.group({clientAttributeNames:[null,[]],sharedAttributeNames:[null,[]],serverAttributeNames:[null,[]],latestTsKeyNames:[null,[]],getLatestValueWithTs:[!1,[]]},{validators:this.atLeastOne(D.required,["clientAttributeNames","sharedAttributeNames","serverAttributeNames","latestTsKeyNames"])}),this.attributeControlGroup.valueChanges.pipe(Le(this.destroy$)).subscribe((e=>{this.propagateChange(e)}))}validate(){return this.attributeControlGroup.valid?null:{atLeastOneRequired:!0}}atLeastOne(e,t=null){return n=>{t||(t=Object.keys(n.controls));return n?.controls&&t.some((t=>!e(n.controls[t])))?null:{atLeastOne:!0}}}writeValue(e){this.attributeControlGroup.setValue(e,{emitEvent:!1})}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){this.onTouched=e}setDisabledState(e){e?this.attributeControlGroup.disable({emitEvent:!1}):this.attributeControlGroup.enable({emitEvent:!1})}ngOnDestroy(){this.destroy$.next(null),this.destroy$.complete()}}e("SelectAttributesComponent",bn),bn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:bn,deps:[{token:H.TranslateService},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),bn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:bn,selector:"tb-select-attributes",inputs:{popupHelpLink:"popupHelpLink"},providers:[{provide:P,useExisting:a((()=>bn)),multi:!0},{provide:w,useExisting:bn,multi:!0}],ngImport:t,template:'
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n {{ \'tb.rulenode.fetch-latest-telemetry-with-timestamp\' | translate }}\n \n
\n
\n\n\n help\n\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:R.NgTemplateOutlet,selector:"[ngTemplateOutlet]",inputs:["ngTemplateOutletContext","ngTemplateOutlet","ngTemplateOutletInjector"]},{kind:"component",type:Re.StringItemsListComponent,selector:"tb-string-items-list",inputs:["required","disabled","label","placeholder","hint","requiredText","floatLabel","appearance","editable","subscriptSizing","predefinedValues"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"component",type:mn,selector:"tb-example-hint",inputs:["hintText","popupHelpLink"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:bn,decorators:[{type:n,args:[{selector:"tb-select-attributes",providers:[{provide:P,useExisting:a((()=>bn)),multi:!0},{provide:w,useExisting:bn,multi:!0}],template:'
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n {{ \'tb.rulenode.fetch-latest-telemetry-with-timestamp\' | translate }}\n \n
\n
\n\n\n help\n\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:H.TranslateService},{type:E.FormBuilder}]},propDecorators:{popupHelpLink:[{type:i}]}});class hn extends b{constructor(e,t){super(e),this.store=e,this.fb=t,this.propagateChange=null,this.destroy$=new Ae,this.alarmStatus=k,this.alarmStatusTranslations=L}ngOnInit(){this.alarmStatusGroup=this.fb.group({alarmStatus:[null,[]]}),this.alarmStatusGroup.get("alarmStatus").valueChanges.pipe(Le(this.destroy$)).subscribe((e=>{this.propagateChange(e)}))}setDisabledState(e){e?this.alarmStatusGroup.disable({emitEvent:!1}):this.alarmStatusGroup.enable({emitEvent:!1})}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}ngOnDestroy(){this.destroy$.next(),this.destroy$.complete()}writeValue(e){this.alarmStatusGroup.get("alarmStatus").patchValue(e,{emitEvent:!1})}}e("AlarmStatusSelectComponent",hn),hn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:hn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),hn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:hn,selector:"tb-alarm-status-select",providers:[{provide:P,useExisting:a((()=>hn)),multi:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n
\n \n {{ alarmStatusTranslations.get(alarmStatus.ACTIVE_UNACK) | translate }}\n \n \n {{ alarmStatusTranslations.get(alarmStatus.ACTIVE_ACK) | translate }}\n \n
\n
\n \n {{ alarmStatusTranslations.get(alarmStatus.CLEARED_UNACK) | translate }}\n \n \n {{ alarmStatusTranslations.get(alarmStatus.ACTIVE_UNACK) | translate }}\n \n
\n
\n
\n',styles:[":host .chip-listbox{max-width:460px;width:100%}:host .chip-listbox .toggle-column{display:flex;flex:1 1 100%;gap:8px}:host .chip-listbox .option{margin:0}@media screen and (max-width: 959px){:host .chip-listbox{max-width:360px}:host .chip-listbox .toggle-column{flex-direction:column}}:host ::ng-deep .chip-listbox .mdc-evolution-chip-set__chips{gap:8px}:host ::ng-deep .chip-listbox .option button{flex-basis:100%;justify-content:start}:host ::ng-deep .chip-listbox .option .mdc-evolution-chip__graphic{flex-grow:0}\n"],dependencies:[{kind:"component",type:ue.MatChipListbox,selector:"mat-chip-listbox",inputs:["tabIndex","multiple","aria-orientation","selectable","compareWith","required","hideSingleSelectionIndicator","value"],outputs:["change"]},{kind:"component",type:ue.MatChipOption,selector:"mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]",inputs:["color","disabled","disableRipple","tabIndex","selectable","selected"],outputs:["selectionChange"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutAlignDirective,selector:" [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]",inputs:["fxLayoutAlign","fxLayoutAlign.xs","fxLayoutAlign.sm","fxLayoutAlign.md","fxLayoutAlign.lg","fxLayoutAlign.xl","fxLayoutAlign.lt-sm","fxLayoutAlign.lt-md","fxLayoutAlign.lt-lg","fxLayoutAlign.lt-xl","fxLayoutAlign.gt-xs","fxLayoutAlign.gt-sm","fxLayoutAlign.gt-md","fxLayoutAlign.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:hn,decorators:[{type:n,args:[{selector:"tb-alarm-status-select",providers:[{provide:P,useExisting:a((()=>hn)),multi:!0}],template:'
\n \n
\n \n {{ alarmStatusTranslations.get(alarmStatus.ACTIVE_UNACK) | translate }}\n \n \n {{ alarmStatusTranslations.get(alarmStatus.ACTIVE_ACK) | translate }}\n \n
\n
\n \n {{ alarmStatusTranslations.get(alarmStatus.CLEARED_UNACK) | translate }}\n \n \n {{ alarmStatusTranslations.get(alarmStatus.ACTIVE_UNACK) | translate }}\n \n
\n
\n
\n',styles:[":host .chip-listbox{max-width:460px;width:100%}:host .chip-listbox .toggle-column{display:flex;flex:1 1 100%;gap:8px}:host .chip-listbox .option{margin:0}@media screen and (max-width: 959px){:host .chip-listbox{max-width:360px}:host .chip-listbox .toggle-column{flex-direction:column}}:host ::ng-deep .chip-listbox .mdc-evolution-chip-set__chips{gap:8px}:host ::ng-deep .chip-listbox .option button{flex-basis:100%;justify-content:start}:host ::ng-deep .chip-listbox .option .mdc-evolution-chip__graphic{flex-grow:0}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]}});class vn{}e("RulenodeCoreConfigCommonModule",vn),vn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:vn,deps:[],target:t.ɵɵFactoryTarget.NgModule}),vn.ɵmod=t.ɵɵngDeclareNgModule({minVersion:"14.0.0",version:"15.2.9",ngImport:t,type:vn,declarations:[un,pn,dn,cn,fn,rn,on,ln,Xt,gn,yn,xn,bn,hn,mn],imports:[O,T,Me],exports:[un,pn,dn,cn,fn,rn,on,ln,Xt,gn,yn,xn,bn,hn,mn]}),vn.ɵinj=t.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:vn,imports:[O,T,Me]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:vn,decorators:[{type:l,args:[{declarations:[un,pn,dn,cn,fn,rn,on,ln,Xt,gn,yn,xn,bn,hn,mn],imports:[O,T,Me],exports:[un,pn,dn,cn,fn,rn,on,ln,Xt,gn,yn,xn,bn,hn,mn]}]}]});class Cn{}e("RuleNodeCoreConfigActionModule",Cn),Cn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Cn,deps:[],target:t.ɵɵFactoryTarget.NgModule}),Cn.ɵmod=t.ɵɵngDeclareNgModule({minVersion:"14.0.0",version:"15.2.9",ngImport:t,type:Cn,declarations:[nn,We,en,Wt,zt,Ye,Ze,et,tt,Qt,nt,ot,Ht,jt,Yt,Zt,tn,Xe,rt,Jt,$t,an,sn],imports:[O,T,Me,vn],exports:[nn,We,en,Wt,zt,Ye,Ze,et,tt,Qt,nt,ot,Ht,jt,Yt,Zt,tn,Xe,rt,Jt,$t,an,sn]}),Cn.ɵinj=t.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Cn,imports:[O,T,Me,vn]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Cn,decorators:[{type:l,args:[{declarations:[nn,We,en,Wt,zt,Ye,Ze,et,tt,Qt,nt,ot,Ht,jt,Yt,Zt,tn,Xe,rt,Jt,$t,an,sn],imports:[O,T,Me,vn],exports:[nn,We,en,Wt,zt,Ye,Ze,et,tt,Qt,nt,ot,Ht,jt,Yt,Zt,tn,Xe,rt,Jt,$t,an,sn]}]}]});class Fn extends s{constructor(e,t,n){super(e),this.store=e,this.translate=t,this.fb=n,this.separatorKeysCodes=[le,se,me]}configForm(){return this.calculateDeltaConfigForm}onConfigurationSet(e){this.calculateDeltaConfigForm=this.fb.group({inputValueKey:[e.inputValueKey,[D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)]],outputValueKey:[e.outputValueKey,[D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)]],useCache:[e.useCache,[]],addPeriodBetweenMsgs:[e.addPeriodBetweenMsgs,[]],periodValueKey:[e.periodValueKey,[]],round:[e.round,[D.min(0),D.max(15)]],tellFailureIfDeltaIsNegative:[e.tellFailureIfDeltaIsNegative,[]]})}prepareInputConfig(e){return{inputValueKey:X(e?.inputValueKey)?e.inputValueKey:null,outputValueKey:X(e?.outputValueKey)?e.outputValueKey:null,useCache:!X(e?.useCache)||e.useCache,addPeriodBetweenMsgs:!!X(e?.addPeriodBetweenMsgs)&&e.addPeriodBetweenMsgs,periodValueKey:X(e?.periodValueKey)?e.periodValueKey:null,round:X(e?.round)?e.round:null,tellFailureIfDeltaIsNegative:!X(e?.tellFailureIfDeltaIsNegative)||e.tellFailureIfDeltaIsNegative}}prepareOutputConfig(e){return Z(e)}updateValidators(e){this.calculateDeltaConfigForm.get("addPeriodBetweenMsgs").value?this.calculateDeltaConfigForm.get("periodValueKey").setValidators([D.required]):this.calculateDeltaConfigForm.get("periodValueKey").setValidators([]),this.calculateDeltaConfigForm.get("periodValueKey").updateValueAndValidity({emitEvent:e})}validatorTriggers(){return["addPeriodBetweenMsgs"]}}e("CalculateDeltaConfigComponent",Fn),Fn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Fn,deps:[{token:G.Store},{token:H.TranslateService},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),Fn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Fn,selector:"tb-enrichment-node-calculate-delta-config",usesInheritance:!0,ngImport:t,template:"
\n
\n \n {{ 'tb.rulenode.input-value-key' | translate }}\n \n \n {{ 'tb.rulenode.input-value-key-required' | translate }}\n \n \n \n {{ 'tb.rulenode.output-value-key' | translate }}\n \n \n {{ 'tb.rulenode.output-value-key-required' | translate }}\n \n \n
\n \n {{ 'tb.rulenode.number-of-digits-after-floating-point' | translate }}\n \n \n {{ 'tb.rulenode.number-of-digits-after-floating-point-range' | translate }}\n \n \n {{ 'tb.rulenode.number-of-digits-after-floating-point-range' | translate }}\n \n \n
\n
\n \n {{ 'tb.rulenode.failure-if-delta-negative' | translate }}\n \n
\n
\n \n {{ 'tb.rulenode.use-caching' | translate }}\n \n
\n
\n
\n \n {{ 'tb.rulenode.add-time-difference-between-readings' | translate:\n { inputValueKey: calculateDeltaConfigForm.get('inputValueKey').valid ?\n calculateDeltaConfigForm.get('inputValueKey').value : 'tb.rulenode.input-value-key' | translate } }}\n \n
\n \n {{ 'tb.rulenode.period-value-key' | translate }}\n \n \n {{ 'tb.rulenode.period-value-key-required' | translate }}\n \n \n
\n
\n
\n",dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.MaxValidator,selector:"input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",inputs:["max"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Fn,decorators:[{type:n,args:[{selector:"tb-enrichment-node-calculate-delta-config",template:"
\n
\n \n {{ 'tb.rulenode.input-value-key' | translate }}\n \n \n {{ 'tb.rulenode.input-value-key-required' | translate }}\n \n \n \n {{ 'tb.rulenode.output-value-key' | translate }}\n \n \n {{ 'tb.rulenode.output-value-key-required' | translate }}\n \n \n
\n \n {{ 'tb.rulenode.number-of-digits-after-floating-point' | translate }}\n \n \n {{ 'tb.rulenode.number-of-digits-after-floating-point-range' | translate }}\n \n \n {{ 'tb.rulenode.number-of-digits-after-floating-point-range' | translate }}\n \n \n
\n
\n \n {{ 'tb.rulenode.failure-if-delta-negative' | translate }}\n \n
\n
\n \n {{ 'tb.rulenode.use-caching' | translate }}\n \n
\n
\n
\n \n {{ 'tb.rulenode.add-time-difference-between-readings' | translate:\n { inputValueKey: calculateDeltaConfigForm.get('inputValueKey').valid ?\n calculateDeltaConfigForm.get('inputValueKey').value : 'tb.rulenode.input-value-key' | translate } }}\n \n
\n \n {{ 'tb.rulenode.period-value-key' | translate }}\n \n \n {{ 'tb.rulenode.period-value-key-required' | translate }}\n \n \n
\n
\n
\n"}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:E.FormBuilder}]}});class kn extends s{constructor(e,t,n){super(e),this.store=e,this.fb=t,this.translate=n,this.fetchToData=[],this.DataToFetch=ht;for(const e of vt.keys())e!==ht.FIELDS&&this.fetchToData.push({value:e,name:this.translate.instant(vt.get(e))})}configForm(){return this.customerAttributesConfigForm}prepareOutputConfig(e){const t={};for(const n of Object.keys(e.dataMapping))t[n.trim()]=e.dataMapping[n];return e.dataMapping=t,Z(e)}prepareInputConfig(e){let t,n;return t=X(e?.telemetry)?e.telemetry?ht.LATEST_TELEMETRY:ht.ATTRIBUTES:X(e?.dataToFetch)?e.dataToFetch:ht.ATTRIBUTES,n=X(e?.attrMapping)?e.attrMapping:X(e?.dataMapping)?e.dataMapping:null,{dataToFetch:t,dataMapping:n,fetchTo:X(e?.fetchTo)?e.fetchTo:Pt.METADATA}}selectTranslation(e,t){return this.customerAttributesConfigForm.get("dataToFetch").value===ht.LATEST_TELEMETRY?e:t}onConfigurationSet(e){this.customerAttributesConfigForm=this.fb.group({dataToFetch:[e.dataToFetch,[]],dataMapping:[e.dataMapping,[D.required]],fetchTo:[e.fetchTo]})}}e("CustomerAttributesConfigComponent",kn),kn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:kn,deps:[{token:G.Store},{token:E.FormBuilder},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),kn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:kn,selector:"tb-enrichment-node-customer-attributes-config",usesInheritance:!0,ngImport:t,template:'
\n
tb.rulenode.mapping-of-customers-fields
\n
\n
\n \n \n {{ data.name }}\n \n \n
\n
\n \n \n \n \n
\n',styles:[":host .fetch-to-data-toggle{max-width:420px;width:100%}\n"],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:_.DefaultLayoutAlignDirective,selector:" [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]",inputs:["fxLayoutAlign","fxLayoutAlign.xs","fxLayoutAlign.sm","fxLayoutAlign.md","fxLayoutAlign.lg","fxLayoutAlign.xl","fxLayoutAlign.lt-sm","fxLayoutAlign.lt-md","fxLayoutAlign.lt-lg","fxLayoutAlign.lt-xl","fxLayoutAlign.gt-xs","fxLayoutAlign.gt-sm","fxLayoutAlign.gt-md","fxLayoutAlign.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"directive",type:Oe.ToggleOption,selector:"tb-toggle-option",inputs:["value"]},{kind:"component",type:Be.ToggleSelectComponent,selector:"tb-toggle-select",inputs:["disabled","selectMediaBreakpoint","appearance","disablePagination"]},{kind:"component",type:un,selector:"tb-kv-map-config",inputs:["disabled","uniqueKeyValuePairValidator","labelText","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","popupHelpLink","required"]},{kind:"component",type:gn,selector:"tb-msg-metadata-chip",inputs:["labelText"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:kn,decorators:[{type:n,args:[{selector:"tb-enrichment-node-customer-attributes-config",template:'
\n
tb.rulenode.mapping-of-customers-fields
\n
\n
\n \n \n {{ data.name }}\n \n \n
\n
\n \n \n \n \n
\n',styles:[":host .fetch-to-data-toggle{max-width:420px;width:100%}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder},{type:H.TranslateService}]}});class Ln extends s{constructor(e,t,n){super(e),this.store=e,this.translate=t,this.fb=n}configForm(){return this.deviceAttributesConfigForm}onConfigurationSet(e){this.deviceAttributesConfigForm=this.fb.group({deviceRelationsQuery:[e.deviceRelationsQuery,[D.required]],tellFailureIfAbsent:[e.tellFailureIfAbsent,[]],fetchTo:[e.fetchTo,[]],attributesControl:[e.attributesControl,[]]})}prepareInputConfig(e){return ee(e)&&(e.attributesControl={clientAttributeNames:X(e?.clientAttributeNames)?e.clientAttributeNames:null,latestTsKeyNames:X(e?.latestTsKeyNames)?e.latestTsKeyNames:null,serverAttributeNames:X(e?.serverAttributeNames)?e.serverAttributeNames:null,sharedAttributeNames:X(e?.sharedAttributeNames)?e.sharedAttributeNames:null,getLatestValueWithTs:!!X(e?.getLatestValueWithTs)&&e.getLatestValueWithTs}),{deviceRelationsQuery:X(e?.deviceRelationsQuery)?e.deviceRelationsQuery:null,tellFailureIfAbsent:!X(e?.tellFailureIfAbsent)||e.tellFailureIfAbsent,fetchTo:X(e?.fetchTo)?e.fetchTo:Pt.METADATA,attributesControl:e?e.attributesControl:null}}prepareOutputConfig(e){for(const t of Object.keys(e.attributesControl))e[t]=e.attributesControl[t];return delete e.attributesControl,e}}e("DeviceAttributesConfigComponent",Ln),Ln.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Ln,deps:[{token:G.Store},{token:H.TranslateService},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),Ln.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Ln,selector:"tb-enrichment-node-device-attributes-config",usesInheritance:!0,ngImport:t,template:'
\n
\n
tb.rulenode.device-relations-query
\n \n \n
\n
\n
\n
tb.rulenode.related-device-attributes
\n
\n tb.rulenode.at-least-one-field-required\n
\n
\n \n \n
\n
\n \n {{ \'tb.rulenode.tell-failure\' | translate }}\n \n
\n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"component",type:pn,selector:"tb-device-relations-query-config",inputs:["disabled","required"]},{kind:"component",type:gn,selector:"tb-msg-metadata-chip",inputs:["labelText"]},{kind:"component",type:bn,selector:"tb-select-attributes",inputs:["popupHelpLink"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Ln,decorators:[{type:n,args:[{selector:"tb-enrichment-node-device-attributes-config",template:'
\n
\n
tb.rulenode.device-relations-query
\n \n \n
\n
\n
\n
tb.rulenode.related-device-attributes
\n
\n tb.rulenode.at-least-one-field-required\n
\n
\n \n \n
\n
\n \n {{ \'tb.rulenode.tell-failure\' | translate }}\n \n
\n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:E.FormBuilder}]}});class Tn extends s{constructor(e,t,n){super(e),this.store=e,this.translate=t,this.fb=n,this.predefinedValues=[];for(const e of Object.keys(ct))this.predefinedValues.push({value:ct[e],name:this.translate.instant(ft.get(ct[e]))})}ngOnInit(){super.ngOnInit()}configForm(){return this.entityDetailsConfigForm}prepareInputConfig(e){let t;return t=X(e?.addToMetadata)?e.addToMetadata?Pt.METADATA:Pt.DATA:e?.fetchTo?e.fetchTo:Pt.DATA,{detailsList:X(e?.detailsList)?e.detailsList:null,fetchTo:t}}onConfigurationSet(e){this.entityDetailsConfigForm=this.fb.group({detailsList:[e.detailsList,[D.required]],fetchTo:[e.fetchTo,[]]})}}e("EntityDetailsConfigComponent",Tn),Tn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Tn,deps:[{token:G.Store},{token:H.TranslateService},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),Tn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Tn,selector:"tb-enrichment-node-entity-details-config",usesInheritance:!0,ngImport:t,template:'
\n \n \n help\n \n \n \n \n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"component",type:Re.StringItemsListComponent,selector:"tb-string-items-list",inputs:["required","disabled","label","placeholder","hint","requiredText","floatLabel","appearance","editable","subscriptSizing","predefinedValues"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:gn,selector:"tb-msg-metadata-chip",inputs:["labelText"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Tn,decorators:[{type:n,args:[{selector:"tb-enrichment-node-entity-details-config",template:'
\n \n \n help\n \n \n \n \n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:E.FormBuilder}]}});class In extends s{constructor(e,t,n){super(e),this.store=e,this.translate=t,this.fb=n,this.separatorKeysCodes=[le,se,me],this.aggregationTypes=I,this.aggregations=Object.values(I),this.aggregationTypesTranslations=N,this.fetchMode=gt,this.samplingOrders=Object.values(bt),this.samplingOrdersTranslate=Ft,this.timeUnits=Object.values(mt),this.timeUnitsTranslationMap=ut,this.deduplicationStrategiesHintTranslations=xt,this.headerOptions=[],this.timeUnitMap={[mt.MILLISECONDS]:1,[mt.SECONDS]:1e3,[mt.MINUTES]:6e4,[mt.HOURS]:36e5,[mt.DAYS]:864e5},this.intervalValidator=()=>e=>e.get("startInterval").value*this.timeUnitMap[e.get("startIntervalTimeUnit").value]<=e.get("endInterval").value*this.timeUnitMap[e.get("endIntervalTimeUnit").value]?{intervalError:!0}:null;for(const e of yt.keys())this.headerOptions.push({value:e,name:this.translate.instant(yt.get(e))})}configForm(){return this.getTelemetryFromDatabaseConfigForm}onConfigurationSet(e){this.getTelemetryFromDatabaseConfigForm=this.fb.group({latestTsKeyNames:[e.latestTsKeyNames,[D.required]],aggregation:[e.aggregation,[D.required]],fetchMode:[e.fetchMode,[D.required]],orderBy:[e.orderBy,[]],limit:[e.limit,[]],useMetadataIntervalPatterns:[e.useMetadataIntervalPatterns,[]],interval:this.fb.group({startInterval:[e.interval.startInterval,[]],startIntervalTimeUnit:[e.interval.startIntervalTimeUnit,[]],endInterval:[e.interval.endInterval,[]],endIntervalTimeUnit:[e.interval.endIntervalTimeUnit,[]]}),startIntervalPattern:[e.startIntervalPattern,[]],endIntervalPattern:[e.endIntervalPattern,[]]})}validatorTriggers(){return["fetchMode","useMetadataIntervalPatterns"]}toggleChange(e){this.getTelemetryFromDatabaseConfigForm.get("fetchMode").patchValue(e,{emitEvent:!0})}prepareOutputConfig(e){return e.startInterval=e.interval.startInterval,e.startIntervalTimeUnit=e.interval.startIntervalTimeUnit,e.endInterval=e.interval.endInterval,e.endIntervalTimeUnit=e.interval.endIntervalTimeUnit,delete e.interval,Z(e)}prepareInputConfig(e){return ee(e)&&(e.interval={startInterval:e.startInterval,startIntervalTimeUnit:e.startIntervalTimeUnit,endInterval:e.endInterval,endIntervalTimeUnit:e.endIntervalTimeUnit}),{latestTsKeyNames:X(e?.latestTsKeyNames)?e.latestTsKeyNames:null,aggregation:X(e?.aggregation)?e.aggregation:I.NONE,fetchMode:X(e?.fetchMode)?e.fetchMode:gt.FIRST,orderBy:X(e?.orderBy)?e.orderBy:bt.ASC,limit:X(e?.limit)?e.limit:1e3,useMetadataIntervalPatterns:!!X(e?.useMetadataIntervalPatterns)&&e.useMetadataIntervalPatterns,interval:{startInterval:X(e?.interval?.startInterval)?e.interval.startInterval:2,startIntervalTimeUnit:X(e?.interval?.startIntervalTimeUnit)?e.interval.startIntervalTimeUnit:mt.MINUTES,endInterval:X(e?.interval?.endInterval)?e.interval.endInterval:1,endIntervalTimeUnit:X(e?.interval?.endIntervalTimeUnit)?e.interval.endIntervalTimeUnit:mt.MINUTES},startIntervalPattern:X(e?.startIntervalPattern)?e.startIntervalPattern:null,endIntervalPattern:X(e?.endIntervalPattern)?e.endIntervalPattern:null}}updateValidators(e){const t=this.getTelemetryFromDatabaseConfigForm.get("fetchMode").value,n=this.getTelemetryFromDatabaseConfigForm.get("useMetadataIntervalPatterns").value;t&&t===gt.ALL?(this.getTelemetryFromDatabaseConfigForm.get("aggregation").setValidators([D.required]),this.getTelemetryFromDatabaseConfigForm.get("orderBy").setValidators([D.required]),this.getTelemetryFromDatabaseConfigForm.get("limit").setValidators([D.required,D.min(2),D.max(1e3)])):(this.getTelemetryFromDatabaseConfigForm.get("aggregation").setValidators([]),this.getTelemetryFromDatabaseConfigForm.get("orderBy").setValidators([]),this.getTelemetryFromDatabaseConfigForm.get("limit").setValidators([])),n?(this.getTelemetryFromDatabaseConfigForm.get("interval.startInterval").setValidators([]),this.getTelemetryFromDatabaseConfigForm.get("interval.startIntervalTimeUnit").setValidators([]),this.getTelemetryFromDatabaseConfigForm.get("interval.endInterval").setValidators([]),this.getTelemetryFromDatabaseConfigForm.get("interval.endIntervalTimeUnit").setValidators([]),this.getTelemetryFromDatabaseConfigForm.get("interval").setValidators([]),this.getTelemetryFromDatabaseConfigForm.get("startIntervalPattern").setValidators([D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)]),this.getTelemetryFromDatabaseConfigForm.get("endIntervalPattern").setValidators([D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)])):(this.getTelemetryFromDatabaseConfigForm.get("interval.startInterval").setValidators([D.required,D.min(1),D.max(2147483647)]),this.getTelemetryFromDatabaseConfigForm.get("interval.startIntervalTimeUnit").setValidators([D.required]),this.getTelemetryFromDatabaseConfigForm.get("interval.endInterval").setValidators([D.required,D.min(1),D.max(2147483647)]),this.getTelemetryFromDatabaseConfigForm.get("interval.endIntervalTimeUnit").setValidators([D.required]),this.getTelemetryFromDatabaseConfigForm.get("interval").setValidators([this.intervalValidator()]),this.getTelemetryFromDatabaseConfigForm.get("startIntervalPattern").setValidators([]),this.getTelemetryFromDatabaseConfigForm.get("endIntervalPattern").setValidators([])),this.getTelemetryFromDatabaseConfigForm.get("aggregation").updateValueAndValidity({emitEvent:e}),this.getTelemetryFromDatabaseConfigForm.get("orderBy").updateValueAndValidity({emitEvent:e}),this.getTelemetryFromDatabaseConfigForm.get("limit").updateValueAndValidity({emitEvent:e}),this.getTelemetryFromDatabaseConfigForm.get("interval.startInterval").updateValueAndValidity({emitEvent:e}),this.getTelemetryFromDatabaseConfigForm.get("interval.startIntervalTimeUnit").updateValueAndValidity({emitEvent:e}),this.getTelemetryFromDatabaseConfigForm.get("interval.endInterval").updateValueAndValidity({emitEvent:e}),this.getTelemetryFromDatabaseConfigForm.get("interval.endIntervalTimeUnit").updateValueAndValidity({emitEvent:e}),this.getTelemetryFromDatabaseConfigForm.get("interval").updateValueAndValidity({emitEvent:e}),this.getTelemetryFromDatabaseConfigForm.get("startIntervalPattern").updateValueAndValidity({emitEvent:e}),this.getTelemetryFromDatabaseConfigForm.get("endIntervalPattern").updateValueAndValidity({emitEvent:e})}removeKey(e,t){const n=this.getTelemetryFromDatabaseConfigForm.get(t).value,r=n.indexOf(e);r>=0&&(n.splice(r,1),this.getTelemetryFromDatabaseConfigForm.get(t).setValue(n,{emitEvent:!0}))}clearChipGrid(){this.getTelemetryFromDatabaseConfigForm.get("latestTsKeyNames").patchValue([],{emitEvent:!0})}addKey(e,t){const n=e.input;let r=e.value;if((r||"").trim()){r=r.trim();let e=this.getTelemetryFromDatabaseConfigForm.get(t).value;e&&-1!==e.indexOf(r)||(e||(e=[]),e.push(r),this.getTelemetryFromDatabaseConfigForm.get(t).setValue(e,{emitEvent:!0}))}n&&(n.value="")}defaultPaddingEnable(){return this.getTelemetryFromDatabaseConfigForm.get("fetchMode").value===gt.ALL&&this.getTelemetryFromDatabaseConfigForm.get("aggregation").value===I.NONE}}e("GetTelemetryFromDatabaseConfigComponent",In),In.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:In,deps:[{token:G.Store},{token:H.TranslateService},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),In.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:In,selector:"tb-enrichment-node-get-telemetry-from-database",usesInheritance:!0,ngImport:t,template:'
\n \n
\n help\n \n
\n
\n
tb.rulenode.fetch-interval
\n
\n \n {{ \'tb.rulenode.use-metadata-dynamic-interval\' | translate }}\n \n
\n
\n
\n \n {{ \'tb.rulenode.interval-start\' | translate }}\n \n \n {{ \'tb.rulenode.start-interval-value-required\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n \n {{ \'tb.rulenode.time-unit\' | translate }}\n \n \n {{ timeUnitsTranslationMap.get(timeUnit) | translate }}\n \n \n \n
\n
\n \n {{ \'tb.rulenode.interval-end\' | translate }}\n \n \n {{ \'tb.rulenode.end-interval-value-required\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n \n {{ \'tb.rulenode.time-unit\' | translate }}\n \n \n {{ timeUnitsTranslationMap.get(timeUnit) | translate }}\n \n \n \n
\n
\n error_outline\n
\n \n {{ \'tb.rulenode.fetch-timeseries-from-to\' | translate:\n {\n startInterval: getTelemetryFromDatabaseConfigForm.get(\'interval.startInterval\').value,\n endInterval: getTelemetryFromDatabaseConfigForm.get(\'interval.endInterval\').value,\n startIntervalTimeUnit: getTelemetryFromDatabaseConfigForm.get(\'interval.startIntervalTimeUnit\').value.toLowerCase(),\n endIntervalTimeUnit: getTelemetryFromDatabaseConfigForm.get(\'interval.endIntervalTimeUnit\').value.toLowerCase()\n } }}\n \n \n {{ "tb.rulenode.fetch-timeseries-from-to-invalid" | translate }}\n \n
\n
\n
\n \n
\n \n {{ \'tb.rulenode.start-interval\' | translate }}\n \n \n {{ \'tb.rulenode.start-interval-required\' | translate }}\n \n \n \n {{ \'tb.rulenode.end-interval\' | translate }}\n \n \n {{ \'tb.rulenode.end-interval-required\' | translate }}\n \n \n \n \n
\n
\n
\n
\n
tb.rulenode.fetch-strategy
\n
\n
\n \n \n {{ data.name }}\n \n \n
\n
\n {{ deduplicationStrategiesHintTranslations.get(getTelemetryFromDatabaseConfigForm.get(\'fetchMode\').value) | translate }}\n
\n
\n
\n \n {{ \'aggregation.function\' | translate }}\n \n \n {{ aggregationTypesTranslations.get(aggregationTypes[aggregation]) | translate }}\n \n \n \n
\n \n {{ "tb.rulenode.order-by-timestamp" | translate }} \n \n \n {{ samplingOrdersTranslate.get(order) | translate }}\n \n \n \n \n {{ "tb.rulenode.limit" | translate }}\n \n {{ "tb.rulenode.limit-hint" | translate }}\n \n {{ \'tb.rulenode.limit-required\' | translate }}\n \n \n {{ \'tb.rulenode.limit-range\' | translate }}\n \n \n {{ \'tb.rulenode.limit-range\' | translate }}\n \n \n
\n
\n
\n
\n',styles:[":host .see-example{display:inline-block}:host .description-block{display:flex;align-items:center;border-radius:6px;border:1px solid #EAEAEA}:host .description-block .description-icon{font-size:24px;height:24px;min-height:24px;width:24px;min-width:24px;line-height:24px;color:#d9d9d9;margin:4px}:host .description-block .description-text{font-size:12px;line-height:16px;letter-spacing:.25px;margin:6px}:host .description-block.error{color:var(--mdc-theme-error, #f44336)}:host .description-block.error .description-icon{color:var(--mdc-theme-error, #f44336)}:host .item-center{align-items:center}:host .item-center .fetch-mod-toggle{max-width:630px;width:100%}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:Ge.HelpPopupComponent,selector:"[tb-help-popup], [tb-help-popup-content]",inputs:["tb-help-popup","tb-help-popup-content","trigger-text","trigger-style","tb-help-popup-placement","tb-help-popup-style","hintMode"]},{kind:"component",type:Re.StringItemsListComponent,selector:"tb-string-items-list",inputs:["required","disabled","label","placeholder","hint","requiredText","floatLabel","appearance","editable","subscriptSizing","predefinedValues"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.MaxValidator,selector:"input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",inputs:["max"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:E.FormGroupName,selector:"[formGroupName]",inputs:["formGroupName"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"directive",type:Oe.ToggleOption,selector:"tb-toggle-option",inputs:["value"]},{kind:"component",type:Be.ToggleSelectComponent,selector:"tb-toggle-select",inputs:["disabled","selectMediaBreakpoint","appearance","disablePagination"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"component",type:mn,selector:"tb-example-hint",inputs:["hintText","popupHelpLink"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:In,decorators:[{type:n,args:[{selector:"tb-enrichment-node-get-telemetry-from-database",template:'
\n \n
\n help\n \n
\n
\n
tb.rulenode.fetch-interval
\n
\n \n {{ \'tb.rulenode.use-metadata-dynamic-interval\' | translate }}\n \n
\n
\n
\n \n {{ \'tb.rulenode.interval-start\' | translate }}\n \n \n {{ \'tb.rulenode.start-interval-value-required\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n \n {{ \'tb.rulenode.time-unit\' | translate }}\n \n \n {{ timeUnitsTranslationMap.get(timeUnit) | translate }}\n \n \n \n
\n
\n \n {{ \'tb.rulenode.interval-end\' | translate }}\n \n \n {{ \'tb.rulenode.end-interval-value-required\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n \n {{ \'tb.rulenode.time-unit\' | translate }}\n \n \n {{ timeUnitsTranslationMap.get(timeUnit) | translate }}\n \n \n \n
\n
\n error_outline\n
\n \n {{ \'tb.rulenode.fetch-timeseries-from-to\' | translate:\n {\n startInterval: getTelemetryFromDatabaseConfigForm.get(\'interval.startInterval\').value,\n endInterval: getTelemetryFromDatabaseConfigForm.get(\'interval.endInterval\').value,\n startIntervalTimeUnit: getTelemetryFromDatabaseConfigForm.get(\'interval.startIntervalTimeUnit\').value.toLowerCase(),\n endIntervalTimeUnit: getTelemetryFromDatabaseConfigForm.get(\'interval.endIntervalTimeUnit\').value.toLowerCase()\n } }}\n \n \n {{ "tb.rulenode.fetch-timeseries-from-to-invalid" | translate }}\n \n
\n
\n
\n \n
\n \n {{ \'tb.rulenode.start-interval\' | translate }}\n \n \n {{ \'tb.rulenode.start-interval-required\' | translate }}\n \n \n \n {{ \'tb.rulenode.end-interval\' | translate }}\n \n \n {{ \'tb.rulenode.end-interval-required\' | translate }}\n \n \n \n \n
\n
\n
\n
\n
tb.rulenode.fetch-strategy
\n
\n
\n \n \n {{ data.name }}\n \n \n
\n
\n {{ deduplicationStrategiesHintTranslations.get(getTelemetryFromDatabaseConfigForm.get(\'fetchMode\').value) | translate }}\n
\n
\n
\n \n {{ \'aggregation.function\' | translate }}\n \n \n {{ aggregationTypesTranslations.get(aggregationTypes[aggregation]) | translate }}\n \n \n \n
\n \n {{ "tb.rulenode.order-by-timestamp" | translate }} \n \n \n {{ samplingOrdersTranslate.get(order) | translate }}\n \n \n \n \n {{ "tb.rulenode.limit" | translate }}\n \n {{ "tb.rulenode.limit-hint" | translate }}\n \n {{ \'tb.rulenode.limit-required\' | translate }}\n \n \n {{ \'tb.rulenode.limit-range\' | translate }}\n \n \n {{ \'tb.rulenode.limit-range\' | translate }}\n \n \n
\n
\n
\n
\n',styles:[":host .see-example{display:inline-block}:host .description-block{display:flex;align-items:center;border-radius:6px;border:1px solid #EAEAEA}:host .description-block .description-icon{font-size:24px;height:24px;min-height:24px;width:24px;min-width:24px;line-height:24px;color:#d9d9d9;margin:4px}:host .description-block .description-text{font-size:12px;line-height:16px;letter-spacing:.25px;margin:6px}:host .description-block.error{color:var(--mdc-theme-error, #f44336)}:host .description-block.error .description-icon{color:var(--mdc-theme-error, #f44336)}:host .item-center{align-items:center}:host .item-center .fetch-mod-toggle{max-width:630px;width:100%}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:E.FormBuilder}]}});class Nn extends s{constructor(e,t,n){super(e),this.store=e,this.translate=t,this.fb=n}configForm(){return this.originatorAttributesConfigForm}onConfigurationSet(e){this.originatorAttributesConfigForm=this.fb.group({tellFailureIfAbsent:[e.tellFailureIfAbsent,[]],fetchTo:[e.fetchTo,[]],attributesControl:[e.attributesControl,[]]})}prepareInputConfig(e){return ee(e)&&(e.attributesControl={clientAttributeNames:X(e?.clientAttributeNames)?e.clientAttributeNames:null,latestTsKeyNames:X(e?.latestTsKeyNames)?e.latestTsKeyNames:null,serverAttributeNames:X(e?.serverAttributeNames)?e.serverAttributeNames:null,sharedAttributeNames:X(e?.sharedAttributeNames)?e.sharedAttributeNames:null,getLatestValueWithTs:!!X(e?.getLatestValueWithTs)&&e.getLatestValueWithTs}),{fetchTo:X(e?.fetchTo)?e.fetchTo:Pt.METADATA,tellFailureIfAbsent:!!X(e?.tellFailureIfAbsent)&&e.tellFailureIfAbsent,attributesControl:X(e?.attributesControl)?e.attributesControl:null}}prepareOutputConfig(e){for(const t of Object.keys(e.attributesControl))e[t]=e.attributesControl[t];return delete e.attributesControl,e}}e("OriginatorAttributesConfigComponent",Nn),Nn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Nn,deps:[{token:G.Store},{token:H.TranslateService},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),Nn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Nn,selector:"tb-enrichment-node-originator-attributes-config",usesInheritance:!0,ngImport:t,template:'
\n
\n
\n
tb.rulenode.originator-attributes
\n
\n tb.rulenode.at-least-one-field-required\n
\n
\n \n \n \n \n
\n
\n \n {{ \'tb.rulenode.tell-failure\' | translate }}\n \n
\n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"component",type:gn,selector:"tb-msg-metadata-chip",inputs:["labelText"]},{kind:"component",type:bn,selector:"tb-select-attributes",inputs:["popupHelpLink"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Nn,decorators:[{type:n,args:[{selector:"tb-enrichment-node-originator-attributes-config",template:'
\n
\n
\n
tb.rulenode.originator-attributes
\n
\n tb.rulenode.at-least-one-field-required\n
\n
\n \n \n \n \n
\n
\n \n {{ \'tb.rulenode.tell-failure\' | translate }}\n \n
\n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:E.FormBuilder}]}});class Sn extends s{constructor(e,t,n){super(e),this.store=e,this.fb=t,this.translate=n,this.originatorFields=[];for(const e of Object.keys(S))this.originatorFields.push({value:S[e].value,name:this.translate.instant(S[e].name)})}configForm(){return this.originatorFieldsConfigForm}prepareOutputConfig(e){return Z(e)}prepareInputConfig(e){return{dataMapping:X(e?.dataMapping)?e.dataMapping:null,ignoreNullStrings:X(e?.ignoreNullStrings)?e.ignoreNullStrings:null,fetchTo:X(e?.fetchTo)?e.fetchTo:Pt.METADATA}}onConfigurationSet(e){this.originatorFieldsConfigForm=this.fb.group({dataMapping:[e.dataMapping,[D.required]],ignoreNullStrings:[e.ignoreNullStrings,[]],fetchTo:[e.fetchTo,[]]})}}e("OriginatorFieldsConfigComponent",Sn),Sn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Sn,deps:[{token:G.Store},{token:E.FormBuilder},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),Sn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Sn,selector:"tb-enrichment-node-originator-fields-config",usesInheritance:!0,ngImport:t,template:'
\n \n \n \n \n
\n \n {{ \'tb.rulenode.skip-empty-fields\' | translate }}\n \n
\n
\n',dependencies:[{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"component",type:gn,selector:"tb-msg-metadata-chip",inputs:["labelText"]},{kind:"component",type:yn,selector:"tb-sv-map-config",inputs:["selectOptions","disabled","labelText","requiredText","targetKeyPrefix","selectText","selectRequiredText","valText","valRequiredText","hintText","popupHelpLink","required"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Sn,decorators:[{type:n,args:[{selector:"tb-enrichment-node-originator-fields-config",template:'
\n \n \n \n \n
\n \n {{ \'tb.rulenode.skip-empty-fields\' | translate }}\n \n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder},{type:H.TranslateService}]}});class qn extends s{constructor(e,t,n){super(e),this.store=e,this.fb=t,this.translate=n,this.DataToFetch=ht,this.msgMetadataLabelTranslations=Ct,this.originatorFields=[],this.fetchToData=[],this.destroy$=new Ae;for(const e of Object.keys(S))this.originatorFields.push({value:S[e].value,name:this.translate.instant(S[e].name)});for(const e of vt.keys())this.fetchToData.push({value:e,name:this.translate.instant(vt.get(e))})}configForm(){return this.relatedAttributesConfigForm}prepareOutputConfig(e){e.dataToFetch===ht.FIELDS?(e.dataMapping=e.svMap,delete e.svMap):(e.dataMapping=e.kvMap,delete e.kvMap);const t={};for(const n of Object.keys(e.dataMapping))t[n.trim()]=e.dataMapping[n];return e.dataMapping=t,delete e.svMap,delete e.kvMap,Z(e)}prepareInputConfig(e){let t,n,r={[S.name.value]:`relatedEntity${this.translate.instant(S.name.name)}`},o={serialNumber:"sn"};return t=X(e?.telemetry)?e.telemetry?ht.LATEST_TELEMETRY:ht.ATTRIBUTES:X(e?.dataToFetch)?e.dataToFetch:ht.ATTRIBUTES,n=X(e?.attrMapping)?e.attrMapping:X(e?.dataMapping)?e.dataMapping:null,t===ht.FIELDS?r=n:o=n,{relationsQuery:X(e?.relationsQuery)?e.relationsQuery:null,dataToFetch:t,svMap:r,kvMap:o,fetchTo:X(e?.fetchTo)?e.fetchTo:Pt.METADATA}}selectTranslation(e,t){return this.relatedAttributesConfigForm.get("dataToFetch").value===ht.LATEST_TELEMETRY?e:t}onConfigurationSet(e){this.relatedAttributesConfigForm=this.fb.group({relationsQuery:[e.relationsQuery,[D.required]],dataToFetch:[e.dataToFetch,[]],kvMap:[e.kvMap,[]],svMap:[e.svMap,[]],fetchTo:[e.fetchTo,[]]}),this.relatedAttributesConfigForm.get("dataToFetch").valueChanges.pipe(Le(this.destroy$)).subscribe((e=>{e===ht.FIELDS?(this.relatedAttributesConfigForm.get("svMap").setValidators(D.required),this.relatedAttributesConfigForm.get("svMap").updateValueAndValidity(),this.relatedAttributesConfigForm.get("kvMap").clearValidators(),this.relatedAttributesConfigForm.get("kvMap").updateValueAndValidity()):(this.relatedAttributesConfigForm.get("kvMap").setValidators(D.required),this.relatedAttributesConfigForm.get("kvMap").updateValueAndValidity(),this.relatedAttributesConfigForm.get("svMap").clearValidators(),this.relatedAttributesConfigForm.get("svMap").updateValueAndValidity())}))}ngOnDestroy(){this.destroy$.next(),this.destroy$.complete()}}e("RelatedAttributesConfigComponent",qn),qn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:qn,deps:[{token:G.Store},{token:E.FormBuilder},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),qn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:qn,selector:"tb-enrichment-node-related-attributes-config",usesInheritance:!0,ngImport:t,template:'
\n \n \n
\n
tb.rulenode.data-to-fetch
\n
\n
\n \n \n {{ data.name }}\n \n \n
\n
\n \n \n \n \n \n \n \n \n
\n
\n',styles:[":host .toggle-block{display:flex;place-content:center}:host .toggle-block .fetch-to-data-toggle{max-width:630px;width:100%}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"directive",type:Oe.ToggleOption,selector:"tb-toggle-option",inputs:["value"]},{kind:"component",type:Be.ToggleSelectComponent,selector:"tb-toggle-select",inputs:["disabled","selectMediaBreakpoint","appearance","disablePagination"]},{kind:"component",type:un,selector:"tb-kv-map-config",inputs:["disabled","uniqueKeyValuePairValidator","labelText","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","popupHelpLink","required"]},{kind:"component",type:dn,selector:"tb-relations-query-config",inputs:["disabled","required"]},{kind:"component",type:gn,selector:"tb-msg-metadata-chip",inputs:["labelText"]},{kind:"component",type:yn,selector:"tb-sv-map-config",inputs:["selectOptions","disabled","labelText","requiredText","targetKeyPrefix","selectText","selectRequiredText","valText","valRequiredText","hintText","popupHelpLink","required"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:qn,decorators:[{type:n,args:[{selector:"tb-enrichment-node-related-attributes-config",template:'
\n \n \n
\n
tb.rulenode.data-to-fetch
\n
\n
\n \n \n {{ data.name }}\n \n \n
\n
\n \n \n \n \n \n \n \n \n
\n
\n',styles:[":host .toggle-block{display:flex;place-content:center}:host .toggle-block .fetch-to-data-toggle{max-width:630px;width:100%}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder},{type:H.TranslateService}]}});class An extends s{constructor(e,t,n){super(e),this.store=e,this.fb=t,this.translate=n,this.fetchToData=[],this.DataToFetch=ht;for(const e of vt.keys())e!==ht.FIELDS&&this.fetchToData.push({value:e,name:this.translate.instant(vt.get(e))})}configForm(){return this.tenantAttributesConfigForm}prepareInputConfig(e){let t,n;return t=X(e?.telemetry)?e.telemetry?ht.LATEST_TELEMETRY:ht.ATTRIBUTES:X(e?.dataToFetch)?e.dataToFetch:ht.ATTRIBUTES,n=X(e?.attrMapping)?e.attrMapping:X(e?.dataMapping)?e.dataMapping:null,{dataToFetch:t,dataMapping:n,fetchTo:X(e?.fetchTo)?e.fetchTo:Pt.METADATA}}selectTranslation(e,t){return this.tenantAttributesConfigForm.get("dataToFetch").value===ht.LATEST_TELEMETRY?e:t}onConfigurationSet(e){this.tenantAttributesConfigForm=this.fb.group({dataToFetch:[e.dataToFetch,[]],dataMapping:[e.dataMapping,[D.required]],fetchTo:[e.fetchTo,[]]})}}e("TenantAttributesConfigComponent",An),An.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:An,deps:[{token:G.Store},{token:E.FormBuilder},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),An.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:An,selector:"tb-enrichment-node-tenant-attributes-config",usesInheritance:!0,ngImport:t,template:'
\n
tb.rulenode.mapping-of-tenant-fields
\n
\n
\n \n \n {{ data.name }}\n \n \n
\n
\n \n \n \n \n
\n',styles:[":host .fetch-to-data-toggle{max-width:420px;width:100%}\n"],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:_.DefaultLayoutAlignDirective,selector:" [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]",inputs:["fxLayoutAlign","fxLayoutAlign.xs","fxLayoutAlign.sm","fxLayoutAlign.md","fxLayoutAlign.lg","fxLayoutAlign.xl","fxLayoutAlign.lt-sm","fxLayoutAlign.lt-md","fxLayoutAlign.lt-lg","fxLayoutAlign.lt-xl","fxLayoutAlign.gt-xs","fxLayoutAlign.gt-sm","fxLayoutAlign.gt-md","fxLayoutAlign.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"directive",type:Oe.ToggleOption,selector:"tb-toggle-option",inputs:["value"]},{kind:"component",type:Be.ToggleSelectComponent,selector:"tb-toggle-select",inputs:["disabled","selectMediaBreakpoint","appearance","disablePagination"]},{kind:"component",type:un,selector:"tb-kv-map-config",inputs:["disabled","uniqueKeyValuePairValidator","labelText","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","popupHelpLink","required"]},{kind:"component",type:gn,selector:"tb-msg-metadata-chip",inputs:["labelText"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:An,decorators:[{type:n,args:[{selector:"tb-enrichment-node-tenant-attributes-config",template:'
\n
tb.rulenode.mapping-of-tenant-fields
\n
\n
\n \n \n {{ data.name }}\n \n \n
\n
\n \n \n \n \n
\n',styles:[":host .fetch-to-data-toggle{max-width:420px;width:100%}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder},{type:H.TranslateService}]}});class Mn extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.fetchDeviceCredentialsConfigForm}prepareInputConfig(e){return{fetchTo:X(e?.fetchTo)?e.fetchTo:Pt.METADATA}}onConfigurationSet(e){this.fetchDeviceCredentialsConfigForm=this.fb.group({fetchTo:[e.fetchTo,[]]})}}e("FetchDeviceCredentialsConfigComponent",Mn),Mn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Mn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),Mn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Mn,selector:"./tb-enrichment-node-fetch-device-credentials-config",usesInheritance:!0,ngImport:t,template:'
\n \n \n
\n',dependencies:[{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:gn,selector:"tb-msg-metadata-chip",inputs:["labelText"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Mn,decorators:[{type:n,args:[{selector:"./tb-enrichment-node-fetch-device-credentials-config",template:'
\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]}});class Gn{}e("RulenodeCoreConfigEnrichmentModule",Gn),Gn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Gn,deps:[],target:t.ɵɵFactoryTarget.NgModule}),Gn.ɵmod=t.ɵɵngDeclareNgModule({minVersion:"14.0.0",version:"15.2.9",ngImport:t,type:Gn,declarations:[kn,Tn,Ln,Nn,Sn,In,qn,An,Fn,Mn],imports:[O,T,vn],exports:[kn,Tn,Ln,Nn,Sn,In,qn,An,Fn,Mn]}),Gn.ɵinj=t.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Gn,imports:[O,T,vn]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Gn,decorators:[{type:l,args:[{declarations:[kn,Tn,Ln,Nn,Sn,In,qn,An,Fn,Mn],imports:[O,T,vn],exports:[kn,Tn,Ln,Nn,Sn,In,qn,An,Fn,Mn]}]}]});class En extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.allAzureIotHubCredentialsTypes=Nt,this.azureIotHubCredentialsTypeTranslationsMap=St}configForm(){return this.azureIotHubConfigForm}onConfigurationSet(e){this.azureIotHubConfigForm=this.fb.group({topicPattern:[e?e.topicPattern:null,[D.required]],host:[e?e.host:null,[D.required]],port:[e?e.port:null,[D.required,D.min(1),D.max(65535)]],connectTimeoutSec:[e?e.connectTimeoutSec:null,[D.required,D.min(1),D.max(200)]],clientId:[e?e.clientId:null,[D.required]],cleanSession:[!!e&&e.cleanSession,[]],ssl:[!!e&&e.ssl,[]],credentials:this.fb.group({type:[e&&e.credentials?e.credentials.type:null,[D.required]],sasKey:[e&&e.credentials?e.credentials.sasKey:null,[]],caCert:[e&&e.credentials?e.credentials.caCert:null,[]],caCertFileName:[e&&e.credentials?e.credentials.caCertFileName:null,[]],privateKey:[e&&e.credentials?e.credentials.privateKey:null,[]],privateKeyFileName:[e&&e.credentials?e.credentials.privateKeyFileName:null,[]],cert:[e&&e.credentials?e.credentials.cert:null,[]],certFileName:[e&&e.credentials?e.credentials.certFileName:null,[]],password:[e&&e.credentials?e.credentials.password:null,[]]})})}prepareOutputConfig(e){const t=e.credentials.type;return"sas"===t&&(e.credentials={type:t,sasKey:e.credentials.sasKey,caCert:e.credentials.caCert,caCertFileName:e.credentials.caCertFileName}),e}validatorTriggers(){return["credentials.type"]}updateValidators(e){const t=this.azureIotHubConfigForm.get("credentials"),n=t.get("type").value;switch(e&&t.reset({type:n},{emitEvent:!1}),t.get("sasKey").setValidators([]),t.get("privateKey").setValidators([]),t.get("privateKeyFileName").setValidators([]),t.get("cert").setValidators([]),t.get("certFileName").setValidators([]),n){case"sas":t.get("sasKey").setValidators([D.required]);break;case"cert.PEM":t.get("privateKey").setValidators([D.required]),t.get("privateKeyFileName").setValidators([D.required]),t.get("cert").setValidators([D.required]),t.get("certFileName").setValidators([D.required])}t.get("sasKey").updateValueAndValidity({emitEvent:e}),t.get("privateKey").updateValueAndValidity({emitEvent:e}),t.get("privateKeyFileName").updateValueAndValidity({emitEvent:e}),t.get("cert").updateValueAndValidity({emitEvent:e}),t.get("certFileName").updateValueAndValidity({emitEvent:e})}}e("AzureIotHubConfigComponent",En),En.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:En,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),En.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:En,selector:"tb-external-node-azure-iot-hub-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.topic\n \n \n {{ \'tb.rulenode.topic-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.hostname\n \n \n {{ \'tb.rulenode.hostname-required\' | translate }}\n \n \n \n tb.rulenode.device-id\n \n \n {{ \'tb.rulenode.device-id-required\' | translate }}\n \n \n \n \n \n tb.rulenode.credentials\n \n {{ azureIotHubCredentialsTypeTranslationsMap.get(azureIotHubConfigForm.get(\'credentials.type\').value) | translate }}\n \n \n
\n \n tb.rulenode.credentials-type\n \n \n {{ azureIotHubCredentialsTypeTranslationsMap.get(credentialsType) | translate }}\n \n \n \n {{ \'tb.rulenode.credentials-type-required\' | translate }}\n \n \n
\n \n \n \n \n tb.rulenode.sas-key\n \n \n \n {{ \'tb.rulenode.sas-key-required\' | translate }}\n \n \n \n \n \n \n \n \n \n \n \n \n \n tb.rulenode.private-key-password\n \n \n \n \n
\n
\n
\n
\n
\n',styles:[":host .tb-mqtt-credentials-panel-group{margin:0 6px}\n"],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:R.NgSwitch,selector:"[ngSwitch]",inputs:["ngSwitch"]},{kind:"directive",type:R.NgSwitchCase,selector:"[ngSwitchCase]",inputs:["ngSwitchCase"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:Ne.MatAccordion,selector:"mat-accordion",inputs:["multi","hideToggle","displayMode","togglePosition"],exportAs:["matAccordion"]},{kind:"component",type:Ne.MatExpansionPanel,selector:"mat-expansion-panel",inputs:["disabled","expanded","hideToggle","togglePosition"],outputs:["opened","closed","expandedChange","afterExpand","afterCollapse"],exportAs:["matExpansionPanel"]},{kind:"component",type:Ne.MatExpansionPanelHeader,selector:"mat-expansion-panel-header",inputs:["tabIndex","expandedHeight","collapsedHeight"]},{kind:"directive",type:Ne.MatExpansionPanelTitle,selector:"mat-panel-title"},{kind:"directive",type:Ne.MatExpansionPanelDescription,selector:"mat-panel-description"},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:E.FormGroupName,selector:"[formGroupName]",inputs:["formGroupName"]},{kind:"component",type:Pe.FileInputComponent,selector:"tb-file-input",inputs:["label","hint","accept","noFileText","inputId","allowedExtensions","dropLabel","contentConvertFunction","required","requiredAsError","disabled","existingFileName","readAsBinary","workFromFileObj","multipleFile"],outputs:["fileNameChanged"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:we.TogglePasswordComponent,selector:"tb-toggle-password"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:En,decorators:[{type:n,args:[{selector:"tb-external-node-azure-iot-hub-config",template:'
\n \n tb.rulenode.topic\n \n \n {{ \'tb.rulenode.topic-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.hostname\n \n \n {{ \'tb.rulenode.hostname-required\' | translate }}\n \n \n \n tb.rulenode.device-id\n \n \n {{ \'tb.rulenode.device-id-required\' | translate }}\n \n \n \n \n \n tb.rulenode.credentials\n \n {{ azureIotHubCredentialsTypeTranslationsMap.get(azureIotHubConfigForm.get(\'credentials.type\').value) | translate }}\n \n \n
\n \n tb.rulenode.credentials-type\n \n \n {{ azureIotHubCredentialsTypeTranslationsMap.get(credentialsType) | translate }}\n \n \n \n {{ \'tb.rulenode.credentials-type-required\' | translate }}\n \n \n
\n \n \n \n \n tb.rulenode.sas-key\n \n \n \n {{ \'tb.rulenode.sas-key-required\' | translate }}\n \n \n \n \n \n \n \n \n \n \n \n \n \n tb.rulenode.private-key-password\n \n \n \n \n
\n
\n
\n
\n
\n',styles:[":host .tb-mqtt-credentials-panel-group{margin:0 6px}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Dn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.ackValues=["all","-1","0","1"],this.ToByteStandartCharsetTypesValues=At,this.ToByteStandartCharsetTypeTranslationMap=Mt}configForm(){return this.kafkaConfigForm}onConfigurationSet(e){this.kafkaConfigForm=this.fb.group({topicPattern:[e?e.topicPattern:null,[D.required]],keyPattern:[e?e.keyPattern:null],bootstrapServers:[e?e.bootstrapServers:null,[D.required]],retries:[e?e.retries:null,[D.min(0)]],batchSize:[e?e.batchSize:null,[D.min(0)]],linger:[e?e.linger:null,[D.min(0)]],bufferMemory:[e?e.bufferMemory:null,[D.min(0)]],acks:[e?e.acks:null,[D.required]],keySerializer:[e?e.keySerializer:null,[D.required]],valueSerializer:[e?e.valueSerializer:null,[D.required]],otherProperties:[e?e.otherProperties:null,[]],addMetadataKeyValuesAsKafkaHeaders:[!!e&&e.addMetadataKeyValuesAsKafkaHeaders,[]],kafkaHeadersCharset:[e?e.kafkaHeadersCharset:null,[]]})}validatorTriggers(){return["addMetadataKeyValuesAsKafkaHeaders"]}updateValidators(e){this.kafkaConfigForm.get("addMetadataKeyValuesAsKafkaHeaders").value?this.kafkaConfigForm.get("kafkaHeadersCharset").setValidators([D.required]):this.kafkaConfigForm.get("kafkaHeadersCharset").setValidators([]),this.kafkaConfigForm.get("kafkaHeadersCharset").updateValueAndValidity({emitEvent:e})}}e("KafkaConfigComponent",Dn),Dn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Dn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Dn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Dn,selector:"tb-external-node-kafka-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.topic-pattern\n \n \n {{ \'tb.rulenode.topic-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.key-pattern\n \n tb.rulenode.general-pattern-hint\n \n
tb.rulenode.key-pattern-hint
\n \n tb.rulenode.bootstrap-servers\n \n \n {{ \'tb.rulenode.bootstrap-servers-required\' | translate }}\n \n \n \n tb.rulenode.retries\n \n \n {{ \'tb.rulenode.min-retries-message\' | translate }}\n \n \n \n tb.rulenode.batch-size-bytes\n \n \n {{ \'tb.rulenode.min-batch-size-bytes-message\' | translate }}\n \n \n \n tb.rulenode.linger-ms\n \n \n {{ \'tb.rulenode.min-linger-ms-message\' | translate }}\n \n \n \n tb.rulenode.buffer-memory-bytes\n \n \n {{ \'tb.rulenode.min-buffer-memory-bytes-message\' | translate }}\n \n \n \n tb.rulenode.acks\n \n \n {{ ackValue }}\n \n \n \n \n tb.rulenode.key-serializer\n \n \n {{ \'tb.rulenode.key-serializer-required\' | translate }}\n \n \n \n tb.rulenode.value-serializer\n \n \n {{ \'tb.rulenode.value-serializer-required\' | translate }}\n \n \n \n \n \n \n {{ \'tb.rulenode.add-metadata-key-values-as-kafka-headers\' | translate }}\n \n
tb.rulenode.add-metadata-key-values-as-kafka-headers-hint
\n \n tb.rulenode.charset-encoding\n \n \n {{ ToByteStandartCharsetTypeTranslationMap.get(charset) | translate }}\n \n \n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:Xt,selector:"tb-kv-map-config-old",inputs:["disabled","uniqueKeyValuePairValidator","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","required"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Dn,decorators:[{type:n,args:[{selector:"tb-external-node-kafka-config",template:'
\n \n tb.rulenode.topic-pattern\n \n \n {{ \'tb.rulenode.topic-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.key-pattern\n \n tb.rulenode.general-pattern-hint\n \n
tb.rulenode.key-pattern-hint
\n \n tb.rulenode.bootstrap-servers\n \n \n {{ \'tb.rulenode.bootstrap-servers-required\' | translate }}\n \n \n \n tb.rulenode.retries\n \n \n {{ \'tb.rulenode.min-retries-message\' | translate }}\n \n \n \n tb.rulenode.batch-size-bytes\n \n \n {{ \'tb.rulenode.min-batch-size-bytes-message\' | translate }}\n \n \n \n tb.rulenode.linger-ms\n \n \n {{ \'tb.rulenode.min-linger-ms-message\' | translate }}\n \n \n \n tb.rulenode.buffer-memory-bytes\n \n \n {{ \'tb.rulenode.min-buffer-memory-bytes-message\' | translate }}\n \n \n \n tb.rulenode.acks\n \n \n {{ ackValue }}\n \n \n \n \n tb.rulenode.key-serializer\n \n \n {{ \'tb.rulenode.key-serializer-required\' | translate }}\n \n \n \n tb.rulenode.value-serializer\n \n \n {{ \'tb.rulenode.value-serializer-required\' | translate }}\n \n \n \n \n \n \n {{ \'tb.rulenode.add-metadata-key-values-as-kafka-headers\' | translate }}\n \n
tb.rulenode.add-metadata-key-values-as-kafka-headers-hint
\n \n tb.rulenode.charset-encoding\n \n \n {{ ToByteStandartCharsetTypeTranslationMap.get(charset) | translate }}\n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Vn extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.mqttConfigForm}onConfigurationSet(e){this.mqttConfigForm=this.fb.group({topicPattern:[e?e.topicPattern:null,[D.required]],host:[e?e.host:null,[D.required]],port:[e?e.port:null,[D.required,D.min(1),D.max(65535)]],connectTimeoutSec:[e?e.connectTimeoutSec:null,[D.required,D.min(1),D.max(200)]],clientId:[e?e.clientId:null,[]],appendClientIdSuffix:[{value:!!e&&e.appendClientIdSuffix,disabled:!(e&&te(e.clientId))},[]],cleanSession:[!!e&&e.cleanSession,[]],retainedMessage:[!!e&&e.retainedMessage,[]],ssl:[!!e&&e.ssl,[]],credentials:[e?e.credentials:null,[]]})}updateValidators(e){te(this.mqttConfigForm.get("clientId").value)?this.mqttConfigForm.get("appendClientIdSuffix").enable({emitEvent:!1}):this.mqttConfigForm.get("appendClientIdSuffix").disable({emitEvent:!1}),this.mqttConfigForm.get("appendClientIdSuffix").updateValueAndValidity({emitEvent:e})}validatorTriggers(){return["clientId"]}}e("MqttConfigComponent",Vn),Vn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Vn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Vn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Vn,selector:"tb-external-node-mqtt-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.topic-pattern\n \n \n {{ \'tb.rulenode.topic-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n \n tb.rulenode.host\n \n \n {{ \'tb.rulenode.host-required\' | translate }}\n \n \n \n tb.rulenode.port\n \n \n {{ \'tb.rulenode.port-required\' | translate }}\n \n \n {{ \'tb.rulenode.port-range\' | translate }}\n \n \n {{ \'tb.rulenode.port-range\' | translate }}\n \n \n \n tb.rulenode.connect-timeout\n \n \n {{ \'tb.rulenode.connect-timeout-required\' | translate }}\n \n \n {{ \'tb.rulenode.connect-timeout-range\' | translate }}\n \n \n {{ \'tb.rulenode.connect-timeout-range\' | translate }}\n \n \n
\n \n tb.rulenode.client-id\n \n {{\'tb.rulenode.client-id-hint\' | translate}}\n \n \n {{ \'tb.rulenode.append-client-id-suffix\' | translate }}\n \n
{{ "tb.rulenode.client-id-suffix-hint" | translate }}
\n \n {{ \'tb.rulenode.clean-session\' | translate }}\n \n \n {{ "tb.rulenode.retained-message" | translate }}\n \n \n {{ \'tb.rulenode.enable-ssl\' | translate }}\n \n \n
\n',styles:[":host .tb-mqtt-credentials-panel-group{margin:0 6px}\n"],dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.MaxValidator,selector:"input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",inputs:["max"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:fn,selector:"tb-credentials-config",inputs:["required","disableCertPemCredentials","passwordFieldRequired"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Vn,decorators:[{type:n,args:[{selector:"tb-external-node-mqtt-config",template:'
\n \n tb.rulenode.topic-pattern\n \n \n {{ \'tb.rulenode.topic-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n \n tb.rulenode.host\n \n \n {{ \'tb.rulenode.host-required\' | translate }}\n \n \n \n tb.rulenode.port\n \n \n {{ \'tb.rulenode.port-required\' | translate }}\n \n \n {{ \'tb.rulenode.port-range\' | translate }}\n \n \n {{ \'tb.rulenode.port-range\' | translate }}\n \n \n \n tb.rulenode.connect-timeout\n \n \n {{ \'tb.rulenode.connect-timeout-required\' | translate }}\n \n \n {{ \'tb.rulenode.connect-timeout-range\' | translate }}\n \n \n {{ \'tb.rulenode.connect-timeout-range\' | translate }}\n \n \n
\n \n tb.rulenode.client-id\n \n {{\'tb.rulenode.client-id-hint\' | translate}}\n \n \n {{ \'tb.rulenode.append-client-id-suffix\' | translate }}\n \n
{{ "tb.rulenode.client-id-suffix-hint" | translate }}
\n \n {{ \'tb.rulenode.clean-session\' | translate }}\n \n \n {{ "tb.rulenode.retained-message" | translate }}\n \n \n {{ \'tb.rulenode.enable-ssl\' | translate }}\n \n \n
\n',styles:[":host .tb-mqtt-credentials-panel-group{margin:0 6px}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Pn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.notificationType=q,this.entityType=x}configForm(){return this.notificationConfigForm}onConfigurationSet(e){this.notificationConfigForm=this.fb.group({templateId:[e?e.templateId:null,[D.required]],targets:[e?e.targets:[],[D.required]]})}}e("NotificationConfigComponent",Pn),Pn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Pn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),Pn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Pn,selector:"tb-external-node-notification-config",usesInheritance:!0,ngImport:t,template:'
\n \n \n \n \n
\n',dependencies:[{kind:"component",type:Ke.EntityListComponent,selector:"tb-entity-list",inputs:["entityType","subType","labelText","placeholderText","requiredText","required","disabled","subscriptSizing","hint"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:Ue.TemplateAutocompleteComponent,selector:"tb-template-autocomplete",inputs:["required","allowCreate","allowEdit","disabled","notificationTypes"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Pn,decorators:[{type:n,args:[{selector:"tb-external-node-notification-config",template:'
\n \n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]}});class wn extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.pubSubConfigForm}onConfigurationSet(e){this.pubSubConfigForm=this.fb.group({projectId:[e?e.projectId:null,[D.required]],topicName:[e?e.topicName:null,[D.required]],serviceAccountKey:[e?e.serviceAccountKey:null,[D.required]],serviceAccountKeyFileName:[e?e.serviceAccountKeyFileName:null,[D.required]],messageAttributes:[e?e.messageAttributes:null,[]]})}}e("PubSubConfigComponent",wn),wn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:wn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),wn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:wn,selector:"tb-external-node-pub-sub-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.gcp-project-id\n \n \n {{ \'tb.rulenode.gcp-project-id-required\' | translate }}\n \n \n \n tb.rulenode.pubsub-topic-name\n \n \n {{ \'tb.rulenode.pubsub-topic-name-required\' | translate }}\n \n \n \n \n \n
\n \n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:Pe.FileInputComponent,selector:"tb-file-input",inputs:["label","hint","accept","noFileText","inputId","allowedExtensions","dropLabel","contentConvertFunction","required","requiredAsError","disabled","existingFileName","readAsBinary","workFromFileObj","multipleFile"],outputs:["fileNameChanged"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:Xt,selector:"tb-kv-map-config-old",inputs:["disabled","uniqueKeyValuePairValidator","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","required"]},{kind:"pipe",type:pe.SafePipe,name:"safe"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:wn,decorators:[{type:n,args:[{selector:"tb-external-node-pub-sub-config",template:'
\n \n tb.rulenode.gcp-project-id\n \n \n {{ \'tb.rulenode.gcp-project-id-required\' | translate }}\n \n \n \n tb.rulenode.pubsub-topic-name\n \n \n {{ \'tb.rulenode.pubsub-topic-name-required\' | translate }}\n \n \n \n \n \n
\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Rn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.messageProperties=[null,"BASIC","TEXT_PLAIN","MINIMAL_BASIC","MINIMAL_PERSISTENT_BASIC","PERSISTENT_BASIC","PERSISTENT_TEXT_PLAIN"]}configForm(){return this.rabbitMqConfigForm}onConfigurationSet(e){this.rabbitMqConfigForm=this.fb.group({exchangeNamePattern:[e?e.exchangeNamePattern:null,[]],routingKeyPattern:[e?e.routingKeyPattern:null,[]],messageProperties:[e?e.messageProperties:null,[]],host:[e?e.host:null,[D.required]],port:[e?e.port:null,[D.required,D.min(1),D.max(65535)]],virtualHost:[e?e.virtualHost:null,[]],username:[e?e.username:null,[]],password:[e?e.password:null,[]],automaticRecoveryEnabled:[!!e&&e.automaticRecoveryEnabled,[]],connectionTimeout:[e?e.connectionTimeout:null,[D.min(0)]],handshakeTimeout:[e?e.handshakeTimeout:null,[D.min(0)]],clientProperties:[e?e.clientProperties:null,[]]})}}e("RabbitMqConfigComponent",Rn),Rn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Rn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Rn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Rn,selector:"tb-external-node-rabbit-mq-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.exchange-name-pattern\n \n \n \n tb.rulenode.routing-key-pattern\n \n \n \n tb.rulenode.message-properties\n \n \n {{ property }}\n \n \n \n
\n \n tb.rulenode.host\n \n \n {{ \'tb.rulenode.host-required\' | translate }}\n \n \n \n tb.rulenode.port\n \n \n {{ \'tb.rulenode.port-required\' | translate }}\n \n \n {{ \'tb.rulenode.port-range\' | translate }}\n \n \n {{ \'tb.rulenode.port-range\' | translate }}\n \n \n
\n \n tb.rulenode.virtual-host\n \n \n \n tb.rulenode.username\n \n \n \n tb.rulenode.password\n \n \n \n \n {{ \'tb.rulenode.automatic-recovery\' | translate }}\n \n \n tb.rulenode.connection-timeout-ms\n \n \n {{ \'tb.rulenode.min-connection-timeout-ms-message\' | translate }}\n \n \n \n tb.rulenode.handshake-timeout-ms\n \n \n {{ \'tb.rulenode.min-handshake-timeout-ms-message\' | translate }}\n \n \n \n \n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.MaxValidator,selector:"input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",inputs:["max"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:we.TogglePasswordComponent,selector:"tb-toggle-password"},{kind:"component",type:Xt,selector:"tb-kv-map-config-old",inputs:["disabled","uniqueKeyValuePairValidator","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","required"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Rn,decorators:[{type:n,args:[{selector:"tb-external-node-rabbit-mq-config",template:'
\n \n tb.rulenode.exchange-name-pattern\n \n \n \n tb.rulenode.routing-key-pattern\n \n \n \n tb.rulenode.message-properties\n \n \n {{ property }}\n \n \n \n
\n \n tb.rulenode.host\n \n \n {{ \'tb.rulenode.host-required\' | translate }}\n \n \n \n tb.rulenode.port\n \n \n {{ \'tb.rulenode.port-required\' | translate }}\n \n \n {{ \'tb.rulenode.port-range\' | translate }}\n \n \n {{ \'tb.rulenode.port-range\' | translate }}\n \n \n
\n \n tb.rulenode.virtual-host\n \n \n \n tb.rulenode.username\n \n \n \n tb.rulenode.password\n \n \n \n \n {{ \'tb.rulenode.automatic-recovery\' | translate }}\n \n \n tb.rulenode.connection-timeout-ms\n \n \n {{ \'tb.rulenode.min-connection-timeout-ms-message\' | translate }}\n \n \n \n tb.rulenode.handshake-timeout-ms\n \n \n {{ \'tb.rulenode.min-handshake-timeout-ms-message\' | translate }}\n \n \n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class On extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.proxySchemes=["http","https"],this.httpRequestTypes=Object.keys(qt)}configForm(){return this.restApiCallConfigForm}onConfigurationSet(e){this.restApiCallConfigForm=this.fb.group({restEndpointUrlPattern:[e?e.restEndpointUrlPattern:null,[D.required]],requestMethod:[e?e.requestMethod:null,[D.required]],useSimpleClientHttpFactory:[!!e&&e.useSimpleClientHttpFactory,[]],trimDoubleQuotes:[!!e&&e.trimDoubleQuotes,[]],ignoreRequestBody:[!!e&&e.ignoreRequestBody,[]],enableProxy:[!!e&&e.enableProxy,[]],useSystemProxyProperties:[!!e&&e.enableProxy,[]],proxyScheme:[e?e.proxyHost:null,[]],proxyHost:[e?e.proxyHost:null,[]],proxyPort:[e?e.proxyPort:null,[]],proxyUser:[e?e.proxyUser:null,[]],proxyPassword:[e?e.proxyPassword:null,[]],readTimeoutMs:[e?e.readTimeoutMs:null,[]],maxParallelRequestsCount:[e?e.maxParallelRequestsCount:null,[D.min(0)]],headers:[e?e.headers:null,[]],useRedisQueueForMsgPersistence:[!!e&&e.useRedisQueueForMsgPersistence,[]],trimQueue:[!!e&&e.trimQueue,[]],maxQueueSize:[e?e.maxQueueSize:null,[]],credentials:[e?e.credentials:null,[]]})}validatorTriggers(){return["useSimpleClientHttpFactory","useRedisQueueForMsgPersistence","enableProxy","useSystemProxyProperties"]}updateValidators(e){const t=this.restApiCallConfigForm.get("useSimpleClientHttpFactory").value,n=this.restApiCallConfigForm.get("useRedisQueueForMsgPersistence").value,r=this.restApiCallConfigForm.get("enableProxy").value,o=this.restApiCallConfigForm.get("useSystemProxyProperties").value;r&&!o?(this.restApiCallConfigForm.get("proxyHost").setValidators(r?[D.required]:[]),this.restApiCallConfigForm.get("proxyPort").setValidators(r?[D.required,D.min(1),D.max(65535)]:[])):(this.restApiCallConfigForm.get("proxyHost").setValidators([]),this.restApiCallConfigForm.get("proxyPort").setValidators([]),t?this.restApiCallConfigForm.get("readTimeoutMs").setValidators([]):this.restApiCallConfigForm.get("readTimeoutMs").setValidators([D.min(0)])),n?this.restApiCallConfigForm.get("maxQueueSize").setValidators([D.min(0)]):this.restApiCallConfigForm.get("maxQueueSize").setValidators([]),this.restApiCallConfigForm.get("readTimeoutMs").updateValueAndValidity({emitEvent:e}),this.restApiCallConfigForm.get("maxQueueSize").updateValueAndValidity({emitEvent:e}),this.restApiCallConfigForm.get("proxyHost").updateValueAndValidity({emitEvent:e}),this.restApiCallConfigForm.get("proxyPort").updateValueAndValidity({emitEvent:e}),this.restApiCallConfigForm.get("credentials").updateValueAndValidity({emitEvent:e})}}e("RestApiCallConfigComponent",On),On.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:On,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),On.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:On,selector:"tb-external-node-rest-api-call-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.endpoint-url-pattern\n \n \n {{ \'tb.rulenode.endpoint-url-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.request-method\n \n \n {{ requestType }}\n \n \n \n \n {{ \'tb.rulenode.enable-proxy\' | translate }}\n \n \n {{ \'tb.rulenode.use-simple-client-http-factory\' | translate }}\n \n \n {{ \'tb.rulenode.trim-double-quotes\' | translate }}\n \n
tb.rulenode.trim-double-quotes-hint
\n \n {{ \'tb.rulenode.ignore-request-body\' | translate }}\n \n
\n \n {{ \'tb.rulenode.use-system-proxy-properties\' | translate }}\n \n
\n
\n \n tb.rulenode.proxy-scheme\n \n \n {{ proxyScheme }}\n \n \n \n \n tb.rulenode.proxy-host\n \n \n {{ \'tb.rulenode.proxy-host-required\' | translate }}\n \n \n \n tb.rulenode.proxy-port\n \n \n {{ \'tb.rulenode.proxy-port-required\' | translate }}\n \n \n {{ \'tb.rulenode.proxy-port-range\' | translate }}\n \n \n
\n \n tb.rulenode.proxy-user\n \n \n \n tb.rulenode.proxy-password\n \n \n
\n
\n \n tb.rulenode.read-timeout\n \n tb.rulenode.read-timeout-hint\n \n \n tb.rulenode.max-parallel-requests-count\n \n tb.rulenode.max-parallel-requests-count-hint\n \n \n
\n \n \n \n {{ \'tb.rulenode.use-redis-queue\' | translate }}\n \n
\n \n {{ \'tb.rulenode.trim-redis-queue\' | translate }}\n \n \n tb.rulenode.redis-queue-max-size\n \n \n
\n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:fn,selector:"tb-credentials-config",inputs:["required","disableCertPemCredentials","passwordFieldRequired"]},{kind:"component",type:Xt,selector:"tb-kv-map-config-old",inputs:["disabled","uniqueKeyValuePairValidator","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","required"]},{kind:"pipe",type:pe.SafePipe,name:"safe"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:On,decorators:[{type:n,args:[{selector:"tb-external-node-rest-api-call-config",template:'
\n \n tb.rulenode.endpoint-url-pattern\n \n \n {{ \'tb.rulenode.endpoint-url-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.request-method\n \n \n {{ requestType }}\n \n \n \n \n {{ \'tb.rulenode.enable-proxy\' | translate }}\n \n \n {{ \'tb.rulenode.use-simple-client-http-factory\' | translate }}\n \n \n {{ \'tb.rulenode.trim-double-quotes\' | translate }}\n \n
tb.rulenode.trim-double-quotes-hint
\n \n {{ \'tb.rulenode.ignore-request-body\' | translate }}\n \n
\n \n {{ \'tb.rulenode.use-system-proxy-properties\' | translate }}\n \n
\n
\n \n tb.rulenode.proxy-scheme\n \n \n {{ proxyScheme }}\n \n \n \n \n tb.rulenode.proxy-host\n \n \n {{ \'tb.rulenode.proxy-host-required\' | translate }}\n \n \n \n tb.rulenode.proxy-port\n \n \n {{ \'tb.rulenode.proxy-port-required\' | translate }}\n \n \n {{ \'tb.rulenode.proxy-port-range\' | translate }}\n \n \n
\n \n tb.rulenode.proxy-user\n \n \n \n tb.rulenode.proxy-password\n \n \n
\n
\n \n tb.rulenode.read-timeout\n \n tb.rulenode.read-timeout-hint\n \n \n tb.rulenode.max-parallel-requests-count\n \n tb.rulenode.max-parallel-requests-count-hint\n \n \n
\n \n \n \n {{ \'tb.rulenode.use-redis-queue\' | translate }}\n \n
\n \n {{ \'tb.rulenode.trim-redis-queue\' | translate }}\n \n \n tb.rulenode.redis-queue-max-size\n \n \n
\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Bn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.smtpProtocols=["smtp","smtps"],this.tlsVersions=["TLSv1","TLSv1.1","TLSv1.2","TLSv1.3"]}configForm(){return this.sendEmailConfigForm}onConfigurationSet(e){this.sendEmailConfigForm=this.fb.group({useSystemSmtpSettings:[!!e&&e.useSystemSmtpSettings,[]],smtpProtocol:[e?e.smtpProtocol:null,[]],smtpHost:[e?e.smtpHost:null,[]],smtpPort:[e?e.smtpPort:null,[]],timeout:[e?e.timeout:null,[]],enableTls:[!!e&&e.enableTls,[]],tlsVersion:[e?e.tlsVersion:null,[]],enableProxy:[!!e&&e.enableProxy,[]],proxyHost:[e?e.proxyHost:null,[]],proxyPort:[e?e.proxyPort:null,[]],proxyUser:[e?e.proxyUser:null,[]],proxyPassword:[e?e.proxyPassword:null,[]],username:[e?e.username:null,[]],password:[e?e.password:null,[]]})}validatorTriggers(){return["useSystemSmtpSettings","enableProxy"]}updateValidators(e){const t=this.sendEmailConfigForm.get("useSystemSmtpSettings").value,n=this.sendEmailConfigForm.get("enableProxy").value;t?(this.sendEmailConfigForm.get("smtpProtocol").setValidators([]),this.sendEmailConfigForm.get("smtpHost").setValidators([]),this.sendEmailConfigForm.get("smtpPort").setValidators([]),this.sendEmailConfigForm.get("timeout").setValidators([]),this.sendEmailConfigForm.get("proxyHost").setValidators([]),this.sendEmailConfigForm.get("proxyPort").setValidators([])):(this.sendEmailConfigForm.get("smtpProtocol").setValidators([D.required]),this.sendEmailConfigForm.get("smtpHost").setValidators([D.required]),this.sendEmailConfigForm.get("smtpPort").setValidators([D.required,D.min(1),D.max(65535)]),this.sendEmailConfigForm.get("timeout").setValidators([D.required,D.min(0)]),this.sendEmailConfigForm.get("proxyHost").setValidators(n?[D.required]:[]),this.sendEmailConfigForm.get("proxyPort").setValidators(n?[D.required,D.min(1),D.max(65535)]:[])),this.sendEmailConfigForm.get("smtpProtocol").updateValueAndValidity({emitEvent:e}),this.sendEmailConfigForm.get("smtpHost").updateValueAndValidity({emitEvent:e}),this.sendEmailConfigForm.get("smtpPort").updateValueAndValidity({emitEvent:e}),this.sendEmailConfigForm.get("timeout").updateValueAndValidity({emitEvent:e}),this.sendEmailConfigForm.get("proxyHost").updateValueAndValidity({emitEvent:e}),this.sendEmailConfigForm.get("proxyPort").updateValueAndValidity({emitEvent:e})}}e("SendEmailConfigComponent",Bn),Bn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Bn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Bn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Bn,selector:"tb-external-node-send-email-config",usesInheritance:!0,ngImport:t,template:'
\n \n {{ \'tb.rulenode.use-system-smtp-settings\' | translate }}\n \n
\n \n tb.rulenode.smtp-protocol\n \n \n {{ smtpProtocol.toUpperCase() }}\n \n \n \n
\n \n tb.rulenode.smtp-host\n \n \n {{ \'tb.rulenode.smtp-host-required\' | translate }}\n \n \n \n tb.rulenode.smtp-port\n \n \n {{ \'tb.rulenode.smtp-port-required\' | translate }}\n \n \n {{ \'tb.rulenode.smtp-port-range\' | translate }}\n \n \n {{ \'tb.rulenode.smtp-port-range\' | translate }}\n \n \n
\n \n tb.rulenode.timeout-msec\n \n \n {{ \'tb.rulenode.timeout-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-timeout-msec-message\' | translate }}\n \n \n \n {{ \'tb.rulenode.enable-tls\' | translate }}\n \n \n tb.rulenode.tls-version\n \n \n {{ tlsVersion }}\n \n \n \n \n {{ \'tb.rulenode.enable-proxy\' | translate }}\n \n
\n
\n \n tb.rulenode.proxy-host\n \n \n {{ \'tb.rulenode.proxy-host-required\' | translate }}\n \n \n \n tb.rulenode.proxy-port\n \n \n {{ \'tb.rulenode.proxy-port-required\' | translate }}\n \n \n {{ \'tb.rulenode.proxy-port-range\' | translate }}\n \n \n
\n \n tb.rulenode.proxy-user\n \n \n \n tb.rulenode.proxy-password\n \n \n
\n \n tb.rulenode.username\n \n \n \n tb.rulenode.password\n \n \n \n
\n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:_e.TbCheckboxComponent,selector:"tb-checkbox",inputs:["disabled","trueValue","falseValue"],outputs:["valueChange"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.MaxValidator,selector:"input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",inputs:["max"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:we.TogglePasswordComponent,selector:"tb-toggle-password"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Bn,decorators:[{type:n,args:[{selector:"tb-external-node-send-email-config",template:'
\n \n {{ \'tb.rulenode.use-system-smtp-settings\' | translate }}\n \n
\n \n tb.rulenode.smtp-protocol\n \n \n {{ smtpProtocol.toUpperCase() }}\n \n \n \n
\n \n tb.rulenode.smtp-host\n \n \n {{ \'tb.rulenode.smtp-host-required\' | translate }}\n \n \n \n tb.rulenode.smtp-port\n \n \n {{ \'tb.rulenode.smtp-port-required\' | translate }}\n \n \n {{ \'tb.rulenode.smtp-port-range\' | translate }}\n \n \n {{ \'tb.rulenode.smtp-port-range\' | translate }}\n \n \n
\n \n tb.rulenode.timeout-msec\n \n \n {{ \'tb.rulenode.timeout-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-timeout-msec-message\' | translate }}\n \n \n \n {{ \'tb.rulenode.enable-tls\' | translate }}\n \n \n tb.rulenode.tls-version\n \n \n {{ tlsVersion }}\n \n \n \n \n {{ \'tb.rulenode.enable-proxy\' | translate }}\n \n
\n
\n \n tb.rulenode.proxy-host\n \n \n {{ \'tb.rulenode.proxy-host-required\' | translate }}\n \n \n \n tb.rulenode.proxy-port\n \n \n {{ \'tb.rulenode.proxy-port-required\' | translate }}\n \n \n {{ \'tb.rulenode.proxy-port-range\' | translate }}\n \n \n
\n \n tb.rulenode.proxy-user\n \n \n \n tb.rulenode.proxy-password\n \n \n
\n \n tb.rulenode.username\n \n \n \n tb.rulenode.password\n \n \n \n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Kn extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.sendSmsConfigForm}onConfigurationSet(e){this.sendSmsConfigForm=this.fb.group({numbersToTemplate:[e?e.numbersToTemplate:null,[D.required]],smsMessageTemplate:[e?e.smsMessageTemplate:null,[D.required]],useSystemSmsSettings:[!!e&&e.useSystemSmsSettings,[]],smsProviderConfiguration:[e?e.smsProviderConfiguration:null,[]]})}validatorTriggers(){return["useSystemSmsSettings"]}updateValidators(e){this.sendSmsConfigForm.get("useSystemSmsSettings").value?this.sendSmsConfigForm.get("smsProviderConfiguration").setValidators([]):this.sendSmsConfigForm.get("smsProviderConfiguration").setValidators([D.required]),this.sendSmsConfigForm.get("smsProviderConfiguration").updateValueAndValidity({emitEvent:e})}}e("SendSmsConfigComponent",Kn),Kn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Kn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Kn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Kn,selector:"tb-external-node-send-sms-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.numbers-to-template\n \n \n {{ \'tb.rulenode.numbers-to-template-required\' | translate }}\n \n \n \n \n tb.rulenode.sms-message-template\n \n \n {{ \'tb.rulenode.sms-message-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.use-system-sms-settings\' | translate }}\n \n \n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:He.SmsProviderConfigurationComponent,selector:"tb-sms-provider-configuration",inputs:["required","disabled"]},{kind:"pipe",type:pe.SafePipe,name:"safe"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Kn,decorators:[{type:n,args:[{selector:"tb-external-node-send-sms-config",template:'
\n \n tb.rulenode.numbers-to-template\n \n \n {{ \'tb.rulenode.numbers-to-template-required\' | translate }}\n \n \n \n \n tb.rulenode.sms-message-template\n \n \n {{ \'tb.rulenode.sms-message-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.use-system-sms-settings\' | translate }}\n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Un extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.slackChanelTypes=Object.keys(A),this.slackChanelTypesTranslateMap=M}configForm(){return this.slackConfigForm}onConfigurationSet(e){this.slackConfigForm=this.fb.group({botToken:[e?e.botToken:null],useSystemSettings:[!!e&&e.useSystemSettings],messageTemplate:[e?e.messageTemplate:null,[D.required]],conversationType:[e?e.conversationType:null,[D.required]],conversation:[e?e.conversation:null,[D.required]]})}validatorTriggers(){return["useSystemSettings"]}updateValidators(e){this.slackConfigForm.get("useSystemSettings").value?this.slackConfigForm.get("botToken").clearValidators():this.slackConfigForm.get("botToken").setValidators([D.required]),this.slackConfigForm.get("botToken").updateValueAndValidity({emitEvent:e})}}e("SlackConfigComponent",Un),Un.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Un,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),Un.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Un,selector:"tb-external-node-slack-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.message-template\n \n \n {{ \'tb.rulenode.message-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.use-system-slack-settings\' | translate }}\n \n \n tb.rulenode.slack-api-token\n \n \n {{ \'tb.rulenode.slack-api-token-required\' | translate }}\n \n \n \n \n \n {{ slackChanelTypesTranslateMap.get(slackChanelType) | translate }}\n \n \n \n \n
\n',styles:[":host .tb-title{display:block;padding-bottom:6px}:host ::ng-deep .mat-mdc-radio-group{display:flex;flex-direction:row;margin-bottom:22px;gap:12px}:host ::ng-deep .mat-mdc-radio-group .mat-mdc-radio-button{flex:1 1 100%;padding:4px;border:1px solid rgba(0,0,0,.12);border-radius:6px}@media screen and (max-width: 599px){:host ::ng-deep .mat-mdc-radio-group{flex-direction:column}}\n"],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:ze.MatRadioGroup,selector:"mat-radio-group",exportAs:["matRadioGroup"]},{kind:"component",type:ze.MatRadioButton,selector:"mat-radio-button",inputs:["disableRipple","tabIndex"],exportAs:["matRadioButton"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:je.SlackConversationAutocompleteComponent,selector:"tb-slack-conversation-autocomplete",inputs:["labelText","requiredText","required","disabled","slackChanelType","token"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Un,decorators:[{type:n,args:[{selector:"tb-external-node-slack-config",template:'
\n \n tb.rulenode.message-template\n \n \n {{ \'tb.rulenode.message-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.use-system-slack-settings\' | translate }}\n \n \n tb.rulenode.slack-api-token\n \n \n {{ \'tb.rulenode.slack-api-token-required\' | translate }}\n \n \n \n \n \n {{ slackChanelTypesTranslateMap.get(slackChanelType) | translate }}\n \n \n \n \n
\n',styles:[":host .tb-title{display:block;padding-bottom:6px}:host ::ng-deep .mat-mdc-radio-group{display:flex;flex-direction:row;margin-bottom:22px;gap:12px}:host ::ng-deep .mat-mdc-radio-group .mat-mdc-radio-button{flex:1 1 100%;padding:4px;border:1px solid rgba(0,0,0,.12);border-radius:6px}@media screen and (max-width: 599px){:host ::ng-deep .mat-mdc-radio-group{flex-direction:column}}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]}});class _n extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.snsConfigForm}onConfigurationSet(e){this.snsConfigForm=this.fb.group({topicArnPattern:[e?e.topicArnPattern:null,[D.required]],accessKeyId:[e?e.accessKeyId:null,[D.required]],secretAccessKey:[e?e.secretAccessKey:null,[D.required]],region:[e?e.region:null,[D.required]]})}}e("SnsConfigComponent",_n),_n.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:_n,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),_n.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:_n,selector:"tb-external-node-sns-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.topic-arn-pattern\n \n \n {{ \'tb.rulenode.topic-arn-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.aws-access-key-id\n \n \n {{ \'tb.rulenode.aws-access-key-id-required\' | translate }}\n \n \n \n tb.rulenode.aws-secret-access-key\n \n \n {{ \'tb.rulenode.aws-secret-access-key-required\' | translate }}\n \n \n \n tb.rulenode.aws-region\n \n \n {{ \'tb.rulenode.aws-region-required\' | translate }}\n \n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:_n,decorators:[{type:n,args:[{selector:"tb-external-node-sns-config",template:'
\n \n tb.rulenode.topic-arn-pattern\n \n \n {{ \'tb.rulenode.topic-arn-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.aws-access-key-id\n \n \n {{ \'tb.rulenode.aws-access-key-id-required\' | translate }}\n \n \n \n tb.rulenode.aws-secret-access-key\n \n \n {{ \'tb.rulenode.aws-secret-access-key-required\' | translate }}\n \n \n \n tb.rulenode.aws-region\n \n \n {{ \'tb.rulenode.aws-region-required\' | translate }}\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Hn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.sqsQueueType=kt,this.sqsQueueTypes=Object.keys(kt),this.sqsQueueTypeTranslationsMap=Lt}configForm(){return this.sqsConfigForm}onConfigurationSet(e){this.sqsConfigForm=this.fb.group({queueType:[e?e.queueType:null,[D.required]],queueUrlPattern:[e?e.queueUrlPattern:null,[D.required]],delaySeconds:[e?e.delaySeconds:null,[D.min(0),D.max(900)]],messageAttributes:[e?e.messageAttributes:null,[]],accessKeyId:[e?e.accessKeyId:null,[D.required]],secretAccessKey:[e?e.secretAccessKey:null,[D.required]],region:[e?e.region:null,[D.required]]})}}e("SqsConfigComponent",Hn),Hn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Hn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Hn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Hn,selector:"tb-external-node-sqs-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.queue-type\n \n \n {{ sqsQueueTypeTranslationsMap.get(type) | translate }}\n \n \n \n \n tb.rulenode.queue-url-pattern\n \n \n {{ \'tb.rulenode.queue-url-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.delay-seconds\n \n \n {{ \'tb.rulenode.min-delay-seconds-message\' | translate }}\n \n \n {{ \'tb.rulenode.max-delay-seconds-message\' | translate }}\n \n \n \n
\n \n \n \n tb.rulenode.aws-access-key-id\n \n \n {{ \'tb.rulenode.aws-access-key-id-required\' | translate }}\n \n \n \n tb.rulenode.aws-secret-access-key\n \n \n {{ \'tb.rulenode.aws-secret-access-key-required\' | translate }}\n \n \n \n tb.rulenode.aws-region\n \n \n {{ \'tb.rulenode.aws-region-required\' | translate }}\n \n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.MaxValidator,selector:"input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",inputs:["max"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:Xt,selector:"tb-kv-map-config-old",inputs:["disabled","uniqueKeyValuePairValidator","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","required"]},{kind:"pipe",type:pe.SafePipe,name:"safe"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Hn,decorators:[{type:n,args:[{selector:"tb-external-node-sqs-config",template:'
\n \n tb.rulenode.queue-type\n \n \n {{ sqsQueueTypeTranslationsMap.get(type) | translate }}\n \n \n \n \n tb.rulenode.queue-url-pattern\n \n \n {{ \'tb.rulenode.queue-url-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.delay-seconds\n \n \n {{ \'tb.rulenode.min-delay-seconds-message\' | translate }}\n \n \n {{ \'tb.rulenode.max-delay-seconds-message\' | translate }}\n \n \n \n
\n \n \n \n tb.rulenode.aws-access-key-id\n \n \n {{ \'tb.rulenode.aws-access-key-id-required\' | translate }}\n \n \n \n tb.rulenode.aws-secret-access-key\n \n \n {{ \'tb.rulenode.aws-secret-access-key-required\' | translate }}\n \n \n \n tb.rulenode.aws-region\n \n \n {{ \'tb.rulenode.aws-region-required\' | translate }}\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class zn{}e("RulenodeCoreConfigExternalModule",zn),zn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:zn,deps:[],target:t.ɵɵFactoryTarget.NgModule}),zn.ɵmod=t.ɵɵngDeclareNgModule({minVersion:"14.0.0",version:"15.2.9",ngImport:t,type:zn,declarations:[_n,Hn,wn,Dn,Vn,Pn,Rn,On,Bn,En,Kn,Un],imports:[O,T,Me,vn],exports:[_n,Hn,wn,Dn,Vn,Pn,Rn,On,Bn,En,Kn,Un]}),zn.ɵinj=t.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:zn,imports:[O,T,Me,vn]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:zn,decorators:[{type:l,args:[{declarations:[_n,Hn,wn,Dn,Vn,Pn,Rn,On,Bn,En,Kn,Un],imports:[O,T,Me,vn],exports:[_n,Hn,wn,Dn,Vn,Pn,Rn,On,Bn,En,Kn,Un]}]}]});class jn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.searchText=""}configForm(){return this.alarmStatusConfigForm}prepareInputConfig(e){return{alarmStatusList:X(e?.alarmStatusList)?e.alarmStatusList:null}}onConfigurationSet(e){this.alarmStatusConfigForm=this.fb.group({alarmStatusList:[e.alarmStatusList,[D.required]]})}}e("CheckAlarmStatusComponent",jn),jn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:jn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),jn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:jn,selector:"tb-filter-node-check-alarm-status-config",usesInheritance:!0,ngImport:t,template:'
\n
\n
tb.rulenode.alarm-status
\n
\n tb.rulenode.alarm-required\n
\n
\n \n
\n\n\n\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:hn,selector:"tb-alarm-status-select"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:jn,decorators:[{type:n,args:[{selector:"tb-filter-node-check-alarm-status-config",template:'
\n
\n
tb.rulenode.alarm-status
\n
\n tb.rulenode.alarm-required\n
\n
\n \n
\n\n\n\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]}});class Qn extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.checkMessageConfigForm}prepareInputConfig(e){return{messageNames:X(e?.messageNames)?e.messageNames:null,metadataNames:X(e?.metadataNames)?e.metadataNames:null,checkAllKeys:!!X(e?.checkAllKeys)&&e.checkAllKeys}}atLeastOne(e,t=null){return n=>{t||(t=Object.keys(n.controls));return n?.controls&&t.some((t=>!e(n.controls[t])))?null:{atLeastOne:!0}}}onConfigurationSet(e){this.checkMessageConfigForm=this.fb.group({messageNames:[e.messageNames,[]],metadataNames:[e.metadataNames,[]],checkAllKeys:[e.checkAllKeys,[]]},{validators:this.atLeastOne(D.required,["messageNames","metadataNames"])})}get touchedValidationControl(){return["messageNames","metadataNames"].some((e=>this.checkMessageConfigForm.get(e).touched))}}e("CheckMessageConfigComponent",Qn),Qn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Qn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),Qn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Qn,selector:"tb-filter-node-check-message-config",usesInheritance:!0,ngImport:t,template:'
\n
\n
tb.rulenode.fields-to-check
\n
\n tb.rulenode.at-least-one-field-required\n
\n
\n \n help\n \n \n help\n \n
\n \n {{ \'tb.rulenode.check-all-keys\' | translate }}\n \n
\n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"component",type:Re.StringItemsListComponent,selector:"tb-string-items-list",inputs:["required","disabled","label","placeholder","hint","requiredText","floatLabel","appearance","editable","subscriptSizing","predefinedValues"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Qn,decorators:[{type:n,args:[{selector:"tb-filter-node-check-message-config",template:'
\n
\n
tb.rulenode.fields-to-check
\n
\n tb.rulenode.at-least-one-field-required\n
\n
\n \n help\n \n \n help\n \n
\n \n {{ \'tb.rulenode.check-all-keys\' | translate }}\n \n
\n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]}});class $n extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.entitySearchDirection=Object.values(g),this.entitySearchDirectionTranslationsMap=y}configForm(){return this.checkRelationConfigForm}prepareInputConfig(e){return{checkForSingleEntity:!!X(e?.checkForSingleEntity)&&e.checkForSingleEntity,direction:X(e?.direction)?e.direction:null,entityType:X(e?.entityType)?e.entityType:null,entityId:X(e?.entityId)?e.entityId:null,relationType:X(e?.relationType)?e.relationType:null}}onConfigurationSet(e){this.checkRelationConfigForm=this.fb.group({checkForSingleEntity:[e.checkForSingleEntity,[]],direction:[e.direction,[]],entityType:[e.entityType,e&&e.checkForSingleEntity?[D.required]:[]],entityId:[e.entityId,e&&e.checkForSingleEntity?[D.required]:[]],relationType:[e.relationType,[D.required]]})}validatorTriggers(){return["checkForSingleEntity"]}updateValidators(e){const t=this.checkRelationConfigForm.get("checkForSingleEntity").value;this.checkRelationConfigForm.get("entityType").setValidators(t?[D.required]:[]),this.checkRelationConfigForm.get("entityType").updateValueAndValidity({emitEvent:e}),this.checkRelationConfigForm.get("entityId").setValidators(t?[D.required]:[]),this.checkRelationConfigForm.get("entityId").updateValueAndValidity({emitEvent:e})}}e("CheckRelationConfigComponent",$n),$n.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:$n,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),$n.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:$n,selector:"tb-filter-node-check-relation-config",usesInheritance:!0,ngImport:t,template:'
\n
tb.rulenode.relation-search-parameters
\n
\n \n {{ \'relation.direction\' | translate }}\n \n \n {{ entitySearchDirectionTranslationsMap.get(direction) | translate }}\n \n \n \n \n \n
\n \n {{ \'tb.rulenode.check-relation-to-specific-entity\' | translate }}\n \n
\n
\n \n \n \n \n
\n
\n
\n',styles:[":host .slide-toggle{margin-bottom:18px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:Qe.EntityAutocompleteComponent,selector:"tb-entity-autocomplete",inputs:["entityType","entitySubtype","excludeEntityIds","labelText","requiredText","useFullEntityId","appearance","required","disabled"],outputs:["entityChanged"]},{kind:"component",type:de.EntityTypeSelectComponent,selector:"tb-entity-type-select",inputs:["allowedEntityTypes","useAliasEntityTypes","filterAllowedEntityTypes","showLabel","required","disabled"]},{kind:"component",type:De.RelationTypeAutocompleteComponent,selector:"tb-relation-type-autocomplete",inputs:["showLabel","additionalClasses","appearance","required","disabled","subscriptSizing"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:$n,decorators:[{type:n,args:[{selector:"tb-filter-node-check-relation-config",template:'
\n
tb.rulenode.relation-search-parameters
\n
\n \n {{ \'relation.direction\' | translate }}\n \n \n {{ entitySearchDirectionTranslationsMap.get(direction) | translate }}\n \n \n \n \n \n
\n \n {{ \'tb.rulenode.check-relation-to-specific-entity\' | translate }}\n \n
\n
\n \n \n \n \n
\n
\n
\n',styles:[":host .slide-toggle{margin-bottom:18px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Jn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.perimeterType=lt,this.perimeterTypes=Object.values(lt),this.perimeterTypeTranslationMap=st,this.rangeUnits=Object.values(pt),this.rangeUnitTranslationMap=dt,this.defaultPaddingEnable=!0}configForm(){return this.geoFilterConfigForm}prepareInputConfig(e){return{latitudeKeyName:X(e?.latitudeKeyName)?e.latitudeKeyName:null,longitudeKeyName:X(e?.longitudeKeyName)?e.longitudeKeyName:null,perimeterType:X(e?.perimeterType)?e.perimeterType:null,fetchPerimeterInfoFromMessageMetadata:!!X(e?.fetchPerimeterInfoFromMessageMetadata)&&e.fetchPerimeterInfoFromMessageMetadata,perimeterKeyName:X(e?.perimeterKeyName)?e.perimeterKeyName:null,centerLatitude:X(e?.centerLatitude)?e.centerLatitude:null,centerLongitude:X(e?.centerLongitude)?e.centerLongitude:null,range:X(e?.range)?e.range:null,rangeUnit:X(e?.rangeUnit)?e.rangeUnit:null,polygonsDefinition:X(e?.polygonsDefinition)?e.polygonsDefinition:null}}onConfigurationSet(e){this.geoFilterConfigForm=this.fb.group({latitudeKeyName:[e.latitudeKeyName,[D.required]],longitudeKeyName:[e.longitudeKeyName,[D.required]],perimeterType:[e.perimeterType,[D.required]],fetchPerimeterInfoFromMessageMetadata:[e.fetchPerimeterInfoFromMessageMetadata,[]],perimeterKeyName:[e.perimeterKeyName,[]],centerLatitude:[e.centerLatitude,[]],centerLongitude:[e.centerLongitude,[]],range:[e.range,[]],rangeUnit:[e.rangeUnit,[]],polygonsDefinition:[e.polygonsDefinition,[]]})}validatorTriggers(){return["fetchPerimeterInfoFromMessageMetadata","perimeterType"]}updateValidators(e){const t=this.geoFilterConfigForm.get("fetchPerimeterInfoFromMessageMetadata").value,n=this.geoFilterConfigForm.get("perimeterType").value;t?this.geoFilterConfigForm.get("perimeterKeyName").setValidators([D.required]):this.geoFilterConfigForm.get("perimeterKeyName").setValidators([]),t||n!==lt.CIRCLE?(this.geoFilterConfigForm.get("centerLatitude").setValidators([]),this.geoFilterConfigForm.get("centerLongitude").setValidators([]),this.geoFilterConfigForm.get("range").setValidators([]),this.geoFilterConfigForm.get("rangeUnit").setValidators([]),this.defaultPaddingEnable=!0):(this.geoFilterConfigForm.get("centerLatitude").setValidators([D.required,D.min(-90),D.max(90)]),this.geoFilterConfigForm.get("centerLongitude").setValidators([D.required,D.min(-180),D.max(180)]),this.geoFilterConfigForm.get("range").setValidators([D.required,D.min(0)]),this.geoFilterConfigForm.get("rangeUnit").setValidators([D.required]),this.defaultPaddingEnable=!1),t||n!==lt.POLYGON?this.geoFilterConfigForm.get("polygonsDefinition").setValidators([]):this.geoFilterConfigForm.get("polygonsDefinition").setValidators([D.required]),this.geoFilterConfigForm.get("perimeterKeyName").updateValueAndValidity({emitEvent:e}),this.geoFilterConfigForm.get("centerLatitude").updateValueAndValidity({emitEvent:e}),this.geoFilterConfigForm.get("centerLongitude").updateValueAndValidity({emitEvent:e}),this.geoFilterConfigForm.get("range").updateValueAndValidity({emitEvent:e}),this.geoFilterConfigForm.get("rangeUnit").updateValueAndValidity({emitEvent:e}),this.geoFilterConfigForm.get("polygonsDefinition").updateValueAndValidity({emitEvent:e})}}e("GpsGeoFilterConfigComponent",Jn),Jn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Jn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),Jn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Jn,selector:"tb-filter-node-gps-geofencing-config",usesInheritance:!0,ngImport:t,template:'
\n
\n
tb.rulenode.coordinate-field-names
\n
\n
\n \n {{ \'tb.rulenode.latitude-field-name\' | translate }}\n \n \n {{ \'tb.rulenode.latitude-field-name-required\' | translate }}\n \n \n \n {{ \'tb.rulenode.longitude-field-name\' | translate }}\n \n \n {{ \'tb.rulenode.longitude-field-name-required\' | translate }}\n \n \n
\n
tb.rulenode.coordinate-field-hint
\n
\n
\n
\n
tb.rulenode.geofence-configuration
\n
\n \n {{ \'tb.rulenode.perimeter-type\' | translate }}\n \n \n {{ perimeterTypeTranslationMap.get(type) | translate }}\n \n \n \n
\n \n {{ \'tb.rulenode.fetch-perimeter-info-from-metadata\' | translate }}\n \n
\n \n {{ \'tb.rulenode.perimeter-key-name\' | translate }}\n \n \n {{ \'tb.rulenode.perimeter-key-name-required\' | translate }}\n \n {{ \'tb.rulenode.perimeter-key-name-hint\' | translate }}\n \n
\n
\n \n {{ \'tb.rulenode.circle-center-latitude\' | translate }}\n \n \n {{ \'tb.rulenode.circle-center-latitude-required\' | translate }}\n \n \n \n {{ \'tb.rulenode.circle-center-longitude\' | translate }}\n \n \n {{ \'tb.rulenode.circle-center-longitude-required\' | translate }}\n \n \n
\n
\n \n {{ \'tb.rulenode.range\' | translate }}\n \n \n {{ \'tb.rulenode.range-required\' | translate }}\n \n \n \n {{ \'tb.rulenode.range-units\' | translate }}\n \n \n {{ rangeUnitTranslationMap.get(type) | translate }}\n \n \n \n {{ \'tb.rulenode.range-units-required\' | translate }}\n \n \n
\n
\n \n {{ \'tb.rulenode.polygon-definition\' | translate }}\n \n {{ \'tb.rulenode.polygon-definition-hint\' | translate }}\n \n {{ \'tb.rulenode.polygon-definition-required\' | translate }}\n \n \n
\n
\n
\n',styles:[":host .slide-toggle{margin-bottom:18px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.MaxValidator,selector:"input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",inputs:["max"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Jn,decorators:[{type:n,args:[{selector:"tb-filter-node-gps-geofencing-config",template:'
\n
\n
tb.rulenode.coordinate-field-names
\n
\n
\n \n {{ \'tb.rulenode.latitude-field-name\' | translate }}\n \n \n {{ \'tb.rulenode.latitude-field-name-required\' | translate }}\n \n \n \n {{ \'tb.rulenode.longitude-field-name\' | translate }}\n \n \n {{ \'tb.rulenode.longitude-field-name-required\' | translate }}\n \n \n
\n
tb.rulenode.coordinate-field-hint
\n
\n
\n
\n
tb.rulenode.geofence-configuration
\n
\n \n {{ \'tb.rulenode.perimeter-type\' | translate }}\n \n \n {{ perimeterTypeTranslationMap.get(type) | translate }}\n \n \n \n
\n \n {{ \'tb.rulenode.fetch-perimeter-info-from-metadata\' | translate }}\n \n
\n \n {{ \'tb.rulenode.perimeter-key-name\' | translate }}\n \n \n {{ \'tb.rulenode.perimeter-key-name-required\' | translate }}\n \n {{ \'tb.rulenode.perimeter-key-name-hint\' | translate }}\n \n
\n
\n \n {{ \'tb.rulenode.circle-center-latitude\' | translate }}\n \n \n {{ \'tb.rulenode.circle-center-latitude-required\' | translate }}\n \n \n \n {{ \'tb.rulenode.circle-center-longitude\' | translate }}\n \n \n {{ \'tb.rulenode.circle-center-longitude-required\' | translate }}\n \n \n
\n
\n \n {{ \'tb.rulenode.range\' | translate }}\n \n \n {{ \'tb.rulenode.range-required\' | translate }}\n \n \n \n {{ \'tb.rulenode.range-units\' | translate }}\n \n \n {{ rangeUnitTranslationMap.get(type) | translate }}\n \n \n \n {{ \'tb.rulenode.range-units-required\' | translate }}\n \n \n
\n
\n \n {{ \'tb.rulenode.polygon-definition\' | translate }}\n \n {{ \'tb.rulenode.polygon-definition-hint\' | translate }}\n \n {{ \'tb.rulenode.polygon-definition-required\' | translate }}\n \n \n
\n
\n
\n',styles:[":host .slide-toggle{margin-bottom:18px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]}});class Yn extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.messageTypeConfigForm}prepareInputConfig(e){return{messageTypes:X(e?.messageTypes)?e.messageTypes:null}}onConfigurationSet(e){this.messageTypeConfigForm=this.fb.group({messageTypes:[e.messageTypes,[D.required]]})}}e("MessageTypeConfigComponent",Yn),Yn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Yn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Yn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Yn,selector:"tb-filter-node-message-type-config",usesInheritance:!0,ngImport:t,template:'
\n \n \n
\n',dependencies:[{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:cn,selector:"tb-message-types-config",inputs:["required","label","placeholder","disabled"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Yn,decorators:[{type:n,args:[{selector:"tb-filter-node-message-type-config",template:'
\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Wn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.allowedEntityTypes=[x.DEVICE,x.ASSET,x.ENTITY_VIEW,x.TENANT,x.CUSTOMER,x.USER,x.DASHBOARD,x.RULE_CHAIN,x.RULE_NODE]}configForm(){return this.originatorTypeConfigForm}prepareInputConfig(e){return{originatorTypes:X(e?.originatorTypes)?e.originatorTypes:null}}onConfigurationSet(e){this.originatorTypeConfigForm=this.fb.group({originatorTypes:[e.originatorTypes,[D.required]]})}}e("OriginatorTypeConfigComponent",Wn),Wn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Wn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Wn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Wn,selector:"tb-filter-node-originator-type-config",usesInheritance:!0,ngImport:t,template:'
\n \n help\n \n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"component",type:$e.EntityTypeListComponent,selector:"tb-entity-type-list",inputs:["required","additionalClasses","appearance","label","floatLabel","disabled","subscriptSizing","allowedEntityTypes","emptyInputPlaceholder","filledInputPlaceholder","ignoreAuthorityFilter"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Wn,decorators:[{type:n,args:[{selector:"tb-filter-node-originator-type-config",template:'
\n \n help\n \n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Xn extends s{constructor(e,t,n,o){super(e),this.store=e,this.fb=t,this.nodeScriptTestService=n,this.translate=o,this.tbelEnabled=Y(this.store).tbelEnabled,this.scriptLanguage=d,this.changeScript=new r,this.hasScript=!0,this.testScriptLabel="tb.rulenode.test-filter-function"}configForm(){return this.scriptConfigForm}onConfigurationSet(e){this.scriptConfigForm=this.fb.group({scriptLang:[e.scriptLang,[D.required]],jsScript:[e.jsScript,[]],tbelScript:[e.tbelScript,[]]})}validatorTriggers(){return["scriptLang"]}updateValidators(e){let t=this.scriptConfigForm.get("scriptLang").value;t!==d.TBEL||this.tbelEnabled||(t=d.JS,this.scriptConfigForm.get("scriptLang").patchValue(t,{emitEvent:!1}),setTimeout((()=>{this.scriptConfigForm.updateValueAndValidity({emitEvent:!0})}))),this.scriptConfigForm.get("jsScript").setValidators(t===d.JS?[D.required]:[]),this.scriptConfigForm.get("jsScript").updateValueAndValidity({emitEvent:e}),this.scriptConfigForm.get("tbelScript").setValidators(t===d.TBEL?[D.required]:[]),this.scriptConfigForm.get("tbelScript").updateValueAndValidity({emitEvent:e})}prepareInputConfig(e){return e&&(e.scriptLang||(e.scriptLang=d.JS)),{scriptLang:X(e?.scriptLang)?e.scriptLang:d.JS,jsScript:X(e?.jsScript)?e.jsScript:null,tbelScript:X(e?.tbelScript)?e.tbelScript:null}}testScript(e){const t=this.scriptConfigForm.get("scriptLang").value,n=t===d.JS?"jsScript":"tbelScript",r=t===d.JS?"rulenode/filter_node_script_fn":"rulenode/tbel/filter_node_script_fn",o=this.scriptConfigForm.get(n).value;this.nodeScriptTestService.testNodeScript(o,"filter",this.translate.instant("tb.rulenode.filter"),"Filter",["msg","metadata","msgType"],this.ruleNodeId,r,t,e).subscribe((e=>{e&&(this.scriptConfigForm.get(n).setValue(e),this.changeScript.emit())}))}onValidate(){this.scriptConfigForm.get("scriptLang").value===d.JS&&this.jsFuncComponent.validateOnSubmit()}}e("ScriptConfigComponent",Xn),Xn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Xn,deps:[{token:G.Store},{token:E.UntypedFormBuilder},{token:W.NodeScriptTestService},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),Xn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Xn,selector:"tb-filter-node-script-config",viewQueries:[{propertyName:"jsFuncComponent",first:!0,predicate:["jsFuncComponent"],descendants:!0},{propertyName:"tbelFuncComponent",first:!0,predicate:["tbelFuncComponent"],descendants:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n \n \n \n \n \n \n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:ne.JsFuncComponent,selector:"tb-js-func",inputs:["functionTitle","functionName","functionArgs","validationArgs","resultType","disabled","fillHeight","minHeight","editorCompleter","globalVariables","disableUndefinedCheck","helpId","scriptLanguage","noValidate","required"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:ie.TbScriptLangComponent,selector:"tb-script-lang",inputs:["disabled"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Xn,decorators:[{type:n,args:[{selector:"tb-filter-node-script-config",template:'
\n \n \n \n \n \n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder},{type:W.NodeScriptTestService},{type:H.TranslateService}]},propDecorators:{jsFuncComponent:[{type:o,args:["jsFuncComponent",{static:!1}]}],tbelFuncComponent:[{type:o,args:["tbelFuncComponent",{static:!1}]}]}});class Zn extends s{constructor(e,t,n,o){super(e),this.store=e,this.fb=t,this.nodeScriptTestService=n,this.translate=o,this.tbelEnabled=Y(this.store).tbelEnabled,this.scriptLanguage=d,this.changeScript=new r,this.hasScript=!0,this.testScriptLabel="tb.rulenode.test-switch-function"}configForm(){return this.switchConfigForm}onConfigurationSet(e){this.switchConfigForm=this.fb.group({scriptLang:[e.scriptLang,[D.required]],jsScript:[e.jsScript,[]],tbelScript:[e.tbelScript,[]]})}validatorTriggers(){return["scriptLang"]}updateValidators(e){let t=this.switchConfigForm.get("scriptLang").value;t!==d.TBEL||this.tbelEnabled||(t=d.JS,this.switchConfigForm.get("scriptLang").patchValue(t,{emitEvent:!1}),setTimeout((()=>{this.switchConfigForm.updateValueAndValidity({emitEvent:!0})}))),this.switchConfigForm.get("jsScript").setValidators(t===d.JS?[D.required]:[]),this.switchConfigForm.get("jsScript").updateValueAndValidity({emitEvent:e}),this.switchConfigForm.get("tbelScript").setValidators(t===d.TBEL?[D.required]:[]),this.switchConfigForm.get("tbelScript").updateValueAndValidity({emitEvent:e})}prepareInputConfig(e){return e&&(e.scriptLang||(e.scriptLang=d.JS)),{scriptLang:X(e?.scriptLang)?e.scriptLang:d.JS,jsScript:X(e?.jsScript)?e.jsScript:null,tbelScript:X(e?.tbelScript)?e.tbelScript:null}}testScript(e){const t=this.switchConfigForm.get("scriptLang").value,n=t===d.JS?"jsScript":"tbelScript",r=t===d.JS?"rulenode/switch_node_script_fn":"rulenode/tbel/switch_node_script_fn",o=this.switchConfigForm.get(n).value;this.nodeScriptTestService.testNodeScript(o,"switch",this.translate.instant("tb.rulenode.switch"),"Switch",["msg","metadata","msgType"],this.ruleNodeId,r,t,e).subscribe((e=>{e&&(this.switchConfigForm.get(n).setValue(e),this.changeScript.emit())}))}onValidate(){this.switchConfigForm.get("scriptLang").value===d.JS&&this.jsFuncComponent.validateOnSubmit()}}e("SwitchConfigComponent",Zn),Zn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Zn,deps:[{token:G.Store},{token:E.UntypedFormBuilder},{token:W.NodeScriptTestService},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),Zn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Zn,selector:"tb-filter-node-switch-config",viewQueries:[{propertyName:"jsFuncComponent",first:!0,predicate:["jsFuncComponent"],descendants:!0},{propertyName:"tbelFuncComponent",first:!0,predicate:["tbelFuncComponent"],descendants:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n \n \n \n \n \n \n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:ne.JsFuncComponent,selector:"tb-js-func",inputs:["functionTitle","functionName","functionArgs","validationArgs","resultType","disabled","fillHeight","minHeight","editorCompleter","globalVariables","disableUndefinedCheck","helpId","scriptLanguage","noValidate","required"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:ie.TbScriptLangComponent,selector:"tb-script-lang",inputs:["disabled"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Zn,decorators:[{type:n,args:[{selector:"tb-filter-node-switch-config",template:'
\n \n \n \n \n \n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder},{type:W.NodeScriptTestService},{type:H.TranslateService}]},propDecorators:{jsFuncComponent:[{type:o,args:["jsFuncComponent",{static:!1}]}],tbelFuncComponent:[{type:o,args:["tbelFuncComponent",{static:!1}]}]}});class er{}e("RuleNodeCoreConfigFilterModule",er),er.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:er,deps:[],target:t.ɵɵFactoryTarget.NgModule}),er.ɵmod=t.ɵɵngDeclareNgModule({minVersion:"14.0.0",version:"15.2.9",ngImport:t,type:er,declarations:[Qn,$n,Jn,Yn,Wn,Xn,Zn,jn],imports:[O,T,vn],exports:[Qn,$n,Jn,Yn,Wn,Xn,Zn,jn]}),er.ɵinj=t.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:er,imports:[O,T,vn]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:er,decorators:[{type:l,args:[{declarations:[Qn,$n,Jn,Yn,Wn,Xn,Zn,jn],imports:[O,T,vn],exports:[Qn,$n,Jn,Yn,Wn,Xn,Zn,jn]}]}]});class tr extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.originatorSource=at,this.originatorSources=Object.keys(at),this.originatorSourceTranslationMap=it,this.allowedEntityTypes=[x.DEVICE,x.ASSET,x.ENTITY_VIEW,x.USER,x.EDGE]}configForm(){return this.changeOriginatorConfigForm}onConfigurationSet(e){this.changeOriginatorConfigForm=this.fb.group({originatorSource:[e?e.originatorSource:null,[D.required]],entityType:[e?e.entityType:null,[]],entityNamePattern:[e?e.entityNamePattern:null,[]],relationsQuery:[e?e.relationsQuery:null,[]]})}validatorTriggers(){return["originatorSource"]}updateValidators(e){const t=this.changeOriginatorConfigForm.get("originatorSource").value;t===at.RELATED?this.changeOriginatorConfigForm.get("relationsQuery").setValidators([D.required]):this.changeOriginatorConfigForm.get("relationsQuery").setValidators([]),t===at.ENTITY?(this.changeOriginatorConfigForm.get("entityType").setValidators([D.required]),this.changeOriginatorConfigForm.get("entityNamePattern").setValidators([D.required,D.pattern(/.*\S.*/)])):(this.changeOriginatorConfigForm.get("entityType").patchValue(null,{emitEvent:e}),this.changeOriginatorConfigForm.get("entityNamePattern").patchValue(null,{emitEvent:e}),this.changeOriginatorConfigForm.get("entityType").setValidators([]),this.changeOriginatorConfigForm.get("entityNamePattern").setValidators([])),this.changeOriginatorConfigForm.get("relationsQuery").updateValueAndValidity({emitEvent:e}),this.changeOriginatorConfigForm.get("entityType").updateValueAndValidity({emitEvent:e}),this.changeOriginatorConfigForm.get("entityNamePattern").updateValueAndValidity({emitEvent:e})}}e("ChangeOriginatorConfigComponent",tr),tr.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:tr,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),tr.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:tr,selector:"tb-transformation-node-change-originator-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.originator-source\n \n \n {{ originatorSourceTranslationMap.get(source) | translate }}\n \n \n \n
\n \n \n \n tb.rulenode.entity-name-pattern\n \n \n {{ \'tb.rulenode.entity-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n
\n \n \n \n
\n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:de.EntityTypeSelectComponent,selector:"tb-entity-type-select",inputs:["allowedEntityTypes","useAliasEntityTypes","filterAllowedEntityTypes","showLabel","required","disabled"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:xn,selector:"tb-relations-query-config-old",inputs:["disabled","required"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:tr,decorators:[{type:n,args:[{selector:"tb-transformation-node-change-originator-config",template:'
\n \n tb.rulenode.originator-source\n \n \n {{ originatorSourceTranslationMap.get(source) | translate }}\n \n \n \n
\n \n \n \n tb.rulenode.entity-name-pattern\n \n \n {{ \'tb.rulenode.entity-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n
\n \n \n \n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class nr extends s{constructor(e,t,n,o){super(e),this.store=e,this.fb=t,this.nodeScriptTestService=n,this.translate=o,this.tbelEnabled=Y(this.store).tbelEnabled,this.scriptLanguage=d,this.changeScript=new r,this.hasScript=!0,this.testScriptLabel="tb.rulenode.test-transformer-function"}configForm(){return this.scriptConfigForm}onConfigurationSet(e){this.scriptConfigForm=this.fb.group({scriptLang:[e?e.scriptLang:d.JS,[D.required]],jsScript:[e?e.jsScript:null,[D.required]],tbelScript:[e?e.tbelScript:null,[]]})}validatorTriggers(){return["scriptLang"]}updateValidators(e){let t=this.scriptConfigForm.get("scriptLang").value;t!==d.TBEL||this.tbelEnabled||(t=d.JS,this.scriptConfigForm.get("scriptLang").patchValue(t,{emitEvent:!1}),setTimeout((()=>{this.scriptConfigForm.updateValueAndValidity({emitEvent:!0})}))),this.scriptConfigForm.get("jsScript").setValidators(t===d.JS?[D.required]:[]),this.scriptConfigForm.get("jsScript").updateValueAndValidity({emitEvent:e}),this.scriptConfigForm.get("tbelScript").setValidators(t===d.TBEL?[D.required]:[]),this.scriptConfigForm.get("tbelScript").updateValueAndValidity({emitEvent:e})}prepareInputConfig(e){return e&&(e.scriptLang||(e.scriptLang=d.JS)),e}testScript(e){const t=this.scriptConfigForm.get("scriptLang").value,n=t===d.JS?"jsScript":"tbelScript",r=t===d.JS?"rulenode/transformation_node_script_fn":"rulenode/tbel/transformation_node_script_fn",o=this.scriptConfigForm.get(n).value;this.nodeScriptTestService.testNodeScript(o,"update",this.translate.instant("tb.rulenode.transformer"),"Transform",["msg","metadata","msgType"],this.ruleNodeId,r,t,e).subscribe((e=>{e&&(this.scriptConfigForm.get(n).setValue(e),this.changeScript.emit())}))}onValidate(){this.scriptConfigForm.get("scriptLang").value===d.JS&&this.jsFuncComponent.validateOnSubmit()}}e("TransformScriptConfigComponent",nr),nr.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:nr,deps:[{token:G.Store},{token:E.UntypedFormBuilder},{token:W.NodeScriptTestService},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),nr.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:nr,selector:"tb-transformation-node-script-config",viewQueries:[{propertyName:"jsFuncComponent",first:!0,predicate:["jsFuncComponent"],descendants:!0},{propertyName:"tbelFuncComponent",first:!0,predicate:["tbelFuncComponent"],descendants:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n \n \n \n \n \n \n
\n \n
\n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:ne.JsFuncComponent,selector:"tb-js-func",inputs:["functionTitle","functionName","functionArgs","validationArgs","resultType","disabled","fillHeight","minHeight","editorCompleter","globalVariables","disableUndefinedCheck","helpId","scriptLanguage","noValidate","required"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:ie.TbScriptLangComponent,selector:"tb-script-lang",inputs:["disabled"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:nr,decorators:[{type:n,args:[{selector:"tb-transformation-node-script-config",template:'
\n \n \n \n \n \n \n \n
\n \n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder},{type:W.NodeScriptTestService},{type:H.TranslateService}]},propDecorators:{jsFuncComponent:[{type:o,args:["jsFuncComponent",{static:!1}]}],tbelFuncComponent:[{type:o,args:["tbelFuncComponent",{static:!1}]}]}});class rr extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.mailBodyTypes=[{name:"tb.mail-body-type.plain-text",value:"false"},{name:"tb.mail-body-type.html",value:"true"},{name:"tb.mail-body-type.dynamic",value:"dynamic"}]}configForm(){return this.toEmailConfigForm}onConfigurationSet(e){this.toEmailConfigForm=this.fb.group({fromTemplate:[e?e.fromTemplate:null,[D.required]],toTemplate:[e?e.toTemplate:null,[D.required]],ccTemplate:[e?e.ccTemplate:null,[]],bccTemplate:[e?e.bccTemplate:null,[]],subjectTemplate:[e?e.subjectTemplate:null,[D.required]],mailBodyType:[e?e.mailBodyType:null],isHtmlTemplate:[e?e.isHtmlTemplate:null,[D.required]],bodyTemplate:[e?e.bodyTemplate:null,[D.required]]})}updateValidators(e){"dynamic"===this.toEmailConfigForm.get("mailBodyType").value?this.toEmailConfigForm.get("isHtmlTemplate").enable({emitEvent:!1}):this.toEmailConfigForm.get("isHtmlTemplate").disable({emitEvent:!1}),this.toEmailConfigForm.get("isHtmlTemplate").updateValueAndValidity({emitEvent:e})}validatorTriggers(){return["mailBodyType"]}}e("ToEmailConfigComponent",rr),rr.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:rr,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),rr.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:rr,selector:"tb-transformation-node-to-email-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.from-template\n \n \n {{ \'tb.rulenode.from-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.to-template\n \n \n {{ \'tb.rulenode.to-template-required\' | translate }}\n \n \n \n \n tb.rulenode.cc-template\n \n \n \n \n tb.rulenode.bcc-template\n \n \n \n \n tb.rulenode.subject-template\n \n \n {{ \'tb.rulenode.subject-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.mail-body-type\n \n \n {{ type.name | translate }}\n \n \n \n \n tb.rulenode.dynamic-mail-body-type\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.body-template\n \n \n {{ \'tb.rulenode.body-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:pe.SafePipe,name:"safe"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:rr,decorators:[{type:n,args:[{selector:"tb-transformation-node-to-email-config",template:'
\n \n tb.rulenode.from-template\n \n \n {{ \'tb.rulenode.from-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.to-template\n \n \n {{ \'tb.rulenode.to-template-required\' | translate }}\n \n \n \n \n tb.rulenode.cc-template\n \n \n \n \n tb.rulenode.bcc-template\n \n \n \n \n tb.rulenode.subject-template\n \n \n {{ \'tb.rulenode.subject-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.mail-body-type\n \n \n {{ type.name | translate }}\n \n \n \n \n tb.rulenode.dynamic-mail-body-type\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.body-template\n \n \n {{ \'tb.rulenode.body-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class or extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.separatorKeysCodes=[le,se,me]}onConfigurationSet(e){this.copyKeysConfigForm=this.fb.group({fromMetadata:[e?e.fromMetadata:null,[D.required]],keys:[e?e.keys:null,[D.required]]})}configForm(){return this.copyKeysConfigForm}removeKey(e){const t=this.copyKeysConfigForm.get("keys").value,n=t.indexOf(e);n>=0&&(t.splice(n,1),this.copyKeysConfigForm.get("keys").patchValue(t,{emitEvent:!0}))}addKey(e){const t=e.input;let n=e.value;if((n||"").trim()){n=n.trim();let e=this.copyKeysConfigForm.get("keys").value;e&&-1!==e.indexOf(n)||(e||(e=[]),e.push(n),this.copyKeysConfigForm.get("keys").patchValue(e,{emitEvent:!0}))}t&&(t.value="")}}e("CopyKeysConfigComponent",or),or.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:or,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),or.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:or,selector:"tb-transformation-node-copy-keys-config",usesInheritance:!0,ngImport:t,template:'
\n
{{\'tb.rulenode.copy-from\' | translate}}
\n \n \n {{\'tb.rulenode.data-to-metadata\' | translate}}\n \n \n {{\'tb.rulenode.metadata-to-data\' | translate}}\n \n \n \n \n \n {{key}}\n close\n \n \n \n {{ \'tb.rulenode.keys-required\' | translate }}\n tb.rulenode.use-regular-expression-hint\n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:ze.MatRadioGroup,selector:"mat-radio-group",exportAs:["matRadioGroup"]},{kind:"component",type:ze.MatRadioButton,selector:"mat-radio-button",inputs:["disableRipple","tabIndex"],exportAs:["matRadioButton"]},{kind:"component",type:ue.MatChipGrid,selector:"mat-chip-grid",inputs:["tabIndex","disabled","placeholder","required","value","errorStateMatcher"],outputs:["change","valueChange"]},{kind:"directive",type:ue.MatChipInput,selector:"input[matChipInputFor]",inputs:["matChipInputFor","matChipInputAddOnBlur","matChipInputSeparatorKeyCodes","placeholder","id","disabled"],outputs:["matChipInputTokenEnd"],exportAs:["matChipInput","matChipInputFor"]},{kind:"directive",type:ue.MatChipRemove,selector:"[matChipRemove]"},{kind:"component",type:ue.MatChipRow,selector:"mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]",inputs:["color","disabled","disableRipple","tabIndex","editable"],outputs:["edited"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:or,decorators:[{type:n,args:[{selector:"tb-transformation-node-copy-keys-config",template:'
\n
{{\'tb.rulenode.copy-from\' | translate}}
\n \n \n {{\'tb.rulenode.data-to-metadata\' | translate}}\n \n \n {{\'tb.rulenode.metadata-to-data\' | translate}}\n \n \n \n \n \n {{key}}\n close\n \n \n \n {{ \'tb.rulenode.keys-required\' | translate }}\n tb.rulenode.use-regular-expression-hint\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class ar extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.renameKeysConfigForm}onConfigurationSet(e){this.renameKeysConfigForm=this.fb.group({fromMetadata:[e?e.fromMetadata:null,[D.required]],renameKeysMapping:[e?e.renameKeysMapping:null,[D.required]]})}}e("RenameKeysConfigComponent",ar),ar.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ar,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),ar.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:ar,selector:"tb-transformation-node-rename-keys-config",usesInheritance:!0,ngImport:t,template:'
\n
{{ \'tb.rulenode.rename-keys-in\' | translate }}
\n \n \n {{\'tb.rulenode.data\' | translate}}\n \n \n {{\'tb.rulenode.metadata\' | translate}}\n \n \n \n \n
\n',dependencies:[{kind:"directive",type:ze.MatRadioGroup,selector:"mat-radio-group",exportAs:["matRadioGroup"]},{kind:"component",type:ze.MatRadioButton,selector:"mat-radio-button",inputs:["disableRipple","tabIndex"],exportAs:["matRadioButton"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:Xt,selector:"tb-kv-map-config-old",inputs:["disabled","uniqueKeyValuePairValidator","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","required"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ar,decorators:[{type:n,args:[{selector:"tb-transformation-node-rename-keys-config",template:'
\n
{{ \'tb.rulenode.rename-keys-in\' | translate }}
\n \n \n {{\'tb.rulenode.data\' | translate}}\n \n \n {{\'tb.rulenode.metadata\' | translate}}\n \n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class ir extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.jsonPathConfigForm}onConfigurationSet(e){this.jsonPathConfigForm=this.fb.group({jsonPath:[e?e.jsonPath:null,[D.required]]})}}e("NodeJsonPathConfigComponent",ir),ir.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ir,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),ir.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:ir,selector:"tb-transformation-node-json-path-config",usesInheritance:!0,ngImport:t,template:"
\n \n {{ 'tb.rulenode.json-path-expression' | translate }}\n \n {{ 'tb.rulenode.json-path-expression-hint' | translate }}\n {{ 'tb.rulenode.json-path-expression-required' | translate }}\n \n
\n\n",dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ir,decorators:[{type:n,args:[{selector:"tb-transformation-node-json-path-config",template:"
\n \n {{ 'tb.rulenode.json-path-expression' | translate }}\n \n {{ 'tb.rulenode.json-path-expression-hint' | translate }}\n {{ 'tb.rulenode.json-path-expression-required' | translate }}\n \n
\n\n"}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class lr extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.separatorKeysCodes=[le,se,me]}onConfigurationSet(e){this.deleteKeysConfigForm=this.fb.group({fromMetadata:[e?e.fromMetadata:null,[D.required]],keys:[e?e.keys:null,[D.required]]})}configForm(){return this.deleteKeysConfigForm}removeKey(e){const t=this.deleteKeysConfigForm.get("keys").value,n=t.indexOf(e);n>=0&&(t.splice(n,1),this.deleteKeysConfigForm.get("keys").patchValue(t,{emitEvent:!0}))}addKey(e){const t=e.input;let n=e.value;if((n||"").trim()){n=n.trim();let e=this.deleteKeysConfigForm.get("keys").value;e&&-1!==e.indexOf(n)||(e||(e=[]),e.push(n),this.deleteKeysConfigForm.get("keys").patchValue(e,{emitEvent:!0}))}t&&(t.value="")}}e("DeleteKeysConfigComponent",lr),lr.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:lr,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),lr.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:lr,selector:"tb-transformation-node-delete-keys-config",usesInheritance:!0,ngImport:t,template:'
\n
{{\'tb.rulenode.delete-from\' | translate}}
\n \n \n {{\'tb.rulenode.data\' | translate}}\n \n \n {{\'tb.rulenode.metadata\' | translate}}\n \n \n \n \n \n {{key}}\n close\n \n \n \n {{ \'tb.rulenode.keys-required\' | translate }}\n tb.rulenode.use-regular-expression-delete-hint\n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:ze.MatRadioGroup,selector:"mat-radio-group",exportAs:["matRadioGroup"]},{kind:"component",type:ze.MatRadioButton,selector:"mat-radio-button",inputs:["disableRipple","tabIndex"],exportAs:["matRadioButton"]},{kind:"component",type:ue.MatChipGrid,selector:"mat-chip-grid",inputs:["tabIndex","disabled","placeholder","required","value","errorStateMatcher"],outputs:["change","valueChange"]},{kind:"directive",type:ue.MatChipInput,selector:"input[matChipInputFor]",inputs:["matChipInputFor","matChipInputAddOnBlur","matChipInputSeparatorKeyCodes","placeholder","id","disabled"],outputs:["matChipInputTokenEnd"],exportAs:["matChipInput","matChipInputFor"]},{kind:"directive",type:ue.MatChipRemove,selector:"[matChipRemove]"},{kind:"component",type:ue.MatChipRow,selector:"mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]",inputs:["color","disabled","disableRipple","tabIndex","editable"],outputs:["edited"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:lr,decorators:[{type:n,args:[{selector:"tb-transformation-node-delete-keys-config",template:'
\n
{{\'tb.rulenode.delete-from\' | translate}}
\n \n \n {{\'tb.rulenode.data\' | translate}}\n \n \n {{\'tb.rulenode.metadata\' | translate}}\n \n \n \n \n \n {{key}}\n close\n \n \n \n {{ \'tb.rulenode.keys-required\' | translate }}\n tb.rulenode.use-regular-expression-delete-hint\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class sr{}e("RulenodeCoreConfigTransformModule",sr),sr.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:sr,deps:[],target:t.ɵɵFactoryTarget.NgModule}),sr.ɵmod=t.ɵɵngDeclareNgModule({minVersion:"14.0.0",version:"15.2.9",ngImport:t,type:sr,declarations:[tr,nr,rr,or,ar,ir,lr],imports:[O,T,vn],exports:[tr,nr,rr,or,ar,ir,lr]}),sr.ɵinj=t.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:sr,imports:[O,T,vn]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:sr,decorators:[{type:l,args:[{declarations:[tr,nr,rr,or,ar,ir,lr],imports:[O,T,vn],exports:[tr,nr,rr,or,ar,ir,lr]}]}]});class mr extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.entityType=x}configForm(){return this.ruleChainInputConfigForm}onConfigurationSet(e){this.ruleChainInputConfigForm=this.fb.group({ruleChainId:[e?e.ruleChainId:null,[D.required]]})}}e("RuleChainInputComponent",mr),mr.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:mr,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),mr.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:mr,selector:"tb-flow-node-rule-chain-input-config",usesInheritance:!0,ngImport:t,template:'
\n \n \n
\n',dependencies:[{kind:"component",type:Qe.EntityAutocompleteComponent,selector:"tb-entity-autocomplete",inputs:["entityType","entitySubtype","excludeEntityIds","labelText","requiredText","useFullEntityId","appearance","required","disabled"],outputs:["entityChanged"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:mr,decorators:[{type:n,args:[{selector:"tb-flow-node-rule-chain-input-config",template:'
\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class ur extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.ruleChainOutputConfigForm}onConfigurationSet(e){this.ruleChainOutputConfigForm=this.fb.group({})}}e("RuleChainOutputComponent",ur),ur.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ur,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),ur.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:ur,selector:"tb-flow-node-rule-chain-output-config",usesInheritance:!0,ngImport:t,template:'
\n
\n
\n',dependencies:[{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ur,decorators:[{type:n,args:[{selector:"tb-flow-node-rule-chain-output-config",template:'
\n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class pr{}e("RuleNodeCoreConfigFlowModule",pr),pr.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:pr,deps:[],target:t.ɵɵFactoryTarget.NgModule}),pr.ɵmod=t.ɵɵngDeclareNgModule({minVersion:"14.0.0",version:"15.2.9",ngImport:t,type:pr,declarations:[mr,ur],imports:[O,T,vn],exports:[mr,ur]}),pr.ɵinj=t.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:pr,imports:[O,T,vn]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:pr,decorators:[{type:l,args:[{declarations:[mr,ur],imports:[O,T,vn],exports:[mr,ur]}]}]});class dr{constructor(e){!function(e){e.setTranslation("en_US",{tb:{rulenode:{"create-entity-if-not-exists":"Create new entity if not exists","create-entity-if-not-exists-hint":"Create a new entity set above if it does not exist.","entity-name-pattern":"Name pattern","entity-name-pattern-required":"Name pattern is required","entity-type-pattern":"Type pattern","entity-type-pattern-required":"Type pattern is required","output-message-type":"Output message type","output-message-type-required":"Output message type is required","output-message-type-max-length":"Output message type should be less than 256","entity-cache-expiration":"Entities cache expiration time (sec)","entity-cache-expiration-hint":"Specifies maximum time interval allowed to store found entity records. 0 value means that records will never expire.","entity-cache-expiration-required":"Entities cache expiration time is required.","entity-cache-expiration-range":"Entities cache expiration time should be greater than or equal to 0.","customer-name-pattern":"Customer name pattern","customer-name-pattern-required":"Customer name pattern is required","create-customer-if-not-exists":"Create new customer if not exists","customer-cache-expiration":"Customers cache expiration time (sec)","customer-cache-expiration-hint":"Specifies maximum time interval allowed to store found customer records. 0 value means that records will never expire.","customer-cache-expiration-required":"Customers cache expiration time is required.","customer-cache-expiration-range":"Customers cache expiration time should be greater than or equal to 0.","interval-start":"Interval start","interval-end":"Interval end","time-unit":"Time unit","fetch-mode":"Fetch mode","order-by-timestamp":"Order by timestamp",limit:"Limit","limit-hint":"Min limit value is 2, max - 1000. If you want to fetch a single entry, select fetch mode 'First' or 'Last'.","limit-required":"Limit is required.","limit-range":"Limit should be in a range from 2 to 1000.","time-unit-milliseconds":"Milliseconds","time-unit-seconds":"Seconds","time-unit-minutes":"Minutes","time-unit-hours":"Hours","time-unit-days":"Days","time-value-range":"Allowing range from 1 to 2147483647.","start-interval-value-required":"Interval start is required.","end-interval-value-required":"Interval end is required.",filter:"Filter",switch:"Switch","math-templatization-tooltip":"This field support templatization. Use $[messageKey] to extract value from the message and ${metadataKey} to extract value from the metadata.","add-message-type":"Add message type","select-message-types-required":"At least one message type should be selected.","select-message-types":"Select message types","no-message-types-found":"No message types found","no-message-type-matching":"'{{messageType}}' not found.","create-new-message-type":"Create a new one.","message-types-required":"Message types are required.","client-attributes":"Client attributes","shared-attributes":"Shared attributes","server-attributes":"Server attributes","attributes-keys":"Attributes keys","attributes-keys-required":"Attributes keys are required","notify-device":"Notify device","send-attributes-updated-notification":"Send attributes updated notification","send-attributes-updated-notification-hint":"Send notification about updated attributes as a separate message to the rule engine queue.","send-attributes-deleted-notification":"Send attributes deleted notification","send-attributes-deleted-notification-hint":"Send notification about deleted attributes as a separate message to the rule engine queue.","update-attributes-only-on-value-change":"Save attributes only if the value changes","update-attributes-only-on-value-change-hint":"Updates the attributes on every incoming message disregarding if their value has changed. Increases API usage and reduces performance.","update-attributes-only-on-value-change-hint-enabled":"Updates the attributes only if their value has changed. If the value is not changed, no update to the attribute timestamp nor attribute change notification will be sent.","fetch-credentials-to-metadata":"Fetch credentials to metadata","notify-device-hint":"If the message arrives from the device, we will push it back to the device by default.","notify-device-delete-hint":"Send notification about deleted attributes to device.","latest-timeseries":"Latest time-series data keys","timeseries-keys":"Timeseries keys","timeseries-keys-required":"At least one timeseries key should be selected.","add-timeseries-key":"Add timeseries key","add-message-field":"Add message field","relation-search-parameters":"Relation search parameters","add-metadata-field":"Add metadata field","data-keys":"Message field names","copy-from":"Copy from","data-to-metadata":"Data to metadata","metadata-to-data":"Metadata to data","use-regular-expression-hint":"Use regular expression to copy keys by pattern",interval:"Interval","interval-required":"Interval is required","interval-hint":"Deduplication interval in seconds.","interval-min-error":"Min allowed value is 1","max-pending-msgs":"Max pending messages","max-pending-msgs-hint":"Maximum number of messages that are stored in memory for each unique deduplication id.","max-pending-msgs-required":"Max pending messages is required","max-pending-msgs-max-error":"Max allowed value is 1000","max-pending-msgs-min-error":"Min allowed value is 1","max-retries":"Max retries","max-retries-required":"Max retries is required","max-retries-hint":"Maximum number of retries to push the deduplicated messages into the queue. 10 seconds delay is used between retries","max-retries-max-error":"Max allowed value is 100","max-retries-min-error":"Min allowed value is 0",strategy:"Strategy","strategy-required":"Strategy is required","strategy-all-hint":"Return all messages that arrived during deduplication period as a single JSON array message. Where each element represents object with msg and metadata inner properties.","strategy-first-hint":"Return first message that arrived during deduplication period.","strategy-last-hint":"Return last message that arrived during deduplication period.",first:"First",last:"Last",all:"All","output-msg-type-hint":"The message type of the deduplication result.","queue-name-hint":"The queue name where the deduplication result will be published.",keys:"Keys","keys-required":"Keys are required","rename-keys-in":"Rename keys in",data:"Data",message:"Message",metadata:"Metadata","key-name":"Key name","key-name-required":"Key name is required","new-key-name":"New key name","new-key-name-required":"New key name is required","metadata-keys":"Metadata field names","json-path-expression":"JSON path expression","json-path-expression-required":"JSON path expression is required","json-path-expression-hint":"JSONPath specifies a path to an element or a set of elements in a JSON structure. '$' represents the root object or array.","relations-query":"Relations query","device-relations-query":"Device relations query","max-relation-level":"Max relation level","max-relation-level-error":"Value should be greater than 0 or unspecified.","relation-type":"Relation type","relation-type-pattern":"Relation type pattern","relation-type-pattern-required":"Relation type pattern is required","relation-types-list":"Relation types to propagate","relation-types-list-hint":"If Propagate relation types are not selected, alarms will be propagated without filtering by relation type.","unlimited-level":"Unlimited level","latest-telemetry":"Latest telemetry","add-telemetry-key":"Add telemetry key","delete-from":"Delete from","use-regular-expression-delete-hint":"Use regular expression to delete keys by pattern","fetch-into":"Fetch into","attr-mapping":"Attributes mapping:","source-attribute":"Source attribute key","source-attribute-required":"Source attribute key is required.","source-telemetry":"Source telemetry key","source-telemetry-required":"Source telemetry key is required.","target-key":"Target key","target-key-required":"Target key is required.","attr-mapping-required":"At least one mapping entry should be specified.","fields-mapping":"Fields mapping*","fields-mapping-required":"At least one field mapping should be specified.","at-least-one-field-required":"At least one input field must have a value(s) provided.","originator-fields-sv-map-hint":"Target key fields support templatization. Use $[messageKey] to extract value from the message and ${metadataKey} to extract value from the metadata.","sv-map-hint":"Only target key fields support templatization. Use $[messageKey] to extract value from the message and ${metadataKey} to extract value from the metadata.","source-field":"Source field","source-field-required":"Source field is required.","originator-source":"Originator source","originator-customer":"Customer","originator-tenant":"Tenant","originator-related":"Related","originator-alarm-originator":"Alarm Originator","originator-entity":"Entity","clone-message":"Clone message",transform:"Transform","default-ttl":"Default TTL in seconds","default-ttl-required":"Default TTL is required.","min-default-ttl-message":"Only 0 minimum TTL is allowed.","message-count":"Message count (0 - unlimited)","message-count-required":"Message count is required.","min-message-count-message":"Only 0 minimum message count is allowed.","period-seconds":"Period in seconds","period-seconds-required":"Period is required.","use-metadata-period-in-seconds-patterns":"Use period in seconds pattern","use-metadata-period-in-seconds-patterns-hint":"If selected, rule node use period in seconds interval pattern from message metadata or data assuming that intervals are in the seconds.","period-in-seconds-pattern":"Period in seconds pattern","period-in-seconds-pattern-required":"Period in seconds pattern is required","min-period-seconds-message":"Only 1 second minimum period is allowed.",originator:"Originator","message-body":"Message body","message-metadata":"Message metadata",generate:"Generate","test-generator-function":"Test generator function",generator:"Generator","test-filter-function":"Test filter function","test-switch-function":"Test switch function","test-transformer-function":"Test transformer function",transformer:"Transformer","alarm-create-condition":"Alarm create condition","test-condition-function":"Test condition function","alarm-clear-condition":"Alarm clear condition","alarm-details-builder":"Alarm details builder","test-details-function":"Test details function","alarm-type":"Alarm type","select-entity-types":"Select entity types","alarm-type-required":"Alarm type is required.","alarm-severity":"Alarm severity","alarm-severity-required":"Alarm severity is required","alarm-severity-pattern":"Alarm severity pattern","alarm-status-filter":"Alarm status filter","alarm-status-list-empty":"Alarm status list is empty","no-alarm-status-matching":"No alarm status matching were found.",propagate:"Propagate alarm to related entities","propagate-to-owner":"Propagate alarm to entity owner (Customer or Tenant)","propagate-to-tenant":"Propagate alarm to Tenant",condition:"Condition",details:"Details","to-string":"To string","test-to-string-function":"Test to string function","from-template":"From Template","from-template-required":"From Template is required","to-template":"To Template","to-template-required":"To Template is required","mail-address-list-template-hint":'Comma separated address list, use ${metadataKey} for value from metadata, $[messageKey] for value from message body',"cc-template":"Cc Template","bcc-template":"Bcc Template","subject-template":"Subject Template","subject-template-required":"Subject Template is required","body-template":"Body Template","body-template-required":"Body Template is required","dynamic-mail-body-type":"Dynamic mail body type","mail-body-type":"Mail body type","request-id-metadata-attribute":"Request Id Metadata attribute name","timeout-sec":"Timeout in seconds","timeout-required":"Timeout is required","min-timeout-message":"Only 0 minimum timeout value is allowed.","endpoint-url-pattern":"Endpoint URL pattern","endpoint-url-pattern-required":"Endpoint URL pattern is required","request-method":"Request method","use-simple-client-http-factory":"Use simple client HTTP factory","ignore-request-body":"Without request body","trim-double-quotes":"Message without quotes","trim-double-quotes-hint":"If selected, request body message payload will be sent without double quotes, i.e. msg = message body","read-timeout":"Read timeout in millis","read-timeout-hint":"The value of 0 means an infinite timeout","max-parallel-requests-count":"Max number of parallel requests","max-parallel-requests-count-hint":"The value of 0 specifies no limit in parallel processing",headers:"Headers","headers-hint":'Use ${metadataKey} for value from metadata, $[messageKey] for value from message body in header/value fields',header:"Header","header-required":"Header is required",value:"Value","value-required":"Value is required","topic-pattern":"Topic pattern","key-pattern":"Key pattern","key-pattern-hint":"Optional. If a valid partition number is specified, it will be used when sending the record. If no partition is specified, the key will be used instead. If neither is specified, a partition will be assigned in a round-robin fashion.","topic-pattern-required":"Topic pattern is required",topic:"Topic","topic-required":"Topic is required","bootstrap-servers":"Bootstrap servers","bootstrap-servers-required":"Bootstrap servers value is required","other-properties":"Other properties",key:"Key","key-required":"Key is required",retries:"Automatically retry times if fails","min-retries-message":"Only 0 minimum retries is allowed.","batch-size-bytes":"Produces batch size in bytes","min-batch-size-bytes-message":"Only 0 minimum batch size is allowed.","linger-ms":"Time to buffer locally (ms)","min-linger-ms-message":"Only 0 ms minimum value is allowed.","buffer-memory-bytes":"Client buffer max size in bytes","min-buffer-memory-message":"Only 0 minimum buffer size is allowed.",acks:"Number of acknowledgments","key-serializer":"Key serializer","key-serializer-required":"Key serializer is required","value-serializer":"Value serializer","value-serializer-required":"Value serializer is required","topic-arn-pattern":"Topic ARN pattern","topic-arn-pattern-required":"Topic ARN pattern is required","aws-access-key-id":"AWS Access Key ID","aws-access-key-id-required":"AWS Access Key ID is required","aws-secret-access-key":"AWS Secret Access Key","aws-secret-access-key-required":"AWS Secret Access Key is required","aws-region":"AWS Region","aws-region-required":"AWS Region is required","exchange-name-pattern":"Exchange name pattern","routing-key-pattern":"Routing key pattern","message-properties":"Message properties",host:"Host","host-required":"Host is required",port:"Port","port-required":"Port is required","port-range":"Port should be in a range from 1 to 65535.","virtual-host":"Virtual host",username:"Username",password:"Password","automatic-recovery":"Automatic recovery","connection-timeout-ms":"Connection timeout (ms)","min-connection-timeout-ms-message":"Only 0 ms minimum value is allowed.","handshake-timeout-ms":"Handshake timeout (ms)","min-handshake-timeout-ms-message":"Only 0 ms minimum value is allowed.","client-properties":"Client properties","queue-url-pattern":"Queue URL pattern","queue-url-pattern-required":"Queue URL pattern is required","delay-seconds":"Delay (seconds)","min-delay-seconds-message":"Only 0 seconds minimum value is allowed.","max-delay-seconds-message":"Only 900 seconds maximum value is allowed.",name:"Name","name-required":"Name is required","queue-type":"Queue type","sqs-queue-standard":"Standard","sqs-queue-fifo":"FIFO","gcp-project-id":"GCP project ID","gcp-project-id-required":"GCP project ID is required","gcp-service-account-key":"GCP service account key file","gcp-service-account-key-required":"GCP service account key file is required","pubsub-topic-name":"Topic name","pubsub-topic-name-required":"Topic name is required","message-attributes":"Message attributes","message-attributes-hint":'Use ${metadataKey} for value from metadata, $[messageKey] for value from message body in name/value fields',"connect-timeout":"Connection timeout (sec)","connect-timeout-required":"Connection timeout is required.","connect-timeout-range":"Connection timeout should be in a range from 1 to 200.","client-id":"Client ID","client-id-hint":'Optional. Leave empty for auto-generated Client ID. Be careful when specifying the Client ID. Majority of the MQTT brokers will not allow multiple connections with the same Client ID. To connect to such brokers, your mqtt Client ID must be unique. When platform is running in a micro-services mode, the copy of rule node is launched in each micro-service. This will automatically lead to multiple mqtt clients with the same ID and may cause failures of the rule node. To avoid such failures enable "Add Service ID as suffix to Client ID" option below.',"append-client-id-suffix":"Add Service ID as suffix to Client ID","client-id-suffix-hint":'Optional. Applied when "Client ID" specified explicitly. If selected then Service ID will be added to Client ID as a suffix. Helps to avoid failures when platform is running in a micro-services mode.',"device-id":"Device ID","device-id-required":"Device ID is required.","clean-session":"Clean session","enable-ssl":"Enable SSL",credentials:"Credentials","credentials-type":"Credentials type","credentials-type-required":"Credentials type is required.","credentials-anonymous":"Anonymous","credentials-basic":"Basic","credentials-pem":"PEM","credentials-pem-hint":"At least Server CA certificate file or a pair of Client certificate and Client private key files are required","credentials-sas":"Shared Access Signature","sas-key":"SAS Key","sas-key-required":"SAS Key is required.",hostname:"Hostname","hostname-required":"Hostname is required.","azure-ca-cert":"CA certificate file","username-required":"Username is required.","password-required":"Password is required.","ca-cert":"Server CA certificate file","private-key":"Client private key file",cert:"Client certificate file","no-file":"No file selected.","drop-file":"Drop a file or click to select a file to upload.","private-key-password":"Private key password","use-system-smtp-settings":"Use system SMTP settings","use-metadata-dynamic-interval":"Use dynamic interval","metadata-dynamic-interval-hint":"Interval start and end input fields support templatization. Note that the substituted template value should be set in milliseconds. Use $[messageKey] to extract value from the message and ${metadataKey} to extract value from the metadata.","use-metadata-interval-patterns-hint":"If selected, rule node use start and end interval patterns from message metadata or data assuming that intervals are in the milliseconds.","use-message-alarm-data":"Use message alarm data","overwrite-alarm-details":"Overwrite alarm details","use-alarm-severity-pattern":"Use alarm severity pattern","check-all-keys":"Check that all specified fields are present","check-all-keys-hint":"If selected, checks that all specified keys are present in the message data and metadata.","check-relation-to-specific-entity":"Check relation to specific entity","check-relation-to-specific-entity-tooltip":"If enabled, checks the presence of relation with a specific entity otherwise, checks the presence of relation with any entity. In both cases, relation lookup is based on configured direction and type.","check-relation-hint":"Checks existence of relation to specific entity or to any entity based on direction and relation type.","delete-relation-to-specific-entity":"Delete relation to specific entity","delete-relation-hint":"Deletes relation from the originator of the incoming message to the specified entity or list of entities based on direction and type.","remove-current-relations":"Remove current relations","remove-current-relations-hint":"Removes current relations from the originator of the incoming message based on direction and type.","change-originator-to-related-entity":"Change originator to related entity","change-originator-to-related-entity-hint":"Used to process submitted message as a message from another entity.","start-interval":"Interval start","end-interval":"Interval end","start-interval-required":"Interval start is required.","end-interval-required":"Interval end is required.","smtp-protocol":"Protocol","smtp-host":"SMTP host","smtp-host-required":"SMTP host is required.","smtp-port":"SMTP port","smtp-port-required":"You must supply a smtp port.","smtp-port-range":"SMTP port should be in a range from 1 to 65535.","timeout-msec":"Timeout ms","min-timeout-msec-message":"Only 0 ms minimum value is allowed.","enter-username":"Enter username","enter-password":"Enter password","enable-tls":"Enable TLS","tls-version":"TLS version","enable-proxy":"Enable proxy","use-system-proxy-properties":"Use system proxy properties","proxy-host":"Proxy host","proxy-host-required":"Proxy host is required.","proxy-port":"Proxy port","proxy-port-required":"Proxy port is required.","proxy-port-range":"Proxy port should be in a range from 1 to 65535.","proxy-user":"Proxy user","proxy-password":"Proxy password","proxy-scheme":"Proxy scheme","numbers-to-template":"Phone Numbers To Template","numbers-to-template-required":"Phone Numbers To Template is required","numbers-to-template-hint":'Comma separated Phone Numbers, use ${metadataKey} for value from metadata, $[messageKey] for value from message body',"sms-message-template":"SMS message Template","sms-message-template-required":"SMS message Template is required","use-system-sms-settings":"Use system SMS provider settings","min-period-0-seconds-message":"Only 0 second minimum period is allowed.","max-pending-messages":"Maximum pending messages","max-pending-messages-required":"Maximum pending messages is required.","max-pending-messages-range":"Maximum pending messages should be in a range from 1 to 100000.","originator-types-filter":"Originator types filter","interval-seconds":"Interval in seconds","interval-seconds-required":"Interval is required.","min-interval-seconds-message":"Only 1 second minimum interval is allowed.","output-timeseries-key-prefix":"Output timeseries key prefix","output-timeseries-key-prefix-required":"Output timeseries key prefix required.","separator-hint":'Press "Enter" to complete field input.',"select-details":"Select details","entity-details-id":"Id","entity-details-title":"Title","entity-details-country":"Country","entity-details-state":"State","entity-details-city":"City","entity-details-zip":"Zip","entity-details-address":"Address","entity-details-address2":"Address2","entity-details-additional_info":"Additional Info","entity-details-phone":"Phone","entity-details-email":"Email","fields-to-check":"Fields to check","add-detail":"Add detail","check-all-keys-tooltip":"If enabled, checks the presence of all fields listed in the message and metadata field names within the incoming message and its metadata.","fields-to-check-hint":'Press "Enter" to complete field name input. Multiple field names supported.',"entity-details-list-empty":"At least one detail should be selected.","alarm-status":"Alarm status","alarm-required":"At least one alarm status should be selected.","no-entity-details-matching":"No entity details matching were found.","custom-table-name":"Custom table name","custom-table-name-required":"Table Name is required","custom-table-hint":"Enter the table name without prefix 'cs_tb_'.","message-field":"Message field","message-field-required":"Message field is required.","table-col":"Table column","table-col-required":"Table column is required.","latitude-field-name":"Latitude field name","longitude-field-name":"Longitude field name","latitude-field-name-required":"Latitude field name is required.","longitude-field-name-required":"Longitude field name is required.","fetch-perimeter-info-from-metadata":"Fetch perimeter information from metadata","fetch-perimeter-info-from-metadata-tooltip":"If perimeter type is set to 'Polygon' the value of metadata field '{{perimeterKeyName}}' will be set as perimeter definition without additional parsing of the value. Otherwise, if perimeter type is set to 'Circle' the value of '{{perimeterKeyName}}' metadata field will be parsed to extract 'latitude', 'longitude', 'radius', 'radiusUnit' fields that uses for circle perimeter definition.","perimeter-key-name":"Perimeter key name","perimeter-key-name-hint":"Metadata field name that includes perimeter information.","perimeter-key-name-required":"Perimeter key name is required.","perimeter-circle":"Circle","perimeter-polygon":"Polygon","perimeter-type":"Perimeter type","circle-center-latitude":"Center latitude","circle-center-latitude-required":"Center latitude is required.","circle-center-longitude":"Center longitude","circle-center-longitude-required":"Center longitude is required.","range-unit-meter":"Meter","range-unit-kilometer":"Kilometer","range-unit-foot":"Foot","range-unit-mile":"Mile","range-unit-nautical-mile":"Nautical mile","range-units":"Range units","range-units-required":"Range units is required.",range:"Range","range-required":"Range is required.","polygon-definition":"Polygon definition","polygon-definition-required":"Polygon definition is required.","polygon-definition-hint":"Use the following format for manual definition of polygon: [[lat1,lon1],[lat2,lon2], ... ,[latN,lonN]].","min-inside-duration":"Minimal inside duration","min-inside-duration-value-required":"Minimal inside duration is required","min-inside-duration-time-unit":"Minimal inside duration time unit","min-outside-duration":"Minimal outside duration","min-outside-duration-value-required":"Minimal outside duration is required","min-outside-duration-time-unit":"Minimal outside duration time unit","tell-failure-if-absent":"Tell Failure","tell-failure-if-absent-hint":'If at least one selected key doesn\'t exist the outbound message will report "Failure".',"get-latest-value-with-ts":"Fetch timestamp for the latest telemetry values","get-latest-value-with-ts-hint":'If selected, the latest telemetry values will also include timestamp, e.g: "temp": "{"ts":1574329385897, "value":42}"',"use-redis-queue":"Use redis queue for message persistence","ignore-null-strings":"Ignore null strings","ignore-null-strings-hint":"If selected rule node will ignore entity fields with empty value.","trim-redis-queue":"Trim redis queue","redis-queue-max-size":"Redis queue max size","add-metadata-key-values-as-kafka-headers":"Add Message metadata key-value pairs to Kafka record headers","add-metadata-key-values-as-kafka-headers-hint":"If selected, key-value pairs from message metadata will be added to the outgoing records headers as byte arrays with predefined charset encoding.","charset-encoding":"Charset encoding","charset-encoding-required":"Charset encoding is required.","charset-us-ascii":"US-ASCII","charset-iso-8859-1":"ISO-8859-1","charset-utf-8":"UTF-8","charset-utf-16be":"UTF-16BE","charset-utf-16le":"UTF-16LE","charset-utf-16":"UTF-16","select-queue-hint":"The queue name can be selected from a drop-down list or add a custom name.","persist-alarm-rules":"Persist state of alarm rules","fetch-alarm-rules":"Fetch state of alarm rules","input-value-key":"Input value key","input-value-key-required":"Input value key is required.","output-value-key":"Output value key","output-value-key-required":"Output value key is required.","number-of-digits-after-floating-point":"Number of digits after floating point","number-of-digits-after-floating-point-range":"Number of digits after floating point should be in a range from 0 to 15.","failure-if-delta-negative":"Tell Failure if delta is negative","failure-if-delta-negative-tooltip":"Rule node forces failure of message processing if delta value is negative.","use-caching":"Use caching","use-caching-tooltip":'Rule node will cache the value of "{{inputValueKey}}" that arrives from the incoming message to improve performance. Note that the cache will not be updated if you modify the "{{inputValueKey}}" value elsewhere.',"add-time-difference-between-readings":'Add the time difference between "{{inputValueKey}}" readings',"add-time-difference-between-readings-tooltip":'If enabled, the rule node will add the "{{periodValueKey}}" to the outbound message.',"period-value-key":"Period value key","period-value-key-required":"Period value key is required.","general-pattern-hint":"Use ${metadataKey} for value from metadata, $[messageKey] for value from message body.","alarm-severity-pattern-hint":'Use ${metadataKey} for value from metadata, $[messageKey] for value from message body. Alarm severity should be system (CRITICAL, MAJOR etc.)',"output-node-name-hint":"The rule node name corresponds to the relation type of the output message, and it is used to forward messages to other rule nodes in the caller rule chain.","skip-latest-persistence":"Skip latest persistence","use-server-ts":"Use server ts","use-server-ts-hint":"Enable this setting to use the timestamp of the message processing instead of the timestamp from the message. Useful for all sorts of sequential processing if you merge messages from multiple sources (devices, assets, etc).","kv-map-pattern-hint":"All input fields support templatization. Use $[messageKey] to extract value from the message and ${metadataKey} to extract value from the metadata.","shared-scope":"Shared scope","server-scope":"Server scope","client-scope":"Client scope","attribute-type":"Attribute","constant-type":"Constant","time-series-type":"Time-series","message-body-type":"Message","message-metadata-type":"Metadata","argument-tile":"Arguments","no-arguments-prompt":"No arguments configured","result-title":"Result","functions-field-input":"Functions","no-option-found":"No option found","argument-source-field-input":"Source","argument-source-field-input-required":"Argument source is required.","argument-key-field-input":"Key","argument-key-field-input-required":"Argument key is required.","constant-value-field-input":"Constant value","constant-value-field-input-required":"Constant value is required.","attribute-scope-field-input":"Attribute scope","attribute-scope-field-input-required":"Attribute scope os required.","default-value-field-input":"Default value","type-field-input":"Type","type-field-input-required":"Type is required.","key-field-input":"Key","add-entity-type":"Add entity type","key-field-input-required":"Key is required.","number-floating-point-field-input":"Number of digits after floating point","number-floating-point-field-input-hint":"Use 0 to convert result to integer","add-to-message-field-input":"Add to message","add-to-metadata-field-input":"Add to metadata","custom-expression-field-input":"Mathematical Expression","custom-expression-field-input-required":"Mathematical expression is required","custom-expression-field-input-hint":"Specify a mathematical expression to evaluate. Default expression demonstrates how to transform Fahrenheit to Celsius","retained-message":"Retained","attributes-mapping":"Attributes mapping","latest-telemetry-mapping":"Latest telemetry mapping","add-mapped-attribute-to":"Add mapped attributes to","add-mapped-latest-telemetry-to":"Add mapped latest telemetry to","add-mapped-fields-to":"Add mapped fields to","add-selected-details-to":"Add selected details to","clear-selected-types":"Clear selected types","clear-selected-details":"Clear selected details","clear-selected-fields":"Clear selected fields","clear-selected-keys":"Clear selected keys","geofence-configuration":"Geofence configuration","coordinate-field-names":"Coordinate field names","coordinate-field-hint":"Rule node tries to retrieve the specified fields from the message. If they are not present, it will look them up in the metadata.","fetch-credentials-to":"Fetch credentials to","add-originator-attributes-to":"Add originator attributes to","originator-attributes":"Originator attributes","fetch-latest-telemetry-with-timestamp":"Fetch latest telemetry with timestamp","fetch-latest-telemetry-with-timestamp-tooltip":'If selected, latest telemetry values will be added to the outbound metadata with timestamp, e.g: "{{latestTsKeyName}}": "{"ts":1574329385897, "value":42}"',"tell-failure":"Tell failure if any of the attributes are missing","tell-failure-tooltip":'If at least one selected key doesn\'t exist the outbound message will report "Failure".',"created-time":"Created time","chip-help":"Press 'Enter' to complete {{inputName}} input. \nPress 'Backspace' to delete {{inputName}}. \nMultiple values supported.",detail:"detail","field-name":"field name","device-profile":"device profile","entity-type":"entity type","message-type":"message type","timeseries-key":"timeseries key",type:"Type","first-name":"First name","last-name":"Last name",label:"Label","originator-fields-mapping":"Originator fields mapping","add-mapped-originator-fields-to":"Add mapped originator fields to",fields:"Fields","skip-empty-fields":"Skip empty fields","skip-empty-fields-tooltip":"Fields with empty values will not be added to the output message/output metadata.","fetch-interval":"Fetch interval","fetch-strategy":"Fetch strategy","fetch-timeseries-from-to":"Fetch timeseries from {{startInterval}} {{startIntervalTimeUnit}} ago to {{endInterval}} {{endIntervalTimeUnit}} ago.","fetch-timeseries-from-to-invalid":'Fetch timeseries invalid ("Interval start" should be less than "Interval end").',"use-metadata-dynamic-interval-tooltip":"If selected, the rule node will use dynamic interval start and end based on the message and metadata patterns.","all-mode-hint":'If selected fetch mode "All" rule node will retrieve telemetry from the fetch interval with configurable query parameters.',"first-mode-hint":'If selected fetch mode "First" rule node will retrieve the closest telemetry to the fetch interval\'s start.',"last-mode-hint":'If selected fetch mode "Last" rule node will retrieve the closest telemetry to the fetch interval\'s end.',ascending:"Ascending",descending:"Descending",min:"Min",max:"Max",average:"Average",sum:"Sum",count:"Count",none:"None","last-level-relation-tooltip":"If selected, the rule node will search related entities only on the level set in the max relation level.","last-level-device-relation-tooltip":"If selected, the rule node will search related devices only on the level set in the max relation level.","data-to-fetch":"Data to fetch","mapping-of-customers-fields":"Mapping of customer's fields","map-fields-required":"All mapping fields are required.",attributes:"Attributes","related-device-attributes":"Related device attributes","add-selected-attributes-to":"Add selected attributes to","device-profiles":"Device profiles","mapping-of-tenant-fields":"Mapping of tenant's fields","add-attribute-key":"Add attribute key","message-template":"Message template","message-template-required":"Message template is required","use-system-slack-settings":"Use system slack settings","slack-api-token":"Slack API token","slack-api-token-required":"Slack API token is required"},"key-val":{key:"Key",value:"Value","see-examples":"See examples.","remove-entry":"Remove entry","remove-mapping-entry":"Remove mapping entry","add-mapping-entry":"Add mapping","add-entry":"Add entry","unique-key-value-pair-error":"'{{valText}}' must be different from the current '{{keyText}}'"},"mail-body-type":{"plain-text":"Plain Text",html:"HTML",dynamic:"Dynamic"}}},!0)}(e)}}e("RuleNodeCoreConfigModule",dr),dr.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:dr,deps:[{token:H.TranslateService}],target:t.ɵɵFactoryTarget.NgModule}),dr.ɵmod=t.ɵɵngDeclareNgModule({minVersion:"14.0.0",version:"15.2.9",ngImport:t,type:dr,declarations:[Je],imports:[O,T],exports:[Cn,er,Gn,zn,sr,pr,Je]}),dr.ɵinj=t.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:dr,imports:[O,T,Cn,er,Gn,zn,sr,pr]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:dr,decorators:[{type:l,args:[{declarations:[Je],imports:[O,T],exports:[Cn,er,Gn,zn,sr,pr,Je]}]}],ctorParameters:function(){return[{type:H.TranslateService}]}})}}}));//# sourceMappingURL=rulenode-core-config.js.map +System.register(["@angular/core","@shared/public-api","@ngrx/store","@angular/forms","@angular/common","@angular/material/checkbox","@angular/material/input","@angular/material/form-field","@angular/flex-layout/flex","@ngx-translate/core","@angular/material/select","@angular/material/core","@angular/material/slide-toggle","@shared/components/hint-tooltip-icon.component","@shared/components/queue/queue-autocomplete.component","@core/public-api","@shared/components/js-func.component","@angular/material/button","@angular/material/icon","@angular/material/tooltip","@shared/components/script-lang.component","@angular/cdk/keycodes","@angular/material/chips","@shared/pipe/safe.pipe","@shared/components/entity/entity-type-select.component","@shared/components/entity/entity-select.component","@angular/cdk/coercion","@shared/components/tb-error.component","@angular/flex-layout/extended","@angular/material/list","@angular/cdk/drag-drop","rxjs/operators","@angular/material/autocomplete","@shared/pipe/highlight.pipe","@angular/material/expansion","tslib","rxjs","@home/components/public-api","@shared/components/help-popup.component","@shared/components/entity/entity-subtype-list.component","@shared/components/relation/relation-type-autocomplete.component","@home/components/relation/relation-filters.component","@shared/components/file-input.component","@shared/components/button/toggle-password.component","@shared/components/string-items-list.component","@shared/components/toggle-header.component","@shared/components/toggle-select.component","@shared/components/entity/entity-list.component","@shared/components/notification/template-autocomplete.component","@shared/components/tb-checkbox.component","@home/components/sms/sms-provider-configuration.component","@angular/material/radio","@shared/components/slack-conversation-autocomplete.component","@shared/components/entity/entity-autocomplete.component","@shared/components/entity/entity-type-list.component"],(function(e){"use strict";var t,n,r,o,a,i,l,s,m,u,p,d,c,f,g,y,x,b,h,v,C,F,k,L,T,I,N,S,q,A,M,G,E,D,V,P,w,R,O,B,K,U,_,H,z,j,Q,$,J,Y,W,X,Z,ee,te,ne,re,oe,ae,ie,le,se,me,ue,pe,de,ce,fe,ge,ye,xe,be,he,ve,Ce,Fe,ke,Le,Te,Ie,Ne,Se,qe,Ae,Me,Ge,Ee,De,Ve,Pe,we,Re,Oe,Be,Ke,Ue,_e,He,ze,je,Qe,$e;return{setters:[function(e){t=e,n=e.Component,r=e.EventEmitter,o=e.ViewChild,a=e.forwardRef,i=e.Input,l=e.NgModule},function(e){s=e.RuleNodeConfigurationComponent,m=e.AttributeScope,u=e.telemetryTypeTranslations,p=e.ServiceType,d=e.ScriptLanguage,c=e.AlarmSeverity,f=e.alarmSeverityTranslations,g=e.EntitySearchDirection,y=e.entitySearchDirectionTranslations,x=e.EntityType,b=e.entityFields,h=e.PageComponent,v=e.coerceBoolean,C=e.MessageType,F=e.messageTypeNames,k=e,L=e.AlarmStatus,T=e.alarmStatusTranslations,I=e.SharedModule,N=e.AggregationType,S=e.aggregationTranslations,q=e.NotificationType,A=e.SlackChanelType,M=e.SlackChanelTypesTranslateMap},function(e){G=e},function(e){E=e,D=e.Validators,V=e.NgControl,P=e.NG_VALUE_ACCESSOR,w=e.NG_VALIDATORS},function(e){R=e,O=e.CommonModule},function(e){B=e},function(e){K=e},function(e){U=e},function(e){_=e},function(e){H=e},function(e){z=e},function(e){j=e},function(e){Q=e},function(e){$=e},function(e){J=e},function(e){Y=e.getCurrentAuthState,W=e,X=e.isDefinedAndNotNull,Z=e.deepTrim,ee=e.isObject,te=e.isNotEmptyStr},function(e){ne=e},function(e){re=e},function(e){oe=e},function(e){ae=e},function(e){ie=e},function(e){le=e.ENTER,se=e.COMMA,me=e.SEMICOLON},function(e){ue=e},function(e){pe=e},function(e){de=e},function(e){ce=e},function(e){fe=e.coerceBooleanProperty},function(e){ge=e},function(e){ye=e},function(e){xe=e},function(e){be=e},function(e){he=e.tap,ve=e.map,Ce=e.mergeMap,Fe=e.startWith,ke=e.share,Le=e.takeUntil},function(e){Te=e},function(e){Ie=e},function(e){Ne=e},function(e){Se=e.__decorate},function(e){qe=e.of,Ae=e.Subject},function(e){Me=e.HomeComponentsModule},function(e){Ge=e},function(e){Ee=e},function(e){De=e},function(e){Ve=e},function(e){Pe=e},function(e){we=e},function(e){Re=e},function(e){Oe=e},function(e){Be=e},function(e){Ke=e},function(e){Ue=e},function(e){_e=e},function(e){He=e},function(e){ze=e},function(e){je=e},function(e){Qe=e},function(e){$e=e}],execute:function(){class Je extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.emptyConfigForm}onConfigurationSet(e){this.emptyConfigForm=this.fb.group({})}}e("EmptyConfigComponent",Je),Je.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Je,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Je.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Je,selector:"tb-node-empty-config",usesInheritance:!0,ngImport:t,template:"
",isInline:!0}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Je,decorators:[{type:n,args:[{selector:"tb-node-empty-config",template:"
"}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Ye extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.assignCustomerConfigForm}onConfigurationSet(e){this.assignCustomerConfigForm=this.fb.group({customerNamePattern:[e?e.customerNamePattern:null,[D.required,D.pattern(/.*\S.*/)]],createCustomerIfNotExists:[!!e&&e.createCustomerIfNotExists,[]],customerCacheExpiration:[e?e.customerCacheExpiration:null,[D.required,D.min(0)]]})}prepareOutputConfig(e){return e.customerNamePattern=e.customerNamePattern.trim(),e}}e("AssignCustomerConfigComponent",Ye),Ye.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Ye,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Ye.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Ye,selector:"tb-action-node-assign-to-customer-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.customer-name-pattern\n \n \n {{ \'tb.rulenode.customer-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.create-customer-if-not-exists\' | translate }}\n \n \n tb.rulenode.customer-cache-expiration\n \n \n {{ \'tb.rulenode.customer-cache-expiration-required\' | translate }}\n \n \n {{ \'tb.rulenode.customer-cache-expiration-range\' | translate }}\n \n tb.rulenode.customer-cache-expiration-hint\n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Ye,decorators:[{type:n,args:[{selector:"tb-action-node-assign-to-customer-config",template:'
\n \n tb.rulenode.customer-name-pattern\n \n \n {{ \'tb.rulenode.customer-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.create-customer-if-not-exists\' | translate }}\n \n \n tb.rulenode.customer-cache-expiration\n \n \n {{ \'tb.rulenode.customer-cache-expiration-required\' | translate }}\n \n \n {{ \'tb.rulenode.customer-cache-expiration-range\' | translate }}\n \n tb.rulenode.customer-cache-expiration-hint\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class We extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.attributeScopeMap=m,this.attributeScopes=Object.keys(m),this.telemetryTypeTranslationsMap=u}configForm(){return this.attributesConfigForm}onConfigurationSet(e){this.attributesConfigForm=this.fb.group({scope:[e?e.scope:null,[D.required]],notifyDevice:[!e||e.notifyDevice,[]],sendAttributesUpdatedNotification:[!!e&&e.sendAttributesUpdatedNotification,[]],updateAttributesOnlyOnValueChange:[!!e&&e.updateAttributesOnlyOnValueChange,[]]}),this.attributesConfigForm.get("scope").valueChanges.subscribe((e=>{e!==m.SHARED_SCOPE&&this.attributesConfigForm.get("notifyDevice").patchValue(!1,{emitEvent:!1}),e===m.CLIENT_SCOPE&&this.attributesConfigForm.get("sendAttributesUpdatedNotification").patchValue(!1,{emitEvent:!1}),this.attributesConfigForm.get("updateAttributesOnlyOnValueChange").patchValue(!1,{emitEvent:!1})}))}}e("AttributesConfigComponent",We),We.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:We,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),We.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:We,selector:"tb-action-node-attributes-config",usesInheritance:!0,ngImport:t,template:'
\n \n attribute.attributes-scope\n \n \n {{ telemetryTypeTranslationsMap.get(scope) | translate }}\n \n \n \n
\n
\n \n {{ \'tb.rulenode.update-attributes-only-on-value-change\' | translate }}\n \n
\n
\n \n {{ \'tb.rulenode.send-attributes-updated-notification\' | translate }}\n \n
\n
\n \n {{ \'tb.rulenode.notify-device\' | translate }}\n \n
\n
\n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:We,decorators:[{type:n,args:[{selector:"tb-action-node-attributes-config",template:'
\n \n attribute.attributes-scope\n \n \n {{ telemetryTypeTranslationsMap.get(scope) | translate }}\n \n \n \n
\n
\n \n {{ \'tb.rulenode.update-attributes-only-on-value-change\' | translate }}\n \n
\n
\n \n {{ \'tb.rulenode.send-attributes-updated-notification\' | translate }}\n \n
\n
\n \n {{ \'tb.rulenode.notify-device\' | translate }}\n \n
\n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Xe extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.serviceType=p.TB_RULE_ENGINE}configForm(){return this.checkPointConfigForm}onConfigurationSet(e){this.checkPointConfigForm=this.fb.group({queueName:[e?e.queueName:null,[D.required]]})}}e("CheckPointConfigComponent",Xe),Xe.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Xe,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Xe.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Xe,selector:"tb-action-node-check-point-config",usesInheritance:!0,ngImport:t,template:'
\n \n \n
\n',dependencies:[{kind:"component",type:J.QueueAutocompleteComponent,selector:"tb-queue-autocomplete",inputs:["labelText","requiredText","autocompleteHint","subscriptSizing","required","queueType","disabled"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Xe,decorators:[{type:n,args:[{selector:"tb-action-node-check-point-config",template:'
\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Ze extends s{constructor(e,t,n,o){super(e),this.store=e,this.fb=t,this.nodeScriptTestService=n,this.translate=o,this.tbelEnabled=Y(this.store).tbelEnabled,this.scriptLanguage=d,this.changeScript=new r,this.hasScript=!0,this.testScriptLabel="tb.rulenode.test-details-function"}configForm(){return this.clearAlarmConfigForm}onConfigurationSet(e){this.clearAlarmConfigForm=this.fb.group({scriptLang:[e?e.scriptLang:d.JS,[D.required]],alarmDetailsBuildJs:[e?e.alarmDetailsBuildJs:null,[]],alarmDetailsBuildTbel:[e?e.alarmDetailsBuildTbel:null,[]],alarmType:[e?e.alarmType:null,[D.required]]})}validatorTriggers(){return["scriptLang"]}updateValidators(e){let t=this.clearAlarmConfigForm.get("scriptLang").value;t!==d.TBEL||this.tbelEnabled||(t=d.JS,this.clearAlarmConfigForm.get("scriptLang").patchValue(t,{emitEvent:!1}),setTimeout((()=>{this.clearAlarmConfigForm.updateValueAndValidity({emitEvent:!0})}))),this.clearAlarmConfigForm.get("alarmDetailsBuildJs").setValidators(t===d.JS?[D.required]:[]),this.clearAlarmConfigForm.get("alarmDetailsBuildJs").updateValueAndValidity({emitEvent:e}),this.clearAlarmConfigForm.get("alarmDetailsBuildTbel").setValidators(t===d.TBEL?[D.required]:[]),this.clearAlarmConfigForm.get("alarmDetailsBuildTbel").updateValueAndValidity({emitEvent:e})}prepareInputConfig(e){return e&&(e.scriptLang||(e.scriptLang=d.JS)),e}testScript(e){const t=this.clearAlarmConfigForm.get("scriptLang").value,n=t===d.JS?"alarmDetailsBuildJs":"alarmDetailsBuildTbel",r=t===d.JS?"rulenode/clear_alarm_node_script_fn":"rulenode/tbel/clear_alarm_node_script_fn",o=this.clearAlarmConfigForm.get(n).value;this.nodeScriptTestService.testNodeScript(o,"json",this.translate.instant("tb.rulenode.details"),"Details",["msg","metadata","msgType"],this.ruleNodeId,r,t,e).subscribe((e=>{e&&(this.clearAlarmConfigForm.get(n).setValue(e),this.changeScript.emit())}))}onValidate(){this.clearAlarmConfigForm.get("scriptLang").value===d.JS&&this.jsFuncComponent.validateOnSubmit()}}e("ClearAlarmConfigComponent",Ze),Ze.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Ze,deps:[{token:G.Store},{token:E.UntypedFormBuilder},{token:W.NodeScriptTestService},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),Ze.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Ze,selector:"tb-action-node-clear-alarm-config",viewQueries:[{propertyName:"jsFuncComponent",first:!0,predicate:["jsFuncComponent"],descendants:!0},{propertyName:"tbelFuncComponent",first:!0,predicate:["tbelFuncComponent"],descendants:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n \n \n \n \n \n \n
\n \n
\n \n tb.rulenode.alarm-type\n \n \n {{ \'tb.rulenode.alarm-type-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:ne.JsFuncComponent,selector:"tb-js-func",inputs:["functionTitle","functionName","functionArgs","validationArgs","resultType","disabled","fillHeight","minHeight","editorCompleter","globalVariables","disableUndefinedCheck","helpId","scriptLanguage","noValidate","required"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:ie.TbScriptLangComponent,selector:"tb-script-lang",inputs:["disabled"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Ze,decorators:[{type:n,args:[{selector:"tb-action-node-clear-alarm-config",template:'
\n \n \n \n \n \n \n \n
\n \n
\n \n tb.rulenode.alarm-type\n \n \n {{ \'tb.rulenode.alarm-type-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder},{type:W.NodeScriptTestService},{type:H.TranslateService}]},propDecorators:{jsFuncComponent:[{type:o,args:["jsFuncComponent",{static:!1}]}],tbelFuncComponent:[{type:o,args:["tbelFuncComponent",{static:!1}]}]}});class et extends s{constructor(e,t,n,o){super(e),this.store=e,this.fb=t,this.nodeScriptTestService=n,this.translate=o,this.alarmSeverities=Object.keys(c),this.alarmSeverityTranslationMap=f,this.separatorKeysCodes=[le,se,me],this.tbelEnabled=Y(this.store).tbelEnabled,this.scriptLanguage=d,this.changeScript=new r,this.hasScript=!0,this.testScriptLabel="tb.rulenode.test-details-function"}configForm(){return this.createAlarmConfigForm}onConfigurationSet(e){this.createAlarmConfigForm=this.fb.group({scriptLang:[e?e.scriptLang:d.JS,[D.required]],alarmDetailsBuildJs:[e?e.alarmDetailsBuildJs:null,[]],alarmDetailsBuildTbel:[e?e.alarmDetailsBuildTbel:null,[]],useMessageAlarmData:[!!e&&e.useMessageAlarmData,[]],overwriteAlarmDetails:[!!e&&e.overwriteAlarmDetails,[]],alarmType:[e?e.alarmType:null,[]],severity:[e?e.severity:null,[]],propagate:[!!e&&e.propagate,[]],relationTypes:[e?e.relationTypes:null,[]],propagateToOwner:[!!e&&e.propagateToOwner,[]],propagateToTenant:[!!e&&e.propagateToTenant,[]],dynamicSeverity:!1}),this.createAlarmConfigForm.get("dynamicSeverity").valueChanges.subscribe((e=>{e?this.createAlarmConfigForm.get("severity").patchValue("",{emitEvent:!1}):this.createAlarmConfigForm.get("severity").patchValue(this.alarmSeverities[0],{emitEvent:!1})}))}validatorTriggers(){return["useMessageAlarmData","overwriteAlarmDetails","scriptLang"]}updateValidators(e){const t=this.createAlarmConfigForm.get("useMessageAlarmData").value,n=this.createAlarmConfigForm.get("overwriteAlarmDetails").value;t?(this.createAlarmConfigForm.get("alarmType").setValidators([]),this.createAlarmConfigForm.get("severity").setValidators([])):(this.createAlarmConfigForm.get("alarmType").setValidators([D.required]),this.createAlarmConfigForm.get("severity").setValidators([D.required])),this.createAlarmConfigForm.get("alarmType").updateValueAndValidity({emitEvent:e}),this.createAlarmConfigForm.get("severity").updateValueAndValidity({emitEvent:e});let r=this.createAlarmConfigForm.get("scriptLang").value;r!==d.TBEL||this.tbelEnabled||(r=d.JS,this.createAlarmConfigForm.get("scriptLang").patchValue(r,{emitEvent:!1}),setTimeout((()=>{this.createAlarmConfigForm.updateValueAndValidity({emitEvent:!0})})));const o=!1===t||!0===n;this.createAlarmConfigForm.get("alarmDetailsBuildJs").setValidators(o&&r===d.JS?[D.required]:[]),this.createAlarmConfigForm.get("alarmDetailsBuildTbel").setValidators(o&&r===d.TBEL?[D.required]:[]),this.createAlarmConfigForm.get("alarmDetailsBuildJs").updateValueAndValidity({emitEvent:e}),this.createAlarmConfigForm.get("alarmDetailsBuildTbel").updateValueAndValidity({emitEvent:e})}prepareInputConfig(e){return e&&(e.scriptLang||(e.scriptLang=d.JS)),e}testScript(e){const t=this.createAlarmConfigForm.get("scriptLang").value,n=t===d.JS?"alarmDetailsBuildJs":"alarmDetailsBuildTbel",r=t===d.JS?"rulenode/create_alarm_node_script_fn":"rulenode/tbel/create_alarm_node_script_fn",o=this.createAlarmConfigForm.get(n).value;this.nodeScriptTestService.testNodeScript(o,"json",this.translate.instant("tb.rulenode.details"),"Details",["msg","metadata","msgType"],this.ruleNodeId,r,t,e).subscribe((e=>{e&&(this.createAlarmConfigForm.get(n).setValue(e),this.changeScript.emit())}))}removeKey(e,t){const n=this.createAlarmConfigForm.get(t).value,r=n.indexOf(e);r>=0&&(n.splice(r,1),this.createAlarmConfigForm.get(t).setValue(n,{emitEvent:!0}))}addKey(e,t){const n=e.input;let r=e.value;if((r||"").trim()){r=r.trim();let e=this.createAlarmConfigForm.get(t).value;e&&-1!==e.indexOf(r)||(e||(e=[]),e.push(r),this.createAlarmConfigForm.get(t).setValue(e,{emitEvent:!0}))}n&&(n.value="")}onValidate(){const e=this.createAlarmConfigForm.get("useMessageAlarmData").value,t=this.createAlarmConfigForm.get("overwriteAlarmDetails").value;if(!e||t){this.createAlarmConfigForm.get("scriptLang").value===d.JS&&this.jsFuncComponent.validateOnSubmit()}}}e("CreateAlarmConfigComponent",et),et.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:et,deps:[{token:G.Store},{token:E.UntypedFormBuilder},{token:W.NodeScriptTestService},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),et.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:et,selector:"tb-action-node-create-alarm-config",viewQueries:[{propertyName:"jsFuncComponent",first:!0,predicate:["jsFuncComponent"],descendants:!0},{propertyName:"tbelFuncComponent",first:!0,predicate:["tbelFuncComponent"],descendants:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n {{ \'tb.rulenode.use-message-alarm-data\' | translate }}\n \n \n {{ \'tb.rulenode.overwrite-alarm-details\' | translate }}\n \n
\n \n \n \n \n \n \n \n
\n \n
\n
\n
\n \n tb.rulenode.alarm-type\n \n \n {{ \'tb.rulenode.alarm-type-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.use-alarm-severity-pattern\' | translate }}\n \n \n tb.rulenode.alarm-severity\n \n \n {{ alarmSeverityTranslationMap.get(severity) | translate }}\n \n \n \n {{ \'tb.rulenode.alarm-severity-required\' | translate }}\n \n \n \n tb.rulenode.alarm-severity-pattern\n \n \n {{ \'tb.rulenode.alarm-severity-required\' | translate }}\n \n \n \n \n {{ \'tb.rulenode.propagate\' | translate }}\n \n
\n \n tb.rulenode.relation-types-list\n \n \n {{key}}\n close\n \n \n \n tb.rulenode.relation-types-list-hint\n \n
\n \n {{ \'tb.rulenode.propagate-to-owner\' | translate }}\n \n \n {{ \'tb.rulenode.propagate-to-tenant\' | translate }}\n \n
\n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:ne.JsFuncComponent,selector:"tb-js-func",inputs:["functionTitle","functionName","functionArgs","validationArgs","resultType","disabled","fillHeight","minHeight","editorCompleter","globalVariables","disableUndefinedCheck","helpId","scriptLanguage","noValidate","required"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"component",type:ue.MatChipGrid,selector:"mat-chip-grid",inputs:["tabIndex","disabled","placeholder","required","value","errorStateMatcher"],outputs:["change","valueChange"]},{kind:"directive",type:ue.MatChipInput,selector:"input[matChipInputFor]",inputs:["matChipInputFor","matChipInputAddOnBlur","matChipInputSeparatorKeyCodes","placeholder","id","disabled"],outputs:["matChipInputTokenEnd"],exportAs:["matChipInput","matChipInputFor"]},{kind:"directive",type:ue.MatChipRemove,selector:"[matChipRemove]"},{kind:"component",type:ue.MatChipRow,selector:"mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]",inputs:["color","disabled","disableRipple","tabIndex","editable"],outputs:["edited"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:ie.TbScriptLangComponent,selector:"tb-script-lang",inputs:["disabled"]},{kind:"pipe",type:pe.SafePipe,name:"safe"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:et,decorators:[{type:n,args:[{selector:"tb-action-node-create-alarm-config",template:'
\n \n {{ \'tb.rulenode.use-message-alarm-data\' | translate }}\n \n \n {{ \'tb.rulenode.overwrite-alarm-details\' | translate }}\n \n
\n \n \n \n \n \n \n \n
\n \n
\n
\n
\n \n tb.rulenode.alarm-type\n \n \n {{ \'tb.rulenode.alarm-type-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.use-alarm-severity-pattern\' | translate }}\n \n \n tb.rulenode.alarm-severity\n \n \n {{ alarmSeverityTranslationMap.get(severity) | translate }}\n \n \n \n {{ \'tb.rulenode.alarm-severity-required\' | translate }}\n \n \n \n tb.rulenode.alarm-severity-pattern\n \n \n {{ \'tb.rulenode.alarm-severity-required\' | translate }}\n \n \n \n \n {{ \'tb.rulenode.propagate\' | translate }}\n \n
\n \n tb.rulenode.relation-types-list\n \n \n {{key}}\n close\n \n \n \n tb.rulenode.relation-types-list-hint\n \n
\n \n {{ \'tb.rulenode.propagate-to-owner\' | translate }}\n \n \n {{ \'tb.rulenode.propagate-to-tenant\' | translate }}\n \n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder},{type:W.NodeScriptTestService},{type:H.TranslateService}]},propDecorators:{jsFuncComponent:[{type:o,args:["jsFuncComponent",{static:!1}]}],tbelFuncComponent:[{type:o,args:["tbelFuncComponent",{static:!1}]}]}});class tt extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.directionTypes=Object.keys(g),this.directionTypeTranslations=y,this.entityType=x}configForm(){return this.createRelationConfigForm}onConfigurationSet(e){this.createRelationConfigForm=this.fb.group({direction:[e?e.direction:null,[D.required]],entityType:[e?e.entityType:null,[D.required]],entityNamePattern:[e?e.entityNamePattern:null,[]],entityTypePattern:[e?e.entityTypePattern:null,[]],relationType:[e?e.relationType:null,[D.required]],createEntityIfNotExists:[!!e&&e.createEntityIfNotExists,[]],removeCurrentRelations:[!!e&&e.removeCurrentRelations,[]],changeOriginatorToRelatedEntity:[!!e&&e.changeOriginatorToRelatedEntity,[]],entityCacheExpiration:[e?e.entityCacheExpiration:null,[D.required,D.min(0)]]})}validatorTriggers(){return["entityType"]}updateValidators(e){const t=this.createRelationConfigForm.get("entityType").value;t?this.createRelationConfigForm.get("entityNamePattern").setValidators([D.required,D.pattern(/.*\S.*/)]):this.createRelationConfigForm.get("entityNamePattern").setValidators([]),!t||t!==x.DEVICE&&t!==x.ASSET?this.createRelationConfigForm.get("entityTypePattern").setValidators([]):this.createRelationConfigForm.get("entityTypePattern").setValidators([D.required,D.pattern(/.*\S.*/)]),this.createRelationConfigForm.get("entityNamePattern").updateValueAndValidity({emitEvent:e}),this.createRelationConfigForm.get("entityTypePattern").updateValueAndValidity({emitEvent:e})}prepareOutputConfig(e){return e.entityNamePattern=e.entityNamePattern?e.entityNamePattern.trim():null,e.entityTypePattern=e.entityTypePattern?e.entityTypePattern.trim():null,e}}e("CreateRelationConfigComponent",tt),tt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:tt,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),tt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:tt,selector:"tb-action-node-create-relation-config",usesInheritance:!0,ngImport:t,template:'
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }}\n \n \n \n
\n \n \n \n tb.rulenode.entity-name-pattern\n \n \n {{ \'tb.rulenode.entity-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.entity-type-pattern\n \n \n {{ \'tb.rulenode.entity-type-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n \n tb.rulenode.relation-type-pattern\n \n \n {{ \'tb.rulenode.relation-type-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n \n {{ \'tb.rulenode.create-entity-if-not-exists\' | translate }}\n \n
tb.rulenode.create-entity-if-not-exists-hint
\n
\n \n {{ \'tb.rulenode.remove-current-relations\' | translate }}\n \n
tb.rulenode.remove-current-relations-hint
\n \n {{ \'tb.rulenode.change-originator-to-related-entity\' | translate }}\n \n
tb.rulenode.change-originator-to-related-entity-hint
\n \n tb.rulenode.entity-cache-expiration\n \n \n {{ \'tb.rulenode.entity-cache-expiration-required\' | translate }}\n \n \n {{ \'tb.rulenode.entity-cache-expiration-range\' | translate }}\n \n tb.rulenode.entity-cache-expiration-hint\n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:de.EntityTypeSelectComponent,selector:"tb-entity-type-select",inputs:["allowedEntityTypes","useAliasEntityTypes","filterAllowedEntityTypes","showLabel","required","disabled"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:tt,decorators:[{type:n,args:[{selector:"tb-action-node-create-relation-config",template:'
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }}\n \n \n \n
\n \n \n \n tb.rulenode.entity-name-pattern\n \n \n {{ \'tb.rulenode.entity-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.entity-type-pattern\n \n \n {{ \'tb.rulenode.entity-type-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n \n tb.rulenode.relation-type-pattern\n \n \n {{ \'tb.rulenode.relation-type-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n \n {{ \'tb.rulenode.create-entity-if-not-exists\' | translate }}\n \n
tb.rulenode.create-entity-if-not-exists-hint
\n
\n \n {{ \'tb.rulenode.remove-current-relations\' | translate }}\n \n
tb.rulenode.remove-current-relations-hint
\n \n {{ \'tb.rulenode.change-originator-to-related-entity\' | translate }}\n \n
tb.rulenode.change-originator-to-related-entity-hint
\n \n tb.rulenode.entity-cache-expiration\n \n \n {{ \'tb.rulenode.entity-cache-expiration-required\' | translate }}\n \n \n {{ \'tb.rulenode.entity-cache-expiration-range\' | translate }}\n \n tb.rulenode.entity-cache-expiration-hint\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class nt extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.directionTypes=Object.keys(g),this.directionTypeTranslations=y,this.entityType=x}configForm(){return this.deleteRelationConfigForm}onConfigurationSet(e){this.deleteRelationConfigForm=this.fb.group({deleteForSingleEntity:[!!e&&e.deleteForSingleEntity,[]],direction:[e?e.direction:null,[D.required]],entityType:[e?e.entityType:null,[]],entityNamePattern:[e?e.entityNamePattern:null,[]],relationType:[e?e.relationType:null,[D.required]],entityCacheExpiration:[e?e.entityCacheExpiration:null,[D.required,D.min(0)]]})}validatorTriggers(){return["deleteForSingleEntity","entityType"]}updateValidators(e){const t=this.deleteRelationConfigForm.get("deleteForSingleEntity").value,n=this.deleteRelationConfigForm.get("entityType").value;t?this.deleteRelationConfigForm.get("entityType").setValidators([D.required]):this.deleteRelationConfigForm.get("entityType").setValidators([]),t&&n?this.deleteRelationConfigForm.get("entityNamePattern").setValidators([D.required,D.pattern(/.*\S.*/)]):this.deleteRelationConfigForm.get("entityNamePattern").setValidators([]),this.deleteRelationConfigForm.get("entityType").updateValueAndValidity({emitEvent:!1}),this.deleteRelationConfigForm.get("entityNamePattern").updateValueAndValidity({emitEvent:e})}prepareOutputConfig(e){return e.entityNamePattern=e.entityNamePattern?e.entityNamePattern.trim():null,e}}e("DeleteRelationConfigComponent",nt),nt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:nt,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),nt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:nt,selector:"tb-action-node-delete-relation-config",usesInheritance:!0,ngImport:t,template:'
\n \n {{ \'tb.rulenode.delete-relation-to-specific-entity\' | translate }}\n \n
tb.rulenode.delete-relation-hint
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }}\n \n \n \n
\n \n \n \n tb.rulenode.entity-name-pattern\n \n \n {{ \'tb.rulenode.entity-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n \n tb.rulenode.relation-type-pattern\n \n \n {{ \'tb.rulenode.relation-type-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.entity-cache-expiration\n \n \n {{ \'tb.rulenode.entity-cache-expiration-required\' | translate }}\n \n \n {{ \'tb.rulenode.entity-cache-expiration-range\' | translate }}\n \n tb.rulenode.entity-cache-expiration-hint\n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:de.EntityTypeSelectComponent,selector:"tb-entity-type-select",inputs:["allowedEntityTypes","useAliasEntityTypes","filterAllowedEntityTypes","showLabel","required","disabled"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:nt,decorators:[{type:n,args:[{selector:"tb-action-node-delete-relation-config",template:'
\n \n {{ \'tb.rulenode.delete-relation-to-specific-entity\' | translate }}\n \n
tb.rulenode.delete-relation-hint
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }}\n \n \n \n
\n \n \n \n tb.rulenode.entity-name-pattern\n \n \n {{ \'tb.rulenode.entity-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n \n tb.rulenode.relation-type-pattern\n \n \n {{ \'tb.rulenode.relation-type-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.entity-cache-expiration\n \n \n {{ \'tb.rulenode.entity-cache-expiration-required\' | translate }}\n \n \n {{ \'tb.rulenode.entity-cache-expiration-range\' | translate }}\n \n tb.rulenode.entity-cache-expiration-hint\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class rt extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.deviceProfile}onConfigurationSet(e){this.deviceProfile=this.fb.group({persistAlarmRulesState:[!!e&&e.persistAlarmRulesState,D.required],fetchAlarmRulesStateOnStart:[!!e&&e.fetchAlarmRulesStateOnStart,D.required]})}}e("DeviceProfileConfigComponent",rt),rt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:rt,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),rt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:rt,selector:"tb-device-profile-config",usesInheritance:!0,ngImport:t,template:'
\n \n {{ \'tb.rulenode.persist-alarm-rules\' | translate }}\n \n \n {{ \'tb.rulenode.fetch-alarm-rules\' | translate }}\n \n
\n',dependencies:[{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:rt,decorators:[{type:n,args:[{selector:"tb-device-profile-config",template:'
\n \n {{ \'tb.rulenode.persist-alarm-rules\' | translate }}\n \n \n {{ \'tb.rulenode.fetch-alarm-rules\' | translate }}\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class ot extends s{constructor(e,t,n,o){super(e),this.store=e,this.fb=t,this.nodeScriptTestService=n,this.translate=o,this.tbelEnabled=Y(this.store).tbelEnabled,this.scriptLanguage=d,this.changeScript=new r,this.hasScript=!0,this.testScriptLabel="tb.rulenode.test-generator-function",this.serviceType=p.TB_RULE_ENGINE}configForm(){return this.generatorConfigForm}onConfigurationSet(e){this.generatorConfigForm=this.fb.group({msgCount:[e?e.msgCount:null,[D.required,D.min(0)]],periodInSeconds:[e?e.periodInSeconds:null,[D.required,D.min(1)]],originator:[e?e.originator:null,[]],scriptLang:[e?e.scriptLang:d.JS,[D.required]],jsScript:[e?e.jsScript:null,[]],tbelScript:[e?e.tbelScript:null,[]],queueName:[e?e.queueName:null,[]]})}validatorTriggers(){return["scriptLang"]}updateValidators(e){let t=this.generatorConfigForm.get("scriptLang").value;t!==d.TBEL||this.tbelEnabled||(t=d.JS,this.generatorConfigForm.get("scriptLang").patchValue(t,{emitEvent:!1}),setTimeout((()=>{this.generatorConfigForm.updateValueAndValidity({emitEvent:!0})}))),this.generatorConfigForm.get("jsScript").setValidators(t===d.JS?[D.required]:[]),this.generatorConfigForm.get("jsScript").updateValueAndValidity({emitEvent:e}),this.generatorConfigForm.get("tbelScript").setValidators(t===d.TBEL?[D.required]:[]),this.generatorConfigForm.get("tbelScript").updateValueAndValidity({emitEvent:e})}prepareInputConfig(e){return e&&(e.scriptLang||(e.scriptLang=d.JS),e.originatorId&&e.originatorType?e.originator={id:e.originatorId,entityType:e.originatorType}:e.originator=null,delete e.originatorId,delete e.originatorType),e}prepareOutputConfig(e){return e.originator?(e.originatorId=e.originator.id,e.originatorType=e.originator.entityType):(e.originatorId=null,e.originatorType=null),delete e.originator,e}testScript(e){const t=this.generatorConfigForm.get("scriptLang").value,n=t===d.JS?"jsScript":"tbelScript",r=t===d.JS?"rulenode/generator_node_script_fn":"rulenode/tbel/generator_node_script_fn",o=this.generatorConfigForm.get(n).value;this.nodeScriptTestService.testNodeScript(o,"generate",this.translate.instant("tb.rulenode.generator"),"Generate",["prevMsg","prevMetadata","prevMsgType"],this.ruleNodeId,r,t,e).subscribe((e=>{e&&(this.generatorConfigForm.get(n).setValue(e),this.changeScript.emit())}))}onValidate(){this.generatorConfigForm.get("scriptLang").value===d.JS&&this.jsFuncComponent.validateOnSubmit()}}var at;e("GeneratorConfigComponent",ot),ot.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ot,deps:[{token:G.Store},{token:E.UntypedFormBuilder},{token:W.NodeScriptTestService},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),ot.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:ot,selector:"tb-action-node-generator-config",viewQueries:[{propertyName:"jsFuncComponent",first:!0,predicate:["jsFuncComponent"],descendants:!0},{propertyName:"tbelFuncComponent",first:!0,predicate:["tbelFuncComponent"],descendants:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.message-count\n \n \n {{ \'tb.rulenode.message-count-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-message-count-message\' | translate }}\n \n \n \n tb.rulenode.period-seconds\n \n \n {{ \'tb.rulenode.period-seconds-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-period-seconds-message\' | translate }}\n \n \n
\n \n \n \n
\n\n \n \n\n \n \n \n \n \n \n \n
\n \n
\n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:ce.EntitySelectComponent,selector:"tb-entity-select",inputs:["allowedEntityTypes","useAliasEntityTypes","required","disabled"]},{kind:"component",type:J.QueueAutocompleteComponent,selector:"tb-queue-autocomplete",inputs:["labelText","requiredText","autocompleteHint","subscriptSizing","required","queueType","disabled"]},{kind:"component",type:ne.JsFuncComponent,selector:"tb-js-func",inputs:["functionTitle","functionName","functionArgs","validationArgs","resultType","disabled","fillHeight","minHeight","editorCompleter","globalVariables","disableUndefinedCheck","helpId","scriptLanguage","noValidate","required"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:ie.TbScriptLangComponent,selector:"tb-script-lang",inputs:["disabled"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ot,decorators:[{type:n,args:[{selector:"tb-action-node-generator-config",template:'
\n \n tb.rulenode.message-count\n \n \n {{ \'tb.rulenode.message-count-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-message-count-message\' | translate }}\n \n \n \n tb.rulenode.period-seconds\n \n \n {{ \'tb.rulenode.period-seconds-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-period-seconds-message\' | translate }}\n \n \n
\n \n \n \n
\n\n \n \n\n \n \n \n \n \n \n \n
\n \n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder},{type:W.NodeScriptTestService},{type:H.TranslateService}]},propDecorators:{jsFuncComponent:[{type:o,args:["jsFuncComponent",{static:!1}]}],tbelFuncComponent:[{type:o,args:["tbelFuncComponent",{static:!1}]}]}}),function(e){e.CUSTOMER="CUSTOMER",e.TENANT="TENANT",e.RELATED="RELATED",e.ALARM_ORIGINATOR="ALARM_ORIGINATOR",e.ENTITY="ENTITY"}(at||(at={}));const it=new Map([[at.CUSTOMER,"tb.rulenode.originator-customer"],[at.TENANT,"tb.rulenode.originator-tenant"],[at.RELATED,"tb.rulenode.originator-related"],[at.ALARM_ORIGINATOR,"tb.rulenode.originator-alarm-originator"],[at.ENTITY,"tb.rulenode.originator-entity"]]),lt=[b.createdTime,b.name,b.type,b.firstName,b.lastName,b.email,b.title,b.country,b.state,b.city,b.address,b.address2,b.zip,b.phone,b.label,{value:"id",name:"tb.rulenode.id",keyName:"id"},{value:"additionalInfo",name:"tb.rulenode.additional-info",keyName:"additionalInfo"}];var st;!function(e){e.CIRCLE="CIRCLE",e.POLYGON="POLYGON"}(st||(st={}));const mt=new Map([[st.CIRCLE,"tb.rulenode.perimeter-circle"],[st.POLYGON,"tb.rulenode.perimeter-polygon"]]);var ut;!function(e){e.MILLISECONDS="MILLISECONDS",e.SECONDS="SECONDS",e.MINUTES="MINUTES",e.HOURS="HOURS",e.DAYS="DAYS"}(ut||(ut={}));const pt=new Map([[ut.MILLISECONDS,"tb.rulenode.time-unit-milliseconds"],[ut.SECONDS,"tb.rulenode.time-unit-seconds"],[ut.MINUTES,"tb.rulenode.time-unit-minutes"],[ut.HOURS,"tb.rulenode.time-unit-hours"],[ut.DAYS,"tb.rulenode.time-unit-days"]]);var dt;!function(e){e.METER="METER",e.KILOMETER="KILOMETER",e.FOOT="FOOT",e.MILE="MILE",e.NAUTICAL_MILE="NAUTICAL_MILE"}(dt||(dt={}));const ct=new Map([[dt.METER,"tb.rulenode.range-unit-meter"],[dt.KILOMETER,"tb.rulenode.range-unit-kilometer"],[dt.FOOT,"tb.rulenode.range-unit-foot"],[dt.MILE,"tb.rulenode.range-unit-mile"],[dt.NAUTICAL_MILE,"tb.rulenode.range-unit-nautical-mile"]]);var ft;!function(e){e.ID="ID",e.TITLE="TITLE",e.COUNTRY="COUNTRY",e.STATE="STATE",e.CITY="CITY",e.ZIP="ZIP",e.ADDRESS="ADDRESS",e.ADDRESS2="ADDRESS2",e.PHONE="PHONE",e.EMAIL="EMAIL",e.ADDITIONAL_INFO="ADDITIONAL_INFO"}(ft||(ft={}));const gt=new Map([[ft.ID,"tb.rulenode.entity-details-id"],[ft.TITLE,"tb.rulenode.entity-details-title"],[ft.COUNTRY,"tb.rulenode.entity-details-country"],[ft.STATE,"tb.rulenode.entity-details-state"],[ft.CITY,"tb.rulenode.entity-details-city"],[ft.ZIP,"tb.rulenode.entity-details-zip"],[ft.ADDRESS,"tb.rulenode.entity-details-address"],[ft.ADDRESS2,"tb.rulenode.entity-details-address2"],[ft.PHONE,"tb.rulenode.entity-details-phone"],[ft.EMAIL,"tb.rulenode.entity-details-email"],[ft.ADDITIONAL_INFO,"tb.rulenode.entity-details-additional_info"]]);var yt;!function(e){e.FIRST="FIRST",e.LAST="LAST",e.ALL="ALL"}(yt||(yt={}));const xt=new Map([[yt.FIRST,"tb.rulenode.first"],[yt.LAST,"tb.rulenode.last"],[yt.ALL,"tb.rulenode.all"]]),bt=new Map([[yt.FIRST,"tb.rulenode.first-mode-hint"],[yt.LAST,"tb.rulenode.last-mode-hint"],[yt.ALL,"tb.rulenode.all-mode-hint"]]);var ht,vt;!function(e){e.ASC="ASC",e.DESC="DESC"}(ht||(ht={})),function(e){e.ATTRIBUTES="ATTRIBUTES",e.LATEST_TELEMETRY="LATEST_TELEMETRY",e.FIELDS="FIELDS"}(vt||(vt={}));const Ct=new Map([[vt.ATTRIBUTES,"tb.rulenode.attributes"],[vt.LATEST_TELEMETRY,"tb.rulenode.latest-telemetry"],[vt.FIELDS,"tb.rulenode.fields"]]),Ft=new Map([[vt.ATTRIBUTES,"tb.rulenode.add-mapped-attribute-to"],[vt.LATEST_TELEMETRY,"tb.rulenode.add-mapped-latest-telemetry-to"],[vt.FIELDS,"tb.rulenode.add-mapped-fields-to"]]),kt=new Map([[ht.ASC,"tb.rulenode.ascending"],[ht.DESC,"tb.rulenode.descending"]]);var Lt;!function(e){e.STANDARD="STANDARD",e.FIFO="FIFO"}(Lt||(Lt={}));const Tt=new Map([[Lt.STANDARD,"tb.rulenode.sqs-queue-standard"],[Lt.FIFO,"tb.rulenode.sqs-queue-fifo"]]),It=["anonymous","basic","cert.PEM"],Nt=new Map([["anonymous","tb.rulenode.credentials-anonymous"],["basic","tb.rulenode.credentials-basic"],["cert.PEM","tb.rulenode.credentials-pem"]]),St=["sas","cert.PEM"],qt=new Map([["sas","tb.rulenode.credentials-sas"],["cert.PEM","tb.rulenode.credentials-pem"]]);var At;!function(e){e.GET="GET",e.POST="POST",e.PUT="PUT",e.DELETE="DELETE"}(At||(At={}));const Mt=["US-ASCII","ISO-8859-1","UTF-8","UTF-16BE","UTF-16LE","UTF-16"],Gt=new Map([["US-ASCII","tb.rulenode.charset-us-ascii"],["ISO-8859-1","tb.rulenode.charset-iso-8859-1"],["UTF-8","tb.rulenode.charset-utf-8"],["UTF-16BE","tb.rulenode.charset-utf-16be"],["UTF-16LE","tb.rulenode.charset-utf-16le"],["UTF-16","tb.rulenode.charset-utf-16"]]);var Et;!function(e){e.CUSTOM="CUSTOM",e.ADD="ADD",e.SUB="SUB",e.MULT="MULT",e.DIV="DIV",e.SIN="SIN",e.SINH="SINH",e.COS="COS",e.COSH="COSH",e.TAN="TAN",e.TANH="TANH",e.ACOS="ACOS",e.ASIN="ASIN",e.ATAN="ATAN",e.ATAN2="ATAN2",e.EXP="EXP",e.EXPM1="EXPM1",e.SQRT="SQRT",e.CBRT="CBRT",e.GET_EXP="GET_EXP",e.HYPOT="HYPOT",e.LOG="LOG",e.LOG10="LOG10",e.LOG1P="LOG1P",e.CEIL="CEIL",e.FLOOR="FLOOR",e.FLOOR_DIV="FLOOR_DIV",e.FLOOR_MOD="FLOOR_MOD",e.ABS="ABS",e.MIN="MIN",e.MAX="MAX",e.POW="POW",e.SIGNUM="SIGNUM",e.RAD="RAD",e.DEG="DEG"}(Et||(Et={}));const Dt=new Map([[Et.CUSTOM,{value:Et.CUSTOM,name:"Custom Function",description:"Use this function to specify complex mathematical expression.",minArgs:1,maxArgs:16}],[Et.ADD,{value:Et.ADD,name:"Addition",description:"x + y",minArgs:2,maxArgs:2}],[Et.SUB,{value:Et.SUB,name:"Subtraction",description:"x - y",minArgs:2,maxArgs:2}],[Et.MULT,{value:Et.MULT,name:"Multiplication",description:"x * y",minArgs:2,maxArgs:2}],[Et.DIV,{value:Et.DIV,name:"Division",description:"x / y",minArgs:2,maxArgs:2}],[Et.SIN,{value:Et.SIN,name:"Sine",description:"Returns the trigonometric sine of an angle in radians.",minArgs:1,maxArgs:1}],[Et.SINH,{value:Et.SINH,name:"Hyperbolic sine",description:"Returns the hyperbolic sine of an argument.",minArgs:1,maxArgs:1}],[Et.COS,{value:Et.COS,name:"Cosine",description:"Returns the trigonometric cosine of an angle in radians.",minArgs:1,maxArgs:1}],[Et.COSH,{value:Et.COSH,name:"Hyperbolic cosine",description:"Returns the hyperbolic cosine of an argument.",minArgs:1,maxArgs:1}],[Et.TAN,{value:Et.TAN,name:"Tangent",description:"Returns the trigonometric tangent of an angle in radians",minArgs:1,maxArgs:1}],[Et.TANH,{value:Et.TANH,name:"Hyperbolic tangent",description:"Returns the hyperbolic tangent of an argument",minArgs:1,maxArgs:1}],[Et.ACOS,{value:Et.ACOS,name:"Arc cosine",description:"Returns the arc cosine of an argument",minArgs:1,maxArgs:1}],[Et.ASIN,{value:Et.ASIN,name:"Arc sine",description:"Returns the arc sine of an argument",minArgs:1,maxArgs:1}],[Et.ATAN,{value:Et.ATAN,name:"Arc tangent",description:"Returns the arc tangent of an argument",minArgs:1,maxArgs:1}],[Et.ATAN2,{value:Et.ATAN2,name:"2-argument arc tangent",description:"Returns the angle theta from the conversion of rectangular coordinates (x, y) to polar coordinates (r, theta)",minArgs:2,maxArgs:2}],[Et.EXP,{value:Et.EXP,name:"Exponential",description:"Returns Euler's number e raised to the power of an argument",minArgs:1,maxArgs:1}],[Et.EXPM1,{value:Et.EXPM1,name:"Exponential minus one",description:"Returns Euler's number e raised to the power of an argument minus one",minArgs:1,maxArgs:1}],[Et.SQRT,{value:Et.SQRT,name:"Square",description:"Returns the correctly rounded positive square root of an argument",minArgs:1,maxArgs:1}],[Et.CBRT,{value:Et.CBRT,name:"Cube root",description:"Returns the cube root of an argument",minArgs:1,maxArgs:1}],[Et.GET_EXP,{value:Et.GET_EXP,name:"Get exponent",description:"Returns the unbiased exponent used in the representation of an argument",minArgs:1,maxArgs:1}],[Et.HYPOT,{value:Et.HYPOT,name:"Square root",description:"Returns the square root of the squares of the arguments",minArgs:2,maxArgs:2}],[Et.LOG,{value:Et.LOG,name:"Logarithm",description:"Returns the natural logarithm of an argument",minArgs:1,maxArgs:1}],[Et.LOG10,{value:Et.LOG10,name:"Base 10 logarithm",description:"Returns the base 10 logarithm of an argument",minArgs:1,maxArgs:1}],[Et.LOG1P,{value:Et.LOG1P,name:"Logarithm of the sum",description:"Returns the natural logarithm of the sum of an argument",minArgs:1,maxArgs:1}],[Et.CEIL,{value:Et.CEIL,name:"Ceiling",description:"Returns the smallest (closest to negative infinity) of an argument",minArgs:1,maxArgs:1}],[Et.FLOOR,{value:Et.FLOOR,name:"Floor",description:"Returns the largest (closest to positive infinity) of an argument",minArgs:1,maxArgs:1}],[Et.FLOOR_DIV,{value:Et.FLOOR_DIV,name:"Floor division",description:"Returns the largest (closest to positive infinity) of the arguments",minArgs:2,maxArgs:2}],[Et.FLOOR_MOD,{value:Et.FLOOR_MOD,name:"Floor modulus",description:"Returns the floor modulus of the arguments",minArgs:2,maxArgs:2}],[Et.ABS,{value:Et.ABS,name:"Absolute",description:"Returns the absolute value of an argument",minArgs:1,maxArgs:1}],[Et.MIN,{value:Et.MIN,name:"Min",description:"Returns the smaller of the arguments",minArgs:2,maxArgs:2}],[Et.MAX,{value:Et.MAX,name:"Max",description:"Returns the greater of the arguments",minArgs:2,maxArgs:2}],[Et.POW,{value:Et.POW,name:"Raise to a power",description:"Returns the value of the first argument raised to the power of the second argument",minArgs:2,maxArgs:2}],[Et.SIGNUM,{value:Et.SIGNUM,name:"Sign of a real number",description:"Returns the signum function of the argument",minArgs:1,maxArgs:1}],[Et.RAD,{value:Et.RAD,name:"Radian",description:"Converts an angle measured in degrees to an approximately equivalent angle measured in radians",minArgs:1,maxArgs:1}],[Et.DEG,{value:Et.DEG,name:"Degrees",description:"Converts an angle measured in radians to an approximately equivalent angle measured in degrees.",minArgs:1,maxArgs:1}]]);var Vt,Pt,wt;!function(e){e.MESSAGE_BODY="MESSAGE_BODY",e.MESSAGE_METADATA="MESSAGE_METADATA",e.ATTRIBUTE="ATTRIBUTE",e.TIME_SERIES="TIME_SERIES",e.CONSTANT="CONSTANT"}(Vt||(Vt={})),function(e){e.MESSAGE_BODY="MESSAGE_BODY",e.MESSAGE_METADATA="MESSAGE_METADATA",e.ATTRIBUTE="ATTRIBUTE",e.TIME_SERIES="TIME_SERIES"}(Pt||(Pt={})),function(e){e.DATA="DATA",e.METADATA="METADATA"}(wt||(wt={}));const Rt=new Map([[wt.DATA,"tb.rulenode.message"],[wt.METADATA,"tb.rulenode.metadata"]]),Ot=new Map([[Vt.MESSAGE_BODY,{name:"tb.rulenode.message-body-type",description:"Fetch argument value from incoming message"}],[Vt.MESSAGE_METADATA,{name:"tb.rulenode.message-metadata-type",description:"Fetch argument value from incoming message metadata"}],[Vt.ATTRIBUTE,{name:"tb.rulenode.attribute-type",description:"Fetch attribute value from database"}],[Vt.TIME_SERIES,{name:"tb.rulenode.time-series-type",description:"Fetch latest time-series value from database"}],[Vt.CONSTANT,{name:"tb.rulenode.constant-type",description:"Define constant value"}]]),Bt=new Map([[Pt.MESSAGE_BODY,{name:"tb.rulenode.message-body-type",description:"Add result to the outgoing message"}],[Pt.MESSAGE_METADATA,{name:"tb.rulenode.message-metadata-type",description:"Add result to the outgoing message metadata"}],[Pt.ATTRIBUTE,{name:"tb.rulenode.attribute-type",description:"Store result as an entity attribute in the database"}],[Pt.TIME_SERIES,{name:"tb.rulenode.time-series-type",description:"Store result as an entity time-series in the database"}]]),Kt=["x","y","z","a","b","c","d","k","l","m","n","o","p","r","s","t"];var Ut,_t;!function(e){e.SHARED_SCOPE="SHARED_SCOPE",e.SERVER_SCOPE="SERVER_SCOPE",e.CLIENT_SCOPE="CLIENT_SCOPE"}(Ut||(Ut={})),function(e){e.SHARED_SCOPE="SHARED_SCOPE",e.SERVER_SCOPE="SERVER_SCOPE"}(_t||(_t={}));const Ht=new Map([[Ut.SHARED_SCOPE,"tb.rulenode.shared-scope"],[Ut.SERVER_SCOPE,"tb.rulenode.server-scope"],[Ut.CLIENT_SCOPE,"tb.rulenode.client-scope"]]);class zt extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.perimeterType=st,this.perimeterTypes=Object.keys(st),this.perimeterTypeTranslationMap=mt,this.rangeUnits=Object.keys(dt),this.rangeUnitTranslationMap=ct,this.timeUnits=Object.keys(ut),this.timeUnitsTranslationMap=pt}configForm(){return this.geoActionConfigForm}onConfigurationSet(e){this.geoActionConfigForm=this.fb.group({latitudeKeyName:[e?e.latitudeKeyName:null,[D.required]],longitudeKeyName:[e?e.longitudeKeyName:null,[D.required]],perimeterType:[e?e.perimeterType:null,[D.required]],fetchPerimeterInfoFromMessageMetadata:[!!e&&e.fetchPerimeterInfoFromMessageMetadata,[]],perimeterKeyName:[e?e.perimeterKeyName:null,[]],centerLatitude:[e?e.centerLatitude:null,[]],centerLongitude:[e?e.centerLatitude:null,[]],range:[e?e.range:null,[]],rangeUnit:[e?e.rangeUnit:null,[]],polygonsDefinition:[e?e.polygonsDefinition:null,[]],minInsideDuration:[e?e.minInsideDuration:null,[D.required,D.min(1),D.max(2147483647)]],minInsideDurationTimeUnit:[e?e.minInsideDurationTimeUnit:null,[D.required]],minOutsideDuration:[e?e.minOutsideDuration:null,[D.required,D.min(1),D.max(2147483647)]],minOutsideDurationTimeUnit:[e?e.minOutsideDurationTimeUnit:null,[D.required]]})}validatorTriggers(){return["fetchPerimeterInfoFromMessageMetadata","perimeterType"]}updateValidators(e){const t=this.geoActionConfigForm.get("fetchPerimeterInfoFromMessageMetadata").value,n=this.geoActionConfigForm.get("perimeterType").value;t?this.geoActionConfigForm.get("perimeterKeyName").setValidators([D.required]):this.geoActionConfigForm.get("perimeterKeyName").setValidators([]),t||n!==st.CIRCLE?(this.geoActionConfigForm.get("centerLatitude").setValidators([]),this.geoActionConfigForm.get("centerLongitude").setValidators([]),this.geoActionConfigForm.get("range").setValidators([]),this.geoActionConfigForm.get("rangeUnit").setValidators([])):(this.geoActionConfigForm.get("centerLatitude").setValidators([D.required,D.min(-90),D.max(90)]),this.geoActionConfigForm.get("centerLongitude").setValidators([D.required,D.min(-180),D.max(180)]),this.geoActionConfigForm.get("range").setValidators([D.required,D.min(0)]),this.geoActionConfigForm.get("rangeUnit").setValidators([D.required])),t||n!==st.POLYGON?this.geoActionConfigForm.get("polygonsDefinition").setValidators([]):this.geoActionConfigForm.get("polygonsDefinition").setValidators([D.required]),this.geoActionConfigForm.get("perimeterKeyName").updateValueAndValidity({emitEvent:e}),this.geoActionConfigForm.get("centerLatitude").updateValueAndValidity({emitEvent:e}),this.geoActionConfigForm.get("centerLongitude").updateValueAndValidity({emitEvent:e}),this.geoActionConfigForm.get("range").updateValueAndValidity({emitEvent:e}),this.geoActionConfigForm.get("rangeUnit").updateValueAndValidity({emitEvent:e}),this.geoActionConfigForm.get("polygonsDefinition").updateValueAndValidity({emitEvent:e})}}e("GpsGeoActionConfigComponent",zt),zt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:zt,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),zt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:zt,selector:"tb-action-node-gps-geofencing-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.latitude-key-name\n \n \n {{ \'tb.rulenode.latitude-key-name-required\' | translate }}\n \n \n \n tb.rulenode.longitude-key-name\n \n \n {{ \'tb.rulenode.longitude-key-name-required\' | translate }}\n \n \n \n tb.rulenode.perimeter-type\n \n \n {{ perimeterTypeTranslationMap.get(type) | translate }}\n \n \n \n \n {{ \'tb.rulenode.fetch-perimeter-info-from-metadata\' | translate }}\n \n \n tb.rulenode.perimeter-key-name\n \n \n {{ \'tb.rulenode.perimeter-key-name-required\' | translate }}\n \n \n
\n
\n \n tb.rulenode.circle-center-latitude\n \n \n {{ \'tb.rulenode.circle-center-latitude-required\' | translate }}\n \n \n \n tb.rulenode.circle-center-longitude\n \n \n {{ \'tb.rulenode.circle-center-longitude-required\' | translate }}\n \n \n
\n
\n \n tb.rulenode.range\n \n \n {{ \'tb.rulenode.range-required\' | translate }}\n \n \n \n tb.rulenode.range-units\n \n \n {{ rangeUnitTranslationMap.get(type) | translate }}\n \n \n \n
\n
\n
\n \n tb.rulenode.polygon-definition\n \n \n {{ \'tb.rulenode.polygon-definition-required\' | translate }}\n \n \n
\n
\n \n tb.rulenode.min-inside-duration\n \n \n {{ \'tb.rulenode.min-inside-duration-value-required\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n \n tb.rulenode.min-inside-duration-time-unit\n \n \n {{ timeUnitsTranslationMap.get(timeUnit) | translate }}\n \n \n \n
\n
\n \n tb.rulenode.min-outside-duration\n \n \n {{ \'tb.rulenode.min-outside-duration-value-required\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n \n tb.rulenode.min-outside-duration-time-unit\n \n \n {{ timeUnitsTranslationMap.get(timeUnit) | translate }}\n \n \n \n
\n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.MaxValidator,selector:"input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",inputs:["max"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:zt,decorators:[{type:n,args:[{selector:"tb-action-node-gps-geofencing-config",template:'
\n \n tb.rulenode.latitude-key-name\n \n \n {{ \'tb.rulenode.latitude-key-name-required\' | translate }}\n \n \n \n tb.rulenode.longitude-key-name\n \n \n {{ \'tb.rulenode.longitude-key-name-required\' | translate }}\n \n \n \n tb.rulenode.perimeter-type\n \n \n {{ perimeterTypeTranslationMap.get(type) | translate }}\n \n \n \n \n {{ \'tb.rulenode.fetch-perimeter-info-from-metadata\' | translate }}\n \n \n tb.rulenode.perimeter-key-name\n \n \n {{ \'tb.rulenode.perimeter-key-name-required\' | translate }}\n \n \n
\n
\n \n tb.rulenode.circle-center-latitude\n \n \n {{ \'tb.rulenode.circle-center-latitude-required\' | translate }}\n \n \n \n tb.rulenode.circle-center-longitude\n \n \n {{ \'tb.rulenode.circle-center-longitude-required\' | translate }}\n \n \n
\n
\n \n tb.rulenode.range\n \n \n {{ \'tb.rulenode.range-required\' | translate }}\n \n \n \n tb.rulenode.range-units\n \n \n {{ rangeUnitTranslationMap.get(type) | translate }}\n \n \n \n
\n
\n
\n \n tb.rulenode.polygon-definition\n \n \n {{ \'tb.rulenode.polygon-definition-required\' | translate }}\n \n \n
\n
\n \n tb.rulenode.min-inside-duration\n \n \n {{ \'tb.rulenode.min-inside-duration-value-required\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n \n tb.rulenode.min-inside-duration-time-unit\n \n \n {{ timeUnitsTranslationMap.get(timeUnit) | translate }}\n \n \n \n
\n
\n \n tb.rulenode.min-outside-duration\n \n \n {{ \'tb.rulenode.min-outside-duration-value-required\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n \n tb.rulenode.min-outside-duration-time-unit\n \n \n {{ timeUnitsTranslationMap.get(timeUnit) | translate }}\n \n \n \n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class jt extends s{constructor(e,t,n,o){super(e),this.store=e,this.fb=t,this.nodeScriptTestService=n,this.translate=o,this.tbelEnabled=Y(this.store).tbelEnabled,this.scriptLanguage=d,this.changeScript=new r,this.hasScript=!0,this.testScriptLabel="tb.rulenode.test-to-string-function"}configForm(){return this.logConfigForm}onConfigurationSet(e){this.logConfigForm=this.fb.group({scriptLang:[e?e.scriptLang:d.JS,[D.required]],jsScript:[e?e.jsScript:null,[]],tbelScript:[e?e.tbelScript:null,[]]})}validatorTriggers(){return["scriptLang"]}updateValidators(e){let t=this.logConfigForm.get("scriptLang").value;t!==d.TBEL||this.tbelEnabled||(t=d.JS,this.logConfigForm.get("scriptLang").patchValue(t,{emitEvent:!1}),setTimeout((()=>{this.logConfigForm.updateValueAndValidity({emitEvent:!0})}))),this.logConfigForm.get("jsScript").setValidators(t===d.JS?[D.required]:[]),this.logConfigForm.get("jsScript").updateValueAndValidity({emitEvent:e}),this.logConfigForm.get("tbelScript").setValidators(t===d.TBEL?[D.required]:[]),this.logConfigForm.get("tbelScript").updateValueAndValidity({emitEvent:e})}prepareInputConfig(e){return e&&(e.scriptLang||(e.scriptLang=d.JS)),e}testScript(e){const t=this.logConfigForm.get("scriptLang").value,n=t===d.JS?"jsScript":"tbelScript",r=t===d.JS?"rulenode/log_node_script_fn":"rulenode/tbel/log_node_script_fn",o=this.logConfigForm.get(n).value;this.nodeScriptTestService.testNodeScript(o,"string",this.translate.instant("tb.rulenode.to-string"),"ToString",["msg","metadata","msgType"],this.ruleNodeId,r,t,e).subscribe((e=>{e&&(this.logConfigForm.get(n).setValue(e),this.changeScript.emit())}))}onValidate(){this.logConfigForm.get("scriptLang").value===d.JS&&this.jsFuncComponent.validateOnSubmit()}}e("LogConfigComponent",jt),jt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:jt,deps:[{token:G.Store},{token:E.UntypedFormBuilder},{token:W.NodeScriptTestService},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),jt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:jt,selector:"tb-action-node-log-config",viewQueries:[{propertyName:"jsFuncComponent",first:!0,predicate:["jsFuncComponent"],descendants:!0},{propertyName:"tbelFuncComponent",first:!0,predicate:["tbelFuncComponent"],descendants:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n \n \n \n \n \n \n
\n \n
\n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:ne.JsFuncComponent,selector:"tb-js-func",inputs:["functionTitle","functionName","functionArgs","validationArgs","resultType","disabled","fillHeight","minHeight","editorCompleter","globalVariables","disableUndefinedCheck","helpId","scriptLanguage","noValidate","required"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:ie.TbScriptLangComponent,selector:"tb-script-lang",inputs:["disabled"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:jt,decorators:[{type:n,args:[{selector:"tb-action-node-log-config",template:'
\n \n \n \n \n \n \n \n
\n \n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder},{type:W.NodeScriptTestService},{type:H.TranslateService}]},propDecorators:{jsFuncComponent:[{type:o,args:["jsFuncComponent",{static:!1}]}],tbelFuncComponent:[{type:o,args:["tbelFuncComponent",{static:!1}]}]}});class Qt extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.msgCountConfigForm}onConfigurationSet(e){this.msgCountConfigForm=this.fb.group({interval:[e?e.interval:null,[D.required,D.min(1)]],telemetryPrefix:[e?e.telemetryPrefix:null,[D.required]]})}}e("MsgCountConfigComponent",Qt),Qt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Qt,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Qt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Qt,selector:"tb-action-node-msg-count-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.interval-seconds\n \n \n {{ \'tb.rulenode.interval-seconds-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-interval-seconds-message\' | translate }}\n \n \n \n tb.rulenode.output-timeseries-key-prefix\n \n \n {{ \'tb.rulenode.output-timeseries-key-prefix-required\' | translate }}\n \n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Qt,decorators:[{type:n,args:[{selector:"tb-action-node-msg-count-config",template:'
\n \n tb.rulenode.interval-seconds\n \n \n {{ \'tb.rulenode.interval-seconds-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-interval-seconds-message\' | translate }}\n \n \n \n tb.rulenode.output-timeseries-key-prefix\n \n \n {{ \'tb.rulenode.output-timeseries-key-prefix-required\' | translate }}\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class $t extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.msgDelayConfigForm}onConfigurationSet(e){this.msgDelayConfigForm=this.fb.group({useMetadataPeriodInSecondsPatterns:[!!e&&e.useMetadataPeriodInSecondsPatterns,[]],periodInSeconds:[e?e.periodInSeconds:null,[]],periodInSecondsPattern:[e?e.periodInSecondsPattern:null,[]],maxPendingMsgs:[e?e.maxPendingMsgs:null,[D.required,D.min(1),D.max(1e5)]]})}validatorTriggers(){return["useMetadataPeriodInSecondsPatterns"]}updateValidators(e){this.msgDelayConfigForm.get("useMetadataPeriodInSecondsPatterns").value?(this.msgDelayConfigForm.get("periodInSecondsPattern").setValidators([D.required]),this.msgDelayConfigForm.get("periodInSeconds").setValidators([])):(this.msgDelayConfigForm.get("periodInSecondsPattern").setValidators([]),this.msgDelayConfigForm.get("periodInSeconds").setValidators([D.required,D.min(0)])),this.msgDelayConfigForm.get("periodInSecondsPattern").updateValueAndValidity({emitEvent:e}),this.msgDelayConfigForm.get("periodInSeconds").updateValueAndValidity({emitEvent:e})}}e("MsgDelayConfigComponent",$t),$t.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:$t,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),$t.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:$t,selector:"tb-action-node-msg-delay-config",usesInheritance:!0,ngImport:t,template:'
\n \n {{ \'tb.rulenode.use-metadata-period-in-seconds-patterns\' | translate }}\n \n
tb.rulenode.use-metadata-period-in-seconds-patterns-hint
\n \n tb.rulenode.period-seconds\n \n \n {{ \'tb.rulenode.period-seconds-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-period-0-seconds-message\' | translate }}\n \n \n \n \n tb.rulenode.period-in-seconds-pattern\n \n \n {{ \'tb.rulenode.period-in-seconds-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n \n tb.rulenode.max-pending-messages\n \n \n {{ \'tb.rulenode.max-pending-messages-required\' | translate }}\n \n \n {{ \'tb.rulenode.max-pending-messages-range\' | translate }}\n \n \n {{ \'tb.rulenode.max-pending-messages-range\' | translate }}\n \n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.MaxValidator,selector:"input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",inputs:["max"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:$t,decorators:[{type:n,args:[{selector:"tb-action-node-msg-delay-config",template:'
\n \n {{ \'tb.rulenode.use-metadata-period-in-seconds-patterns\' | translate }}\n \n
tb.rulenode.use-metadata-period-in-seconds-patterns-hint
\n \n tb.rulenode.period-seconds\n \n \n {{ \'tb.rulenode.period-seconds-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-period-0-seconds-message\' | translate }}\n \n \n \n \n tb.rulenode.period-in-seconds-pattern\n \n \n {{ \'tb.rulenode.period-in-seconds-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n \n tb.rulenode.max-pending-messages\n \n \n {{ \'tb.rulenode.max-pending-messages-required\' | translate }}\n \n \n {{ \'tb.rulenode.max-pending-messages-range\' | translate }}\n \n \n {{ \'tb.rulenode.max-pending-messages-range\' | translate }}\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Jt extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.attributeScopes=Object.keys(m),this.telemetryTypeTranslationsMap=u}configForm(){return this.pushToCloudConfigForm}onConfigurationSet(e){this.pushToCloudConfigForm=this.fb.group({scope:[e?e.scope:null,[D.required]]})}}e("PushToCloudConfigComponent",Jt),Jt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Jt,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Jt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Jt,selector:"tb-action-node-push-to-cloud-config",usesInheritance:!0,ngImport:t,template:'
\n \n attribute.attributes-scope\n \n \n {{ telemetryTypeTranslationsMap.get(scope) | translate }}\n \n \n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Jt,decorators:[{type:n,args:[{selector:"tb-action-node-push-to-cloud-config",template:'
\n \n attribute.attributes-scope\n \n \n {{ telemetryTypeTranslationsMap.get(scope) | translate }}\n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Yt extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.attributeScopes=Object.keys(m),this.telemetryTypeTranslationsMap=u}configForm(){return this.pushToEdgeConfigForm}onConfigurationSet(e){this.pushToEdgeConfigForm=this.fb.group({scope:[e?e.scope:null,[D.required]]})}}e("PushToEdgeConfigComponent",Yt),Yt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Yt,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Yt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Yt,selector:"tb-action-node-push-to-edge-config",usesInheritance:!0,ngImport:t,template:'
\n \n attribute.attributes-scope\n \n \n {{ telemetryTypeTranslationsMap.get(scope) | translate }}\n \n \n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Yt,decorators:[{type:n,args:[{selector:"tb-action-node-push-to-edge-config",template:'
\n \n attribute.attributes-scope\n \n \n {{ telemetryTypeTranslationsMap.get(scope) | translate }}\n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Wt extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.rpcReplyConfigForm}onConfigurationSet(e){this.rpcReplyConfigForm=this.fb.group({requestIdMetaDataAttribute:[e?e.requestIdMetaDataAttribute:null,[]]})}}e("RpcReplyConfigComponent",Wt),Wt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Wt,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Wt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Wt,selector:"tb-action-node-rpc-reply-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.request-id-metadata-attribute\n \n \n
\n',dependencies:[{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Wt,decorators:[{type:n,args:[{selector:"tb-action-node-rpc-reply-config",template:'
\n \n tb.rulenode.request-id-metadata-attribute\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Xt extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.rpcRequestConfigForm}onConfigurationSet(e){this.rpcRequestConfigForm=this.fb.group({timeoutInSeconds:[e?e.timeoutInSeconds:null,[D.required,D.min(0)]]})}}e("RpcRequestConfigComponent",Xt),Xt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Xt,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Xt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Xt,selector:"tb-action-node-rpc-request-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.timeout-sec\n \n \n {{ \'tb.rulenode.timeout-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-timeout-message\' | translate }}\n \n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Xt,decorators:[{type:n,args:[{selector:"tb-action-node-rpc-request-config",template:'
\n \n tb.rulenode.timeout-sec\n \n \n {{ \'tb.rulenode.timeout-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-timeout-message\' | translate }}\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Zt extends h{get required(){return this.requiredValue}set required(e){this.requiredValue=fe(e)}constructor(e,t,n,r){super(e),this.store=e,this.translate=t,this.injector=n,this.fb=r,this.propagateChange=null,this.valueChangeSubscription=null}ngOnInit(){this.ngControl=this.injector.get(V),null!=this.ngControl&&(this.ngControl.valueAccessor=this),this.kvListFormGroup=this.fb.group({}),this.kvListFormGroup.addControl("keyVals",this.fb.array([]))}keyValsFormArray(){return this.kvListFormGroup.get("keyVals")}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}setDisabledState(e){this.disabled=e,this.disabled?this.kvListFormGroup.disable({emitEvent:!1}):this.kvListFormGroup.enable({emitEvent:!1})}writeValue(e){this.valueChangeSubscription&&this.valueChangeSubscription.unsubscribe();const t=[];if(e)for(const n of Object.keys(e))Object.prototype.hasOwnProperty.call(e,n)&&t.push(this.fb.group({key:[n,[D.required]],value:[e[n],[D.required]]}));this.kvListFormGroup.setControl("keyVals",this.fb.array(t)),this.valueChangeSubscription=this.kvListFormGroup.valueChanges.subscribe((()=>{this.updateModel()}))}removeKeyVal(e){this.kvListFormGroup.get("keyVals").removeAt(e)}addKeyVal(){this.kvListFormGroup.get("keyVals").push(this.fb.group({key:["",[D.required]],value:["",[D.required]]}))}validate(e){const t=this.kvListFormGroup.get("keyVals").value;if(!t.length&&this.required)return{kvMapRequired:!0};if(!this.kvListFormGroup.valid)return{kvFieldsRequired:!0};if(this.uniqueKeyValuePairValidator)for(const e of t)if(e.key===e.value)return{uniqueKeyValuePair:!0};return null}updateModel(){const e=this.kvListFormGroup.get("keyVals").value;if(this.required&&!e.length||!this.kvListFormGroup.valid)this.propagateChange(null);else{const t={};e.forEach((e=>{t[e.key]=e.value})),this.propagateChange(t)}}}e("KvMapConfigOldComponent",Zt),Zt.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Zt,deps:[{token:G.Store},{token:H.TranslateService},{token:t.Injector},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),Zt.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Zt,selector:"tb-kv-map-config-old",inputs:{disabled:"disabled",uniqueKeyValuePairValidator:"uniqueKeyValuePairValidator",requiredText:"requiredText",keyText:"keyText",keyRequiredText:"keyRequiredText",valText:"valText",valRequiredText:"valRequiredText",hintText:"hintText",required:"required"},providers:[{provide:P,useExisting:a((()=>Zt)),multi:!0},{provide:w,useExisting:a((()=>Zt)),multi:!0}],usesInheritance:!0,ngImport:t,template:'
\n
\n {{ keyText | translate }}\n {{ valText | translate }}\n \n
\n
\n
\n \n \n \n {{ keyRequiredText | translate }}\n \n \n \n \n \n {{ valRequiredText | translate }}\n \n \n \n
\n
\n
\n \n
\n \n
\n
\n',styles:[":host .tb-kv-map-config{margin-bottom:16px}:host .tb-kv-map-config .header{padding-left:5px;padding-right:5px;padding-bottom:5px}:host .tb-kv-map-config .header .cell{padding-left:5px;padding-right:5px;color:#757575;font-size:12px;font-weight:700;white-space:nowrap}:host .tb-kv-map-config .body{padding-left:5px;padding-right:5px;padding-bottom:0;max-height:300px;overflow:auto}:host .tb-kv-map-config .body .cell{padding-left:5px;padding-right:5px}:host .tb-kv-map-config tb-error{display:block;margin-top:-12px}\n"],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:ge.TbErrorComponent,selector:"tb-error",inputs:["noMargin","error"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultLayoutAlignDirective,selector:" [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]",inputs:["fxLayoutAlign","fxLayoutAlign.xs","fxLayoutAlign.sm","fxLayoutAlign.md","fxLayoutAlign.lg","fxLayoutAlign.xl","fxLayoutAlign.lt-sm","fxLayoutAlign.lt-md","fxLayoutAlign.lt-lg","fxLayoutAlign.lt-xl","fxLayoutAlign.gt-xs","fxLayoutAlign.gt-sm","fxLayoutAlign.gt-md","fxLayoutAlign.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:ye.DefaultShowHideDirective,selector:" [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]",inputs:["fxShow","fxShow.print","fxShow.xs","fxShow.sm","fxShow.md","fxShow.lg","fxShow.xl","fxShow.lt-sm","fxShow.lt-md","fxShow.lt-lg","fxShow.lt-xl","fxShow.gt-xs","fxShow.gt-sm","fxShow.gt-md","fxShow.gt-lg","fxHide","fxHide.print","fxHide.xs","fxHide.sm","fxHide.md","fxHide.lg","fxHide.xl","fxHide.lt-sm","fxHide.lt-md","fxHide.lt-lg","fxHide.lt-xl","fxHide.gt-xs","fxHide.gt-sm","fxHide.gt-md","fxHide.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormControlDirective,selector:"[formControl]",inputs:["formControl","disabled","ngModel"],outputs:["ngModelChange"],exportAs:["ngForm"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormArrayName,selector:"[formArrayName]",inputs:["formArrayName"]},{kind:"pipe",type:R.AsyncPipe,name:"async"},{kind:"pipe",type:pe.SafePipe,name:"safe"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Zt,decorators:[{type:n,args:[{selector:"tb-kv-map-config-old",providers:[{provide:P,useExisting:a((()=>Zt)),multi:!0},{provide:w,useExisting:a((()=>Zt)),multi:!0}],template:'
\n
\n {{ keyText | translate }}\n {{ valText | translate }}\n \n
\n
\n
\n \n \n \n {{ keyRequiredText | translate }}\n \n \n \n \n \n {{ valRequiredText | translate }}\n \n \n \n
\n
\n
\n \n
\n \n
\n
\n',styles:[":host .tb-kv-map-config{margin-bottom:16px}:host .tb-kv-map-config .header{padding-left:5px;padding-right:5px;padding-bottom:5px}:host .tb-kv-map-config .header .cell{padding-left:5px;padding-right:5px;color:#757575;font-size:12px;font-weight:700;white-space:nowrap}:host .tb-kv-map-config .body{padding-left:5px;padding-right:5px;padding-bottom:0;max-height:300px;overflow:auto}:host .tb-kv-map-config .body .cell{padding-left:5px;padding-right:5px}:host .tb-kv-map-config tb-error{display:block;margin-top:-12px}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:t.Injector},{type:E.FormBuilder}]},propDecorators:{disabled:[{type:i}],uniqueKeyValuePairValidator:[{type:i}],requiredText:[{type:i}],keyText:[{type:i}],keyRequiredText:[{type:i}],valText:[{type:i}],valRequiredText:[{type:i}],hintText:[{type:i}],required:[{type:i}]}});class en extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.saveToCustomTableConfigForm}onConfigurationSet(e){this.saveToCustomTableConfigForm=this.fb.group({tableName:[e?e.tableName:null,[D.required,D.pattern(/.*\S.*/)]],fieldsMapping:[e?e.fieldsMapping:null,[D.required]]})}prepareOutputConfig(e){return e.tableName=e.tableName.trim(),e}}e("SaveToCustomTableConfigComponent",en),en.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:en,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),en.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:en,selector:"tb-action-node-custom-table-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.custom-table-name\n \n \n {{ \'tb.rulenode.custom-table-name-required\' | translate }}\n \n tb.rulenode.custom-table-hint\n \n \n \n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:Zt,selector:"tb-kv-map-config-old",inputs:["disabled","uniqueKeyValuePairValidator","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","required"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:en,decorators:[{type:n,args:[{selector:"tb-action-node-custom-table-config",template:'
\n \n tb.rulenode.custom-table-name\n \n \n {{ \'tb.rulenode.custom-table-name-required\' | translate }}\n \n tb.rulenode.custom-table-hint\n \n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class tn extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.timeseriesConfigForm}onConfigurationSet(e){this.timeseriesConfigForm=this.fb.group({defaultTTL:[e?e.defaultTTL:null,[D.required,D.min(0)]],skipLatestPersistence:[!!e&&e.skipLatestPersistence,[]],useServerTs:[!!e&&e.useServerTs,[]]})}}e("TimeseriesConfigComponent",tn),tn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:tn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),tn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:tn,selector:"tb-action-node-timeseries-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.default-ttl\n \n \n {{ \'tb.rulenode.default-ttl-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-default-ttl-message\' | translate }}\n \n \n \n {{ \'tb.rulenode.skip-latest-persistence\' | translate }}\n \n \n {{ \'tb.rulenode.use-server-ts\' | translate }}\n \n
tb.rulenode.use-server-ts-hint
\n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:tn,decorators:[{type:n,args:[{selector:"tb-action-node-timeseries-config",template:'
\n \n tb.rulenode.default-ttl\n \n \n {{ \'tb.rulenode.default-ttl-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-default-ttl-message\' | translate }}\n \n \n \n {{ \'tb.rulenode.skip-latest-persistence\' | translate }}\n \n \n {{ \'tb.rulenode.use-server-ts\' | translate }}\n \n
tb.rulenode.use-server-ts-hint
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class nn extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.unassignCustomerConfigForm}onConfigurationSet(e){this.unassignCustomerConfigForm=this.fb.group({customerNamePattern:[e?e.customerNamePattern:null,[D.required,D.pattern(/.*\S.*/)]],customerCacheExpiration:[e?e.customerCacheExpiration:null,[D.required,D.min(0)]]})}prepareOutputConfig(e){return e.customerNamePattern=e.customerNamePattern.trim(),e}}e("UnassignCustomerConfigComponent",nn),nn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:nn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),nn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:nn,selector:"tb-action-node-un-assign-to-customer-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.customer-name-pattern\n \n \n {{ \'tb.rulenode.customer-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.customer-cache-expiration\n \n \n {{ \'tb.rulenode.customer-cache-expiration-required\' | translate }}\n \n \n {{ \'tb.rulenode.customer-cache-expiration-range\' | translate }}\n \n tb.rulenode.customer-cache-expiration-hint\n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:nn,decorators:[{type:n,args:[{selector:"tb-action-node-un-assign-to-customer-config",template:'
\n \n tb.rulenode.customer-name-pattern\n \n \n {{ \'tb.rulenode.customer-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.customer-cache-expiration\n \n \n {{ \'tb.rulenode.customer-cache-expiration-required\' | translate }}\n \n \n {{ \'tb.rulenode.customer-cache-expiration-range\' | translate }}\n \n tb.rulenode.customer-cache-expiration-hint\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class rn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.attributeScopeMap=m,this.attributeScopes=Object.keys(m),this.telemetryTypeTranslationsMap=u,this.separatorKeysCodes=[le,se,me]}configForm(){return this.deleteAttributesConfigForm}onConfigurationSet(e){this.deleteAttributesConfigForm=this.fb.group({scope:[e?e.scope:null,[D.required]],keys:[e?e.keys:null,[D.required]],sendAttributesDeletedNotification:[!!e&&e.sendAttributesDeletedNotification,[]],notifyDevice:[!!e&&e.notifyDevice,[]]}),this.deleteAttributesConfigForm.get("scope").valueChanges.subscribe((e=>{e!==m.SHARED_SCOPE&&this.deleteAttributesConfigForm.get("notifyDevice").patchValue(!1,{emitEvent:!1})}))}removeKey(e){const t=this.deleteAttributesConfigForm.get("keys").value,n=t.indexOf(e);n>=0&&(t.splice(n,1),this.deleteAttributesConfigForm.get("keys").patchValue(t,{emitEvent:!0}))}addKey(e){const t=e.input;let n=e.value;if((n||"").trim()){n=n.trim();let e=this.deleteAttributesConfigForm.get("keys").value;e&&-1!==e.indexOf(n)||(e||(e=[]),e.push(n),this.deleteAttributesConfigForm.get("keys").patchValue(e,{emitEvent:!0}))}t&&(t.value="")}}e("DeleteAttributesConfigComponent",rn),rn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:rn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),rn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:rn,selector:"tb-action-node-delete-attributes-config",viewQueries:[{propertyName:"attributeChipList",first:!0,predicate:["attributeChipList"],descendants:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n {{ \'attribute.attributes-scope\' | translate }}\n \n \n {{ telemetryTypeTranslationsMap.get(scope) | translate }}\n \n \n \n \n \n \n {{key}}\n close\n \n \n \n {{ \'tb.rulenode.attributes-keys-required\' | translate }}\n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.send-attributes-deleted-notification\' | translate }}\n \n
tb.rulenode.send-attributes-deleted-notification-hint
\n
\n \n {{ \'tb.rulenode.notify-device\' | translate }}\n \n
tb.rulenode.notify-device-delete-hint
\n
\n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"component",type:ue.MatChipGrid,selector:"mat-chip-grid",inputs:["tabIndex","disabled","placeholder","required","value","errorStateMatcher"],outputs:["change","valueChange"]},{kind:"directive",type:ue.MatChipInput,selector:"input[matChipInputFor]",inputs:["matChipInputFor","matChipInputAddOnBlur","matChipInputSeparatorKeyCodes","placeholder","id","disabled"],outputs:["matChipInputTokenEnd"],exportAs:["matChipInput","matChipInputFor"]},{kind:"directive",type:ue.MatChipRemove,selector:"[matChipRemove]"},{kind:"component",type:ue.MatChipRow,selector:"mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]",inputs:["color","disabled","disableRipple","tabIndex","editable"],outputs:["edited"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:rn,decorators:[{type:n,args:[{selector:"tb-action-node-delete-attributes-config",template:'
\n \n {{ \'attribute.attributes-scope\' | translate }}\n \n \n {{ telemetryTypeTranslationsMap.get(scope) | translate }}\n \n \n \n \n \n \n {{key}}\n close\n \n \n \n {{ \'tb.rulenode.attributes-keys-required\' | translate }}\n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.send-attributes-deleted-notification\' | translate }}\n \n
tb.rulenode.send-attributes-deleted-notification-hint
\n
\n \n {{ \'tb.rulenode.notify-device\' | translate }}\n \n
tb.rulenode.notify-device-delete-hint
\n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]},propDecorators:{attributeChipList:[{type:o,args:["attributeChipList"]}]}});class on extends h{get function(){return this.functionValue}set function(e){e&&this.functionValue!==e&&(this.functionValue=e,this.setupArgumentsFormGroup(!0))}constructor(e,t,n,r){super(e),this.store=e,this.translate=t,this.injector=n,this.fb=r,this.maxArgs=16,this.minArgs=1,this.displayArgumentName=!1,this.mathFunctionMap=Dt,this.ArgumentType=Vt,this.attributeScopeMap=Ht,this.argumentTypeMap=Ot,this.arguments=Object.values(Vt),this.attributeScope=Object.values(Ut),this.propagateChange=null,this.valueChangeSubscription=[]}ngOnInit(){this.ngControl=this.injector.get(V),null!=this.ngControl&&(this.ngControl.valueAccessor=this),this.argumentsFormGroup=this.fb.group({arguments:this.fb.array([])}),this.valueChangeSubscription.push(this.argumentsFormGroup.valueChanges.subscribe((()=>{this.updateModel()}))),this.setupArgumentsFormGroup()}onDrop(e){const t=this.argumentsFormArray(),n=t.at(e.previousIndex);t.removeAt(e.previousIndex),t.insert(e.currentIndex,n),this.updateArgumentNames()}argumentsFormArray(){return this.argumentsFormGroup.get("arguments")}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}setDisabledState(e){this.disabled=e,this.disabled?this.argumentsFormGroup.disable({emitEvent:!1}):(this.argumentsFormGroup.enable({emitEvent:!1}),this.argumentsFormGroup.get("arguments").controls.forEach((e=>this.updateArgumentControlValidators(e))))}ngOnDestroy(){this.valueChangeSubscription.length&&this.valueChangeSubscription.forEach((e=>e.unsubscribe()))}writeValue(e){const t=[];e&&e.forEach(((e,n)=>{t.push(this.createArgumentControl(e,n))})),this.argumentsFormGroup.setControl("arguments",this.fb.array(t),{emitEvent:!1}),this.setupArgumentsFormGroup()}removeArgument(e){this.argumentsFormGroup.get("arguments").removeAt(e),this.updateArgumentNames()}addArgument(e=!0){const t=this.argumentsFormGroup.get("arguments"),n=this.createArgumentControl(null,t.length);t.push(n,{emitEvent:e})}validate(e){return this.argumentsFormGroup.valid?null:{argumentsRequired:!0}}setupArgumentsFormGroup(e=!1){if(this.function&&(this.maxArgs=this.mathFunctionMap.get(this.function).maxArgs,this.minArgs=this.mathFunctionMap.get(this.function).minArgs,this.displayArgumentName=this.function===Et.CUSTOM),this.argumentsFormGroup){for(this.argumentsFormGroup.get("arguments").setValidators([D.minLength(this.minArgs),D.maxLength(this.maxArgs)]),this.argumentsFormGroup.get("arguments").value.length>this.maxArgs&&(this.argumentsFormGroup.get("arguments").controls.length=this.maxArgs);this.argumentsFormGroup.get("arguments").value.length{this.updateArgumentControlValidators(n),n.get("attributeScope").updateValueAndValidity({emitEvent:!1}),n.get("defaultValue").updateValueAndValidity({emitEvent:!1})}))),n}updateArgumentControlValidators(e){const t=e.get("type").value;t===Vt.ATTRIBUTE?e.get("attributeScope").enable({emitEvent:!1}):e.get("attributeScope").disable({emitEvent:!1}),t&&t!==Vt.CONSTANT?e.get("defaultValue").enable({emitEvent:!1}):e.get("defaultValue").disable({emitEvent:!1})}updateArgumentNames(){this.argumentsFormGroup.get("arguments").controls.forEach(((e,t)=>{e.get("name").setValue(Kt[t])}))}updateModel(){const e=this.argumentsFormGroup.get("arguments").value;e.length&&this.argumentsFormGroup.valid?this.propagateChange(e):this.propagateChange(null)}}e("ArgumentsMapConfigComponent",on),on.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:on,deps:[{token:G.Store},{token:H.TranslateService},{token:t.Injector},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),on.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:on,selector:"tb-arguments-map-config",inputs:{disabled:"disabled",function:"function"},providers:[{provide:P,useExisting:a((()=>on)),multi:!0},{provide:w,useExisting:a((()=>on)),multi:!0}],usesInheritance:!0,ngImport:t,template:'
\n\n
\n \n \n
\n \n
\n {{argumentControl.get(\'name\').value}}.\n
\n \n tb.rulenode.argument-source-field-input\n \n \n {{ argumentTypeMap.get(argumentControl.get(\'type\').value)?.name | translate }}\n \n \n {{ argumentTypeMap.get(argument).name | translate }}\n \n {{ argumentTypeMap.get(argument).description }}\n \n \n \n \n tb.rulenode.argument-source-field-input-required\n \n \n
\n \n tb.rulenode.argument-key-field-input\n \n \n help\n \n \n tb.rulenode.argument-key-field-input-required\n \n \n \n tb.rulenode.constant-value-field-input\n \n \n tb.rulenode.constant-value-field-input-required\n \n \n \n tb.rulenode.default-value-field-input\n \n \n
\n \n tb.rulenode.attribute-scope-field-input\n \n \n {{ attributeScopeMap.get(scope) | translate }}\n \n \n \n tb.rulenode.attribute-scope-field-input-required\n \n \n
\n \n
\n
\n
\n
\n
\n
\n tb.rulenode.no-arguments-prompt\n
\n \n
\n',styles:[":host .mat-mdc-list-item.tb-argument{border:solid rgba(0,0,0,.25) 1px;border-radius:4px;padding:10px 0;margin-bottom:16px}:host .arguments-list{padding:0}\n"],dependencies:[{kind:"directive",type:R.NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"directive",type:z.MatSelectTrigger,selector:"mat-select-trigger"},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"component",type:xe.MatList,selector:"mat-list",exportAs:["matList"]},{kind:"component",type:xe.MatListItem,selector:"mat-list-item, a[mat-list-item], button[mat-list-item]",inputs:["activated"],exportAs:["matListItem"]},{kind:"directive",type:be.CdkDropList,selector:"[cdkDropList], cdk-drop-list",inputs:["cdkDropListConnectedTo","cdkDropListData","cdkDropListOrientation","id","cdkDropListLockAxis","cdkDropListDisabled","cdkDropListSortingDisabled","cdkDropListEnterPredicate","cdkDropListSortPredicate","cdkDropListAutoScrollDisabled","cdkDropListAutoScrollStep"],outputs:["cdkDropListDropped","cdkDropListEntered","cdkDropListExited","cdkDropListSorted"],exportAs:["cdkDropList"]},{kind:"directive",type:be.CdkDrag,selector:"[cdkDrag]",inputs:["cdkDragData","cdkDragLockAxis","cdkDragRootElement","cdkDragBoundary","cdkDragStartDelay","cdkDragFreeDragPosition","cdkDragDisabled","cdkDragConstrainPosition","cdkDragPreviewClass","cdkDragPreviewContainer"],outputs:["cdkDragStarted","cdkDragReleased","cdkDragEnded","cdkDragEntered","cdkDragExited","cdkDragDropped","cdkDragMoved"],exportAs:["cdkDrag"]},{kind:"directive",type:be.CdkDragHandle,selector:"[cdkDragHandle]",inputs:["cdkDragHandleDisabled"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultLayoutAlignDirective,selector:" [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]",inputs:["fxLayoutAlign","fxLayoutAlign.xs","fxLayoutAlign.sm","fxLayoutAlign.md","fxLayoutAlign.lg","fxLayoutAlign.xl","fxLayoutAlign.lt-sm","fxLayoutAlign.lt-md","fxLayoutAlign.lt-lg","fxLayoutAlign.lt-xl","fxLayoutAlign.gt-xs","fxLayoutAlign.gt-sm","fxLayoutAlign.gt-md","fxLayoutAlign.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:ye.DefaultClassDirective,selector:" [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]",inputs:["ngClass","ngClass.xs","ngClass.sm","ngClass.md","ngClass.lg","ngClass.xl","ngClass.lt-sm","ngClass.lt-md","ngClass.lt-lg","ngClass.lt-xl","ngClass.gt-xs","ngClass.gt-sm","ngClass.gt-md","ngClass.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormControlDirective,selector:"[formControl]",inputs:["formControl","disabled","ngModel"],outputs:["ngModelChange"],exportAs:["ngForm"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormArrayName,selector:"[formArrayName]",inputs:["formArrayName"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:on,decorators:[{type:n,args:[{selector:"tb-arguments-map-config",providers:[{provide:P,useExisting:a((()=>on)),multi:!0},{provide:w,useExisting:a((()=>on)),multi:!0}],template:'
\n\n
\n \n \n
\n \n
\n {{argumentControl.get(\'name\').value}}.\n
\n \n tb.rulenode.argument-source-field-input\n \n \n {{ argumentTypeMap.get(argumentControl.get(\'type\').value)?.name | translate }}\n \n \n {{ argumentTypeMap.get(argument).name | translate }}\n \n {{ argumentTypeMap.get(argument).description }}\n \n \n \n \n tb.rulenode.argument-source-field-input-required\n \n \n
\n \n tb.rulenode.argument-key-field-input\n \n \n help\n \n \n tb.rulenode.argument-key-field-input-required\n \n \n \n tb.rulenode.constant-value-field-input\n \n \n tb.rulenode.constant-value-field-input-required\n \n \n \n tb.rulenode.default-value-field-input\n \n \n
\n \n tb.rulenode.attribute-scope-field-input\n \n \n {{ attributeScopeMap.get(scope) | translate }}\n \n \n \n tb.rulenode.attribute-scope-field-input-required\n \n \n
\n \n
\n
\n
\n
\n
\n
\n tb.rulenode.no-arguments-prompt\n
\n \n
\n',styles:[":host .mat-mdc-list-item.tb-argument{border:solid rgba(0,0,0,.25) 1px;border-radius:4px;padding:10px 0;margin-bottom:16px}:host .arguments-list{padding:0}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:t.Injector},{type:E.FormBuilder}]},propDecorators:{disabled:[{type:i}],function:[{type:i}]}});class an extends h{get required(){return this.requiredValue}set required(e){this.requiredValue=fe(e)}constructor(e,t,n,r){super(e),this.store=e,this.translate=t,this.injector=n,this.fb=r,this.searchText="",this.dirty=!1,this.mathOperation=[...Dt.values()],this.propagateChange=null}ngOnInit(){this.mathFunctionForm=this.fb.group({operation:[""]}),this.filteredOptions=this.mathFunctionForm.get("operation").valueChanges.pipe(he((e=>{let t;t="string"==typeof e&&Et[e]?Et[e]:null,this.updateView(t)})),ve((e=>(this.searchText=e||"",e?this._filter(e):this.mathOperation.slice()))))}_filter(e){const t=e.toLowerCase();return this.mathOperation.filter((e=>e.name.toLowerCase().includes(t)||e.value.toLowerCase().includes(t)))}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}setDisabledState(e){this.disabled=e,this.disabled?this.mathFunctionForm.disable({emitEvent:!1}):this.mathFunctionForm.enable({emitEvent:!1})}mathFunctionDisplayFn(e){if(e){const t=Dt.get(e);return t.value+" | "+t.name}return""}writeValue(e){this.modelValue=e,this.mathFunctionForm.get("operation").setValue(e,{emitEvent:!1}),this.dirty=!0}updateView(e){this.modelValue!==e&&(this.modelValue=e,this.propagateChange(this.modelValue))}onFocus(){this.dirty&&(this.mathFunctionForm.get("operation").updateValueAndValidity({onlySelf:!0}),this.dirty=!1)}clear(){this.mathFunctionForm.get("operation").patchValue(""),setTimeout((()=>{this.operationInput.nativeElement.blur(),this.operationInput.nativeElement.focus()}),0)}}e("MathFunctionAutocompleteComponent",an),an.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:an,deps:[{token:G.Store},{token:H.TranslateService},{token:t.Injector},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),an.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:an,selector:"tb-math-function-autocomplete",inputs:{required:"required",disabled:"disabled"},providers:[{provide:P,useExisting:a((()=>an)),multi:!0}],viewQueries:[{propertyName:"operationInput",first:!0,predicate:["operationInput"],descendants:!0,static:!0}],usesInheritance:!0,ngImport:t,template:'\n tb.rulenode.functions-field-input\n \n \n \n \n \n \n {{ option.description }}\n \n \n \n tb.rulenode.no-option-found\n \n \n\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"component",type:Te.MatAutocomplete,selector:"mat-autocomplete",inputs:["disableRipple","hideSingleSelectionIndicator"],exportAs:["matAutocomplete"]},{kind:"directive",type:Te.MatAutocompleteTrigger,selector:"input[matAutocomplete], textarea[matAutocomplete]",exportAs:["matAutocompleteTrigger"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:R.AsyncPipe,name:"async"},{kind:"pipe",type:Ie.HighlightPipe,name:"highlight"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:an,decorators:[{type:n,args:[{selector:"tb-math-function-autocomplete",providers:[{provide:P,useExisting:a((()=>an)),multi:!0}],template:'\n tb.rulenode.functions-field-input\n \n \n \n \n \n \n {{ option.description }}\n \n \n \n tb.rulenode.no-option-found\n \n \n\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:t.Injector},{type:E.UntypedFormBuilder}]},propDecorators:{required:[{type:i}],disabled:[{type:i}],operationInput:[{type:o,args:["operationInput",{static:!0}]}]}});class ln extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.MathFunction=Et,this.ArgumentTypeResult=Pt,this.argumentTypeResultMap=Bt,this.attributeScopeMap=Ht,this.argumentsResult=Object.values(Pt),this.attributeScopeResult=Object.values(_t)}configForm(){return this.mathFunctionConfigForm}onConfigurationSet(e){this.mathFunctionConfigForm=this.fb.group({operation:[e?e.operation:null,[D.required]],arguments:[e?e.arguments:null,[D.required]],customFunction:[e?e.customFunction:"",[D.required]],result:this.fb.group({type:[e?e.result.type:null,[D.required]],attributeScope:[e?e.result.attributeScope:null,[D.required]],key:[e?e.result.key:"",[D.required]],resultValuePrecision:[e?e.result.resultValuePrecision:0],addToBody:[!!e&&e.result.addToBody],addToMetadata:[!!e&&e.result.addToMetadata]})})}updateValidators(e){const t=this.mathFunctionConfigForm.get("operation").value,n=this.mathFunctionConfigForm.get("result.type").value;t===Et.CUSTOM?this.mathFunctionConfigForm.get("customFunction").enable({emitEvent:!1}):this.mathFunctionConfigForm.get("customFunction").disable({emitEvent:!1}),n===Pt.ATTRIBUTE?this.mathFunctionConfigForm.get("result.attributeScope").enable({emitEvent:!1}):this.mathFunctionConfigForm.get("result.attributeScope").disable({emitEvent:!1}),this.mathFunctionConfigForm.get("customFunction").updateValueAndValidity({emitEvent:e}),this.mathFunctionConfigForm.get("result.attributeScope").updateValueAndValidity({emitEvent:e})}validatorTriggers(){return["operation","result.type"]}}e("MathFunctionConfigComponent",ln),ln.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ln,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),ln.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:ln,selector:"tb-action-node-math-function-config",usesInheritance:!0,ngImport:t,template:'
\n \n \n
\n tb.rulenode.argument-tile\n \n \n
\n
\n {{\'tb.rulenode.custom-expression-field-input\' | translate }} *\n \n \n \n tb.rulenode.custom-expression-field-input-required\n \n tb.rulenode.custom-expression-field-input-hint\n \n
\n
\n tb.rulenode.result-title\n
\n \n tb.rulenode.type-field-input\n \n \n {{ argumentTypeResultMap.get(mathFunctionConfigForm.get(\'result.type\').value)?.name | translate }}\n \n \n {{ argumentTypeResultMap.get(argument).name | translate }}\n \n {{ argumentTypeResultMap.get(argument).description }}\n \n \n \n \n tb.rulenode.type-field-input-required\n \n \n
\n \n tb.rulenode.attribute-scope-field-input\n \n \n {{ attributeScopeMap.get(scope) | translate }}\n \n \n \n \n tb.rulenode.key-field-input\n \n help\n \n tb.rulenode.key-field-input-required\n \n \n
\n
\n \n tb.rulenode.number-floating-point-field-input\n \n \n \n
\n
\n \n {{\'tb.rulenode.add-to-message-field-input\' | translate }}\n \n \n {{\'tb.rulenode.add-to-metadata-field-input\' | translate}}\n \n
\n
\n
\n
\n',styles:[":host ::ng-deep .fields-group{padding:0 16px 8px;margin:10px 0;border:1px groove rgba(0,0,0,.25);border-radius:4px}:host ::ng-deep .fields-group .mat-mdc-form-field .mat-mdc-form-field-infix{width:100%}:host ::ng-deep .fields-group legend{color:#000000b3;width:-moz-fit-content;width:fit-content}:host ::ng-deep .fields-group legend+*{display:block}:host ::ng-deep .fields-group legend+*.no-margin-top{margin-top:0}\n"],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"directive",type:z.MatSelectTrigger,selector:"mat-select-trigger"},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultLayoutAlignDirective,selector:" [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]",inputs:["fxLayoutAlign","fxLayoutAlign.xs","fxLayoutAlign.sm","fxLayoutAlign.md","fxLayoutAlign.lg","fxLayoutAlign.xl","fxLayoutAlign.lt-sm","fxLayoutAlign.lt-md","fxLayoutAlign.lt-lg","fxLayoutAlign.lt-xl","fxLayoutAlign.gt-xs","fxLayoutAlign.gt-sm","fxLayoutAlign.gt-md","fxLayoutAlign.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:E.FormGroupName,selector:"[formGroupName]",inputs:["formGroupName"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:on,selector:"tb-arguments-map-config",inputs:["disabled","function"]},{kind:"component",type:an,selector:"tb-math-function-autocomplete",inputs:["required","disabled"]},{kind:"pipe",type:pe.SafePipe,name:"safe"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ln,decorators:[{type:n,args:[{selector:"tb-action-node-math-function-config",template:'
\n \n \n
\n tb.rulenode.argument-tile\n \n \n
\n
\n {{\'tb.rulenode.custom-expression-field-input\' | translate }} *\n \n \n \n tb.rulenode.custom-expression-field-input-required\n \n tb.rulenode.custom-expression-field-input-hint\n \n
\n
\n tb.rulenode.result-title\n
\n \n tb.rulenode.type-field-input\n \n \n {{ argumentTypeResultMap.get(mathFunctionConfigForm.get(\'result.type\').value)?.name | translate }}\n \n \n {{ argumentTypeResultMap.get(argument).name | translate }}\n \n {{ argumentTypeResultMap.get(argument).description }}\n \n \n \n \n tb.rulenode.type-field-input-required\n \n \n
\n \n tb.rulenode.attribute-scope-field-input\n \n \n {{ attributeScopeMap.get(scope) | translate }}\n \n \n \n \n tb.rulenode.key-field-input\n \n help\n \n tb.rulenode.key-field-input-required\n \n \n
\n
\n \n tb.rulenode.number-floating-point-field-input\n \n \n \n
\n
\n \n {{\'tb.rulenode.add-to-message-field-input\' | translate }}\n \n \n {{\'tb.rulenode.add-to-metadata-field-input\' | translate}}\n \n
\n
\n
\n
\n',styles:[":host ::ng-deep .fields-group{padding:0 16px 8px;margin:10px 0;border:1px groove rgba(0,0,0,.25);border-radius:4px}:host ::ng-deep .fields-group .mat-mdc-form-field .mat-mdc-form-field-infix{width:100%}:host ::ng-deep .fields-group legend{color:#000000b3;width:-moz-fit-content;width:fit-content}:host ::ng-deep .fields-group legend+*{display:block}:host ::ng-deep .fields-group legend+*.no-margin-top{margin-top:0}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class sn extends h{set required(e){this.requiredValue!==e&&(this.requiredValue=e,this.updateValidators())}get required(){return this.requiredValue}constructor(e,t){super(e),this.store=e,this.fb=t,this.subscriptSizing="fixed",this.searchText="",this.dirty=!1,this.messageTypes=["POST_ATTRIBUTES_REQUEST","POST_TELEMETRY_REQUEST"],this.propagateChange=e=>{},this.messageTypeFormGroup=this.fb.group({messageType:[null,[D.maxLength(255)]]})}registerOnTouched(e){}registerOnChange(e){this.propagateChange=e}ngOnInit(){this.outputMessageTypes=this.messageTypeFormGroup.get("messageType").valueChanges.pipe(he((e=>{this.updateView(e)})),ve((e=>e||"")),Ce((e=>this.fetchMessageTypes(e))))}writeValue(e){this.searchText="",this.modelValue=e,this.messageTypeFormGroup.get("messageType").patchValue(e,{emitEvent:!1}),this.dirty=!0}onFocus(){this.dirty&&(this.messageTypeFormGroup.get("messageType").updateValueAndValidity({onlySelf:!0,emitEvent:!0}),this.dirty=!1)}updateView(e){this.modelValue!==e&&(this.modelValue=e,this.propagateChange(this.modelValue))}displayMessageTypeFn(e){return e||void 0}fetchMessageTypes(e,t=!1){return this.searchText=e,qe(this.messageTypes).pipe(ve((n=>n.filter((n=>t?!!e&&n===e:!e||n.toUpperCase().startsWith(e.toUpperCase()))))))}clear(){this.messageTypeFormGroup.get("messageType").patchValue(null,{emitEvent:!0}),setTimeout((()=>{this.messageTypeInput.nativeElement.blur(),this.messageTypeInput.nativeElement.focus()}),0)}setDisabledState(e){e?this.messageTypeFormGroup.disable({emitEvent:!1}):this.messageTypeFormGroup.enable({emitEvent:!1})}updateValidators(){this.messageTypeFormGroup.get("messageType").setValidators(this.required?[D.required,D.maxLength(255)]:[D.maxLength(255)]),this.messageTypeFormGroup.get("messageType").updateValueAndValidity({emitEvent:!1})}}e("OutputMessageTypeAutocompleteComponent",sn),sn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:sn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),sn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:sn,selector:"tb-output-message-type-autocomplete",inputs:{autocompleteHint:"autocompleteHint",subscriptSizing:"subscriptSizing",required:"required"},providers:[{provide:P,useExisting:a((()=>sn)),multi:!0}],viewQueries:[{propertyName:"messageTypeInput",first:!0,predicate:["messageTypeInput"],descendants:!0,static:!0}],usesInheritance:!0,ngImport:t,template:'\n {{\'tb.rulenode.output-message-type\' | translate}}\n \n \n \n \n \n \n \n {{autocompleteHint | translate}}\n \n {{ \'tb.rulenode.output-message-type-required\' | translate }}\n \n \n {{ \'tb.rulenode.output-message-type-max-length\' | translate }}\n \n\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"component",type:Te.MatAutocomplete,selector:"mat-autocomplete",inputs:["disableRipple","hideSingleSelectionIndicator"],exportAs:["matAutocomplete"]},{kind:"directive",type:Te.MatAutocompleteTrigger,selector:"input[matAutocomplete], textarea[matAutocomplete]",exportAs:["matAutocompleteTrigger"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"pipe",type:R.AsyncPipe,name:"async"},{kind:"pipe",type:Ie.HighlightPipe,name:"highlight"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),Se([v()],sn.prototype,"required",null),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:sn,decorators:[{type:n,args:[{selector:"tb-output-message-type-autocomplete",providers:[{provide:P,useExisting:a((()=>sn)),multi:!0}],template:'\n {{\'tb.rulenode.output-message-type\' | translate}}\n \n \n \n \n \n \n \n {{autocompleteHint | translate}}\n \n {{ \'tb.rulenode.output-message-type-required\' | translate }}\n \n \n {{ \'tb.rulenode.output-message-type-max-length\' | translate }}\n \n\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]},propDecorators:{messageTypeInput:[{type:o,args:["messageTypeInput",{static:!0}]}],autocompleteHint:[{type:i}],subscriptSizing:[{type:i}],required:[{type:i}]}});class mn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.serviceType=p.TB_RULE_ENGINE,this.deduplicationStrategie=yt,this.deduplicationStrategies=Object.keys(this.deduplicationStrategie),this.deduplicationStrategiesTranslations=xt}configForm(){return this.deduplicationConfigForm}onConfigurationSet(e){this.deduplicationConfigForm=this.fb.group({interval:[X(e?.interval)?e.interval:null,[D.required,D.min(1)]],strategy:[X(e?.strategy)?e.strategy:null,[D.required]],outMsgType:[X(e?.outMsgType)?e.outMsgType:null,[D.required]],queueName:[X(e?.queueName)?e.queueName:null,[D.required]],maxPendingMsgs:[X(e?.maxPendingMsgs)?e.maxPendingMsgs:null,[D.required,D.min(1),D.max(1e3)]],maxRetries:[X(e?.maxRetries)?e.maxRetries:null,[D.required,D.min(0),D.max(100)]]})}updateValidators(e){this.deduplicationConfigForm.get("strategy").value===this.deduplicationStrategie.ALL?(this.deduplicationConfigForm.get("outMsgType").enable({emitEvent:!1}),this.deduplicationConfigForm.get("queueName").enable({emitEvent:!1})):(this.deduplicationConfigForm.get("outMsgType").disable({emitEvent:!1}),this.deduplicationConfigForm.get("queueName").disable({emitEvent:!1})),this.deduplicationConfigForm.get("outMsgType").updateValueAndValidity({emitEvent:e}),this.deduplicationConfigForm.get("queueName").updateValueAndValidity({emitEvent:e})}validatorTriggers(){return["strategy"]}}e("DeduplicationConfigComponent",mn),mn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:mn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),mn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:mn,selector:"tb-action-node-msg-deduplication-config",usesInheritance:!0,ngImport:t,template:"
\n \n {{'tb.rulenode.interval' | translate}}\n \n {{'tb.rulenode.interval-hint' | translate}}\n \n {{'tb.rulenode.interval-required' | translate}}\n \n \n {{'tb.rulenode.interval-min-error' | translate}}\n \n \n \n {{'tb.rulenode.strategy' | translate}}\n \n \n {{ deduplicationStrategiesTranslations.get(strategy) | translate }}\n \n \n \n {{'tb.rulenode.strategy-first-hint' | translate}}\n {{'tb.rulenode.strategy-last-hint' | translate}}\n \n {{'tb.rulenode.strategy-required' | translate}}\n \n \n
\n \n \n \n \n
\n \n \n \n
\n
Advanced settings
\n
\n
\n
\n \n \n {{'tb.rulenode.max-pending-msgs' | translate}}\n \n {{'tb.rulenode.max-pending-msgs-hint' | translate}}\n \n {{'tb.rulenode.max-pending-msgs-required' | translate}}\n \n \n {{'tb.rulenode.max-pending-msgs-max-error' | translate}}\n \n \n {{'tb.rulenode.max-pending-msgs-min-error' | translate}}\n \n \n \n {{'tb.rulenode.max-retries' | translate}}\n \n {{'tb.rulenode.max-retries-hint' | translate}}\n \n {{'tb.rulenode.max-retries-required' | translate}}\n \n \n {{'tb.rulenode.max-retries-max-error' | translate}}\n \n \n {{'tb.rulenode.max-retries-min-error' | translate}}\n \n \n \n
\n
\n",styles:[":host ::ng-deep .mat-expansion-panel.advanced-settings{border:none;box-shadow:none;padding:0}:host ::ng-deep .mat-expansion-panel.advanced-settings .mat-expansion-panel-body{padding:0}:host ::ng-deep .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:white}\n"],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:J.QueueAutocompleteComponent,selector:"tb-queue-autocomplete",inputs:["labelText","requiredText","autocompleteHint","subscriptSizing","required","queueType","disabled"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"component",type:Ne.MatExpansionPanel,selector:"mat-expansion-panel",inputs:["disabled","expanded","hideToggle","togglePosition"],outputs:["opened","closed","expandedChange","afterExpand","afterCollapse"],exportAs:["matExpansionPanel"]},{kind:"component",type:Ne.MatExpansionPanelHeader,selector:"mat-expansion-panel-header",inputs:["tabIndex","expandedHeight","collapsedHeight"]},{kind:"directive",type:Ne.MatExpansionPanelTitle,selector:"mat-panel-title"},{kind:"directive",type:Ne.MatExpansionPanelContent,selector:"ng-template[matExpansionPanelContent]"},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutAlignDirective,selector:" [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]",inputs:["fxLayoutAlign","fxLayoutAlign.xs","fxLayoutAlign.sm","fxLayoutAlign.md","fxLayoutAlign.lg","fxLayoutAlign.xl","fxLayoutAlign.lt-sm","fxLayoutAlign.lt-md","fxLayoutAlign.lt-lg","fxLayoutAlign.lt-xl","fxLayoutAlign.gt-xs","fxLayoutAlign.gt-sm","fxLayoutAlign.gt-md","fxLayoutAlign.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:sn,selector:"tb-output-message-type-autocomplete",inputs:["autocompleteHint","subscriptSizing","required"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:mn,decorators:[{type:n,args:[{selector:"tb-action-node-msg-deduplication-config",template:"
\n \n {{'tb.rulenode.interval' | translate}}\n \n {{'tb.rulenode.interval-hint' | translate}}\n \n {{'tb.rulenode.interval-required' | translate}}\n \n \n {{'tb.rulenode.interval-min-error' | translate}}\n \n \n \n {{'tb.rulenode.strategy' | translate}}\n \n \n {{ deduplicationStrategiesTranslations.get(strategy) | translate }}\n \n \n \n {{'tb.rulenode.strategy-first-hint' | translate}}\n {{'tb.rulenode.strategy-last-hint' | translate}}\n \n {{'tb.rulenode.strategy-required' | translate}}\n \n \n
\n \n \n \n \n
\n \n \n \n
\n
Advanced settings
\n
\n
\n
\n \n \n {{'tb.rulenode.max-pending-msgs' | translate}}\n \n {{'tb.rulenode.max-pending-msgs-hint' | translate}}\n \n {{'tb.rulenode.max-pending-msgs-required' | translate}}\n \n \n {{'tb.rulenode.max-pending-msgs-max-error' | translate}}\n \n \n {{'tb.rulenode.max-pending-msgs-min-error' | translate}}\n \n \n \n {{'tb.rulenode.max-retries' | translate}}\n \n {{'tb.rulenode.max-retries-hint' | translate}}\n \n {{'tb.rulenode.max-retries-required' | translate}}\n \n \n {{'tb.rulenode.max-retries-max-error' | translate}}\n \n \n {{'tb.rulenode.max-retries-min-error' | translate}}\n \n \n \n
\n
\n",styles:[":host ::ng-deep .mat-expansion-panel.advanced-settings{border:none;box-shadow:none;padding:0}:host ::ng-deep .mat-expansion-panel.advanced-settings .mat-expansion-panel-body{padding:0}:host ::ng-deep .mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:white}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class un{}e("ExampleHintComponent",un),un.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:un,deps:[],target:t.ɵɵFactoryTarget.Component}),un.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:un,selector:"tb-example-hint",inputs:{hintText:"hintText",popupHelpLink:"popupHelpLink"},ngImport:t,template:'
\n
{{ hintText }}
\n
\n
\n
\n',styles:[":host .space-between{display:flex;justify-content:space-between;gap:20px}:host .space-between .see-example{display:flex;flex-shrink:0}\n"],dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:Ge.HelpPopupComponent,selector:"[tb-help-popup], [tb-help-popup-content]",inputs:["tb-help-popup","tb-help-popup-content","trigger-text","trigger-style","tb-help-popup-placement","tb-help-popup-style","hintMode"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:un,decorators:[{type:n,args:[{selector:"tb-example-hint",template:'
\n
{{ hintText }}
\n
\n
\n
\n',styles:[":host .space-between{display:flex;justify-content:space-between;gap:20px}:host .space-between .see-example{display:flex;flex-shrink:0}\n"]}]}],propDecorators:{hintText:[{type:i}],popupHelpLink:[{type:i}]}});class pn extends h{constructor(e,t,n,r){super(e),this.store=e,this.translate=t,this.injector=n,this.fb=r,this.propagateChange=null,this.valueChangeSubscription=null,this.disabled=!1,this.uniqueKeyValuePairValidator=!1,this.required=!1}ngOnInit(){this.ngControl=this.injector.get(V),null!=this.ngControl&&(this.ngControl.valueAccessor=this),this.kvListFormGroup=this.fb.group({}),this.kvListFormGroup.addControl("keyVals",this.fb.array([]))}keyValsFormArray(){return this.kvListFormGroup.get("keyVals")}errorTrigger(){const e=this.keyValsFormArray();for(const t of e.controls)for(const e of Object.keys(t.value))if(t.get(e).touched&&t.get(e).invalid)return!0;return!1}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}setDisabledState(e){this.disabled=e,this.disabled?this.kvListFormGroup.disable({emitEvent:!1}):this.kvListFormGroup.enable({emitEvent:!1})}writeValue(e){this.valueChangeSubscription&&this.valueChangeSubscription.unsubscribe();const t=[];if(e)for(const n of Object.keys(e))Object.prototype.hasOwnProperty.call(e,n)&&t.push(this.fb.group({key:[n,[D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)]],value:[e[n],[D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)]]}));this.kvListFormGroup.setControl("keyVals",this.fb.array(t)),this.valueChangeSubscription=this.kvListFormGroup.valueChanges.subscribe((()=>{this.updateModel()}))}removeKeyVal(e){this.kvListFormGroup.get("keyVals").removeAt(e)}addKeyVal(){this.kvListFormGroup.get("keyVals").push(this.fb.group({key:["",[D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)]],value:["",[D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)]]}))}validate(e){const t=this.kvListFormGroup.get("keyVals").value;if(!t.length&&this.required)return{kvMapRequired:!0};if(!this.kvListFormGroup.valid)return{kvFieldsRequired:!0};if(this.uniqueKeyValuePairValidator)for(const e of t)if(e.key===e.value)return{uniqueKeyValuePair:!0};return null}updateModel(){const e=this.kvListFormGroup.get("keyVals").value;if(this.required&&!e.length||!this.kvListFormGroup.valid)this.propagateChange(null);else{const t={};e.forEach((e=>{t[e.key]=e.value})),this.propagateChange(t)}}}e("KvMapConfigComponent",pn),pn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:pn,deps:[{token:G.Store},{token:H.TranslateService},{token:t.Injector},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),pn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:pn,selector:"tb-kv-map-config",inputs:{disabled:"disabled",uniqueKeyValuePairValidator:"uniqueKeyValuePairValidator",labelText:"labelText",requiredText:"requiredText",keyText:"keyText",keyRequiredText:"keyRequiredText",valText:"valText",valRequiredText:"valRequiredText",hintText:"hintText",popupHelpLink:"popupHelpLink",required:"required"},providers:[{provide:P,useExisting:a((()=>pn)),multi:!0},{provide:w,useExisting:a((()=>pn)),multi:!0}],usesInheritance:!0,ngImport:t,template:'
\n
\n
{{ labelText }}
\n
\n {{ requiredText }}\n
\n
\n
\n
\n
\n
{{ keyText }}
\n
{{ valText }}
\n
\n
\n
\n
\n \n \n \n \n \n \n
\n \n
\n
\n
\n
\n
\n
\n \n
\n \n
\n',styles:[":host .field-space{flex:1 1 50%}:host .actions-header{width:40px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"directive",type:R.NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:ye.DefaultClassDirective,selector:" [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]",inputs:["ngClass","ngClass.xs","ngClass.sm","ngClass.md","ngClass.lg","ngClass.xl","ngClass.lt-sm","ngClass.lt-md","ngClass.lt-lg","ngClass.lt-xl","ngClass.gt-xs","ngClass.gt-sm","ngClass.gt-md","ngClass.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormControlDirective,selector:"[formControl]",inputs:["formControl","disabled","ngModel"],outputs:["ngModelChange"],exportAs:["ngForm"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:un,selector:"tb-example-hint",inputs:["hintText","popupHelpLink"]},{kind:"pipe",type:R.AsyncPipe,name:"async"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),Se([v()],pn.prototype,"disabled",void 0),Se([v()],pn.prototype,"uniqueKeyValuePairValidator",void 0),Se([v()],pn.prototype,"required",void 0),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:pn,decorators:[{type:n,args:[{selector:"tb-kv-map-config",providers:[{provide:P,useExisting:a((()=>pn)),multi:!0},{provide:w,useExisting:a((()=>pn)),multi:!0}],template:'
\n
\n
{{ labelText }}
\n
\n {{ requiredText }}\n
\n
\n
\n
\n
\n
{{ keyText }}
\n
{{ valText }}
\n
\n
\n
\n
\n \n \n \n \n \n \n
\n \n
\n
\n
\n
\n
\n
\n \n
\n \n
\n',styles:[":host .field-space{flex:1 1 50%}:host .actions-header{width:40px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:t.Injector},{type:E.FormBuilder}]},propDecorators:{disabled:[{type:i}],uniqueKeyValuePairValidator:[{type:i}],labelText:[{type:i}],requiredText:[{type:i}],keyText:[{type:i}],keyRequiredText:[{type:i}],valText:[{type:i}],valRequiredText:[{type:i}],hintText:[{type:i}],popupHelpLink:[{type:i}],required:[{type:i}]}});class dn extends h{get required(){return this.requiredValue}set required(e){this.requiredValue=fe(e)}constructor(e,t){super(e),this.store=e,this.fb=t,this.directionTypes=Object.values(g),this.directionTypeTranslations=y,this.entityType=x,this.propagateChange=null}ngOnInit(){this.deviceRelationsQueryFormGroup=this.fb.group({fetchLastLevelOnly:[!1,[]],direction:[null,[D.required]],maxLevel:[null,[D.min(1)]],relationType:[null],deviceTypes:[null,[D.required]]}),this.deviceRelationsQueryFormGroup.valueChanges.subscribe((e=>{this.deviceRelationsQueryFormGroup.valid?this.propagateChange(e):this.propagateChange(null)}))}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}setDisabledState(e){this.disabled=e,this.disabled?this.deviceRelationsQueryFormGroup.disable({emitEvent:!1}):this.deviceRelationsQueryFormGroup.enable({emitEvent:!1})}writeValue(e){this.deviceRelationsQueryFormGroup.reset(e,{emitEvent:!1})}}e("DeviceRelationsQueryConfigComponent",dn),dn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:dn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),dn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:dn,selector:"tb-device-relations-query-config",inputs:{disabled:"disabled",required:"required"},providers:[{provide:P,useExisting:a((()=>dn)),multi:!0}],usesInheritance:!0,ngImport:t,template:'
\n
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }} tb.rulenode.relations-query-config-direction-suffix\n \n \n \n \n tb.rulenode.max-relation-level\n \n \n {{ \'tb.rulenode.max-relation-level-error\' | translate }}\n \n \n
\n
\n \n {{ \'alias.last-level-relation\' | translate }}\n \n
\n \n \n \n help\n \n
\n',styles:[":host .last-level-slide-toggle{margin:8px 0 24px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:Ee.EntitySubTypeListComponent,selector:"tb-entity-subtype-list",inputs:["required","floatLabel","label","disabled","entityType","emptyInputPlaceholder","filledInputPlaceholder","appearance","subscriptSizing","additionalClasses"]},{kind:"component",type:De.RelationTypeAutocompleteComponent,selector:"tb-relation-type-autocomplete",inputs:["showLabel","additionalClasses","appearance","required","disabled","subscriptSizing"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:dn,decorators:[{type:n,args:[{selector:"tb-device-relations-query-config",providers:[{provide:P,useExisting:a((()=>dn)),multi:!0}],template:'
\n
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }} tb.rulenode.relations-query-config-direction-suffix\n \n \n \n \n tb.rulenode.max-relation-level\n \n \n {{ \'tb.rulenode.max-relation-level-error\' | translate }}\n \n \n
\n
\n \n {{ \'alias.last-level-relation\' | translate }}\n \n
\n \n \n \n help\n \n
\n',styles:[":host .last-level-slide-toggle{margin:8px 0 24px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]},propDecorators:{disabled:[{type:i}],required:[{type:i}]}});class cn extends h{get required(){return this.requiredValue}set required(e){this.requiredValue=fe(e)}constructor(e,t){super(e),this.store=e,this.fb=t,this.directionTypes=Object.values(g),this.directionTypeTranslations=y,this.propagateChange=null}ngOnInit(){this.relationsQueryFormGroup=this.fb.group({fetchLastLevelOnly:[!1,[]],direction:[null,[D.required]],maxLevel:[null,[D.min(1)]],filters:[null]}),this.relationsQueryFormGroup.valueChanges.subscribe((e=>{this.relationsQueryFormGroup.valid?this.propagateChange(e):this.propagateChange(null)}))}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}setDisabledState(e){this.disabled=e,this.disabled?this.relationsQueryFormGroup.disable({emitEvent:!1}):this.relationsQueryFormGroup.enable({emitEvent:!1})}writeValue(e){this.relationsQueryFormGroup.reset(e||{},{emitEvent:!1})}}e("RelationsQueryConfigComponent",cn),cn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:cn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),cn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:cn,selector:"tb-relations-query-config",inputs:{disabled:"disabled",required:"required"},providers:[{provide:P,useExisting:a((()=>cn)),multi:!0}],usesInheritance:!0,ngImport:t,template:'
\n
tb.rulenode.relations-query
\n
\n
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }} tb.rulenode.relations-query-config-direction-suffix\n \n \n \n \n tb.rulenode.max-relation-level\n \n \n {{ \'tb.rulenode.max-relation-level-error\' | translate }}\n \n \n
\n
\n \n {{ \'alias.last-level-relation\' | translate }}\n \n
\n
\n
\n
relation.relation-filters
\n \n \n
\n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"component",type:Ve.RelationFiltersComponent,selector:"tb-relation-filters",inputs:["disabled","allowedEntityTypes"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:cn,decorators:[{type:n,args:[{selector:"tb-relations-query-config",providers:[{provide:P,useExisting:a((()=>cn)),multi:!0}],template:'
\n
tb.rulenode.relations-query
\n
\n
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }} tb.rulenode.relations-query-config-direction-suffix\n \n \n \n \n tb.rulenode.max-relation-level\n \n \n {{ \'tb.rulenode.max-relation-level-error\' | translate }}\n \n \n
\n
\n \n {{ \'alias.last-level-relation\' | translate }}\n \n
\n
\n
\n
relation.relation-filters
\n \n \n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]},propDecorators:{disabled:[{type:i}],required:[{type:i}]}});class fn extends h{get required(){return this.requiredValue}set required(e){this.requiredValue=fe(e)}constructor(e,t,n,r){super(e),this.store=e,this.translate=t,this.truncate=n,this.fb=r,this.placeholder="tb.rulenode.add-message-type",this.separatorKeysCodes=[le,se,me],this.messageTypes=[],this.messageTypesList=[],this.searchText="",this.propagateChange=e=>{},this.messageTypeConfigForm=this.fb.group({messageType:[null]});for(const e of Object.keys(C))this.messageTypesList.push({name:F.get(C[e]),value:e})}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}ngOnInit(){this.filteredMessageTypes=this.messageTypeConfigForm.get("messageType").valueChanges.pipe(Fe(""),ve((e=>e||"")),Ce((e=>this.fetchMessageTypes(e))),ke())}setDisabledState(e){this.disabled=e,this.disabled?this.messageTypeConfigForm.disable({emitEvent:!1}):this.messageTypeConfigForm.enable({emitEvent:!1})}writeValue(e){this.searchText="",this.messageTypes.length=0,e&&e.forEach((e=>{const t=this.messageTypesList.find((t=>t.value===e));t?this.messageTypes.push({name:t.name,value:t.value}):this.messageTypes.push({name:e,value:e})}))}displayMessageTypeFn(e){return e?e.name:void 0}textIsNotEmpty(e){return e&&e.length>0}createMessageType(e,t){e.preventDefault(),this.transformMessageType(t)}add(e){this.transformMessageType(e.value)}fetchMessageTypes(e){if(this.searchText=e,this.searchText&&this.searchText.length){const e=this.searchText.toUpperCase();return qe(this.messageTypesList.filter((t=>t.name.toUpperCase().includes(e))))}return qe(this.messageTypesList)}transformMessageType(e){if((e||"").trim()){let t;const n=e.trim(),r=this.messageTypesList.find((e=>e.name===n));t=r?{name:r.name,value:r.value}:{name:n,value:n},t&&this.addMessageType(t)}this.clear("")}remove(e){const t=this.messageTypes.indexOf(e);t>=0&&(this.messageTypes.splice(t,1),this.updateModel())}selected(e){this.addMessageType(e.option.value),this.clear("")}addMessageType(e){-1===this.messageTypes.findIndex((t=>t.value===e.value))&&(this.messageTypes.push(e),this.updateModel())}onFocus(){this.messageTypeConfigForm.get("messageType").updateValueAndValidity({onlySelf:!0,emitEvent:!0})}clear(e=""){this.messageTypeInput.nativeElement.value=e,this.messageTypeConfigForm.get("messageType").patchValue(null,{emitEvent:!0}),setTimeout((()=>{this.messageTypeInput.nativeElement.blur(),this.messageTypeInput.nativeElement.focus()}),0)}updateModel(){const e=this.messageTypes.map((e=>e.value));this.required?(this.chipList.errorState=!e.length,this.propagateChange(e.length>0?e:null)):(this.chipList.errorState=!1,this.propagateChange(e))}}e("MessageTypesConfigComponent",fn),fn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:fn,deps:[{token:G.Store},{token:H.TranslateService},{token:k.TruncatePipe},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),fn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:fn,selector:"tb-message-types-config",inputs:{required:"required",label:"label",placeholder:"placeholder",disabled:"disabled"},providers:[{provide:P,useExisting:a((()=>fn)),multi:!0}],viewQueries:[{propertyName:"chipList",first:!0,predicate:["chipList"],descendants:!0},{propertyName:"matAutocomplete",first:!0,predicate:["messageTypeAutocomplete"],descendants:!0},{propertyName:"messageTypeInput",first:!0,predicate:["messageTypeInput"],descendants:!0}],usesInheritance:!0,ngImport:t,template:'\n {{ label }}\n \n \n {{messageType.name}}\n close\n \n \n \n \n \n \n \n \n
\n
\n tb.rulenode.no-message-types-found\n
\n \n \n {{ \'tb.rulenode.no-message-type-matching\' | translate :\n {messageType: truncate.transform(searchText, true, 6, '...')}\n }}\n \n \n \n tb.rulenode.create-new-message-type\n \n
\n
\n
\n help\n \n {{ \'tb.rulenode.select-message-types-required\' | translate }}\n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"component",type:Te.MatAutocomplete,selector:"mat-autocomplete",inputs:["disableRipple","hideSingleSelectionIndicator"],exportAs:["matAutocomplete"]},{kind:"directive",type:Te.MatAutocompleteTrigger,selector:"input[matAutocomplete], textarea[matAutocomplete]",exportAs:["matAutocompleteTrigger"]},{kind:"directive",type:Te.MatAutocompleteOrigin,selector:"[matAutocompleteOrigin]",exportAs:["matAutocompleteOrigin"]},{kind:"component",type:ue.MatChipGrid,selector:"mat-chip-grid",inputs:["tabIndex","disabled","placeholder","required","value","errorStateMatcher"],outputs:["change","valueChange"]},{kind:"directive",type:ue.MatChipInput,selector:"input[matChipInputFor]",inputs:["matChipInputFor","matChipInputAddOnBlur","matChipInputSeparatorKeyCodes","placeholder","id","disabled"],outputs:["matChipInputTokenEnd"],exportAs:["matChipInput","matChipInputFor"]},{kind:"directive",type:ue.MatChipRemove,selector:"[matChipRemove]"},{kind:"component",type:ue.MatChipRow,selector:"mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]",inputs:["color","disabled","disableRipple","tabIndex","editable"],outputs:["edited"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:R.AsyncPipe,name:"async"},{kind:"pipe",type:Ie.HighlightPipe,name:"highlight"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:fn,decorators:[{type:n,args:[{selector:"tb-message-types-config",providers:[{provide:P,useExisting:a((()=>fn)),multi:!0}],template:'\n {{ label }}\n \n \n {{messageType.name}}\n close\n \n \n \n \n \n \n \n \n
\n
\n tb.rulenode.no-message-types-found\n
\n \n \n {{ \'tb.rulenode.no-message-type-matching\' | translate :\n {messageType: truncate.transform(searchText, true, 6, '...')}\n }}\n \n \n \n tb.rulenode.create-new-message-type\n \n
\n
\n
\n help\n \n {{ \'tb.rulenode.select-message-types-required\' | translate }}\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:k.TruncatePipe},{type:E.FormBuilder}]},propDecorators:{required:[{type:i}],label:[{type:i}],placeholder:[{type:i}],disabled:[{type:i}],chipList:[{type:o,args:["chipList",{static:!1}]}],matAutocomplete:[{type:o,args:["messageTypeAutocomplete",{static:!1}]}],messageTypeInput:[{type:o,args:["messageTypeInput",{static:!1}]}]}});class gn extends h{get required(){return this.requiredValue}set required(e){this.requiredValue=fe(e)}constructor(e,t){super(e),this.store=e,this.fb=t,this.subscriptions=[],this.disableCertPemCredentials=!1,this.passwordFieldRequired=!0,this.allCredentialsTypes=It,this.credentialsTypeTranslationsMap=Nt,this.propagateChange=e=>{}}ngOnInit(){this.credentialsConfigFormGroup=this.fb.group({type:[null,[D.required]],username:[null,[]],password:[null,[]],caCert:[null,[]],caCertFileName:[null,[]],privateKey:[null,[]],privateKeyFileName:[null,[]],cert:[null,[]],certFileName:[null,[]]}),this.subscriptions.push(this.credentialsConfigFormGroup.valueChanges.subscribe((()=>{this.updateView()}))),this.subscriptions.push(this.credentialsConfigFormGroup.get("type").valueChanges.subscribe((()=>{this.credentialsTypeChanged()})))}ngOnChanges(e){for(const t of Object.keys(e)){const n=e[t];if(!n.firstChange&&n.currentValue!==n.previousValue&&n.currentValue&&"disableCertPemCredentials"===t){"cert.PEM"===this.credentialsConfigFormGroup.get("type").value&&setTimeout((()=>{this.credentialsConfigFormGroup.get("type").patchValue("anonymous",{emitEvent:!0})}))}}}ngOnDestroy(){this.subscriptions.forEach((e=>e.unsubscribe()))}writeValue(e){X(e)&&(this.credentialsConfigFormGroup.reset(e,{emitEvent:!1}),this.updateValidators())}setDisabledState(e){e?this.credentialsConfigFormGroup.disable({emitEvent:!1}):(this.credentialsConfigFormGroup.enable({emitEvent:!1}),this.updateValidators())}updateView(){let e=this.credentialsConfigFormGroup.value;const t=e.type;switch(t){case"anonymous":e={type:t};break;case"basic":e={type:t,username:e.username,password:e.password};break;case"cert.PEM":delete e.username}this.propagateChange(e)}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}validate(e){return this.credentialsConfigFormGroup.valid?null:{credentialsConfig:{valid:!1}}}credentialsTypeChanged(){this.credentialsConfigFormGroup.patchValue({username:null,password:null,caCert:null,caCertFileName:null,privateKey:null,privateKeyFileName:null,cert:null,certFileName:null}),this.updateValidators()}updateValidators(e=!1){const t=this.credentialsConfigFormGroup.get("type").value;switch(e&&this.credentialsConfigFormGroup.reset({type:t},{emitEvent:!1}),this.credentialsConfigFormGroup.setValidators([]),this.credentialsConfigFormGroup.get("username").setValidators([]),this.credentialsConfigFormGroup.get("password").setValidators([]),t){case"anonymous":break;case"basic":this.credentialsConfigFormGroup.get("username").setValidators([D.required]),this.credentialsConfigFormGroup.get("password").setValidators(this.passwordFieldRequired?[D.required]:[]);break;case"cert.PEM":this.credentialsConfigFormGroup.setValidators([this.requiredFilesSelected(D.required,[["caCert","caCertFileName"],["privateKey","privateKeyFileName","cert","certFileName"]])])}this.credentialsConfigFormGroup.get("username").updateValueAndValidity({emitEvent:e}),this.credentialsConfigFormGroup.get("password").updateValueAndValidity({emitEvent:e}),this.credentialsConfigFormGroup.updateValueAndValidity({emitEvent:e})}requiredFilesSelected(e,t=null){return n=>{t||(t=[Object.keys(n.controls)]);return n?.controls&&t.some((t=>t.every((t=>!e(n.controls[t])))))?null:{notAllRequiredFilesSelected:!0}}}}e("CredentialsConfigComponent",gn),gn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:gn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),gn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:gn,selector:"tb-credentials-config",inputs:{required:"required",disableCertPemCredentials:"disableCertPemCredentials",passwordFieldRequired:"passwordFieldRequired"},providers:[{provide:P,useExisting:a((()=>gn)),multi:!0},{provide:w,useExisting:a((()=>gn)),multi:!0}],usesInheritance:!0,usesOnChanges:!0,ngImport:t,template:'
\n \n \n tb.rulenode.credentials\n \n {{ credentialsTypeTranslationsMap.get(credentialsConfigFormGroup.get(\'type\').value) | translate }}\n \n \n \n \n tb.rulenode.credentials-type\n \n \n {{ credentialsTypeTranslationsMap.get(credentialsType) | translate }}\n \n \n \n {{ \'tb.rulenode.credentials-type-required\' | translate }}\n \n \n
\n \n \n \n \n tb.rulenode.username\n \n \n {{ \'tb.rulenode.username-required\' | translate }}\n \n \n \n tb.rulenode.password\n \n \n \n {{ \'tb.rulenode.password-required\' | translate }}\n \n \n \n \n
{{ \'tb.rulenode.credentials-pem-hint\' | translate }}
\n \n \n \n \n \n \n \n tb.rulenode.private-key-password\n \n \n \n
\n
\n
\n
\n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:R.NgSwitch,selector:"[ngSwitch]",inputs:["ngSwitch"]},{kind:"directive",type:R.NgSwitchCase,selector:"[ngSwitchCase]",inputs:["ngSwitchCase"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"component",type:Ne.MatExpansionPanel,selector:"mat-expansion-panel",inputs:["disabled","expanded","hideToggle","togglePosition"],outputs:["opened","closed","expandedChange","afterExpand","afterCollapse"],exportAs:["matExpansionPanel"]},{kind:"component",type:Ne.MatExpansionPanelHeader,selector:"mat-expansion-panel-header",inputs:["tabIndex","expandedHeight","collapsedHeight"]},{kind:"directive",type:Ne.MatExpansionPanelTitle,selector:"mat-panel-title"},{kind:"directive",type:Ne.MatExpansionPanelDescription,selector:"mat-panel-description"},{kind:"directive",type:Ne.MatExpansionPanelContent,selector:"ng-template[matExpansionPanelContent]"},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:Pe.FileInputComponent,selector:"tb-file-input",inputs:["label","hint","accept","noFileText","inputId","allowedExtensions","dropLabel","contentConvertFunction","required","requiredAsError","disabled","existingFileName","readAsBinary","workFromFileObj","multipleFile"],outputs:["fileNameChanged"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:we.TogglePasswordComponent,selector:"tb-toggle-password"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:gn,decorators:[{type:n,args:[{selector:"tb-credentials-config",providers:[{provide:P,useExisting:a((()=>gn)),multi:!0},{provide:w,useExisting:a((()=>gn)),multi:!0}],template:'
\n \n \n tb.rulenode.credentials\n \n {{ credentialsTypeTranslationsMap.get(credentialsConfigFormGroup.get(\'type\').value) | translate }}\n \n \n \n \n tb.rulenode.credentials-type\n \n \n {{ credentialsTypeTranslationsMap.get(credentialsType) | translate }}\n \n \n \n {{ \'tb.rulenode.credentials-type-required\' | translate }}\n \n \n
\n \n \n \n \n tb.rulenode.username\n \n \n {{ \'tb.rulenode.username-required\' | translate }}\n \n \n \n tb.rulenode.password\n \n \n \n {{ \'tb.rulenode.password-required\' | translate }}\n \n \n \n \n
{{ \'tb.rulenode.credentials-pem-hint\' | translate }}
\n \n \n \n \n \n \n \n tb.rulenode.private-key-password\n \n \n \n
\n
\n
\n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]},propDecorators:{required:[{type:i}],disableCertPemCredentials:[{type:i}],passwordFieldRequired:[{type:i}]}});class yn{constructor(e,t){this.fb=e,this.translate=t,this.propagateChange=e=>{},this.destroy$=new Ae,this.selectOptions=[];for(const e of Rt.keys())this.selectOptions.push({value:e,name:this.translate.instant(Rt.get(e))})}ngOnInit(){this.chipControlGroup=this.fb.group({chipControl:[null,[]]}),this.chipControlGroup.get("chipControl").valueChanges.pipe(Le(this.destroy$)).subscribe((e=>{e&&this.propagateChange(e)}))}writeValue(e){this.chipControlGroup.get("chipControl").patchValue(e,{emitEvent:!1})}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}setDisabledState(e){e?this.chipControlGroup.disable({emitEvent:!1}):this.chipControlGroup.enable({emitEvent:!1})}ngOnDestroy(){this.destroy$.next(),this.destroy$.complete()}}e("MsgMetadataChipComponent",yn),yn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:yn,deps:[{token:E.FormBuilder},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),yn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:yn,selector:"tb-msg-metadata-chip",inputs:{labelText:"labelText"},providers:[{provide:P,useExisting:a((()=>yn)),multi:!0}],ngImport:t,template:'
\n
{{ labelText }}
\n \n {{ option.name }}\n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"component",type:ue.MatChipListbox,selector:"mat-chip-listbox",inputs:["tabIndex","multiple","aria-orientation","selectable","compareWith","required","hideSingleSelectionIndicator","value"],outputs:["change"]},{kind:"component",type:ue.MatChipOption,selector:"mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]",inputs:["color","disabled","disableRipple","tabIndex","selectable","selected"],outputs:["selectionChange"]},{kind:"directive",type:ye.DefaultClassDirective,selector:" [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]",inputs:["ngClass","ngClass.xs","ngClass.sm","ngClass.md","ngClass.lg","ngClass.xl","ngClass.lt-sm","ngClass.lt-md","ngClass.lt-lg","ngClass.lt-xl","ngClass.gt-xs","ngClass.gt-sm","ngClass.gt-md","ngClass.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:yn,decorators:[{type:n,args:[{selector:"tb-msg-metadata-chip",providers:[{provide:P,useExisting:a((()=>yn)),multi:!0}],template:'
\n
{{ labelText }}
\n \n {{ option.name }}\n \n
\n'}]}],ctorParameters:function(){return[{type:E.FormBuilder},{type:H.TranslateService}]},propDecorators:{labelText:[{type:i}]}});class xn extends h{constructor(e,t,n,r){super(e),this.store=e,this.translate=t,this.injector=n,this.fb=r,this.destroy$=new Ae,this.sourceFieldSubcritption=[],this.propagateChange=null,this.valueChangeSubscription=null,this.disabled=!1,this.required=!1}ngOnInit(){this.ngControl=this.injector.get(V),null!=this.ngControl&&(this.ngControl.valueAccessor=this),this.svListFormGroup=this.fb.group({}),this.svListFormGroup.addControl("keyVals",this.fb.array([]))}keyValsFormArray(){return this.svListFormGroup.get("keyVals")}ngOnDestroy(){this.destroy$.next(),this.destroy$.complete()}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}setDisabledState(e){this.disabled=e,this.disabled?this.svListFormGroup.disable({emitEvent:!1}):this.svListFormGroup.enable({emitEvent:!1})}writeValue(e){this.valueChangeSubscription&&this.valueChangeSubscription.unsubscribe();const t=[];if(e)for(const n of Object.keys(e))Object.prototype.hasOwnProperty.call(e,n)&&t.push(this.fb.group({key:[n,[D.required]],value:[e[n],[D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)]]}));this.svListFormGroup.setControl("keyVals",this.fb.array(t));for(const e of this.keyValsFormArray().controls)this.keyChangeSubscribe(e);this.valueChangeSubscription=this.svListFormGroup.valueChanges.pipe(Le(this.destroy$)).subscribe((()=>{this.updateModel()}))}errorTrigger(){const e=this.keyValsFormArray();for(const t of e.controls)for(const e of Object.keys(t.value))if(t.get(e).touched&&t.get(e).invalid)return!0;return!1}filterSelectOptions(e){const t=[];for(const e of this.svListFormGroup.get("keyVals").value){const n=this.selectOptions.find((t=>t.value===e.key));n&&t.push(n)}const n=[];for(const r of this.selectOptions)X(t.find((e=>e.value===r.value)))&&r.value!==e?.get("key").value||n.push(r);return n}removeKeyVal(e){this.svListFormGroup.get("keyVals").removeAt(e),this.sourceFieldSubcritption[e].unsubscribe(),this.sourceFieldSubcritption.splice(e,1)}addKeyVal(){const e=this.svListFormGroup.get("keyVals");e.push(this.fb.group({key:["",[D.required]],value:["",[D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)]]})),this.keyChangeSubscribe(e.at(e.length-1))}keyChangeSubscribe(e){this.sourceFieldSubcritption.push(e.get("key").valueChanges.pipe(Le(this.destroy$)).subscribe((t=>{e.get("value").patchValue(this.targetKeyPrefix+t[0].toUpperCase()+t.slice(1))})))}validate(e){return!this.svListFormGroup.get("keyVals").value.length&&this.required?{svMapRequired:!0}:this.svListFormGroup.valid?null:{svFieldsRequired:!0}}updateModel(){const e=this.svListFormGroup.get("keyVals").value;if(this.required&&!e.length||!this.svListFormGroup.valid)this.propagateChange(null);else{const t={};e.forEach((e=>{t[e.key]=e.value})),this.propagateChange(t)}}}e("SvMapConfigComponent",xn),xn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:xn,deps:[{token:G.Store},{token:H.TranslateService},{token:t.Injector},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),xn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:xn,selector:"tb-sv-map-config",inputs:{selectOptions:"selectOptions",disabled:"disabled",labelText:"labelText",requiredText:"requiredText",targetKeyPrefix:"targetKeyPrefix",selectText:"selectText",selectRequiredText:"selectRequiredText",valText:"valText",valRequiredText:"valRequiredText",hintText:"hintText",popupHelpLink:"popupHelpLink",required:"required"},providers:[{provide:P,useExisting:a((()=>xn)),multi:!0},{provide:w,useExisting:a((()=>xn)),multi:!0}],usesInheritance:!0,ngImport:t,template:'
\n
\n
{{ labelText }}
\n
\n tb.rulenode.map-fields-required\n
\n
\n
\n
\n
\n
{{ selectText }}
\n
{{ valText }}
\n
\n
\n
\n
\n \n \n \n {{option.name}}\n \n \n \n \n \n \n
\n \n
\n
\n
\n
\n
\n
\n \n
\n \n
\n',styles:[":host .field-space{flex:1 1 50%}:host .actions-header{width:40px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"directive",type:R.NgClass,selector:"[ngClass]",inputs:["class","ngClass"]},{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:ye.DefaultClassDirective,selector:" [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]",inputs:["ngClass","ngClass.xs","ngClass.sm","ngClass.md","ngClass.lg","ngClass.xl","ngClass.lt-sm","ngClass.lt-md","ngClass.lt-lg","ngClass.lt-xl","ngClass.gt-xs","ngClass.gt-sm","ngClass.gt-md","ngClass.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormControlDirective,selector:"[formControl]",inputs:["formControl","disabled","ngModel"],outputs:["ngModelChange"],exportAs:["ngForm"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:un,selector:"tb-example-hint",inputs:["hintText","popupHelpLink"]},{kind:"pipe",type:R.AsyncPipe,name:"async"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),Se([v()],xn.prototype,"disabled",void 0),Se([v()],xn.prototype,"required",void 0),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:xn,decorators:[{type:n,args:[{selector:"tb-sv-map-config",providers:[{provide:P,useExisting:a((()=>xn)),multi:!0},{provide:w,useExisting:a((()=>xn)),multi:!0}],template:'
\n
\n
{{ labelText }}
\n
\n tb.rulenode.map-fields-required\n
\n
\n
\n
\n
\n
{{ selectText }}
\n
{{ valText }}
\n
\n
\n
\n
\n \n \n \n {{option.name}}\n \n \n \n \n \n \n
\n \n
\n
\n
\n
\n
\n
\n \n
\n \n
\n',styles:[":host .field-space{flex:1 1 50%}:host .actions-header{width:40px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:t.Injector},{type:E.FormBuilder}]},propDecorators:{selectOptions:[{type:i}],disabled:[{type:i}],labelText:[{type:i}],requiredText:[{type:i}],targetKeyPrefix:[{type:i}],selectText:[{type:i}],selectRequiredText:[{type:i}],valText:[{type:i}],valRequiredText:[{type:i}],hintText:[{type:i}],popupHelpLink:[{type:i}],required:[{type:i}]}});class bn extends h{get required(){return this.requiredValue}set required(e){this.requiredValue=fe(e)}constructor(e,t){super(e),this.store=e,this.fb=t,this.directionTypes=Object.keys(g),this.directionTypeTranslations=y,this.propagateChange=null}ngOnInit(){this.relationsQueryFormGroup=this.fb.group({fetchLastLevelOnly:[!1,[]],direction:[null,[D.required]],maxLevel:[null,[]],filters:[null]}),this.relationsQueryFormGroup.valueChanges.subscribe((e=>{this.relationsQueryFormGroup.valid?this.propagateChange(e):this.propagateChange(null)}))}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}setDisabledState(e){this.disabled=e,this.disabled?this.relationsQueryFormGroup.disable({emitEvent:!1}):this.relationsQueryFormGroup.enable({emitEvent:!1})}writeValue(e){this.relationsQueryFormGroup.reset(e||{},{emitEvent:!1})}}e("RelationsQueryConfigOldComponent",bn),bn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:bn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),bn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:bn,selector:"tb-relations-query-config-old",inputs:{disabled:"disabled",required:"required"},providers:[{provide:P,useExisting:a((()=>bn)),multi:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n {{ \'alias.last-level-relation\' | translate }}\n \n
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }}\n \n \n \n \n tb.rulenode.max-relation-level\n \n \n
\n
relation.relation-filters
\n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:Ve.RelationFiltersComponent,selector:"tb-relation-filters",inputs:["disabled","allowedEntityTypes"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:bn,decorators:[{type:n,args:[{selector:"tb-relations-query-config-old",providers:[{provide:P,useExisting:a((()=>bn)),multi:!0}],template:'
\n \n {{ \'alias.last-level-relation\' | translate }}\n \n
\n \n relation.direction\n \n \n {{ directionTypeTranslations.get(type) | translate }}\n \n \n \n \n tb.rulenode.max-relation-level\n \n \n
\n
relation.relation-filters
\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]},propDecorators:{disabled:[{type:i}],required:[{type:i}]}});class hn{constructor(e,t){this.translate=e,this.fb=t,this.propagateChange=e=>{},this.destroy$=new Ae,this.separatorKeysCodes=[le,se,me],this.onTouched=()=>{}}ngOnInit(){this.attributeControlGroup=this.fb.group({clientAttributeNames:[null,[]],sharedAttributeNames:[null,[]],serverAttributeNames:[null,[]],latestTsKeyNames:[null,[]],getLatestValueWithTs:[!1,[]]},{validators:this.atLeastOne(D.required,["clientAttributeNames","sharedAttributeNames","serverAttributeNames","latestTsKeyNames"])}),this.attributeControlGroup.valueChanges.pipe(Le(this.destroy$)).subscribe((e=>{this.propagateChange(e)}))}validate(){return this.attributeControlGroup.valid?null:{atLeastOneRequired:!0}}atLeastOne(e,t=null){return n=>{t||(t=Object.keys(n.controls));return n?.controls&&t.some((t=>!e(n.controls[t])))?null:{atLeastOne:!0}}}writeValue(e){this.attributeControlGroup.setValue(e,{emitEvent:!1})}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){this.onTouched=e}setDisabledState(e){e?this.attributeControlGroup.disable({emitEvent:!1}):this.attributeControlGroup.enable({emitEvent:!1})}ngOnDestroy(){this.destroy$.next(null),this.destroy$.complete()}}e("SelectAttributesComponent",hn),hn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:hn,deps:[{token:H.TranslateService},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),hn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:hn,selector:"tb-select-attributes",inputs:{popupHelpLink:"popupHelpLink"},providers:[{provide:P,useExisting:a((()=>hn)),multi:!0},{provide:w,useExisting:hn,multi:!0}],ngImport:t,template:'
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n {{ \'tb.rulenode.fetch-latest-telemetry-with-timestamp\' | translate }}\n \n
\n
\n\n\n help\n\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:R.NgTemplateOutlet,selector:"[ngTemplateOutlet]",inputs:["ngTemplateOutletContext","ngTemplateOutlet","ngTemplateOutletInjector"]},{kind:"component",type:Re.StringItemsListComponent,selector:"tb-string-items-list",inputs:["required","disabled","label","placeholder","hint","requiredText","floatLabel","appearance","editable","subscriptSizing","predefinedValues"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"component",type:un,selector:"tb-example-hint",inputs:["hintText","popupHelpLink"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:hn,decorators:[{type:n,args:[{selector:"tb-select-attributes",providers:[{provide:P,useExisting:a((()=>hn)),multi:!0},{provide:w,useExisting:hn,multi:!0}],template:'
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n {{ \'tb.rulenode.fetch-latest-telemetry-with-timestamp\' | translate }}\n \n
\n
\n\n\n help\n\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:H.TranslateService},{type:E.FormBuilder}]},propDecorators:{popupHelpLink:[{type:i}]}});class vn extends h{constructor(e,t){super(e),this.store=e,this.fb=t,this.propagateChange=null,this.destroy$=new Ae,this.alarmStatus=L,this.alarmStatusTranslations=T}ngOnInit(){this.alarmStatusGroup=this.fb.group({alarmStatus:[null,[]]}),this.alarmStatusGroup.get("alarmStatus").valueChanges.pipe(Le(this.destroy$)).subscribe((e=>{this.propagateChange(e)}))}setDisabledState(e){e?this.alarmStatusGroup.disable({emitEvent:!1}):this.alarmStatusGroup.enable({emitEvent:!1})}registerOnChange(e){this.propagateChange=e}registerOnTouched(e){}ngOnDestroy(){this.destroy$.next(),this.destroy$.complete()}writeValue(e){this.alarmStatusGroup.get("alarmStatus").patchValue(e,{emitEvent:!1})}}e("AlarmStatusSelectComponent",vn),vn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:vn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),vn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:vn,selector:"tb-alarm-status-select",providers:[{provide:P,useExisting:a((()=>vn)),multi:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n
\n \n {{ alarmStatusTranslations.get(alarmStatus.ACTIVE_UNACK) | translate }}\n \n \n {{ alarmStatusTranslations.get(alarmStatus.ACTIVE_ACK) | translate }}\n \n
\n
\n \n {{ alarmStatusTranslations.get(alarmStatus.CLEARED_UNACK) | translate }}\n \n \n {{ alarmStatusTranslations.get(alarmStatus.ACTIVE_UNACK) | translate }}\n \n
\n
\n
\n',styles:[":host .chip-listbox{max-width:460px;width:100%}:host .chip-listbox .toggle-column{display:flex;flex:1 1 100%;gap:8px}:host .chip-listbox .option{margin:0}@media screen and (max-width: 959px){:host .chip-listbox{max-width:360px}:host .chip-listbox .toggle-column{flex-direction:column}}:host ::ng-deep .chip-listbox .mdc-evolution-chip-set__chips{gap:8px}:host ::ng-deep .chip-listbox .option button{flex-basis:100%;justify-content:start}:host ::ng-deep .chip-listbox .option .mdc-evolution-chip__graphic{flex-grow:0}\n"],dependencies:[{kind:"component",type:ue.MatChipListbox,selector:"mat-chip-listbox",inputs:["tabIndex","multiple","aria-orientation","selectable","compareWith","required","hideSingleSelectionIndicator","value"],outputs:["change"]},{kind:"component",type:ue.MatChipOption,selector:"mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]",inputs:["color","disabled","disableRipple","tabIndex","selectable","selected"],outputs:["selectionChange"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutAlignDirective,selector:" [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]",inputs:["fxLayoutAlign","fxLayoutAlign.xs","fxLayoutAlign.sm","fxLayoutAlign.md","fxLayoutAlign.lg","fxLayoutAlign.xl","fxLayoutAlign.lt-sm","fxLayoutAlign.lt-md","fxLayoutAlign.lt-lg","fxLayoutAlign.lt-xl","fxLayoutAlign.gt-xs","fxLayoutAlign.gt-sm","fxLayoutAlign.gt-md","fxLayoutAlign.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:vn,decorators:[{type:n,args:[{selector:"tb-alarm-status-select",providers:[{provide:P,useExisting:a((()=>vn)),multi:!0}],template:'
\n \n
\n \n {{ alarmStatusTranslations.get(alarmStatus.ACTIVE_UNACK) | translate }}\n \n \n {{ alarmStatusTranslations.get(alarmStatus.ACTIVE_ACK) | translate }}\n \n
\n
\n \n {{ alarmStatusTranslations.get(alarmStatus.CLEARED_UNACK) | translate }}\n \n \n {{ alarmStatusTranslations.get(alarmStatus.ACTIVE_UNACK) | translate }}\n \n
\n
\n
\n',styles:[":host .chip-listbox{max-width:460px;width:100%}:host .chip-listbox .toggle-column{display:flex;flex:1 1 100%;gap:8px}:host .chip-listbox .option{margin:0}@media screen and (max-width: 959px){:host .chip-listbox{max-width:360px}:host .chip-listbox .toggle-column{flex-direction:column}}:host ::ng-deep .chip-listbox .mdc-evolution-chip-set__chips{gap:8px}:host ::ng-deep .chip-listbox .option button{flex-basis:100%;justify-content:start}:host ::ng-deep .chip-listbox .option .mdc-evolution-chip__graphic{flex-grow:0}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]}});class Cn{}e("RulenodeCoreConfigCommonModule",Cn),Cn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Cn,deps:[],target:t.ɵɵFactoryTarget.NgModule}),Cn.ɵmod=t.ɵɵngDeclareNgModule({minVersion:"14.0.0",version:"15.2.9",ngImport:t,type:Cn,declarations:[pn,dn,cn,fn,gn,on,an,sn,Zt,yn,xn,bn,hn,vn,un],imports:[O,I,Me],exports:[pn,dn,cn,fn,gn,on,an,sn,Zt,yn,xn,bn,hn,vn,un]}),Cn.ɵinj=t.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Cn,imports:[O,I,Me]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Cn,decorators:[{type:l,args:[{declarations:[pn,dn,cn,fn,gn,on,an,sn,Zt,yn,xn,bn,hn,vn,un],imports:[O,I,Me],exports:[pn,dn,cn,fn,gn,on,an,sn,Zt,yn,xn,bn,hn,vn,un]}]}]});class Fn{}e("RuleNodeCoreConfigActionModule",Fn),Fn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Fn,deps:[],target:t.ɵɵFactoryTarget.NgModule}),Fn.ɵmod=t.ɵɵngDeclareNgModule({minVersion:"14.0.0",version:"15.2.9",ngImport:t,type:Fn,declarations:[rn,We,tn,Xt,jt,Ye,Ze,et,tt,$t,nt,ot,zt,Qt,Wt,en,nn,Xe,rt,Yt,Jt,ln,mn],imports:[O,I,Me,Cn],exports:[rn,We,tn,Xt,jt,Ye,Ze,et,tt,$t,nt,ot,zt,Qt,Wt,en,nn,Xe,rt,Yt,Jt,ln,mn]}),Fn.ɵinj=t.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Fn,imports:[O,I,Me,Cn]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Fn,decorators:[{type:l,args:[{declarations:[rn,We,tn,Xt,jt,Ye,Ze,et,tt,$t,nt,ot,zt,Qt,Wt,en,nn,Xe,rt,Yt,Jt,ln,mn],imports:[O,I,Me,Cn],exports:[rn,We,tn,Xt,jt,Ye,Ze,et,tt,$t,nt,ot,zt,Qt,Wt,en,nn,Xe,rt,Yt,Jt,ln,mn]}]}]});class kn extends s{constructor(e,t,n){super(e),this.store=e,this.translate=t,this.fb=n,this.separatorKeysCodes=[le,se,me]}configForm(){return this.calculateDeltaConfigForm}onConfigurationSet(e){this.calculateDeltaConfigForm=this.fb.group({inputValueKey:[e.inputValueKey,[D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)]],outputValueKey:[e.outputValueKey,[D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)]],useCache:[e.useCache,[]],addPeriodBetweenMsgs:[e.addPeriodBetweenMsgs,[]],periodValueKey:[e.periodValueKey,[]],round:[e.round,[D.min(0),D.max(15)]],tellFailureIfDeltaIsNegative:[e.tellFailureIfDeltaIsNegative,[]]})}prepareInputConfig(e){return{inputValueKey:X(e?.inputValueKey)?e.inputValueKey:null,outputValueKey:X(e?.outputValueKey)?e.outputValueKey:null,useCache:!X(e?.useCache)||e.useCache,addPeriodBetweenMsgs:!!X(e?.addPeriodBetweenMsgs)&&e.addPeriodBetweenMsgs,periodValueKey:X(e?.periodValueKey)?e.periodValueKey:null,round:X(e?.round)?e.round:null,tellFailureIfDeltaIsNegative:!X(e?.tellFailureIfDeltaIsNegative)||e.tellFailureIfDeltaIsNegative}}prepareOutputConfig(e){return Z(e)}updateValidators(e){this.calculateDeltaConfigForm.get("addPeriodBetweenMsgs").value?this.calculateDeltaConfigForm.get("periodValueKey").setValidators([D.required]):this.calculateDeltaConfigForm.get("periodValueKey").setValidators([]),this.calculateDeltaConfigForm.get("periodValueKey").updateValueAndValidity({emitEvent:e})}validatorTriggers(){return["addPeriodBetweenMsgs"]}}e("CalculateDeltaConfigComponent",kn),kn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:kn,deps:[{token:G.Store},{token:H.TranslateService},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),kn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:kn,selector:"tb-enrichment-node-calculate-delta-config",usesInheritance:!0,ngImport:t,template:"
\n
\n \n {{ 'tb.rulenode.input-value-key' | translate }}\n \n \n {{ 'tb.rulenode.input-value-key-required' | translate }}\n \n \n \n {{ 'tb.rulenode.output-value-key' | translate }}\n \n \n {{ 'tb.rulenode.output-value-key-required' | translate }}\n \n \n
\n \n {{ 'tb.rulenode.number-of-digits-after-floating-point' | translate }}\n \n \n {{ 'tb.rulenode.number-of-digits-after-floating-point-range' | translate }}\n \n \n {{ 'tb.rulenode.number-of-digits-after-floating-point-range' | translate }}\n \n \n
\n
\n \n {{ 'tb.rulenode.failure-if-delta-negative' | translate }}\n \n
\n
\n \n {{ 'tb.rulenode.use-caching' | translate }}\n \n
\n
\n
\n \n {{ 'tb.rulenode.add-time-difference-between-readings' | translate:\n { inputValueKey: calculateDeltaConfigForm.get('inputValueKey').valid ?\n calculateDeltaConfigForm.get('inputValueKey').value : 'tb.rulenode.input-value-key' | translate } }}\n \n
\n \n {{ 'tb.rulenode.period-value-key' | translate }}\n \n \n {{ 'tb.rulenode.period-value-key-required' | translate }}\n \n \n
\n
\n
\n",dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.MaxValidator,selector:"input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",inputs:["max"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:kn,decorators:[{type:n,args:[{selector:"tb-enrichment-node-calculate-delta-config",template:"
\n
\n \n {{ 'tb.rulenode.input-value-key' | translate }}\n \n \n {{ 'tb.rulenode.input-value-key-required' | translate }}\n \n \n \n {{ 'tb.rulenode.output-value-key' | translate }}\n \n \n {{ 'tb.rulenode.output-value-key-required' | translate }}\n \n \n
\n \n {{ 'tb.rulenode.number-of-digits-after-floating-point' | translate }}\n \n \n {{ 'tb.rulenode.number-of-digits-after-floating-point-range' | translate }}\n \n \n {{ 'tb.rulenode.number-of-digits-after-floating-point-range' | translate }}\n \n \n
\n
\n \n {{ 'tb.rulenode.failure-if-delta-negative' | translate }}\n \n
\n
\n \n {{ 'tb.rulenode.use-caching' | translate }}\n \n
\n
\n
\n \n {{ 'tb.rulenode.add-time-difference-between-readings' | translate:\n { inputValueKey: calculateDeltaConfigForm.get('inputValueKey').valid ?\n calculateDeltaConfigForm.get('inputValueKey').value : 'tb.rulenode.input-value-key' | translate } }}\n \n
\n \n {{ 'tb.rulenode.period-value-key' | translate }}\n \n \n {{ 'tb.rulenode.period-value-key-required' | translate }}\n \n \n
\n
\n
\n"}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:E.FormBuilder}]}});class Ln extends s{constructor(e,t,n){super(e),this.store=e,this.fb=t,this.translate=n,this.fetchToData=[],this.DataToFetch=vt;for(const e of Ct.keys())e!==vt.FIELDS&&this.fetchToData.push({value:e,name:this.translate.instant(Ct.get(e))})}configForm(){return this.customerAttributesConfigForm}prepareOutputConfig(e){const t={};for(const n of Object.keys(e.dataMapping))t[n.trim()]=e.dataMapping[n];return e.dataMapping=t,Z(e)}prepareInputConfig(e){let t,n;return t=X(e?.telemetry)?e.telemetry?vt.LATEST_TELEMETRY:vt.ATTRIBUTES:X(e?.dataToFetch)?e.dataToFetch:vt.ATTRIBUTES,n=X(e?.attrMapping)?e.attrMapping:X(e?.dataMapping)?e.dataMapping:null,{dataToFetch:t,dataMapping:n,fetchTo:X(e?.fetchTo)?e.fetchTo:wt.METADATA}}selectTranslation(e,t){return this.customerAttributesConfigForm.get("dataToFetch").value===vt.LATEST_TELEMETRY?e:t}onConfigurationSet(e){this.customerAttributesConfigForm=this.fb.group({dataToFetch:[e.dataToFetch,[]],dataMapping:[e.dataMapping,[D.required]],fetchTo:[e.fetchTo]})}}e("CustomerAttributesConfigComponent",Ln),Ln.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Ln,deps:[{token:G.Store},{token:E.FormBuilder},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),Ln.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Ln,selector:"tb-enrichment-node-customer-attributes-config",usesInheritance:!0,ngImport:t,template:'
\n
tb.rulenode.mapping-of-customers-fields
\n
\n
\n \n \n {{ data.name }}\n \n \n
\n
\n \n \n \n \n
\n',styles:[":host .fetch-to-data-toggle{max-width:420px;width:100%}\n"],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:_.DefaultLayoutAlignDirective,selector:" [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]",inputs:["fxLayoutAlign","fxLayoutAlign.xs","fxLayoutAlign.sm","fxLayoutAlign.md","fxLayoutAlign.lg","fxLayoutAlign.xl","fxLayoutAlign.lt-sm","fxLayoutAlign.lt-md","fxLayoutAlign.lt-lg","fxLayoutAlign.lt-xl","fxLayoutAlign.gt-xs","fxLayoutAlign.gt-sm","fxLayoutAlign.gt-md","fxLayoutAlign.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"directive",type:Oe.ToggleOption,selector:"tb-toggle-option",inputs:["value"]},{kind:"component",type:Be.ToggleSelectComponent,selector:"tb-toggle-select",inputs:["disabled","selectMediaBreakpoint","appearance","disablePagination"]},{kind:"component",type:pn,selector:"tb-kv-map-config",inputs:["disabled","uniqueKeyValuePairValidator","labelText","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","popupHelpLink","required"]},{kind:"component",type:yn,selector:"tb-msg-metadata-chip",inputs:["labelText"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Ln,decorators:[{type:n,args:[{selector:"tb-enrichment-node-customer-attributes-config",template:'
\n
tb.rulenode.mapping-of-customers-fields
\n
\n
\n \n \n {{ data.name }}\n \n \n
\n
\n \n \n \n \n
\n',styles:[":host .fetch-to-data-toggle{max-width:420px;width:100%}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder},{type:H.TranslateService}]}});class Tn extends s{constructor(e,t,n){super(e),this.store=e,this.translate=t,this.fb=n}configForm(){return this.deviceAttributesConfigForm}onConfigurationSet(e){this.deviceAttributesConfigForm=this.fb.group({deviceRelationsQuery:[e.deviceRelationsQuery,[D.required]],tellFailureIfAbsent:[e.tellFailureIfAbsent,[]],fetchTo:[e.fetchTo,[]],attributesControl:[e.attributesControl,[]]})}prepareInputConfig(e){return ee(e)&&(e.attributesControl={clientAttributeNames:X(e?.clientAttributeNames)?e.clientAttributeNames:null,latestTsKeyNames:X(e?.latestTsKeyNames)?e.latestTsKeyNames:null,serverAttributeNames:X(e?.serverAttributeNames)?e.serverAttributeNames:null,sharedAttributeNames:X(e?.sharedAttributeNames)?e.sharedAttributeNames:null,getLatestValueWithTs:!!X(e?.getLatestValueWithTs)&&e.getLatestValueWithTs}),{deviceRelationsQuery:X(e?.deviceRelationsQuery)?e.deviceRelationsQuery:null,tellFailureIfAbsent:!X(e?.tellFailureIfAbsent)||e.tellFailureIfAbsent,fetchTo:X(e?.fetchTo)?e.fetchTo:wt.METADATA,attributesControl:e?e.attributesControl:null}}prepareOutputConfig(e){for(const t of Object.keys(e.attributesControl))e[t]=e.attributesControl[t];return delete e.attributesControl,e}}e("DeviceAttributesConfigComponent",Tn),Tn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Tn,deps:[{token:G.Store},{token:H.TranslateService},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),Tn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Tn,selector:"tb-enrichment-node-device-attributes-config",usesInheritance:!0,ngImport:t,template:'
\n
\n
tb.rulenode.device-relations-query
\n \n \n
\n
\n
\n
tb.rulenode.related-device-attributes
\n
\n tb.rulenode.at-least-one-field-required\n
\n
\n \n \n
\n
\n \n {{ \'tb.rulenode.tell-failure\' | translate }}\n \n
\n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"component",type:dn,selector:"tb-device-relations-query-config",inputs:["disabled","required"]},{kind:"component",type:yn,selector:"tb-msg-metadata-chip",inputs:["labelText"]},{kind:"component",type:hn,selector:"tb-select-attributes",inputs:["popupHelpLink"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Tn,decorators:[{type:n,args:[{selector:"tb-enrichment-node-device-attributes-config",template:'
\n
\n
tb.rulenode.device-relations-query
\n \n \n
\n
\n
\n
tb.rulenode.related-device-attributes
\n
\n tb.rulenode.at-least-one-field-required\n
\n
\n \n \n
\n
\n \n {{ \'tb.rulenode.tell-failure\' | translate }}\n \n
\n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:E.FormBuilder}]}});class In extends s{constructor(e,t,n){super(e),this.store=e,this.translate=t,this.fb=n,this.predefinedValues=[];for(const e of Object.keys(ft))this.predefinedValues.push({value:ft[e],name:this.translate.instant(gt.get(ft[e]))})}ngOnInit(){super.ngOnInit()}configForm(){return this.entityDetailsConfigForm}prepareInputConfig(e){let t;return t=X(e?.addToMetadata)?e.addToMetadata?wt.METADATA:wt.DATA:e?.fetchTo?e.fetchTo:wt.DATA,{detailsList:X(e?.detailsList)?e.detailsList:null,fetchTo:t}}onConfigurationSet(e){this.entityDetailsConfigForm=this.fb.group({detailsList:[e.detailsList,[D.required]],fetchTo:[e.fetchTo,[]]})}}e("EntityDetailsConfigComponent",In),In.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:In,deps:[{token:G.Store},{token:H.TranslateService},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),In.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:In,selector:"tb-enrichment-node-entity-details-config",usesInheritance:!0,ngImport:t,template:'
\n \n \n help\n \n \n \n \n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"component",type:Re.StringItemsListComponent,selector:"tb-string-items-list",inputs:["required","disabled","label","placeholder","hint","requiredText","floatLabel","appearance","editable","subscriptSizing","predefinedValues"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:yn,selector:"tb-msg-metadata-chip",inputs:["labelText"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:In,decorators:[{type:n,args:[{selector:"tb-enrichment-node-entity-details-config",template:'
\n \n \n help\n \n \n \n \n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:E.FormBuilder}]}});class Nn extends s{constructor(e,t,n){super(e),this.store=e,this.translate=t,this.fb=n,this.separatorKeysCodes=[le,se,me],this.aggregationTypes=N,this.aggregations=Object.values(N),this.aggregationTypesTranslations=S,this.fetchMode=yt,this.samplingOrders=Object.values(ht),this.samplingOrdersTranslate=kt,this.timeUnits=Object.values(ut),this.timeUnitsTranslationMap=pt,this.deduplicationStrategiesHintTranslations=bt,this.headerOptions=[],this.timeUnitMap={[ut.MILLISECONDS]:1,[ut.SECONDS]:1e3,[ut.MINUTES]:6e4,[ut.HOURS]:36e5,[ut.DAYS]:864e5},this.intervalValidator=()=>e=>e.get("startInterval").value*this.timeUnitMap[e.get("startIntervalTimeUnit").value]<=e.get("endInterval").value*this.timeUnitMap[e.get("endIntervalTimeUnit").value]?{intervalError:!0}:null;for(const e of xt.keys())this.headerOptions.push({value:e,name:this.translate.instant(xt.get(e))})}configForm(){return this.getTelemetryFromDatabaseConfigForm}onConfigurationSet(e){this.getTelemetryFromDatabaseConfigForm=this.fb.group({latestTsKeyNames:[e.latestTsKeyNames,[D.required]],aggregation:[e.aggregation,[D.required]],fetchMode:[e.fetchMode,[D.required]],orderBy:[e.orderBy,[]],limit:[e.limit,[]],useMetadataIntervalPatterns:[e.useMetadataIntervalPatterns,[]],interval:this.fb.group({startInterval:[e.interval.startInterval,[]],startIntervalTimeUnit:[e.interval.startIntervalTimeUnit,[]],endInterval:[e.interval.endInterval,[]],endIntervalTimeUnit:[e.interval.endIntervalTimeUnit,[]]}),startIntervalPattern:[e.startIntervalPattern,[]],endIntervalPattern:[e.endIntervalPattern,[]]})}validatorTriggers(){return["fetchMode","useMetadataIntervalPatterns"]}toggleChange(e){this.getTelemetryFromDatabaseConfigForm.get("fetchMode").patchValue(e,{emitEvent:!0})}prepareOutputConfig(e){return e.startInterval=e.interval.startInterval,e.startIntervalTimeUnit=e.interval.startIntervalTimeUnit,e.endInterval=e.interval.endInterval,e.endIntervalTimeUnit=e.interval.endIntervalTimeUnit,delete e.interval,Z(e)}prepareInputConfig(e){return ee(e)&&(e.interval={startInterval:e.startInterval,startIntervalTimeUnit:e.startIntervalTimeUnit,endInterval:e.endInterval,endIntervalTimeUnit:e.endIntervalTimeUnit}),{latestTsKeyNames:X(e?.latestTsKeyNames)?e.latestTsKeyNames:null,aggregation:X(e?.aggregation)?e.aggregation:N.NONE,fetchMode:X(e?.fetchMode)?e.fetchMode:yt.FIRST,orderBy:X(e?.orderBy)?e.orderBy:ht.ASC,limit:X(e?.limit)?e.limit:1e3,useMetadataIntervalPatterns:!!X(e?.useMetadataIntervalPatterns)&&e.useMetadataIntervalPatterns,interval:{startInterval:X(e?.interval?.startInterval)?e.interval.startInterval:2,startIntervalTimeUnit:X(e?.interval?.startIntervalTimeUnit)?e.interval.startIntervalTimeUnit:ut.MINUTES,endInterval:X(e?.interval?.endInterval)?e.interval.endInterval:1,endIntervalTimeUnit:X(e?.interval?.endIntervalTimeUnit)?e.interval.endIntervalTimeUnit:ut.MINUTES},startIntervalPattern:X(e?.startIntervalPattern)?e.startIntervalPattern:null,endIntervalPattern:X(e?.endIntervalPattern)?e.endIntervalPattern:null}}updateValidators(e){const t=this.getTelemetryFromDatabaseConfigForm.get("fetchMode").value,n=this.getTelemetryFromDatabaseConfigForm.get("useMetadataIntervalPatterns").value;t&&t===yt.ALL?(this.getTelemetryFromDatabaseConfigForm.get("aggregation").setValidators([D.required]),this.getTelemetryFromDatabaseConfigForm.get("orderBy").setValidators([D.required]),this.getTelemetryFromDatabaseConfigForm.get("limit").setValidators([D.required,D.min(2),D.max(1e3)])):(this.getTelemetryFromDatabaseConfigForm.get("aggregation").setValidators([]),this.getTelemetryFromDatabaseConfigForm.get("orderBy").setValidators([]),this.getTelemetryFromDatabaseConfigForm.get("limit").setValidators([])),n?(this.getTelemetryFromDatabaseConfigForm.get("interval.startInterval").setValidators([]),this.getTelemetryFromDatabaseConfigForm.get("interval.startIntervalTimeUnit").setValidators([]),this.getTelemetryFromDatabaseConfigForm.get("interval.endInterval").setValidators([]),this.getTelemetryFromDatabaseConfigForm.get("interval.endIntervalTimeUnit").setValidators([]),this.getTelemetryFromDatabaseConfigForm.get("interval").setValidators([]),this.getTelemetryFromDatabaseConfigForm.get("startIntervalPattern").setValidators([D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)]),this.getTelemetryFromDatabaseConfigForm.get("endIntervalPattern").setValidators([D.required,D.pattern(/(?:.|\s)*\S(&:.|\s)*/)])):(this.getTelemetryFromDatabaseConfigForm.get("interval.startInterval").setValidators([D.required,D.min(1),D.max(2147483647)]),this.getTelemetryFromDatabaseConfigForm.get("interval.startIntervalTimeUnit").setValidators([D.required]),this.getTelemetryFromDatabaseConfigForm.get("interval.endInterval").setValidators([D.required,D.min(1),D.max(2147483647)]),this.getTelemetryFromDatabaseConfigForm.get("interval.endIntervalTimeUnit").setValidators([D.required]),this.getTelemetryFromDatabaseConfigForm.get("interval").setValidators([this.intervalValidator()]),this.getTelemetryFromDatabaseConfigForm.get("startIntervalPattern").setValidators([]),this.getTelemetryFromDatabaseConfigForm.get("endIntervalPattern").setValidators([])),this.getTelemetryFromDatabaseConfigForm.get("aggregation").updateValueAndValidity({emitEvent:e}),this.getTelemetryFromDatabaseConfigForm.get("orderBy").updateValueAndValidity({emitEvent:e}),this.getTelemetryFromDatabaseConfigForm.get("limit").updateValueAndValidity({emitEvent:e}),this.getTelemetryFromDatabaseConfigForm.get("interval.startInterval").updateValueAndValidity({emitEvent:e}),this.getTelemetryFromDatabaseConfigForm.get("interval.startIntervalTimeUnit").updateValueAndValidity({emitEvent:e}),this.getTelemetryFromDatabaseConfigForm.get("interval.endInterval").updateValueAndValidity({emitEvent:e}),this.getTelemetryFromDatabaseConfigForm.get("interval.endIntervalTimeUnit").updateValueAndValidity({emitEvent:e}),this.getTelemetryFromDatabaseConfigForm.get("interval").updateValueAndValidity({emitEvent:e}),this.getTelemetryFromDatabaseConfigForm.get("startIntervalPattern").updateValueAndValidity({emitEvent:e}),this.getTelemetryFromDatabaseConfigForm.get("endIntervalPattern").updateValueAndValidity({emitEvent:e})}removeKey(e,t){const n=this.getTelemetryFromDatabaseConfigForm.get(t).value,r=n.indexOf(e);r>=0&&(n.splice(r,1),this.getTelemetryFromDatabaseConfigForm.get(t).setValue(n,{emitEvent:!0}))}clearChipGrid(){this.getTelemetryFromDatabaseConfigForm.get("latestTsKeyNames").patchValue([],{emitEvent:!0})}addKey(e,t){const n=e.input;let r=e.value;if((r||"").trim()){r=r.trim();let e=this.getTelemetryFromDatabaseConfigForm.get(t).value;e&&-1!==e.indexOf(r)||(e||(e=[]),e.push(r),this.getTelemetryFromDatabaseConfigForm.get(t).setValue(e,{emitEvent:!0}))}n&&(n.value="")}defaultPaddingEnable(){return this.getTelemetryFromDatabaseConfigForm.get("fetchMode").value===yt.ALL&&this.getTelemetryFromDatabaseConfigForm.get("aggregation").value===N.NONE}}e("GetTelemetryFromDatabaseConfigComponent",Nn),Nn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Nn,deps:[{token:G.Store},{token:H.TranslateService},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),Nn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Nn,selector:"tb-enrichment-node-get-telemetry-from-database",usesInheritance:!0,ngImport:t,template:'
\n \n
\n help\n \n
\n
\n
tb.rulenode.fetch-interval
\n
\n \n {{ \'tb.rulenode.use-metadata-dynamic-interval\' | translate }}\n \n
\n
\n
\n \n {{ \'tb.rulenode.interval-start\' | translate }}\n \n \n {{ \'tb.rulenode.start-interval-value-required\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n \n {{ \'tb.rulenode.time-unit\' | translate }}\n \n \n {{ timeUnitsTranslationMap.get(timeUnit) | translate }}\n \n \n \n
\n
\n \n {{ \'tb.rulenode.interval-end\' | translate }}\n \n \n {{ \'tb.rulenode.end-interval-value-required\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n \n {{ \'tb.rulenode.time-unit\' | translate }}\n \n \n {{ timeUnitsTranslationMap.get(timeUnit) | translate }}\n \n \n \n
\n
\n error_outline\n
\n \n {{ \'tb.rulenode.fetch-timeseries-from-to\' | translate:\n {\n startInterval: getTelemetryFromDatabaseConfigForm.get(\'interval.startInterval\').value,\n endInterval: getTelemetryFromDatabaseConfigForm.get(\'interval.endInterval\').value,\n startIntervalTimeUnit: getTelemetryFromDatabaseConfigForm.get(\'interval.startIntervalTimeUnit\').value.toLowerCase(),\n endIntervalTimeUnit: getTelemetryFromDatabaseConfigForm.get(\'interval.endIntervalTimeUnit\').value.toLowerCase()\n } }}\n \n \n {{ "tb.rulenode.fetch-timeseries-from-to-invalid" | translate }}\n \n
\n
\n
\n \n
\n \n {{ \'tb.rulenode.start-interval\' | translate }}\n \n \n {{ \'tb.rulenode.start-interval-required\' | translate }}\n \n \n \n {{ \'tb.rulenode.end-interval\' | translate }}\n \n \n {{ \'tb.rulenode.end-interval-required\' | translate }}\n \n \n \n \n
\n
\n
\n
\n
tb.rulenode.fetch-strategy
\n
\n
\n \n \n {{ data.name }}\n \n \n
\n
\n {{ deduplicationStrategiesHintTranslations.get(getTelemetryFromDatabaseConfigForm.get(\'fetchMode\').value) | translate }}\n
\n
\n
\n \n {{ \'aggregation.function\' | translate }}\n \n \n {{ aggregationTypesTranslations.get(aggregationTypes[aggregation]) | translate }}\n \n \n \n
\n \n {{ "tb.rulenode.order-by-timestamp" | translate }} \n \n \n {{ samplingOrdersTranslate.get(order) | translate }}\n \n \n \n \n {{ "tb.rulenode.limit" | translate }}\n \n {{ "tb.rulenode.limit-hint" | translate }}\n \n {{ \'tb.rulenode.limit-required\' | translate }}\n \n \n {{ \'tb.rulenode.limit-range\' | translate }}\n \n \n {{ \'tb.rulenode.limit-range\' | translate }}\n \n \n
\n
\n
\n
\n',styles:[":host .see-example{display:inline-block}:host .description-block{display:flex;align-items:center;border-radius:6px;border:1px solid #EAEAEA}:host .description-block .description-icon{font-size:24px;height:24px;min-height:24px;width:24px;min-width:24px;line-height:24px;color:#d9d9d9;margin:4px}:host .description-block .description-text{font-size:12px;line-height:16px;letter-spacing:.25px;margin:6px}:host .description-block.error{color:var(--mdc-theme-error, #f44336)}:host .description-block.error .description-icon{color:var(--mdc-theme-error, #f44336)}:host .item-center{align-items:center}:host .item-center .fetch-mod-toggle{max-width:630px;width:100%}:host .hint-container{width:95%}@media screen and (max-width: 959px){:host .hint-container{width:100%}}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:Ge.HelpPopupComponent,selector:"[tb-help-popup], [tb-help-popup-content]",inputs:["tb-help-popup","tb-help-popup-content","trigger-text","trigger-style","tb-help-popup-placement","tb-help-popup-style","hintMode"]},{kind:"component",type:Re.StringItemsListComponent,selector:"tb-string-items-list",inputs:["required","disabled","label","placeholder","hint","requiredText","floatLabel","appearance","editable","subscriptSizing","predefinedValues"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.MaxValidator,selector:"input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",inputs:["max"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:E.FormGroupName,selector:"[formGroupName]",inputs:["formGroupName"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"directive",type:Oe.ToggleOption,selector:"tb-toggle-option",inputs:["value"]},{kind:"component",type:Be.ToggleSelectComponent,selector:"tb-toggle-select",inputs:["disabled","selectMediaBreakpoint","appearance","disablePagination"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"component",type:un,selector:"tb-example-hint",inputs:["hintText","popupHelpLink"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Nn,decorators:[{type:n,args:[{selector:"tb-enrichment-node-get-telemetry-from-database",template:'
\n \n
\n help\n \n
\n
\n
tb.rulenode.fetch-interval
\n
\n \n {{ \'tb.rulenode.use-metadata-dynamic-interval\' | translate }}\n \n
\n
\n
\n \n {{ \'tb.rulenode.interval-start\' | translate }}\n \n \n {{ \'tb.rulenode.start-interval-value-required\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n \n {{ \'tb.rulenode.time-unit\' | translate }}\n \n \n {{ timeUnitsTranslationMap.get(timeUnit) | translate }}\n \n \n \n
\n
\n \n {{ \'tb.rulenode.interval-end\' | translate }}\n \n \n {{ \'tb.rulenode.end-interval-value-required\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n {{ \'tb.rulenode.time-value-range\' | translate }}\n \n \n \n {{ \'tb.rulenode.time-unit\' | translate }}\n \n \n {{ timeUnitsTranslationMap.get(timeUnit) | translate }}\n \n \n \n
\n
\n error_outline\n
\n \n {{ \'tb.rulenode.fetch-timeseries-from-to\' | translate:\n {\n startInterval: getTelemetryFromDatabaseConfigForm.get(\'interval.startInterval\').value,\n endInterval: getTelemetryFromDatabaseConfigForm.get(\'interval.endInterval\').value,\n startIntervalTimeUnit: getTelemetryFromDatabaseConfigForm.get(\'interval.startIntervalTimeUnit\').value.toLowerCase(),\n endIntervalTimeUnit: getTelemetryFromDatabaseConfigForm.get(\'interval.endIntervalTimeUnit\').value.toLowerCase()\n } }}\n \n \n {{ "tb.rulenode.fetch-timeseries-from-to-invalid" | translate }}\n \n
\n
\n
\n \n
\n \n {{ \'tb.rulenode.start-interval\' | translate }}\n \n \n {{ \'tb.rulenode.start-interval-required\' | translate }}\n \n \n \n {{ \'tb.rulenode.end-interval\' | translate }}\n \n \n {{ \'tb.rulenode.end-interval-required\' | translate }}\n \n \n \n \n
\n
\n
\n
\n
tb.rulenode.fetch-strategy
\n
\n
\n \n \n {{ data.name }}\n \n \n
\n
\n {{ deduplicationStrategiesHintTranslations.get(getTelemetryFromDatabaseConfigForm.get(\'fetchMode\').value) | translate }}\n
\n
\n
\n \n {{ \'aggregation.function\' | translate }}\n \n \n {{ aggregationTypesTranslations.get(aggregationTypes[aggregation]) | translate }}\n \n \n \n
\n \n {{ "tb.rulenode.order-by-timestamp" | translate }} \n \n \n {{ samplingOrdersTranslate.get(order) | translate }}\n \n \n \n \n {{ "tb.rulenode.limit" | translate }}\n \n {{ "tb.rulenode.limit-hint" | translate }}\n \n {{ \'tb.rulenode.limit-required\' | translate }}\n \n \n {{ \'tb.rulenode.limit-range\' | translate }}\n \n \n {{ \'tb.rulenode.limit-range\' | translate }}\n \n \n
\n
\n
\n
\n',styles:[":host .see-example{display:inline-block}:host .description-block{display:flex;align-items:center;border-radius:6px;border:1px solid #EAEAEA}:host .description-block .description-icon{font-size:24px;height:24px;min-height:24px;width:24px;min-width:24px;line-height:24px;color:#d9d9d9;margin:4px}:host .description-block .description-text{font-size:12px;line-height:16px;letter-spacing:.25px;margin:6px}:host .description-block.error{color:var(--mdc-theme-error, #f44336)}:host .description-block.error .description-icon{color:var(--mdc-theme-error, #f44336)}:host .item-center{align-items:center}:host .item-center .fetch-mod-toggle{max-width:630px;width:100%}:host .hint-container{width:95%}@media screen and (max-width: 959px){:host .hint-container{width:100%}}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:E.FormBuilder}]}});class Sn extends s{constructor(e,t,n){super(e),this.store=e,this.translate=t,this.fb=n}configForm(){return this.originatorAttributesConfigForm}onConfigurationSet(e){this.originatorAttributesConfigForm=this.fb.group({tellFailureIfAbsent:[e.tellFailureIfAbsent,[]],fetchTo:[e.fetchTo,[]],attributesControl:[e.attributesControl,[]]})}prepareInputConfig(e){return ee(e)&&(e.attributesControl={clientAttributeNames:X(e?.clientAttributeNames)?e.clientAttributeNames:null,latestTsKeyNames:X(e?.latestTsKeyNames)?e.latestTsKeyNames:null,serverAttributeNames:X(e?.serverAttributeNames)?e.serverAttributeNames:null,sharedAttributeNames:X(e?.sharedAttributeNames)?e.sharedAttributeNames:null,getLatestValueWithTs:!!X(e?.getLatestValueWithTs)&&e.getLatestValueWithTs}),{fetchTo:X(e?.fetchTo)?e.fetchTo:wt.METADATA,tellFailureIfAbsent:!!X(e?.tellFailureIfAbsent)&&e.tellFailureIfAbsent,attributesControl:X(e?.attributesControl)?e.attributesControl:null}}prepareOutputConfig(e){for(const t of Object.keys(e.attributesControl))e[t]=e.attributesControl[t];return delete e.attributesControl,e}}e("OriginatorAttributesConfigComponent",Sn),Sn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Sn,deps:[{token:G.Store},{token:H.TranslateService},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),Sn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Sn,selector:"tb-enrichment-node-originator-attributes-config",usesInheritance:!0,ngImport:t,template:'
\n
\n
\n
tb.rulenode.originator-attributes
\n
\n tb.rulenode.at-least-one-field-required\n
\n
\n \n \n \n \n
\n
\n \n {{ \'tb.rulenode.tell-failure\' | translate }}\n \n
\n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"component",type:yn,selector:"tb-msg-metadata-chip",inputs:["labelText"]},{kind:"component",type:hn,selector:"tb-select-attributes",inputs:["popupHelpLink"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Sn,decorators:[{type:n,args:[{selector:"tb-enrichment-node-originator-attributes-config",template:'
\n
\n
\n
tb.rulenode.originator-attributes
\n
\n tb.rulenode.at-least-one-field-required\n
\n
\n \n \n \n \n
\n
\n \n {{ \'tb.rulenode.tell-failure\' | translate }}\n \n
\n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:H.TranslateService},{type:E.FormBuilder}]}});class qn extends s{constructor(e,t,n){super(e),this.store=e,this.fb=t,this.translate=n,this.originatorFields=[];for(const e of lt)this.originatorFields.push({value:e.value,name:this.translate.instant(e.name)})}configForm(){return this.originatorFieldsConfigForm}prepareOutputConfig(e){return Z(e)}prepareInputConfig(e){return{dataMapping:X(e?.dataMapping)?e.dataMapping:null,ignoreNullStrings:X(e?.ignoreNullStrings)?e.ignoreNullStrings:null,fetchTo:X(e?.fetchTo)?e.fetchTo:wt.METADATA}}onConfigurationSet(e){this.originatorFieldsConfigForm=this.fb.group({dataMapping:[e.dataMapping,[D.required]],ignoreNullStrings:[e.ignoreNullStrings,[]],fetchTo:[e.fetchTo,[]]})}}e("OriginatorFieldsConfigComponent",qn),qn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:qn,deps:[{token:G.Store},{token:E.FormBuilder},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),qn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:qn,selector:"tb-enrichment-node-originator-fields-config",usesInheritance:!0,ngImport:t,template:'
\n \n \n \n \n
\n \n {{ \'tb.rulenode.skip-empty-fields\' | translate }}\n \n
\n
\n',dependencies:[{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"component",type:yn,selector:"tb-msg-metadata-chip",inputs:["labelText"]},{kind:"component",type:xn,selector:"tb-sv-map-config",inputs:["selectOptions","disabled","labelText","requiredText","targetKeyPrefix","selectText","selectRequiredText","valText","valRequiredText","hintText","popupHelpLink","required"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:qn,decorators:[{type:n,args:[{selector:"tb-enrichment-node-originator-fields-config",template:'
\n \n \n \n \n
\n \n {{ \'tb.rulenode.skip-empty-fields\' | translate }}\n \n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder},{type:H.TranslateService}]}});class An extends s{constructor(e,t,n){super(e),this.store=e,this.fb=t,this.translate=n,this.DataToFetch=vt,this.msgMetadataLabelTranslations=Ft,this.originatorFields=[],this.fetchToData=[],this.destroy$=new Ae;for(const e of Object.keys(b))this.originatorFields.push({value:b[e].value,name:this.translate.instant(b[e].name)});for(const e of Ct.keys())this.fetchToData.push({value:e,name:this.translate.instant(Ct.get(e))})}configForm(){return this.relatedAttributesConfigForm}prepareOutputConfig(e){e.dataToFetch===vt.FIELDS?(e.dataMapping=e.svMap,delete e.svMap):(e.dataMapping=e.kvMap,delete e.kvMap);const t={};for(const n of Object.keys(e.dataMapping))t[n.trim()]=e.dataMapping[n];return e.dataMapping=t,delete e.svMap,delete e.kvMap,Z(e)}prepareInputConfig(e){let t,n,r={[b.name.value]:`relatedEntity${this.translate.instant(b.name.name)}`},o={serialNumber:"sn"};return t=X(e?.telemetry)?e.telemetry?vt.LATEST_TELEMETRY:vt.ATTRIBUTES:X(e?.dataToFetch)?e.dataToFetch:vt.ATTRIBUTES,n=X(e?.attrMapping)?e.attrMapping:X(e?.dataMapping)?e.dataMapping:null,t===vt.FIELDS?r=n:o=n,{relationsQuery:X(e?.relationsQuery)?e.relationsQuery:null,dataToFetch:t,svMap:r,kvMap:o,fetchTo:X(e?.fetchTo)?e.fetchTo:wt.METADATA}}selectTranslation(e,t){return this.relatedAttributesConfigForm.get("dataToFetch").value===vt.LATEST_TELEMETRY?e:t}onConfigurationSet(e){this.relatedAttributesConfigForm=this.fb.group({relationsQuery:[e.relationsQuery,[D.required]],dataToFetch:[e.dataToFetch,[]],kvMap:[e.kvMap,[]],svMap:[e.svMap,[]],fetchTo:[e.fetchTo,[]]}),this.relatedAttributesConfigForm.get("dataToFetch").valueChanges.pipe(Le(this.destroy$)).subscribe((e=>{e===vt.FIELDS?(this.relatedAttributesConfigForm.get("svMap").setValidators(D.required),this.relatedAttributesConfigForm.get("svMap").updateValueAndValidity(),this.relatedAttributesConfigForm.get("kvMap").clearValidators(),this.relatedAttributesConfigForm.get("kvMap").updateValueAndValidity()):(this.relatedAttributesConfigForm.get("kvMap").setValidators(D.required),this.relatedAttributesConfigForm.get("kvMap").updateValueAndValidity(),this.relatedAttributesConfigForm.get("svMap").clearValidators(),this.relatedAttributesConfigForm.get("svMap").updateValueAndValidity())}))}ngOnDestroy(){this.destroy$.next(),this.destroy$.complete()}}e("RelatedAttributesConfigComponent",An),An.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:An,deps:[{token:G.Store},{token:E.FormBuilder},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),An.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:An,selector:"tb-enrichment-node-related-attributes-config",usesInheritance:!0,ngImport:t,template:'
\n \n \n
\n
tb.rulenode.data-to-fetch
\n
\n
\n \n \n {{ data.name }}\n \n \n
\n
\n \n \n \n \n \n \n \n \n
\n
\n',styles:[":host .toggle-block{display:flex;place-content:center}:host .toggle-block .fetch-to-data-toggle{max-width:630px;width:100%}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"directive",type:Oe.ToggleOption,selector:"tb-toggle-option",inputs:["value"]},{kind:"component",type:Be.ToggleSelectComponent,selector:"tb-toggle-select",inputs:["disabled","selectMediaBreakpoint","appearance","disablePagination"]},{kind:"component",type:pn,selector:"tb-kv-map-config",inputs:["disabled","uniqueKeyValuePairValidator","labelText","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","popupHelpLink","required"]},{kind:"component",type:cn,selector:"tb-relations-query-config",inputs:["disabled","required"]},{kind:"component",type:yn,selector:"tb-msg-metadata-chip",inputs:["labelText"]},{kind:"component",type:xn,selector:"tb-sv-map-config",inputs:["selectOptions","disabled","labelText","requiredText","targetKeyPrefix","selectText","selectRequiredText","valText","valRequiredText","hintText","popupHelpLink","required"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:An,decorators:[{type:n,args:[{selector:"tb-enrichment-node-related-attributes-config",template:'
\n \n \n
\n
tb.rulenode.data-to-fetch
\n
\n
\n \n \n {{ data.name }}\n \n \n
\n
\n \n \n \n \n \n \n \n \n
\n
\n',styles:[":host .toggle-block{display:flex;place-content:center}:host .toggle-block .fetch-to-data-toggle{max-width:630px;width:100%}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder},{type:H.TranslateService}]}});class Mn extends s{constructor(e,t,n){super(e),this.store=e,this.fb=t,this.translate=n,this.fetchToData=[],this.DataToFetch=vt;for(const e of Ct.keys())e!==vt.FIELDS&&this.fetchToData.push({value:e,name:this.translate.instant(Ct.get(e))})}configForm(){return this.tenantAttributesConfigForm}prepareInputConfig(e){let t,n;return t=X(e?.telemetry)?e.telemetry?vt.LATEST_TELEMETRY:vt.ATTRIBUTES:X(e?.dataToFetch)?e.dataToFetch:vt.ATTRIBUTES,n=X(e?.attrMapping)?e.attrMapping:X(e?.dataMapping)?e.dataMapping:null,{dataToFetch:t,dataMapping:n,fetchTo:X(e?.fetchTo)?e.fetchTo:wt.METADATA}}selectTranslation(e,t){return this.tenantAttributesConfigForm.get("dataToFetch").value===vt.LATEST_TELEMETRY?e:t}onConfigurationSet(e){this.tenantAttributesConfigForm=this.fb.group({dataToFetch:[e.dataToFetch,[]],dataMapping:[e.dataMapping,[D.required]],fetchTo:[e.fetchTo,[]]})}}e("TenantAttributesConfigComponent",Mn),Mn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Mn,deps:[{token:G.Store},{token:E.FormBuilder},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),Mn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Mn,selector:"tb-enrichment-node-tenant-attributes-config",usesInheritance:!0,ngImport:t,template:'
\n
tb.rulenode.mapping-of-tenant-fields
\n
\n
\n \n \n {{ data.name }}\n \n \n
\n
\n \n \n \n \n
\n',styles:[":host .fetch-to-data-toggle{max-width:420px;width:100%}\n"],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:_.DefaultLayoutAlignDirective,selector:" [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]",inputs:["fxLayoutAlign","fxLayoutAlign.xs","fxLayoutAlign.sm","fxLayoutAlign.md","fxLayoutAlign.lg","fxLayoutAlign.xl","fxLayoutAlign.lt-sm","fxLayoutAlign.lt-md","fxLayoutAlign.lt-lg","fxLayoutAlign.lt-xl","fxLayoutAlign.gt-xs","fxLayoutAlign.gt-sm","fxLayoutAlign.gt-md","fxLayoutAlign.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"directive",type:Oe.ToggleOption,selector:"tb-toggle-option",inputs:["value"]},{kind:"component",type:Be.ToggleSelectComponent,selector:"tb-toggle-select",inputs:["disabled","selectMediaBreakpoint","appearance","disablePagination"]},{kind:"component",type:pn,selector:"tb-kv-map-config",inputs:["disabled","uniqueKeyValuePairValidator","labelText","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","popupHelpLink","required"]},{kind:"component",type:yn,selector:"tb-msg-metadata-chip",inputs:["labelText"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Mn,decorators:[{type:n,args:[{selector:"tb-enrichment-node-tenant-attributes-config",template:'
\n
tb.rulenode.mapping-of-tenant-fields
\n
\n
\n \n \n {{ data.name }}\n \n \n
\n
\n \n \n \n \n
\n',styles:[":host .fetch-to-data-toggle{max-width:420px;width:100%}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder},{type:H.TranslateService}]}});class Gn extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.fetchDeviceCredentialsConfigForm}prepareInputConfig(e){return{fetchTo:X(e?.fetchTo)?e.fetchTo:wt.METADATA}}onConfigurationSet(e){this.fetchDeviceCredentialsConfigForm=this.fb.group({fetchTo:[e.fetchTo,[]]})}}e("FetchDeviceCredentialsConfigComponent",Gn),Gn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Gn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),Gn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Gn,selector:"./tb-enrichment-node-fetch-device-credentials-config",usesInheritance:!0,ngImport:t,template:'
\n \n \n
\n',dependencies:[{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:yn,selector:"tb-msg-metadata-chip",inputs:["labelText"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Gn,decorators:[{type:n,args:[{selector:"./tb-enrichment-node-fetch-device-credentials-config",template:'
\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]}});class En{}e("RulenodeCoreConfigEnrichmentModule",En),En.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:En,deps:[],target:t.ɵɵFactoryTarget.NgModule}),En.ɵmod=t.ɵɵngDeclareNgModule({minVersion:"14.0.0",version:"15.2.9",ngImport:t,type:En,declarations:[Ln,In,Tn,Sn,qn,Nn,An,Mn,kn,Gn],imports:[O,I,Cn],exports:[Ln,In,Tn,Sn,qn,Nn,An,Mn,kn,Gn]}),En.ɵinj=t.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:En,imports:[O,I,Cn]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:En,decorators:[{type:l,args:[{declarations:[Ln,In,Tn,Sn,qn,Nn,An,Mn,kn,Gn],imports:[O,I,Cn],exports:[Ln,In,Tn,Sn,qn,Nn,An,Mn,kn,Gn]}]}]});class Dn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.allAzureIotHubCredentialsTypes=St,this.azureIotHubCredentialsTypeTranslationsMap=qt}configForm(){return this.azureIotHubConfigForm}onConfigurationSet(e){this.azureIotHubConfigForm=this.fb.group({topicPattern:[e?e.topicPattern:null,[D.required]],host:[e?e.host:null,[D.required]],port:[e?e.port:null,[D.required,D.min(1),D.max(65535)]],connectTimeoutSec:[e?e.connectTimeoutSec:null,[D.required,D.min(1),D.max(200)]],clientId:[e?e.clientId:null,[D.required]],cleanSession:[!!e&&e.cleanSession,[]],ssl:[!!e&&e.ssl,[]],credentials:this.fb.group({type:[e&&e.credentials?e.credentials.type:null,[D.required]],sasKey:[e&&e.credentials?e.credentials.sasKey:null,[]],caCert:[e&&e.credentials?e.credentials.caCert:null,[]],caCertFileName:[e&&e.credentials?e.credentials.caCertFileName:null,[]],privateKey:[e&&e.credentials?e.credentials.privateKey:null,[]],privateKeyFileName:[e&&e.credentials?e.credentials.privateKeyFileName:null,[]],cert:[e&&e.credentials?e.credentials.cert:null,[]],certFileName:[e&&e.credentials?e.credentials.certFileName:null,[]],password:[e&&e.credentials?e.credentials.password:null,[]]})})}prepareOutputConfig(e){const t=e.credentials.type;return"sas"===t&&(e.credentials={type:t,sasKey:e.credentials.sasKey,caCert:e.credentials.caCert,caCertFileName:e.credentials.caCertFileName}),e}validatorTriggers(){return["credentials.type"]}updateValidators(e){const t=this.azureIotHubConfigForm.get("credentials"),n=t.get("type").value;switch(e&&t.reset({type:n},{emitEvent:!1}),t.get("sasKey").setValidators([]),t.get("privateKey").setValidators([]),t.get("privateKeyFileName").setValidators([]),t.get("cert").setValidators([]),t.get("certFileName").setValidators([]),n){case"sas":t.get("sasKey").setValidators([D.required]);break;case"cert.PEM":t.get("privateKey").setValidators([D.required]),t.get("privateKeyFileName").setValidators([D.required]),t.get("cert").setValidators([D.required]),t.get("certFileName").setValidators([D.required])}t.get("sasKey").updateValueAndValidity({emitEvent:e}),t.get("privateKey").updateValueAndValidity({emitEvent:e}),t.get("privateKeyFileName").updateValueAndValidity({emitEvent:e}),t.get("cert").updateValueAndValidity({emitEvent:e}),t.get("certFileName").updateValueAndValidity({emitEvent:e})}}e("AzureIotHubConfigComponent",Dn),Dn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Dn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Dn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Dn,selector:"tb-external-node-azure-iot-hub-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.topic\n \n \n {{ \'tb.rulenode.topic-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.hostname\n \n \n {{ \'tb.rulenode.hostname-required\' | translate }}\n \n \n \n tb.rulenode.device-id\n \n \n {{ \'tb.rulenode.device-id-required\' | translate }}\n \n \n \n \n \n tb.rulenode.credentials\n \n {{ azureIotHubCredentialsTypeTranslationsMap.get(azureIotHubConfigForm.get(\'credentials.type\').value) | translate }}\n \n \n
\n \n tb.rulenode.credentials-type\n \n \n {{ azureIotHubCredentialsTypeTranslationsMap.get(credentialsType) | translate }}\n \n \n \n {{ \'tb.rulenode.credentials-type-required\' | translate }}\n \n \n
\n \n \n \n \n tb.rulenode.sas-key\n \n \n \n {{ \'tb.rulenode.sas-key-required\' | translate }}\n \n \n \n \n \n \n \n \n \n \n \n \n \n tb.rulenode.private-key-password\n \n \n \n \n
\n
\n
\n
\n
\n',styles:[":host .tb-mqtt-credentials-panel-group{margin:0 6px}\n"],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:R.NgSwitch,selector:"[ngSwitch]",inputs:["ngSwitch"]},{kind:"directive",type:R.NgSwitchCase,selector:"[ngSwitchCase]",inputs:["ngSwitchCase"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:Ne.MatAccordion,selector:"mat-accordion",inputs:["multi","hideToggle","displayMode","togglePosition"],exportAs:["matAccordion"]},{kind:"component",type:Ne.MatExpansionPanel,selector:"mat-expansion-panel",inputs:["disabled","expanded","hideToggle","togglePosition"],outputs:["opened","closed","expandedChange","afterExpand","afterCollapse"],exportAs:["matExpansionPanel"]},{kind:"component",type:Ne.MatExpansionPanelHeader,selector:"mat-expansion-panel-header",inputs:["tabIndex","expandedHeight","collapsedHeight"]},{kind:"directive",type:Ne.MatExpansionPanelTitle,selector:"mat-panel-title"},{kind:"directive",type:Ne.MatExpansionPanelDescription,selector:"mat-panel-description"},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:E.FormGroupName,selector:"[formGroupName]",inputs:["formGroupName"]},{kind:"component",type:Pe.FileInputComponent,selector:"tb-file-input",inputs:["label","hint","accept","noFileText","inputId","allowedExtensions","dropLabel","contentConvertFunction","required","requiredAsError","disabled","existingFileName","readAsBinary","workFromFileObj","multipleFile"],outputs:["fileNameChanged"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:we.TogglePasswordComponent,selector:"tb-toggle-password"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Dn,decorators:[{type:n,args:[{selector:"tb-external-node-azure-iot-hub-config",template:'
\n \n tb.rulenode.topic\n \n \n {{ \'tb.rulenode.topic-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.hostname\n \n \n {{ \'tb.rulenode.hostname-required\' | translate }}\n \n \n \n tb.rulenode.device-id\n \n \n {{ \'tb.rulenode.device-id-required\' | translate }}\n \n \n \n \n \n tb.rulenode.credentials\n \n {{ azureIotHubCredentialsTypeTranslationsMap.get(azureIotHubConfigForm.get(\'credentials.type\').value) | translate }}\n \n \n
\n \n tb.rulenode.credentials-type\n \n \n {{ azureIotHubCredentialsTypeTranslationsMap.get(credentialsType) | translate }}\n \n \n \n {{ \'tb.rulenode.credentials-type-required\' | translate }}\n \n \n
\n \n \n \n \n tb.rulenode.sas-key\n \n \n \n {{ \'tb.rulenode.sas-key-required\' | translate }}\n \n \n \n \n \n \n \n \n \n \n \n \n \n tb.rulenode.private-key-password\n \n \n \n \n
\n
\n
\n
\n
\n',styles:[":host .tb-mqtt-credentials-panel-group{margin:0 6px}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Vn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.ackValues=["all","-1","0","1"],this.ToByteStandartCharsetTypesValues=Mt,this.ToByteStandartCharsetTypeTranslationMap=Gt}configForm(){return this.kafkaConfigForm}onConfigurationSet(e){this.kafkaConfigForm=this.fb.group({topicPattern:[e?e.topicPattern:null,[D.required]],keyPattern:[e?e.keyPattern:null],bootstrapServers:[e?e.bootstrapServers:null,[D.required]],retries:[e?e.retries:null,[D.min(0)]],batchSize:[e?e.batchSize:null,[D.min(0)]],linger:[e?e.linger:null,[D.min(0)]],bufferMemory:[e?e.bufferMemory:null,[D.min(0)]],acks:[e?e.acks:null,[D.required]],keySerializer:[e?e.keySerializer:null,[D.required]],valueSerializer:[e?e.valueSerializer:null,[D.required]],otherProperties:[e?e.otherProperties:null,[]],addMetadataKeyValuesAsKafkaHeaders:[!!e&&e.addMetadataKeyValuesAsKafkaHeaders,[]],kafkaHeadersCharset:[e?e.kafkaHeadersCharset:null,[]]})}validatorTriggers(){return["addMetadataKeyValuesAsKafkaHeaders"]}updateValidators(e){this.kafkaConfigForm.get("addMetadataKeyValuesAsKafkaHeaders").value?this.kafkaConfigForm.get("kafkaHeadersCharset").setValidators([D.required]):this.kafkaConfigForm.get("kafkaHeadersCharset").setValidators([]),this.kafkaConfigForm.get("kafkaHeadersCharset").updateValueAndValidity({emitEvent:e})}}e("KafkaConfigComponent",Vn),Vn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Vn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Vn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Vn,selector:"tb-external-node-kafka-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.topic-pattern\n \n \n {{ \'tb.rulenode.topic-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.key-pattern\n \n tb.rulenode.general-pattern-hint\n \n
tb.rulenode.key-pattern-hint
\n \n tb.rulenode.bootstrap-servers\n \n \n {{ \'tb.rulenode.bootstrap-servers-required\' | translate }}\n \n \n \n tb.rulenode.retries\n \n \n {{ \'tb.rulenode.min-retries-message\' | translate }}\n \n \n \n tb.rulenode.batch-size-bytes\n \n \n {{ \'tb.rulenode.min-batch-size-bytes-message\' | translate }}\n \n \n \n tb.rulenode.linger-ms\n \n \n {{ \'tb.rulenode.min-linger-ms-message\' | translate }}\n \n \n \n tb.rulenode.buffer-memory-bytes\n \n \n {{ \'tb.rulenode.min-buffer-memory-bytes-message\' | translate }}\n \n \n \n tb.rulenode.acks\n \n \n {{ ackValue }}\n \n \n \n \n tb.rulenode.key-serializer\n \n \n {{ \'tb.rulenode.key-serializer-required\' | translate }}\n \n \n \n tb.rulenode.value-serializer\n \n \n {{ \'tb.rulenode.value-serializer-required\' | translate }}\n \n \n \n \n \n \n {{ \'tb.rulenode.add-metadata-key-values-as-kafka-headers\' | translate }}\n \n
tb.rulenode.add-metadata-key-values-as-kafka-headers-hint
\n \n tb.rulenode.charset-encoding\n \n \n {{ ToByteStandartCharsetTypeTranslationMap.get(charset) | translate }}\n \n \n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:Zt,selector:"tb-kv-map-config-old",inputs:["disabled","uniqueKeyValuePairValidator","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","required"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Vn,decorators:[{type:n,args:[{selector:"tb-external-node-kafka-config",template:'
\n \n tb.rulenode.topic-pattern\n \n \n {{ \'tb.rulenode.topic-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.key-pattern\n \n tb.rulenode.general-pattern-hint\n \n
tb.rulenode.key-pattern-hint
\n \n tb.rulenode.bootstrap-servers\n \n \n {{ \'tb.rulenode.bootstrap-servers-required\' | translate }}\n \n \n \n tb.rulenode.retries\n \n \n {{ \'tb.rulenode.min-retries-message\' | translate }}\n \n \n \n tb.rulenode.batch-size-bytes\n \n \n {{ \'tb.rulenode.min-batch-size-bytes-message\' | translate }}\n \n \n \n tb.rulenode.linger-ms\n \n \n {{ \'tb.rulenode.min-linger-ms-message\' | translate }}\n \n \n \n tb.rulenode.buffer-memory-bytes\n \n \n {{ \'tb.rulenode.min-buffer-memory-bytes-message\' | translate }}\n \n \n \n tb.rulenode.acks\n \n \n {{ ackValue }}\n \n \n \n \n tb.rulenode.key-serializer\n \n \n {{ \'tb.rulenode.key-serializer-required\' | translate }}\n \n \n \n tb.rulenode.value-serializer\n \n \n {{ \'tb.rulenode.value-serializer-required\' | translate }}\n \n \n \n \n \n \n {{ \'tb.rulenode.add-metadata-key-values-as-kafka-headers\' | translate }}\n \n
tb.rulenode.add-metadata-key-values-as-kafka-headers-hint
\n \n tb.rulenode.charset-encoding\n \n \n {{ ToByteStandartCharsetTypeTranslationMap.get(charset) | translate }}\n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Pn extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.mqttConfigForm}onConfigurationSet(e){this.mqttConfigForm=this.fb.group({topicPattern:[e?e.topicPattern:null,[D.required]],host:[e?e.host:null,[D.required]],port:[e?e.port:null,[D.required,D.min(1),D.max(65535)]],connectTimeoutSec:[e?e.connectTimeoutSec:null,[D.required,D.min(1),D.max(200)]],clientId:[e?e.clientId:null,[]],appendClientIdSuffix:[{value:!!e&&e.appendClientIdSuffix,disabled:!(e&&te(e.clientId))},[]],cleanSession:[!!e&&e.cleanSession,[]],retainedMessage:[!!e&&e.retainedMessage,[]],ssl:[!!e&&e.ssl,[]],credentials:[e?e.credentials:null,[]]})}updateValidators(e){te(this.mqttConfigForm.get("clientId").value)?this.mqttConfigForm.get("appendClientIdSuffix").enable({emitEvent:!1}):this.mqttConfigForm.get("appendClientIdSuffix").disable({emitEvent:!1}),this.mqttConfigForm.get("appendClientIdSuffix").updateValueAndValidity({emitEvent:e})}validatorTriggers(){return["clientId"]}}e("MqttConfigComponent",Pn),Pn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Pn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Pn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Pn,selector:"tb-external-node-mqtt-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.topic-pattern\n \n \n {{ \'tb.rulenode.topic-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n \n tb.rulenode.host\n \n \n {{ \'tb.rulenode.host-required\' | translate }}\n \n \n \n tb.rulenode.port\n \n \n {{ \'tb.rulenode.port-required\' | translate }}\n \n \n {{ \'tb.rulenode.port-range\' | translate }}\n \n \n {{ \'tb.rulenode.port-range\' | translate }}\n \n \n \n tb.rulenode.connect-timeout\n \n \n {{ \'tb.rulenode.connect-timeout-required\' | translate }}\n \n \n {{ \'tb.rulenode.connect-timeout-range\' | translate }}\n \n \n {{ \'tb.rulenode.connect-timeout-range\' | translate }}\n \n \n
\n \n tb.rulenode.client-id\n \n {{\'tb.rulenode.client-id-hint\' | translate}}\n \n \n {{ \'tb.rulenode.append-client-id-suffix\' | translate }}\n \n
{{ "tb.rulenode.client-id-suffix-hint" | translate }}
\n \n {{ \'tb.rulenode.clean-session\' | translate }}\n \n \n {{ "tb.rulenode.retained-message" | translate }}\n \n \n {{ \'tb.rulenode.enable-ssl\' | translate }}\n \n \n
\n',styles:[":host .tb-mqtt-credentials-panel-group{margin:0 6px}\n"],dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.MaxValidator,selector:"input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",inputs:["max"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:gn,selector:"tb-credentials-config",inputs:["required","disableCertPemCredentials","passwordFieldRequired"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Pn,decorators:[{type:n,args:[{selector:"tb-external-node-mqtt-config",template:'
\n \n tb.rulenode.topic-pattern\n \n \n {{ \'tb.rulenode.topic-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n \n tb.rulenode.host\n \n \n {{ \'tb.rulenode.host-required\' | translate }}\n \n \n \n tb.rulenode.port\n \n \n {{ \'tb.rulenode.port-required\' | translate }}\n \n \n {{ \'tb.rulenode.port-range\' | translate }}\n \n \n {{ \'tb.rulenode.port-range\' | translate }}\n \n \n \n tb.rulenode.connect-timeout\n \n \n {{ \'tb.rulenode.connect-timeout-required\' | translate }}\n \n \n {{ \'tb.rulenode.connect-timeout-range\' | translate }}\n \n \n {{ \'tb.rulenode.connect-timeout-range\' | translate }}\n \n \n
\n \n tb.rulenode.client-id\n \n {{\'tb.rulenode.client-id-hint\' | translate}}\n \n \n {{ \'tb.rulenode.append-client-id-suffix\' | translate }}\n \n
{{ "tb.rulenode.client-id-suffix-hint" | translate }}
\n \n {{ \'tb.rulenode.clean-session\' | translate }}\n \n \n {{ "tb.rulenode.retained-message" | translate }}\n \n \n {{ \'tb.rulenode.enable-ssl\' | translate }}\n \n \n
\n',styles:[":host .tb-mqtt-credentials-panel-group{margin:0 6px}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class wn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.notificationType=q,this.entityType=x}configForm(){return this.notificationConfigForm}onConfigurationSet(e){this.notificationConfigForm=this.fb.group({templateId:[e?e.templateId:null,[D.required]],targets:[e?e.targets:[],[D.required]]})}}e("NotificationConfigComponent",wn),wn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:wn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),wn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:wn,selector:"tb-external-node-notification-config",usesInheritance:!0,ngImport:t,template:'
\n \n \n \n \n
\n',dependencies:[{kind:"component",type:Ke.EntityListComponent,selector:"tb-entity-list",inputs:["entityType","subType","labelText","placeholderText","requiredText","required","disabled","subscriptSizing","hint"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:Ue.TemplateAutocompleteComponent,selector:"tb-template-autocomplete",inputs:["required","allowCreate","allowEdit","disabled","notificationTypes"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:wn,decorators:[{type:n,args:[{selector:"tb-external-node-notification-config",template:'
\n \n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]}});class Rn extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.pubSubConfigForm}onConfigurationSet(e){this.pubSubConfigForm=this.fb.group({projectId:[e?e.projectId:null,[D.required]],topicName:[e?e.topicName:null,[D.required]],serviceAccountKey:[e?e.serviceAccountKey:null,[D.required]],serviceAccountKeyFileName:[e?e.serviceAccountKeyFileName:null,[D.required]],messageAttributes:[e?e.messageAttributes:null,[]]})}}e("PubSubConfigComponent",Rn),Rn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Rn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Rn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Rn,selector:"tb-external-node-pub-sub-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.gcp-project-id\n \n \n {{ \'tb.rulenode.gcp-project-id-required\' | translate }}\n \n \n \n tb.rulenode.pubsub-topic-name\n \n \n {{ \'tb.rulenode.pubsub-topic-name-required\' | translate }}\n \n \n \n \n \n
\n \n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:Pe.FileInputComponent,selector:"tb-file-input",inputs:["label","hint","accept","noFileText","inputId","allowedExtensions","dropLabel","contentConvertFunction","required","requiredAsError","disabled","existingFileName","readAsBinary","workFromFileObj","multipleFile"],outputs:["fileNameChanged"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:Zt,selector:"tb-kv-map-config-old",inputs:["disabled","uniqueKeyValuePairValidator","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","required"]},{kind:"pipe",type:pe.SafePipe,name:"safe"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Rn,decorators:[{type:n,args:[{selector:"tb-external-node-pub-sub-config",template:'
\n \n tb.rulenode.gcp-project-id\n \n \n {{ \'tb.rulenode.gcp-project-id-required\' | translate }}\n \n \n \n tb.rulenode.pubsub-topic-name\n \n \n {{ \'tb.rulenode.pubsub-topic-name-required\' | translate }}\n \n \n \n \n \n
\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class On extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.messageProperties=[null,"BASIC","TEXT_PLAIN","MINIMAL_BASIC","MINIMAL_PERSISTENT_BASIC","PERSISTENT_BASIC","PERSISTENT_TEXT_PLAIN"]}configForm(){return this.rabbitMqConfigForm}onConfigurationSet(e){this.rabbitMqConfigForm=this.fb.group({exchangeNamePattern:[e?e.exchangeNamePattern:null,[]],routingKeyPattern:[e?e.routingKeyPattern:null,[]],messageProperties:[e?e.messageProperties:null,[]],host:[e?e.host:null,[D.required]],port:[e?e.port:null,[D.required,D.min(1),D.max(65535)]],virtualHost:[e?e.virtualHost:null,[]],username:[e?e.username:null,[]],password:[e?e.password:null,[]],automaticRecoveryEnabled:[!!e&&e.automaticRecoveryEnabled,[]],connectionTimeout:[e?e.connectionTimeout:null,[D.min(0)]],handshakeTimeout:[e?e.handshakeTimeout:null,[D.min(0)]],clientProperties:[e?e.clientProperties:null,[]]})}}e("RabbitMqConfigComponent",On),On.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:On,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),On.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:On,selector:"tb-external-node-rabbit-mq-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.exchange-name-pattern\n \n \n \n tb.rulenode.routing-key-pattern\n \n \n \n tb.rulenode.message-properties\n \n \n {{ property }}\n \n \n \n
\n \n tb.rulenode.host\n \n \n {{ \'tb.rulenode.host-required\' | translate }}\n \n \n \n tb.rulenode.port\n \n \n {{ \'tb.rulenode.port-required\' | translate }}\n \n \n {{ \'tb.rulenode.port-range\' | translate }}\n \n \n {{ \'tb.rulenode.port-range\' | translate }}\n \n \n
\n \n tb.rulenode.virtual-host\n \n \n \n tb.rulenode.username\n \n \n \n tb.rulenode.password\n \n \n \n \n {{ \'tb.rulenode.automatic-recovery\' | translate }}\n \n \n tb.rulenode.connection-timeout-ms\n \n \n {{ \'tb.rulenode.min-connection-timeout-ms-message\' | translate }}\n \n \n \n tb.rulenode.handshake-timeout-ms\n \n \n {{ \'tb.rulenode.min-handshake-timeout-ms-message\' | translate }}\n \n \n \n \n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.MaxValidator,selector:"input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",inputs:["max"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:we.TogglePasswordComponent,selector:"tb-toggle-password"},{kind:"component",type:Zt,selector:"tb-kv-map-config-old",inputs:["disabled","uniqueKeyValuePairValidator","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","required"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:On,decorators:[{type:n,args:[{selector:"tb-external-node-rabbit-mq-config",template:'
\n \n tb.rulenode.exchange-name-pattern\n \n \n \n tb.rulenode.routing-key-pattern\n \n \n \n tb.rulenode.message-properties\n \n \n {{ property }}\n \n \n \n
\n \n tb.rulenode.host\n \n \n {{ \'tb.rulenode.host-required\' | translate }}\n \n \n \n tb.rulenode.port\n \n \n {{ \'tb.rulenode.port-required\' | translate }}\n \n \n {{ \'tb.rulenode.port-range\' | translate }}\n \n \n {{ \'tb.rulenode.port-range\' | translate }}\n \n \n
\n \n tb.rulenode.virtual-host\n \n \n \n tb.rulenode.username\n \n \n \n tb.rulenode.password\n \n \n \n \n {{ \'tb.rulenode.automatic-recovery\' | translate }}\n \n \n tb.rulenode.connection-timeout-ms\n \n \n {{ \'tb.rulenode.min-connection-timeout-ms-message\' | translate }}\n \n \n \n tb.rulenode.handshake-timeout-ms\n \n \n {{ \'tb.rulenode.min-handshake-timeout-ms-message\' | translate }}\n \n \n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Bn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.proxySchemes=["http","https"],this.httpRequestTypes=Object.keys(At)}configForm(){return this.restApiCallConfigForm}onConfigurationSet(e){this.restApiCallConfigForm=this.fb.group({restEndpointUrlPattern:[e?e.restEndpointUrlPattern:null,[D.required]],requestMethod:[e?e.requestMethod:null,[D.required]],useSimpleClientHttpFactory:[!!e&&e.useSimpleClientHttpFactory,[]],trimDoubleQuotes:[!!e&&e.trimDoubleQuotes,[]],ignoreRequestBody:[!!e&&e.ignoreRequestBody,[]],enableProxy:[!!e&&e.enableProxy,[]],useSystemProxyProperties:[!!e&&e.enableProxy,[]],proxyScheme:[e?e.proxyHost:null,[]],proxyHost:[e?e.proxyHost:null,[]],proxyPort:[e?e.proxyPort:null,[]],proxyUser:[e?e.proxyUser:null,[]],proxyPassword:[e?e.proxyPassword:null,[]],readTimeoutMs:[e?e.readTimeoutMs:null,[]],maxParallelRequestsCount:[e?e.maxParallelRequestsCount:null,[D.min(0)]],headers:[e?e.headers:null,[]],useRedisQueueForMsgPersistence:[!!e&&e.useRedisQueueForMsgPersistence,[]],trimQueue:[!!e&&e.trimQueue,[]],maxQueueSize:[e?e.maxQueueSize:null,[]],credentials:[e?e.credentials:null,[]]})}validatorTriggers(){return["useSimpleClientHttpFactory","useRedisQueueForMsgPersistence","enableProxy","useSystemProxyProperties"]}updateValidators(e){const t=this.restApiCallConfigForm.get("useSimpleClientHttpFactory").value,n=this.restApiCallConfigForm.get("useRedisQueueForMsgPersistence").value,r=this.restApiCallConfigForm.get("enableProxy").value,o=this.restApiCallConfigForm.get("useSystemProxyProperties").value;r&&!o?(this.restApiCallConfigForm.get("proxyHost").setValidators(r?[D.required]:[]),this.restApiCallConfigForm.get("proxyPort").setValidators(r?[D.required,D.min(1),D.max(65535)]:[])):(this.restApiCallConfigForm.get("proxyHost").setValidators([]),this.restApiCallConfigForm.get("proxyPort").setValidators([]),t?this.restApiCallConfigForm.get("readTimeoutMs").setValidators([]):this.restApiCallConfigForm.get("readTimeoutMs").setValidators([D.min(0)])),n?this.restApiCallConfigForm.get("maxQueueSize").setValidators([D.min(0)]):this.restApiCallConfigForm.get("maxQueueSize").setValidators([]),this.restApiCallConfigForm.get("readTimeoutMs").updateValueAndValidity({emitEvent:e}),this.restApiCallConfigForm.get("maxQueueSize").updateValueAndValidity({emitEvent:e}),this.restApiCallConfigForm.get("proxyHost").updateValueAndValidity({emitEvent:e}),this.restApiCallConfigForm.get("proxyPort").updateValueAndValidity({emitEvent:e}),this.restApiCallConfigForm.get("credentials").updateValueAndValidity({emitEvent:e})}}e("RestApiCallConfigComponent",Bn),Bn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Bn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Bn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Bn,selector:"tb-external-node-rest-api-call-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.endpoint-url-pattern\n \n \n {{ \'tb.rulenode.endpoint-url-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.request-method\n \n \n {{ requestType }}\n \n \n \n \n {{ \'tb.rulenode.enable-proxy\' | translate }}\n \n \n {{ \'tb.rulenode.use-simple-client-http-factory\' | translate }}\n \n \n {{ \'tb.rulenode.trim-double-quotes\' | translate }}\n \n
tb.rulenode.trim-double-quotes-hint
\n \n {{ \'tb.rulenode.ignore-request-body\' | translate }}\n \n
\n \n {{ \'tb.rulenode.use-system-proxy-properties\' | translate }}\n \n
\n
\n \n tb.rulenode.proxy-scheme\n \n \n {{ proxyScheme }}\n \n \n \n \n tb.rulenode.proxy-host\n \n \n {{ \'tb.rulenode.proxy-host-required\' | translate }}\n \n \n \n tb.rulenode.proxy-port\n \n \n {{ \'tb.rulenode.proxy-port-required\' | translate }}\n \n \n {{ \'tb.rulenode.proxy-port-range\' | translate }}\n \n \n
\n \n tb.rulenode.proxy-user\n \n \n \n tb.rulenode.proxy-password\n \n \n
\n
\n \n tb.rulenode.read-timeout\n \n tb.rulenode.read-timeout-hint\n \n \n tb.rulenode.max-parallel-requests-count\n \n tb.rulenode.max-parallel-requests-count-hint\n \n \n
\n \n \n \n {{ \'tb.rulenode.use-redis-queue\' | translate }}\n \n
\n \n {{ \'tb.rulenode.trim-redis-queue\' | translate }}\n \n \n tb.rulenode.redis-queue-max-size\n \n \n
\n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:gn,selector:"tb-credentials-config",inputs:["required","disableCertPemCredentials","passwordFieldRequired"]},{kind:"component",type:Zt,selector:"tb-kv-map-config-old",inputs:["disabled","uniqueKeyValuePairValidator","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","required"]},{kind:"pipe",type:pe.SafePipe,name:"safe"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Bn,decorators:[{type:n,args:[{selector:"tb-external-node-rest-api-call-config",template:'
\n \n tb.rulenode.endpoint-url-pattern\n \n \n {{ \'tb.rulenode.endpoint-url-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.request-method\n \n \n {{ requestType }}\n \n \n \n \n {{ \'tb.rulenode.enable-proxy\' | translate }}\n \n \n {{ \'tb.rulenode.use-simple-client-http-factory\' | translate }}\n \n \n {{ \'tb.rulenode.trim-double-quotes\' | translate }}\n \n
tb.rulenode.trim-double-quotes-hint
\n \n {{ \'tb.rulenode.ignore-request-body\' | translate }}\n \n
\n \n {{ \'tb.rulenode.use-system-proxy-properties\' | translate }}\n \n
\n
\n \n tb.rulenode.proxy-scheme\n \n \n {{ proxyScheme }}\n \n \n \n \n tb.rulenode.proxy-host\n \n \n {{ \'tb.rulenode.proxy-host-required\' | translate }}\n \n \n \n tb.rulenode.proxy-port\n \n \n {{ \'tb.rulenode.proxy-port-required\' | translate }}\n \n \n {{ \'tb.rulenode.proxy-port-range\' | translate }}\n \n \n
\n \n tb.rulenode.proxy-user\n \n \n \n tb.rulenode.proxy-password\n \n \n
\n
\n \n tb.rulenode.read-timeout\n \n tb.rulenode.read-timeout-hint\n \n \n tb.rulenode.max-parallel-requests-count\n \n tb.rulenode.max-parallel-requests-count-hint\n \n \n
\n \n \n \n {{ \'tb.rulenode.use-redis-queue\' | translate }}\n \n
\n \n {{ \'tb.rulenode.trim-redis-queue\' | translate }}\n \n \n tb.rulenode.redis-queue-max-size\n \n \n
\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Kn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.smtpProtocols=["smtp","smtps"],this.tlsVersions=["TLSv1","TLSv1.1","TLSv1.2","TLSv1.3"]}configForm(){return this.sendEmailConfigForm}onConfigurationSet(e){this.sendEmailConfigForm=this.fb.group({useSystemSmtpSettings:[!!e&&e.useSystemSmtpSettings,[]],smtpProtocol:[e?e.smtpProtocol:null,[]],smtpHost:[e?e.smtpHost:null,[]],smtpPort:[e?e.smtpPort:null,[]],timeout:[e?e.timeout:null,[]],enableTls:[!!e&&e.enableTls,[]],tlsVersion:[e?e.tlsVersion:null,[]],enableProxy:[!!e&&e.enableProxy,[]],proxyHost:[e?e.proxyHost:null,[]],proxyPort:[e?e.proxyPort:null,[]],proxyUser:[e?e.proxyUser:null,[]],proxyPassword:[e?e.proxyPassword:null,[]],username:[e?e.username:null,[]],password:[e?e.password:null,[]]})}validatorTriggers(){return["useSystemSmtpSettings","enableProxy"]}updateValidators(e){const t=this.sendEmailConfigForm.get("useSystemSmtpSettings").value,n=this.sendEmailConfigForm.get("enableProxy").value;t?(this.sendEmailConfigForm.get("smtpProtocol").setValidators([]),this.sendEmailConfigForm.get("smtpHost").setValidators([]),this.sendEmailConfigForm.get("smtpPort").setValidators([]),this.sendEmailConfigForm.get("timeout").setValidators([]),this.sendEmailConfigForm.get("proxyHost").setValidators([]),this.sendEmailConfigForm.get("proxyPort").setValidators([])):(this.sendEmailConfigForm.get("smtpProtocol").setValidators([D.required]),this.sendEmailConfigForm.get("smtpHost").setValidators([D.required]),this.sendEmailConfigForm.get("smtpPort").setValidators([D.required,D.min(1),D.max(65535)]),this.sendEmailConfigForm.get("timeout").setValidators([D.required,D.min(0)]),this.sendEmailConfigForm.get("proxyHost").setValidators(n?[D.required]:[]),this.sendEmailConfigForm.get("proxyPort").setValidators(n?[D.required,D.min(1),D.max(65535)]:[])),this.sendEmailConfigForm.get("smtpProtocol").updateValueAndValidity({emitEvent:e}),this.sendEmailConfigForm.get("smtpHost").updateValueAndValidity({emitEvent:e}),this.sendEmailConfigForm.get("smtpPort").updateValueAndValidity({emitEvent:e}),this.sendEmailConfigForm.get("timeout").updateValueAndValidity({emitEvent:e}),this.sendEmailConfigForm.get("proxyHost").updateValueAndValidity({emitEvent:e}),this.sendEmailConfigForm.get("proxyPort").updateValueAndValidity({emitEvent:e})}}e("SendEmailConfigComponent",Kn),Kn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Kn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Kn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Kn,selector:"tb-external-node-send-email-config",usesInheritance:!0,ngImport:t,template:'
\n \n {{ \'tb.rulenode.use-system-smtp-settings\' | translate }}\n \n
\n \n tb.rulenode.smtp-protocol\n \n \n {{ smtpProtocol.toUpperCase() }}\n \n \n \n
\n \n tb.rulenode.smtp-host\n \n \n {{ \'tb.rulenode.smtp-host-required\' | translate }}\n \n \n \n tb.rulenode.smtp-port\n \n \n {{ \'tb.rulenode.smtp-port-required\' | translate }}\n \n \n {{ \'tb.rulenode.smtp-port-range\' | translate }}\n \n \n {{ \'tb.rulenode.smtp-port-range\' | translate }}\n \n \n
\n \n tb.rulenode.timeout-msec\n \n \n {{ \'tb.rulenode.timeout-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-timeout-msec-message\' | translate }}\n \n \n \n {{ \'tb.rulenode.enable-tls\' | translate }}\n \n \n tb.rulenode.tls-version\n \n \n {{ tlsVersion }}\n \n \n \n \n {{ \'tb.rulenode.enable-proxy\' | translate }}\n \n
\n
\n \n tb.rulenode.proxy-host\n \n \n {{ \'tb.rulenode.proxy-host-required\' | translate }}\n \n \n \n tb.rulenode.proxy-port\n \n \n {{ \'tb.rulenode.proxy-port-required\' | translate }}\n \n \n {{ \'tb.rulenode.proxy-port-range\' | translate }}\n \n \n
\n \n tb.rulenode.proxy-user\n \n \n \n tb.rulenode.proxy-password\n \n \n
\n \n tb.rulenode.username\n \n \n \n tb.rulenode.password\n \n \n \n
\n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:_e.TbCheckboxComponent,selector:"tb-checkbox",inputs:["disabled","trueValue","falseValue"],outputs:["valueChange"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.MaxValidator,selector:"input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",inputs:["max"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:we.TogglePasswordComponent,selector:"tb-toggle-password"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Kn,decorators:[{type:n,args:[{selector:"tb-external-node-send-email-config",template:'
\n \n {{ \'tb.rulenode.use-system-smtp-settings\' | translate }}\n \n
\n \n tb.rulenode.smtp-protocol\n \n \n {{ smtpProtocol.toUpperCase() }}\n \n \n \n
\n \n tb.rulenode.smtp-host\n \n \n {{ \'tb.rulenode.smtp-host-required\' | translate }}\n \n \n \n tb.rulenode.smtp-port\n \n \n {{ \'tb.rulenode.smtp-port-required\' | translate }}\n \n \n {{ \'tb.rulenode.smtp-port-range\' | translate }}\n \n \n {{ \'tb.rulenode.smtp-port-range\' | translate }}\n \n \n
\n \n tb.rulenode.timeout-msec\n \n \n {{ \'tb.rulenode.timeout-required\' | translate }}\n \n \n {{ \'tb.rulenode.min-timeout-msec-message\' | translate }}\n \n \n \n {{ \'tb.rulenode.enable-tls\' | translate }}\n \n \n tb.rulenode.tls-version\n \n \n {{ tlsVersion }}\n \n \n \n \n {{ \'tb.rulenode.enable-proxy\' | translate }}\n \n
\n
\n \n tb.rulenode.proxy-host\n \n \n {{ \'tb.rulenode.proxy-host-required\' | translate }}\n \n \n \n tb.rulenode.proxy-port\n \n \n {{ \'tb.rulenode.proxy-port-required\' | translate }}\n \n \n {{ \'tb.rulenode.proxy-port-range\' | translate }}\n \n \n
\n \n tb.rulenode.proxy-user\n \n \n \n tb.rulenode.proxy-password\n \n \n
\n \n tb.rulenode.username\n \n \n \n tb.rulenode.password\n \n \n \n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Un extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.sendSmsConfigForm}onConfigurationSet(e){this.sendSmsConfigForm=this.fb.group({numbersToTemplate:[e?e.numbersToTemplate:null,[D.required]],smsMessageTemplate:[e?e.smsMessageTemplate:null,[D.required]],useSystemSmsSettings:[!!e&&e.useSystemSmsSettings,[]],smsProviderConfiguration:[e?e.smsProviderConfiguration:null,[]]})}validatorTriggers(){return["useSystemSmsSettings"]}updateValidators(e){this.sendSmsConfigForm.get("useSystemSmsSettings").value?this.sendSmsConfigForm.get("smsProviderConfiguration").setValidators([]):this.sendSmsConfigForm.get("smsProviderConfiguration").setValidators([D.required]),this.sendSmsConfigForm.get("smsProviderConfiguration").updateValueAndValidity({emitEvent:e})}}e("SendSmsConfigComponent",Un),Un.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Un,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Un.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Un,selector:"tb-external-node-send-sms-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.numbers-to-template\n \n \n {{ \'tb.rulenode.numbers-to-template-required\' | translate }}\n \n \n \n \n tb.rulenode.sms-message-template\n \n \n {{ \'tb.rulenode.sms-message-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.use-system-sms-settings\' | translate }}\n \n \n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:He.SmsProviderConfigurationComponent,selector:"tb-sms-provider-configuration",inputs:["required","disabled"]},{kind:"pipe",type:pe.SafePipe,name:"safe"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Un,decorators:[{type:n,args:[{selector:"tb-external-node-send-sms-config",template:'
\n \n tb.rulenode.numbers-to-template\n \n \n {{ \'tb.rulenode.numbers-to-template-required\' | translate }}\n \n \n \n \n tb.rulenode.sms-message-template\n \n \n {{ \'tb.rulenode.sms-message-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.use-system-sms-settings\' | translate }}\n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class _n extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.slackChanelTypes=Object.keys(A),this.slackChanelTypesTranslateMap=M}configForm(){return this.slackConfigForm}onConfigurationSet(e){this.slackConfigForm=this.fb.group({botToken:[e?e.botToken:null],useSystemSettings:[!!e&&e.useSystemSettings],messageTemplate:[e?e.messageTemplate:null,[D.required]],conversationType:[e?e.conversationType:null,[D.required]],conversation:[e?e.conversation:null,[D.required]]})}validatorTriggers(){return["useSystemSettings"]}updateValidators(e){this.slackConfigForm.get("useSystemSettings").value?this.slackConfigForm.get("botToken").clearValidators():this.slackConfigForm.get("botToken").setValidators([D.required]),this.slackConfigForm.get("botToken").updateValueAndValidity({emitEvent:e})}}e("SlackConfigComponent",_n),_n.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:_n,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),_n.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:_n,selector:"tb-external-node-slack-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.message-template\n \n \n {{ \'tb.rulenode.message-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.use-system-slack-settings\' | translate }}\n \n \n tb.rulenode.slack-api-token\n \n \n {{ \'tb.rulenode.slack-api-token-required\' | translate }}\n \n \n \n \n \n {{ slackChanelTypesTranslateMap.get(slackChanelType) | translate }}\n \n \n \n \n
\n',styles:[":host .tb-title{display:block;padding-bottom:6px}:host ::ng-deep .mat-mdc-radio-group{display:flex;flex-direction:row;margin-bottom:22px;gap:12px}:host ::ng-deep .mat-mdc-radio-group .mat-mdc-radio-button{flex:1 1 100%;padding:4px;border:1px solid rgba(0,0,0,.12);border-radius:6px}@media screen and (max-width: 599px){:host ::ng-deep .mat-mdc-radio-group{flex-direction:column}}\n"],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:B.MatCheckbox,selector:"mat-checkbox",inputs:["disableRipple","color","tabIndex"],exportAs:["matCheckbox"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:ze.MatRadioGroup,selector:"mat-radio-group",exportAs:["matRadioGroup"]},{kind:"component",type:ze.MatRadioButton,selector:"mat-radio-button",inputs:["disableRipple","tabIndex"],exportAs:["matRadioButton"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:je.SlackConversationAutocompleteComponent,selector:"tb-slack-conversation-autocomplete",inputs:["labelText","requiredText","required","disabled","slackChanelType","token"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:_n,decorators:[{type:n,args:[{selector:"tb-external-node-slack-config",template:'
\n \n tb.rulenode.message-template\n \n \n {{ \'tb.rulenode.message-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n {{ \'tb.rulenode.use-system-slack-settings\' | translate }}\n \n \n tb.rulenode.slack-api-token\n \n \n {{ \'tb.rulenode.slack-api-token-required\' | translate }}\n \n \n \n \n \n {{ slackChanelTypesTranslateMap.get(slackChanelType) | translate }}\n \n \n \n \n
\n',styles:[":host .tb-title{display:block;padding-bottom:6px}:host ::ng-deep .mat-mdc-radio-group{display:flex;flex-direction:row;margin-bottom:22px;gap:12px}:host ::ng-deep .mat-mdc-radio-group .mat-mdc-radio-button{flex:1 1 100%;padding:4px;border:1px solid rgba(0,0,0,.12);border-radius:6px}@media screen and (max-width: 599px){:host ::ng-deep .mat-mdc-radio-group{flex-direction:column}}\n"]}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]}});class Hn extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.snsConfigForm}onConfigurationSet(e){this.snsConfigForm=this.fb.group({topicArnPattern:[e?e.topicArnPattern:null,[D.required]],accessKeyId:[e?e.accessKeyId:null,[D.required]],secretAccessKey:[e?e.secretAccessKey:null,[D.required]],region:[e?e.region:null,[D.required]]})}}e("SnsConfigComponent",Hn),Hn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Hn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Hn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Hn,selector:"tb-external-node-sns-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.topic-arn-pattern\n \n \n {{ \'tb.rulenode.topic-arn-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.aws-access-key-id\n \n \n {{ \'tb.rulenode.aws-access-key-id-required\' | translate }}\n \n \n \n tb.rulenode.aws-secret-access-key\n \n \n {{ \'tb.rulenode.aws-secret-access-key-required\' | translate }}\n \n \n \n tb.rulenode.aws-region\n \n \n {{ \'tb.rulenode.aws-region-required\' | translate }}\n \n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Hn,decorators:[{type:n,args:[{selector:"tb-external-node-sns-config",template:'
\n \n tb.rulenode.topic-arn-pattern\n \n \n {{ \'tb.rulenode.topic-arn-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.aws-access-key-id\n \n \n {{ \'tb.rulenode.aws-access-key-id-required\' | translate }}\n \n \n \n tb.rulenode.aws-secret-access-key\n \n \n {{ \'tb.rulenode.aws-secret-access-key-required\' | translate }}\n \n \n \n tb.rulenode.aws-region\n \n \n {{ \'tb.rulenode.aws-region-required\' | translate }}\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class zn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.sqsQueueType=Lt,this.sqsQueueTypes=Object.keys(Lt),this.sqsQueueTypeTranslationsMap=Tt}configForm(){return this.sqsConfigForm}onConfigurationSet(e){this.sqsConfigForm=this.fb.group({queueType:[e?e.queueType:null,[D.required]],queueUrlPattern:[e?e.queueUrlPattern:null,[D.required]],delaySeconds:[e?e.delaySeconds:null,[D.min(0),D.max(900)]],messageAttributes:[e?e.messageAttributes:null,[]],accessKeyId:[e?e.accessKeyId:null,[D.required]],secretAccessKey:[e?e.secretAccessKey:null,[D.required]],region:[e?e.region:null,[D.required]]})}}e("SqsConfigComponent",zn),zn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:zn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),zn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:zn,selector:"tb-external-node-sqs-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.queue-type\n \n \n {{ sqsQueueTypeTranslationsMap.get(type) | translate }}\n \n \n \n \n tb.rulenode.queue-url-pattern\n \n \n {{ \'tb.rulenode.queue-url-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.delay-seconds\n \n \n {{ \'tb.rulenode.min-delay-seconds-message\' | translate }}\n \n \n {{ \'tb.rulenode.max-delay-seconds-message\' | translate }}\n \n \n \n
\n \n \n \n tb.rulenode.aws-access-key-id\n \n \n {{ \'tb.rulenode.aws-access-key-id-required\' | translate }}\n \n \n \n tb.rulenode.aws-secret-access-key\n \n \n {{ \'tb.rulenode.aws-secret-access-key-required\' | translate }}\n \n \n \n tb.rulenode.aws-region\n \n \n {{ \'tb.rulenode.aws-region-required\' | translate }}\n \n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.MaxValidator,selector:"input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",inputs:["max"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:Zt,selector:"tb-kv-map-config-old",inputs:["disabled","uniqueKeyValuePairValidator","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","required"]},{kind:"pipe",type:pe.SafePipe,name:"safe"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:zn,decorators:[{type:n,args:[{selector:"tb-external-node-sqs-config",template:'
\n \n tb.rulenode.queue-type\n \n \n {{ sqsQueueTypeTranslationsMap.get(type) | translate }}\n \n \n \n \n tb.rulenode.queue-url-pattern\n \n \n {{ \'tb.rulenode.queue-url-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.delay-seconds\n \n \n {{ \'tb.rulenode.min-delay-seconds-message\' | translate }}\n \n \n {{ \'tb.rulenode.max-delay-seconds-message\' | translate }}\n \n \n \n
\n \n \n \n tb.rulenode.aws-access-key-id\n \n \n {{ \'tb.rulenode.aws-access-key-id-required\' | translate }}\n \n \n \n tb.rulenode.aws-secret-access-key\n \n \n {{ \'tb.rulenode.aws-secret-access-key-required\' | translate }}\n \n \n \n tb.rulenode.aws-region\n \n \n {{ \'tb.rulenode.aws-region-required\' | translate }}\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class jn{}e("RulenodeCoreConfigExternalModule",jn),jn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:jn,deps:[],target:t.ɵɵFactoryTarget.NgModule}),jn.ɵmod=t.ɵɵngDeclareNgModule({minVersion:"14.0.0",version:"15.2.9",ngImport:t,type:jn,declarations:[Hn,zn,Rn,Vn,Pn,wn,On,Bn,Kn,Dn,Un,_n],imports:[O,I,Me,Cn],exports:[Hn,zn,Rn,Vn,Pn,wn,On,Bn,Kn,Dn,Un,_n]}),jn.ɵinj=t.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:jn,imports:[O,I,Me,Cn]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:jn,decorators:[{type:l,args:[{declarations:[Hn,zn,Rn,Vn,Pn,wn,On,Bn,Kn,Dn,Un,_n],imports:[O,I,Me,Cn],exports:[Hn,zn,Rn,Vn,Pn,wn,On,Bn,Kn,Dn,Un,_n]}]}]});class Qn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.searchText=""}configForm(){return this.alarmStatusConfigForm}prepareInputConfig(e){return{alarmStatusList:X(e?.alarmStatusList)?e.alarmStatusList:null}}onConfigurationSet(e){this.alarmStatusConfigForm=this.fb.group({alarmStatusList:[e.alarmStatusList,[D.required]]})}}e("CheckAlarmStatusComponent",Qn),Qn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Qn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),Qn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Qn,selector:"tb-filter-node-check-alarm-status-config",usesInheritance:!0,ngImport:t,template:'
\n
\n
tb.rulenode.alarm-status
\n
\n tb.rulenode.alarm-required\n
\n
\n \n
\n\n\n\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:vn,selector:"tb-alarm-status-select"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Qn,decorators:[{type:n,args:[{selector:"tb-filter-node-check-alarm-status-config",template:'
\n
\n
tb.rulenode.alarm-status
\n
\n tb.rulenode.alarm-required\n
\n
\n \n
\n\n\n\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]}});class $n extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.checkMessageConfigForm}prepareInputConfig(e){return{messageNames:X(e?.messageNames)?e.messageNames:null,metadataNames:X(e?.metadataNames)?e.metadataNames:null,checkAllKeys:!!X(e?.checkAllKeys)&&e.checkAllKeys}}atLeastOne(e,t=null){return n=>{t||(t=Object.keys(n.controls));return n?.controls&&t.some((t=>!e(n.controls[t])))?null:{atLeastOne:!0}}}onConfigurationSet(e){this.checkMessageConfigForm=this.fb.group({messageNames:[e.messageNames,[]],metadataNames:[e.metadataNames,[]],checkAllKeys:[e.checkAllKeys,[]]},{validators:this.atLeastOne(D.required,["messageNames","metadataNames"])})}get touchedValidationControl(){return["messageNames","metadataNames"].some((e=>this.checkMessageConfigForm.get(e).touched))}}e("CheckMessageConfigComponent",$n),$n.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:$n,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),$n.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:$n,selector:"tb-filter-node-check-message-config",usesInheritance:!0,ngImport:t,template:'
\n
\n
tb.rulenode.fields-to-check
\n
\n tb.rulenode.at-least-one-field-required\n
\n
\n \n help\n \n \n help\n \n
\n \n {{ \'tb.rulenode.check-all-keys\' | translate }}\n \n
\n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"component",type:Re.StringItemsListComponent,selector:"tb-string-items-list",inputs:["required","disabled","label","placeholder","hint","requiredText","floatLabel","appearance","editable","subscriptSizing","predefinedValues"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:$n,decorators:[{type:n,args:[{selector:"tb-filter-node-check-message-config",template:'
\n
\n
tb.rulenode.fields-to-check
\n
\n tb.rulenode.at-least-one-field-required\n
\n
\n \n help\n \n \n help\n \n
\n \n {{ \'tb.rulenode.check-all-keys\' | translate }}\n \n
\n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]}});class Jn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.entitySearchDirection=Object.values(g),this.entitySearchDirectionTranslationsMap=y}configForm(){return this.checkRelationConfigForm}prepareInputConfig(e){return{checkForSingleEntity:!!X(e?.checkForSingleEntity)&&e.checkForSingleEntity,direction:X(e?.direction)?e.direction:null,entityType:X(e?.entityType)?e.entityType:null,entityId:X(e?.entityId)?e.entityId:null,relationType:X(e?.relationType)?e.relationType:null}}onConfigurationSet(e){this.checkRelationConfigForm=this.fb.group({checkForSingleEntity:[e.checkForSingleEntity,[]],direction:[e.direction,[]],entityType:[e.entityType,e&&e.checkForSingleEntity?[D.required]:[]],entityId:[e.entityId,e&&e.checkForSingleEntity?[D.required]:[]],relationType:[e.relationType,[D.required]]})}validatorTriggers(){return["checkForSingleEntity"]}updateValidators(e){const t=this.checkRelationConfigForm.get("checkForSingleEntity").value;this.checkRelationConfigForm.get("entityType").setValidators(t?[D.required]:[]),this.checkRelationConfigForm.get("entityType").updateValueAndValidity({emitEvent:e}),this.checkRelationConfigForm.get("entityId").setValidators(t?[D.required]:[]),this.checkRelationConfigForm.get("entityId").updateValueAndValidity({emitEvent:e})}}e("CheckRelationConfigComponent",Jn),Jn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Jn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Jn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Jn,selector:"tb-filter-node-check-relation-config",usesInheritance:!0,ngImport:t,template:'
\n
tb.rulenode.relation-search-parameters
\n
\n \n {{ \'relation.direction\' | translate }}\n \n \n {{ entitySearchDirectionTranslationsMap.get(direction) | translate }} tb.rulenode.relations-query-config-direction-suffix\n \n \n \n \n \n
\n \n {{ \'tb.rulenode.check-relation-to-specific-entity\' | translate }}\n \n
\n
\n \n \n \n \n
\n
\n
\n',styles:[":host .slide-toggle{margin-bottom:18px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:Qe.EntityAutocompleteComponent,selector:"tb-entity-autocomplete",inputs:["entityType","entitySubtype","excludeEntityIds","labelText","requiredText","useFullEntityId","appearance","required","disabled"],outputs:["entityChanged"]},{kind:"component",type:de.EntityTypeSelectComponent,selector:"tb-entity-type-select",inputs:["allowedEntityTypes","useAliasEntityTypes","filterAllowedEntityTypes","showLabel","required","disabled"]},{kind:"component",type:De.RelationTypeAutocompleteComponent,selector:"tb-relation-type-autocomplete",inputs:["showLabel","additionalClasses","appearance","required","disabled","subscriptSizing"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Jn,decorators:[{type:n,args:[{selector:"tb-filter-node-check-relation-config",template:'
\n
tb.rulenode.relation-search-parameters
\n
\n \n {{ \'relation.direction\' | translate }}\n \n \n {{ entitySearchDirectionTranslationsMap.get(direction) | translate }} tb.rulenode.relations-query-config-direction-suffix\n \n \n \n \n \n
\n \n {{ \'tb.rulenode.check-relation-to-specific-entity\' | translate }}\n \n
\n
\n \n \n \n \n
\n
\n
\n',styles:[":host .slide-toggle{margin-bottom:18px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Yn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.perimeterType=st,this.perimeterTypes=Object.values(st),this.perimeterTypeTranslationMap=mt,this.rangeUnits=Object.values(dt),this.rangeUnitTranslationMap=ct,this.defaultPaddingEnable=!0}configForm(){return this.geoFilterConfigForm}prepareInputConfig(e){return{latitudeKeyName:X(e?.latitudeKeyName)?e.latitudeKeyName:null,longitudeKeyName:X(e?.longitudeKeyName)?e.longitudeKeyName:null,perimeterType:X(e?.perimeterType)?e.perimeterType:null,fetchPerimeterInfoFromMessageMetadata:!!X(e?.fetchPerimeterInfoFromMessageMetadata)&&e.fetchPerimeterInfoFromMessageMetadata,perimeterKeyName:X(e?.perimeterKeyName)?e.perimeterKeyName:null,centerLatitude:X(e?.centerLatitude)?e.centerLatitude:null,centerLongitude:X(e?.centerLongitude)?e.centerLongitude:null,range:X(e?.range)?e.range:null,rangeUnit:X(e?.rangeUnit)?e.rangeUnit:null,polygonsDefinition:X(e?.polygonsDefinition)?e.polygonsDefinition:null}}onConfigurationSet(e){this.geoFilterConfigForm=this.fb.group({latitudeKeyName:[e.latitudeKeyName,[D.required]],longitudeKeyName:[e.longitudeKeyName,[D.required]],perimeterType:[e.perimeterType,[D.required]],fetchPerimeterInfoFromMessageMetadata:[e.fetchPerimeterInfoFromMessageMetadata,[]],perimeterKeyName:[e.perimeterKeyName,[]],centerLatitude:[e.centerLatitude,[]],centerLongitude:[e.centerLongitude,[]],range:[e.range,[]],rangeUnit:[e.rangeUnit,[]],polygonsDefinition:[e.polygonsDefinition,[]]})}validatorTriggers(){return["fetchPerimeterInfoFromMessageMetadata","perimeterType"]}updateValidators(e){const t=this.geoFilterConfigForm.get("fetchPerimeterInfoFromMessageMetadata").value,n=this.geoFilterConfigForm.get("perimeterType").value;t?this.geoFilterConfigForm.get("perimeterKeyName").setValidators([D.required]):this.geoFilterConfigForm.get("perimeterKeyName").setValidators([]),t||n!==st.CIRCLE?(this.geoFilterConfigForm.get("centerLatitude").setValidators([]),this.geoFilterConfigForm.get("centerLongitude").setValidators([]),this.geoFilterConfigForm.get("range").setValidators([]),this.geoFilterConfigForm.get("rangeUnit").setValidators([]),this.defaultPaddingEnable=!0):(this.geoFilterConfigForm.get("centerLatitude").setValidators([D.required,D.min(-90),D.max(90)]),this.geoFilterConfigForm.get("centerLongitude").setValidators([D.required,D.min(-180),D.max(180)]),this.geoFilterConfigForm.get("range").setValidators([D.required,D.min(0)]),this.geoFilterConfigForm.get("rangeUnit").setValidators([D.required]),this.defaultPaddingEnable=!1),t||n!==st.POLYGON?this.geoFilterConfigForm.get("polygonsDefinition").setValidators([]):this.geoFilterConfigForm.get("polygonsDefinition").setValidators([D.required]),this.geoFilterConfigForm.get("perimeterKeyName").updateValueAndValidity({emitEvent:e}),this.geoFilterConfigForm.get("centerLatitude").updateValueAndValidity({emitEvent:e}),this.geoFilterConfigForm.get("centerLongitude").updateValueAndValidity({emitEvent:e}),this.geoFilterConfigForm.get("range").updateValueAndValidity({emitEvent:e}),this.geoFilterConfigForm.get("rangeUnit").updateValueAndValidity({emitEvent:e}),this.geoFilterConfigForm.get("polygonsDefinition").updateValueAndValidity({emitEvent:e})}}e("GpsGeoFilterConfigComponent",Yn),Yn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Yn,deps:[{token:G.Store},{token:E.FormBuilder}],target:t.ɵɵFactoryTarget.Component}),Yn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Yn,selector:"tb-filter-node-gps-geofencing-config",usesInheritance:!0,ngImport:t,template:'
\n
\n
tb.rulenode.coordinate-field-names
\n
\n
\n \n {{ \'tb.rulenode.latitude-field-name\' | translate }}\n \n \n {{ \'tb.rulenode.latitude-field-name-required\' | translate }}\n \n \n \n {{ \'tb.rulenode.longitude-field-name\' | translate }}\n \n \n {{ \'tb.rulenode.longitude-field-name-required\' | translate }}\n \n \n
\n
tb.rulenode.coordinate-field-hint
\n
\n
\n
\n
tb.rulenode.geofence-configuration
\n
\n \n {{ \'tb.rulenode.perimeter-type\' | translate }}\n \n \n {{ perimeterTypeTranslationMap.get(type) | translate }}\n \n \n \n
\n \n {{ \'tb.rulenode.fetch-perimeter-info-from-metadata\' | translate }}\n \n
\n \n {{ \'tb.rulenode.perimeter-key-name\' | translate }}\n \n \n {{ \'tb.rulenode.perimeter-key-name-required\' | translate }}\n \n {{ \'tb.rulenode.perimeter-key-name-hint\' | translate }}\n \n
\n
\n \n {{ \'tb.rulenode.circle-center-latitude\' | translate }}\n \n \n {{ \'tb.rulenode.circle-center-latitude-required\' | translate }}\n \n \n \n {{ \'tb.rulenode.circle-center-longitude\' | translate }}\n \n \n {{ \'tb.rulenode.circle-center-longitude-required\' | translate }}\n \n \n
\n
\n \n {{ \'tb.rulenode.range\' | translate }}\n \n \n {{ \'tb.rulenode.range-required\' | translate }}\n \n \n \n {{ \'tb.rulenode.range-units\' | translate }}\n \n \n {{ rangeUnitTranslationMap.get(type) | translate }}\n \n \n \n {{ \'tb.rulenode.range-units-required\' | translate }}\n \n \n
\n
\n \n {{ \'tb.rulenode.polygon-definition\' | translate }}\n \n {{ \'tb.rulenode.polygon-definition-hint\' | translate }}\n \n {{ \'tb.rulenode.polygon-definition-required\' | translate }}\n \n \n
\n
\n
\n',styles:[":host .slide-toggle{margin-bottom:18px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"component",type:Q.MatSlideToggle,selector:"mat-slide-toggle",inputs:["disabled","disableRipple","color","tabIndex"],exportAs:["matSlideToggle"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NumberValueAccessor,selector:"input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.MinValidator,selector:"input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",inputs:["min"]},{kind:"directive",type:E.MaxValidator,selector:"input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",inputs:["max"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:$.HintTooltipIconComponent,selector:"[tb-hint-tooltip-icon]",inputs:["tb-hint-tooltip-icon","tooltipPosition","hintIcon"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Yn,decorators:[{type:n,args:[{selector:"tb-filter-node-gps-geofencing-config",template:'
\n
\n
tb.rulenode.coordinate-field-names
\n
\n
\n \n {{ \'tb.rulenode.latitude-field-name\' | translate }}\n \n \n {{ \'tb.rulenode.latitude-field-name-required\' | translate }}\n \n \n \n {{ \'tb.rulenode.longitude-field-name\' | translate }}\n \n \n {{ \'tb.rulenode.longitude-field-name-required\' | translate }}\n \n \n
\n
tb.rulenode.coordinate-field-hint
\n
\n
\n
\n
tb.rulenode.geofence-configuration
\n
\n \n {{ \'tb.rulenode.perimeter-type\' | translate }}\n \n \n {{ perimeterTypeTranslationMap.get(type) | translate }}\n \n \n \n
\n \n {{ \'tb.rulenode.fetch-perimeter-info-from-metadata\' | translate }}\n \n
\n \n {{ \'tb.rulenode.perimeter-key-name\' | translate }}\n \n \n {{ \'tb.rulenode.perimeter-key-name-required\' | translate }}\n \n {{ \'tb.rulenode.perimeter-key-name-hint\' | translate }}\n \n
\n
\n \n {{ \'tb.rulenode.circle-center-latitude\' | translate }}\n \n \n {{ \'tb.rulenode.circle-center-latitude-required\' | translate }}\n \n \n \n {{ \'tb.rulenode.circle-center-longitude\' | translate }}\n \n \n {{ \'tb.rulenode.circle-center-longitude-required\' | translate }}\n \n \n
\n
\n \n {{ \'tb.rulenode.range\' | translate }}\n \n \n {{ \'tb.rulenode.range-required\' | translate }}\n \n \n \n {{ \'tb.rulenode.range-units\' | translate }}\n \n \n {{ rangeUnitTranslationMap.get(type) | translate }}\n \n \n \n {{ \'tb.rulenode.range-units-required\' | translate }}\n \n \n
\n
\n \n {{ \'tb.rulenode.polygon-definition\' | translate }}\n \n {{ \'tb.rulenode.polygon-definition-hint\' | translate }}\n \n {{ \'tb.rulenode.polygon-definition-required\' | translate }}\n \n \n
\n
\n
\n',styles:[":host .slide-toggle{margin-bottom:18px}\n",':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:E.FormBuilder}]}});class Wn extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.messageTypeConfigForm}prepareInputConfig(e){return{messageTypes:X(e?.messageTypes)?e.messageTypes:null}}onConfigurationSet(e){this.messageTypeConfigForm=this.fb.group({messageTypes:[e.messageTypes,[D.required]]})}}e("MessageTypeConfigComponent",Wn),Wn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Wn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Wn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Wn,selector:"tb-filter-node-message-type-config",usesInheritance:!0,ngImport:t,template:'
\n \n \n
\n',dependencies:[{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:fn,selector:"tb-message-types-config",inputs:["required","label","placeholder","disabled"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Wn,decorators:[{type:n,args:[{selector:"tb-filter-node-message-type-config",template:'
\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Xn extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.allowedEntityTypes=[x.DEVICE,x.ASSET,x.ENTITY_VIEW,x.TENANT,x.CUSTOMER,x.USER,x.DASHBOARD,x.RULE_CHAIN,x.RULE_NODE]}configForm(){return this.originatorTypeConfigForm}prepareInputConfig(e){return{originatorTypes:X(e?.originatorTypes)?e.originatorTypes:null}}onConfigurationSet(e){this.originatorTypeConfigForm=this.fb.group({originatorTypes:[e.originatorTypes,[D.required]]})}}e("OriginatorTypeConfigComponent",Xn),Xn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Xn,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),Xn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Xn,selector:"tb-filter-node-originator-type-config",usesInheritance:!0,ngImport:t,template:'
\n \n help\n \n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n'],dependencies:[{kind:"component",type:$e.EntityTypeListComponent,selector:"tb-entity-type-list",inputs:["required","additionalClasses","appearance","label","floatLabel","disabled","subscriptSizing","allowedEntityTypes","emptyInputPlaceholder","filledInputPlaceholder","ignoreAuthorityFilter"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:U.MatSuffix,selector:"[matSuffix], [matIconSuffix], [matTextSuffix]",inputs:["matTextSuffix"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Xn,decorators:[{type:n,args:[{selector:"tb-filter-node-originator-type-config",template:'
\n \n help\n \n
\n',styles:[':host .margin-8{margin:8px}:host .tb-error{letter-spacing:.25px;color:var(--mdc-theme-error, #f44336)}:host .tb-required:after{content:"*"}\n']}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class Zn extends s{constructor(e,t,n,o){super(e),this.store=e,this.fb=t,this.nodeScriptTestService=n,this.translate=o,this.tbelEnabled=Y(this.store).tbelEnabled,this.scriptLanguage=d,this.changeScript=new r,this.hasScript=!0,this.testScriptLabel="tb.rulenode.test-filter-function"}configForm(){return this.scriptConfigForm}onConfigurationSet(e){this.scriptConfigForm=this.fb.group({scriptLang:[e.scriptLang,[D.required]],jsScript:[e.jsScript,[]],tbelScript:[e.tbelScript,[]]})}validatorTriggers(){return["scriptLang"]}updateValidators(e){let t=this.scriptConfigForm.get("scriptLang").value;t!==d.TBEL||this.tbelEnabled||(t=d.JS,this.scriptConfigForm.get("scriptLang").patchValue(t,{emitEvent:!1}),setTimeout((()=>{this.scriptConfigForm.updateValueAndValidity({emitEvent:!0})}))),this.scriptConfigForm.get("jsScript").setValidators(t===d.JS?[D.required]:[]),this.scriptConfigForm.get("jsScript").updateValueAndValidity({emitEvent:e}),this.scriptConfigForm.get("tbelScript").setValidators(t===d.TBEL?[D.required]:[]),this.scriptConfigForm.get("tbelScript").updateValueAndValidity({emitEvent:e})}prepareInputConfig(e){return e&&(e.scriptLang||(e.scriptLang=d.JS)),{scriptLang:X(e?.scriptLang)?e.scriptLang:d.JS,jsScript:X(e?.jsScript)?e.jsScript:null,tbelScript:X(e?.tbelScript)?e.tbelScript:null}}testScript(e){const t=this.scriptConfigForm.get("scriptLang").value,n=t===d.JS?"jsScript":"tbelScript",r=t===d.JS?"rulenode/filter_node_script_fn":"rulenode/tbel/filter_node_script_fn",o=this.scriptConfigForm.get(n).value;this.nodeScriptTestService.testNodeScript(o,"filter",this.translate.instant("tb.rulenode.filter"),"Filter",["msg","metadata","msgType"],this.ruleNodeId,r,t,e).subscribe((e=>{e&&(this.scriptConfigForm.get(n).setValue(e),this.changeScript.emit())}))}onValidate(){this.scriptConfigForm.get("scriptLang").value===d.JS&&this.jsFuncComponent.validateOnSubmit()}}e("ScriptConfigComponent",Zn),Zn.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Zn,deps:[{token:G.Store},{token:E.UntypedFormBuilder},{token:W.NodeScriptTestService},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),Zn.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:Zn,selector:"tb-filter-node-script-config",viewQueries:[{propertyName:"jsFuncComponent",first:!0,predicate:["jsFuncComponent"],descendants:!0},{propertyName:"tbelFuncComponent",first:!0,predicate:["tbelFuncComponent"],descendants:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n \n \n \n \n \n \n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:ne.JsFuncComponent,selector:"tb-js-func",inputs:["functionTitle","functionName","functionArgs","validationArgs","resultType","disabled","fillHeight","minHeight","editorCompleter","globalVariables","disableUndefinedCheck","helpId","scriptLanguage","noValidate","required"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:ie.TbScriptLangComponent,selector:"tb-script-lang",inputs:["disabled"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:Zn,decorators:[{type:n,args:[{selector:"tb-filter-node-script-config",template:'
\n \n \n \n \n \n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder},{type:W.NodeScriptTestService},{type:H.TranslateService}]},propDecorators:{jsFuncComponent:[{type:o,args:["jsFuncComponent",{static:!1}]}],tbelFuncComponent:[{type:o,args:["tbelFuncComponent",{static:!1}]}]}});class er extends s{constructor(e,t,n,o){super(e),this.store=e,this.fb=t,this.nodeScriptTestService=n,this.translate=o,this.tbelEnabled=Y(this.store).tbelEnabled,this.scriptLanguage=d,this.changeScript=new r,this.hasScript=!0,this.testScriptLabel="tb.rulenode.test-switch-function"}configForm(){return this.switchConfigForm}onConfigurationSet(e){this.switchConfigForm=this.fb.group({scriptLang:[e.scriptLang,[D.required]],jsScript:[e.jsScript,[]],tbelScript:[e.tbelScript,[]]})}validatorTriggers(){return["scriptLang"]}updateValidators(e){let t=this.switchConfigForm.get("scriptLang").value;t!==d.TBEL||this.tbelEnabled||(t=d.JS,this.switchConfigForm.get("scriptLang").patchValue(t,{emitEvent:!1}),setTimeout((()=>{this.switchConfigForm.updateValueAndValidity({emitEvent:!0})}))),this.switchConfigForm.get("jsScript").setValidators(t===d.JS?[D.required]:[]),this.switchConfigForm.get("jsScript").updateValueAndValidity({emitEvent:e}),this.switchConfigForm.get("tbelScript").setValidators(t===d.TBEL?[D.required]:[]),this.switchConfigForm.get("tbelScript").updateValueAndValidity({emitEvent:e})}prepareInputConfig(e){return e&&(e.scriptLang||(e.scriptLang=d.JS)),{scriptLang:X(e?.scriptLang)?e.scriptLang:d.JS,jsScript:X(e?.jsScript)?e.jsScript:null,tbelScript:X(e?.tbelScript)?e.tbelScript:null}}testScript(e){const t=this.switchConfigForm.get("scriptLang").value,n=t===d.JS?"jsScript":"tbelScript",r=t===d.JS?"rulenode/switch_node_script_fn":"rulenode/tbel/switch_node_script_fn",o=this.switchConfigForm.get(n).value;this.nodeScriptTestService.testNodeScript(o,"switch",this.translate.instant("tb.rulenode.switch"),"Switch",["msg","metadata","msgType"],this.ruleNodeId,r,t,e).subscribe((e=>{e&&(this.switchConfigForm.get(n).setValue(e),this.changeScript.emit())}))}onValidate(){this.switchConfigForm.get("scriptLang").value===d.JS&&this.jsFuncComponent.validateOnSubmit()}}e("SwitchConfigComponent",er),er.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:er,deps:[{token:G.Store},{token:E.UntypedFormBuilder},{token:W.NodeScriptTestService},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),er.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:er,selector:"tb-filter-node-switch-config",viewQueries:[{propertyName:"jsFuncComponent",first:!0,predicate:["jsFuncComponent"],descendants:!0},{propertyName:"tbelFuncComponent",first:!0,predicate:["tbelFuncComponent"],descendants:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n \n \n \n \n \n \n \n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:ne.JsFuncComponent,selector:"tb-js-func",inputs:["functionTitle","functionName","functionArgs","validationArgs","resultType","disabled","fillHeight","minHeight","editorCompleter","globalVariables","disableUndefinedCheck","helpId","scriptLanguage","noValidate","required"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:ie.TbScriptLangComponent,selector:"tb-script-lang",inputs:["disabled"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:er,decorators:[{type:n,args:[{selector:"tb-filter-node-switch-config",template:'
\n \n \n \n \n \n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder},{type:W.NodeScriptTestService},{type:H.TranslateService}]},propDecorators:{jsFuncComponent:[{type:o,args:["jsFuncComponent",{static:!1}]}],tbelFuncComponent:[{type:o,args:["tbelFuncComponent",{static:!1}]}]}});class tr{}e("RuleNodeCoreConfigFilterModule",tr),tr.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:tr,deps:[],target:t.ɵɵFactoryTarget.NgModule}),tr.ɵmod=t.ɵɵngDeclareNgModule({minVersion:"14.0.0",version:"15.2.9",ngImport:t,type:tr,declarations:[$n,Jn,Yn,Wn,Xn,Zn,er,Qn],imports:[O,I,Cn],exports:[$n,Jn,Yn,Wn,Xn,Zn,er,Qn]}),tr.ɵinj=t.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:tr,imports:[O,I,Cn]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:tr,decorators:[{type:l,args:[{declarations:[$n,Jn,Yn,Wn,Xn,Zn,er,Qn],imports:[O,I,Cn],exports:[$n,Jn,Yn,Wn,Xn,Zn,er,Qn]}]}]});class nr extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.originatorSource=at,this.originatorSources=Object.keys(at),this.originatorSourceTranslationMap=it,this.allowedEntityTypes=[x.DEVICE,x.ASSET,x.ENTITY_VIEW,x.USER,x.EDGE]}configForm(){return this.changeOriginatorConfigForm}onConfigurationSet(e){this.changeOriginatorConfigForm=this.fb.group({originatorSource:[e?e.originatorSource:null,[D.required]],entityType:[e?e.entityType:null,[]],entityNamePattern:[e?e.entityNamePattern:null,[]],relationsQuery:[e?e.relationsQuery:null,[]]})}validatorTriggers(){return["originatorSource"]}updateValidators(e){const t=this.changeOriginatorConfigForm.get("originatorSource").value;t===at.RELATED?this.changeOriginatorConfigForm.get("relationsQuery").setValidators([D.required]):this.changeOriginatorConfigForm.get("relationsQuery").setValidators([]),t===at.ENTITY?(this.changeOriginatorConfigForm.get("entityType").setValidators([D.required]),this.changeOriginatorConfigForm.get("entityNamePattern").setValidators([D.required,D.pattern(/.*\S.*/)])):(this.changeOriginatorConfigForm.get("entityType").patchValue(null,{emitEvent:e}),this.changeOriginatorConfigForm.get("entityNamePattern").patchValue(null,{emitEvent:e}),this.changeOriginatorConfigForm.get("entityType").setValidators([]),this.changeOriginatorConfigForm.get("entityNamePattern").setValidators([])),this.changeOriginatorConfigForm.get("relationsQuery").updateValueAndValidity({emitEvent:e}),this.changeOriginatorConfigForm.get("entityType").updateValueAndValidity({emitEvent:e}),this.changeOriginatorConfigForm.get("entityNamePattern").updateValueAndValidity({emitEvent:e})}}e("ChangeOriginatorConfigComponent",nr),nr.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:nr,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),nr.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:nr,selector:"tb-transformation-node-change-originator-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.originator-source\n \n \n {{ originatorSourceTranslationMap.get(source) | translate }}\n \n \n \n
\n \n \n \n tb.rulenode.entity-name-pattern\n \n \n {{ \'tb.rulenode.entity-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n
\n \n \n \n
\n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:de.EntityTypeSelectComponent,selector:"tb-entity-type-select",inputs:["allowedEntityTypes","useAliasEntityTypes","filterAllowedEntityTypes","showLabel","required","disabled"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:_.DefaultFlexDirective,selector:" [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]",inputs:["fxFlex","fxFlex.xs","fxFlex.sm","fxFlex.md","fxFlex.lg","fxFlex.xl","fxFlex.lt-sm","fxFlex.lt-md","fxFlex.lt-lg","fxFlex.lt-xl","fxFlex.gt-xs","fxFlex.gt-sm","fxFlex.gt-md","fxFlex.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"component",type:bn,selector:"tb-relations-query-config-old",inputs:["disabled","required"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:nr,decorators:[{type:n,args:[{selector:"tb-transformation-node-change-originator-config",template:'
\n \n tb.rulenode.originator-source\n \n \n {{ originatorSourceTranslationMap.get(source) | translate }}\n \n \n \n
\n \n \n \n tb.rulenode.entity-name-pattern\n \n \n {{ \'tb.rulenode.entity-name-pattern-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n
\n \n \n \n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class rr extends s{constructor(e,t,n,o){super(e),this.store=e,this.fb=t,this.nodeScriptTestService=n,this.translate=o,this.tbelEnabled=Y(this.store).tbelEnabled,this.scriptLanguage=d,this.changeScript=new r,this.hasScript=!0,this.testScriptLabel="tb.rulenode.test-transformer-function"}configForm(){return this.scriptConfigForm}onConfigurationSet(e){this.scriptConfigForm=this.fb.group({scriptLang:[e?e.scriptLang:d.JS,[D.required]],jsScript:[e?e.jsScript:null,[D.required]],tbelScript:[e?e.tbelScript:null,[]]})}validatorTriggers(){return["scriptLang"]}updateValidators(e){let t=this.scriptConfigForm.get("scriptLang").value;t!==d.TBEL||this.tbelEnabled||(t=d.JS,this.scriptConfigForm.get("scriptLang").patchValue(t,{emitEvent:!1}),setTimeout((()=>{this.scriptConfigForm.updateValueAndValidity({emitEvent:!0})}))),this.scriptConfigForm.get("jsScript").setValidators(t===d.JS?[D.required]:[]),this.scriptConfigForm.get("jsScript").updateValueAndValidity({emitEvent:e}),this.scriptConfigForm.get("tbelScript").setValidators(t===d.TBEL?[D.required]:[]),this.scriptConfigForm.get("tbelScript").updateValueAndValidity({emitEvent:e})}prepareInputConfig(e){return e&&(e.scriptLang||(e.scriptLang=d.JS)),e}testScript(e){const t=this.scriptConfigForm.get("scriptLang").value,n=t===d.JS?"jsScript":"tbelScript",r=t===d.JS?"rulenode/transformation_node_script_fn":"rulenode/tbel/transformation_node_script_fn",o=this.scriptConfigForm.get(n).value;this.nodeScriptTestService.testNodeScript(o,"update",this.translate.instant("tb.rulenode.transformer"),"Transform",["msg","metadata","msgType"],this.ruleNodeId,r,t,e).subscribe((e=>{e&&(this.scriptConfigForm.get(n).setValue(e),this.changeScript.emit())}))}onValidate(){this.scriptConfigForm.get("scriptLang").value===d.JS&&this.jsFuncComponent.validateOnSubmit()}}e("TransformScriptConfigComponent",rr),rr.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:rr,deps:[{token:G.Store},{token:E.UntypedFormBuilder},{token:W.NodeScriptTestService},{token:H.TranslateService}],target:t.ɵɵFactoryTarget.Component}),rr.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:rr,selector:"tb-transformation-node-script-config",viewQueries:[{propertyName:"jsFuncComponent",first:!0,predicate:["jsFuncComponent"],descendants:!0},{propertyName:"tbelFuncComponent",first:!0,predicate:["tbelFuncComponent"],descendants:!0}],usesInheritance:!0,ngImport:t,template:'
\n \n \n \n \n \n \n \n
\n \n
\n
\n',dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:ne.JsFuncComponent,selector:"tb-js-func",inputs:["functionTitle","functionName","functionArgs","validationArgs","resultType","disabled","fillHeight","minHeight","editorCompleter","globalVariables","disableUndefinedCheck","helpId","scriptLanguage","noValidate","required"]},{kind:"component",type:re.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:re.MatIconButton,selector:"button[mat-icon-button]",inputs:["disabled","disableRipple","color"],exportAs:["matButton"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:ae.MatTooltip,selector:"[matTooltip]",exportAs:["matTooltip"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:ie.TbScriptLangComponent,selector:"tb-script-lang",inputs:["disabled"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:rr,decorators:[{type:n,args:[{selector:"tb-transformation-node-script-config",template:'
\n \n \n \n \n \n \n \n
\n \n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder},{type:W.NodeScriptTestService},{type:H.TranslateService}]},propDecorators:{jsFuncComponent:[{type:o,args:["jsFuncComponent",{static:!1}]}],tbelFuncComponent:[{type:o,args:["tbelFuncComponent",{static:!1}]}]}});class or extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.mailBodyTypes=[{name:"tb.mail-body-type.plain-text",value:"false"},{name:"tb.mail-body-type.html",value:"true"},{name:"tb.mail-body-type.dynamic",value:"dynamic"}]}configForm(){return this.toEmailConfigForm}onConfigurationSet(e){this.toEmailConfigForm=this.fb.group({fromTemplate:[e?e.fromTemplate:null,[D.required]],toTemplate:[e?e.toTemplate:null,[D.required]],ccTemplate:[e?e.ccTemplate:null,[]],bccTemplate:[e?e.bccTemplate:null,[]],subjectTemplate:[e?e.subjectTemplate:null,[D.required]],mailBodyType:[e?e.mailBodyType:null],isHtmlTemplate:[e?e.isHtmlTemplate:null,[D.required]],bodyTemplate:[e?e.bodyTemplate:null,[D.required]]})}updateValidators(e){"dynamic"===this.toEmailConfigForm.get("mailBodyType").value?this.toEmailConfigForm.get("isHtmlTemplate").enable({emitEvent:!1}):this.toEmailConfigForm.get("isHtmlTemplate").disable({emitEvent:!1}),this.toEmailConfigForm.get("isHtmlTemplate").updateValueAndValidity({emitEvent:e})}validatorTriggers(){return["mailBodyType"]}}e("ToEmailConfigComponent",or),or.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:or,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),or.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:or,selector:"tb-transformation-node-to-email-config",usesInheritance:!0,ngImport:t,template:'
\n \n tb.rulenode.from-template\n \n \n {{ \'tb.rulenode.from-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.to-template\n \n \n {{ \'tb.rulenode.to-template-required\' | translate }}\n \n \n \n \n tb.rulenode.cc-template\n \n \n \n \n tb.rulenode.bcc-template\n \n \n \n \n tb.rulenode.subject-template\n \n \n {{ \'tb.rulenode.subject-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.mail-body-type\n \n \n {{ type.name | translate }}\n \n \n \n \n tb.rulenode.dynamic-mail-body-type\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.body-template\n \n \n {{ \'tb.rulenode.body-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"component",type:z.MatSelect,selector:"mat-select",inputs:["disabled","disableRipple","tabIndex","hideSingleSelectionIndicator"],exportAs:["matSelect"]},{kind:"component",type:j.MatOption,selector:"mat-option",exportAs:["matOption"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:pe.SafePipe,name:"safe"},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:or,decorators:[{type:n,args:[{selector:"tb-transformation-node-to-email-config",template:'
\n \n tb.rulenode.from-template\n \n \n {{ \'tb.rulenode.from-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.to-template\n \n \n {{ \'tb.rulenode.to-template-required\' | translate }}\n \n \n \n \n tb.rulenode.cc-template\n \n \n \n \n tb.rulenode.bcc-template\n \n \n \n \n tb.rulenode.subject-template\n \n \n {{ \'tb.rulenode.subject-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.mail-body-type\n \n \n {{ type.name | translate }}\n \n \n \n \n tb.rulenode.dynamic-mail-body-type\n \n tb.rulenode.general-pattern-hint\n \n \n tb.rulenode.body-template\n \n \n {{ \'tb.rulenode.body-template-required\' | translate }}\n \n tb.rulenode.general-pattern-hint\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class ar extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.separatorKeysCodes=[le,se,me]}onConfigurationSet(e){this.copyKeysConfigForm=this.fb.group({fromMetadata:[e?e.fromMetadata:null,[D.required]],keys:[e?e.keys:null,[D.required]]})}configForm(){return this.copyKeysConfigForm}removeKey(e){const t=this.copyKeysConfigForm.get("keys").value,n=t.indexOf(e);n>=0&&(t.splice(n,1),this.copyKeysConfigForm.get("keys").patchValue(t,{emitEvent:!0}))}addKey(e){const t=e.input;let n=e.value;if((n||"").trim()){n=n.trim();let e=this.copyKeysConfigForm.get("keys").value;e&&-1!==e.indexOf(n)||(e||(e=[]),e.push(n),this.copyKeysConfigForm.get("keys").patchValue(e,{emitEvent:!0}))}t&&(t.value="")}}e("CopyKeysConfigComponent",ar),ar.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ar,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),ar.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:ar,selector:"tb-transformation-node-copy-keys-config",usesInheritance:!0,ngImport:t,template:'
\n
{{\'tb.rulenode.copy-from\' | translate}}
\n \n \n {{\'tb.rulenode.data-to-metadata\' | translate}}\n \n \n {{\'tb.rulenode.metadata-to-data\' | translate}}\n \n \n \n \n \n {{key}}\n close\n \n \n \n {{ \'tb.rulenode.keys-required\' | translate }}\n tb.rulenode.use-regular-expression-hint\n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:ze.MatRadioGroup,selector:"mat-radio-group",exportAs:["matRadioGroup"]},{kind:"component",type:ze.MatRadioButton,selector:"mat-radio-button",inputs:["disableRipple","tabIndex"],exportAs:["matRadioButton"]},{kind:"component",type:ue.MatChipGrid,selector:"mat-chip-grid",inputs:["tabIndex","disabled","placeholder","required","value","errorStateMatcher"],outputs:["change","valueChange"]},{kind:"directive",type:ue.MatChipInput,selector:"input[matChipInputFor]",inputs:["matChipInputFor","matChipInputAddOnBlur","matChipInputSeparatorKeyCodes","placeholder","id","disabled"],outputs:["matChipInputTokenEnd"],exportAs:["matChipInput","matChipInputFor"]},{kind:"directive",type:ue.MatChipRemove,selector:"[matChipRemove]"},{kind:"component",type:ue.MatChipRow,selector:"mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]",inputs:["color","disabled","disableRipple","tabIndex","editable"],outputs:["edited"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ar,decorators:[{type:n,args:[{selector:"tb-transformation-node-copy-keys-config",template:'
\n
{{\'tb.rulenode.copy-from\' | translate}}
\n \n \n {{\'tb.rulenode.data-to-metadata\' | translate}}\n \n \n {{\'tb.rulenode.metadata-to-data\' | translate}}\n \n \n \n \n \n {{key}}\n close\n \n \n \n {{ \'tb.rulenode.keys-required\' | translate }}\n tb.rulenode.use-regular-expression-hint\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class ir extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.renameKeysConfigForm}onConfigurationSet(e){this.renameKeysConfigForm=this.fb.group({fromMetadata:[e?e.fromMetadata:null,[D.required]],renameKeysMapping:[e?e.renameKeysMapping:null,[D.required]]})}}e("RenameKeysConfigComponent",ir),ir.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ir,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),ir.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:ir,selector:"tb-transformation-node-rename-keys-config",usesInheritance:!0,ngImport:t,template:'
\n
{{ \'tb.rulenode.rename-keys-in\' | translate }}
\n \n \n {{\'tb.rulenode.data\' | translate}}\n \n \n {{\'tb.rulenode.metadata\' | translate}}\n \n \n \n \n
\n',dependencies:[{kind:"directive",type:ze.MatRadioGroup,selector:"mat-radio-group",exportAs:["matRadioGroup"]},{kind:"component",type:ze.MatRadioButton,selector:"mat-radio-button",inputs:["disableRipple","tabIndex"],exportAs:["matRadioButton"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"component",type:Zt,selector:"tb-kv-map-config-old",inputs:["disabled","uniqueKeyValuePairValidator","requiredText","keyText","keyRequiredText","valText","valRequiredText","hintText","required"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ir,decorators:[{type:n,args:[{selector:"tb-transformation-node-rename-keys-config",template:'
\n
{{ \'tb.rulenode.rename-keys-in\' | translate }}
\n \n \n {{\'tb.rulenode.data\' | translate}}\n \n \n {{\'tb.rulenode.metadata\' | translate}}\n \n \n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class lr extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.jsonPathConfigForm}onConfigurationSet(e){this.jsonPathConfigForm=this.fb.group({jsonPath:[e?e.jsonPath:null,[D.required]]})}}e("NodeJsonPathConfigComponent",lr),lr.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:lr,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),lr.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:lr,selector:"tb-transformation-node-json-path-config",usesInheritance:!0,ngImport:t,template:"
\n \n {{ 'tb.rulenode.json-path-expression' | translate }}\n \n {{ 'tb.rulenode.json-path-expression-hint' | translate }}\n {{ 'tb.rulenode.json-path-expression-required' | translate }}\n \n
\n\n",dependencies:[{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatLabel,selector:"mat-label"},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.DefaultValueAccessor,selector:"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]"},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:lr,decorators:[{type:n,args:[{selector:"tb-transformation-node-json-path-config",template:"
\n \n {{ 'tb.rulenode.json-path-expression' | translate }}\n \n {{ 'tb.rulenode.json-path-expression-hint' | translate }}\n {{ 'tb.rulenode.json-path-expression-required' | translate }}\n \n
\n\n"}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class sr extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.separatorKeysCodes=[le,se,me]}onConfigurationSet(e){this.deleteKeysConfigForm=this.fb.group({fromMetadata:[e?e.fromMetadata:null,[D.required]],keys:[e?e.keys:null,[D.required]]})}configForm(){return this.deleteKeysConfigForm}removeKey(e){const t=this.deleteKeysConfigForm.get("keys").value,n=t.indexOf(e);n>=0&&(t.splice(n,1),this.deleteKeysConfigForm.get("keys").patchValue(t,{emitEvent:!0}))}addKey(e){const t=e.input;let n=e.value;if((n||"").trim()){n=n.trim();let e=this.deleteKeysConfigForm.get("keys").value;e&&-1!==e.indexOf(n)||(e||(e=[]),e.push(n),this.deleteKeysConfigForm.get("keys").patchValue(e,{emitEvent:!0}))}t&&(t.value="")}}e("DeleteKeysConfigComponent",sr),sr.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:sr,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),sr.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:sr,selector:"tb-transformation-node-delete-keys-config",usesInheritance:!0,ngImport:t,template:'
\n
{{\'tb.rulenode.delete-from\' | translate}}
\n \n \n {{\'tb.rulenode.data\' | translate}}\n \n \n {{\'tb.rulenode.metadata\' | translate}}\n \n \n \n \n \n {{key}}\n close\n \n \n \n {{ \'tb.rulenode.keys-required\' | translate }}\n tb.rulenode.use-regular-expression-delete-hint\n \n
\n',dependencies:[{kind:"directive",type:R.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:R.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:oe.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"directive",type:K.MatInput,selector:"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]",inputs:["disabled","id","placeholder","name","required","type","errorStateMatcher","aria-describedby","value","readonly"],exportAs:["matInput"]},{kind:"component",type:U.MatFormField,selector:"mat-form-field",inputs:["hideRequiredMarker","color","floatLabel","appearance","subscriptSizing","hintLabel"],exportAs:["matFormField"]},{kind:"directive",type:U.MatHint,selector:"mat-hint",inputs:["align","id"]},{kind:"directive",type:U.MatError,selector:"mat-error, [matError]",inputs:["id"]},{kind:"directive",type:ze.MatRadioGroup,selector:"mat-radio-group",exportAs:["matRadioGroup"]},{kind:"component",type:ze.MatRadioButton,selector:"mat-radio-button",inputs:["disableRipple","tabIndex"],exportAs:["matRadioButton"]},{kind:"component",type:ue.MatChipGrid,selector:"mat-chip-grid",inputs:["tabIndex","disabled","placeholder","required","value","errorStateMatcher"],outputs:["change","valueChange"]},{kind:"directive",type:ue.MatChipInput,selector:"input[matChipInputFor]",inputs:["matChipInputFor","matChipInputAddOnBlur","matChipInputSeparatorKeyCodes","placeholder","id","disabled"],outputs:["matChipInputTokenEnd"],exportAs:["matChipInput","matChipInputFor"]},{kind:"directive",type:ue.MatChipRemove,selector:"[matChipRemove]"},{kind:"component",type:ue.MatChipRow,selector:"mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]",inputs:["color","disabled","disableRipple","tabIndex","editable"],outputs:["edited"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:_.DefaultLayoutGapDirective,selector:" [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]",inputs:["fxLayoutGap","fxLayoutGap.xs","fxLayoutGap.sm","fxLayoutGap.md","fxLayoutGap.lg","fxLayoutGap.xl","fxLayoutGap.lt-sm","fxLayoutGap.lt-md","fxLayoutGap.lt-lg","fxLayoutGap.lt-xl","fxLayoutGap.gt-xs","fxLayoutGap.gt-sm","fxLayoutGap.gt-md","fxLayoutGap.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]},{kind:"directive",type:H.TranslateDirective,selector:"[translate],[ngx-translate]",inputs:["translate","translateParams"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:sr,decorators:[{type:n,args:[{selector:"tb-transformation-node-delete-keys-config",template:'
\n
{{\'tb.rulenode.delete-from\' | translate}}
\n \n \n {{\'tb.rulenode.data\' | translate}}\n \n \n {{\'tb.rulenode.metadata\' | translate}}\n \n \n \n \n \n {{key}}\n close\n \n \n \n {{ \'tb.rulenode.keys-required\' | translate }}\n tb.rulenode.use-regular-expression-delete-hint\n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class mr{}e("RulenodeCoreConfigTransformModule",mr),mr.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:mr,deps:[],target:t.ɵɵFactoryTarget.NgModule}),mr.ɵmod=t.ɵɵngDeclareNgModule({minVersion:"14.0.0",version:"15.2.9",ngImport:t,type:mr,declarations:[nr,rr,or,ar,ir,lr,sr],imports:[O,I,Cn],exports:[nr,rr,or,ar,ir,lr,sr]}),mr.ɵinj=t.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:mr,imports:[O,I,Cn]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:mr,decorators:[{type:l,args:[{declarations:[nr,rr,or,ar,ir,lr,sr],imports:[O,I,Cn],exports:[nr,rr,or,ar,ir,lr,sr]}]}]});class ur extends s{constructor(e,t){super(e),this.store=e,this.fb=t,this.entityType=x}configForm(){return this.ruleChainInputConfigForm}onConfigurationSet(e){this.ruleChainInputConfigForm=this.fb.group({ruleChainId:[e?e.ruleChainId:null,[D.required]]})}}e("RuleChainInputComponent",ur),ur.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ur,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),ur.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:ur,selector:"tb-flow-node-rule-chain-input-config",usesInheritance:!0,ngImport:t,template:'
\n \n \n
\n',dependencies:[{kind:"component",type:Qe.EntityAutocompleteComponent,selector:"tb-entity-autocomplete",inputs:["entityType","entitySubtype","excludeEntityIds","labelText","requiredText","useFullEntityId","appearance","required","disabled"],outputs:["entityChanged"]},{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.NgControlStatus,selector:"[formControlName],[ngModel],[formControl]"},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.RequiredValidator,selector:":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",inputs:["required"]},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"directive",type:E.FormControlName,selector:"[formControlName]",inputs:["formControlName","disabled","ngModel"],outputs:["ngModelChange"]}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:ur,decorators:[{type:n,args:[{selector:"tb-flow-node-rule-chain-input-config",template:'
\n \n \n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class pr extends s{constructor(e,t){super(e),this.store=e,this.fb=t}configForm(){return this.ruleChainOutputConfigForm}onConfigurationSet(e){this.ruleChainOutputConfigForm=this.fb.group({})}}e("RuleChainOutputComponent",pr),pr.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:pr,deps:[{token:G.Store},{token:E.UntypedFormBuilder}],target:t.ɵɵFactoryTarget.Component}),pr.ɵcmp=t.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"15.2.9",type:pr,selector:"tb-flow-node-rule-chain-output-config",usesInheritance:!0,ngImport:t,template:'
\n
\n
\n',dependencies:[{kind:"directive",type:_.DefaultLayoutDirective,selector:" [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]",inputs:["fxLayout","fxLayout.xs","fxLayout.sm","fxLayout.md","fxLayout.lg","fxLayout.xl","fxLayout.lt-sm","fxLayout.lt-md","fxLayout.lt-lg","fxLayout.lt-xl","fxLayout.gt-xs","fxLayout.gt-sm","fxLayout.gt-md","fxLayout.gt-lg"]},{kind:"directive",type:E.NgControlStatusGroup,selector:"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]"},{kind:"directive",type:E.FormGroupDirective,selector:"[formGroup]",inputs:["formGroup"],outputs:["ngSubmit"],exportAs:["ngForm"]},{kind:"pipe",type:H.TranslatePipe,name:"translate"}]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:pr,decorators:[{type:n,args:[{selector:"tb-flow-node-rule-chain-output-config",template:'
\n
\n
\n'}]}],ctorParameters:function(){return[{type:G.Store},{type:E.UntypedFormBuilder}]}});class dr{}e("RuleNodeCoreConfigFlowModule",dr),dr.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:dr,deps:[],target:t.ɵɵFactoryTarget.NgModule}),dr.ɵmod=t.ɵɵngDeclareNgModule({minVersion:"14.0.0",version:"15.2.9",ngImport:t,type:dr,declarations:[ur,pr],imports:[O,I,Cn],exports:[ur,pr]}),dr.ɵinj=t.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:dr,imports:[O,I,Cn]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:dr,decorators:[{type:l,args:[{declarations:[ur,pr],imports:[O,I,Cn],exports:[ur,pr]}]}]});class cr{constructor(e){!function(e){e.setTranslation("en_US",{tb:{rulenode:{id:"Id","additional-info":"Additional Info","create-entity-if-not-exists":"Create new entity if not exists","create-entity-if-not-exists-hint":"Create a new entity set above if it does not exist.","entity-name-pattern":"Name pattern","entity-name-pattern-required":"Name pattern is required","entity-type-pattern":"Type pattern","entity-type-pattern-required":"Type pattern is required","output-message-type":"Output message type","output-message-type-required":"Output message type is required","output-message-type-max-length":"Output message type should be less than 256","entity-cache-expiration":"Entities cache expiration time (sec)","entity-cache-expiration-hint":"Specifies maximum time interval allowed to store found entity records. 0 value means that records will never expire.","entity-cache-expiration-required":"Entities cache expiration time is required.","entity-cache-expiration-range":"Entities cache expiration time should be greater than or equal to 0.","customer-name-pattern":"Customer name pattern","customer-name-pattern-required":"Customer name pattern is required","create-customer-if-not-exists":"Create new customer if not exists","customer-cache-expiration":"Customers cache expiration time (sec)","customer-cache-expiration-hint":"Specifies maximum time interval allowed to store found customer records. 0 value means that records will never expire.","customer-cache-expiration-required":"Customers cache expiration time is required.","customer-cache-expiration-range":"Customers cache expiration time should be greater than or equal to 0.","interval-start":"Interval start","interval-end":"Interval end","time-unit":"Time unit","fetch-mode":"Fetch mode","order-by-timestamp":"Order by timestamp",limit:"Limit","limit-hint":"Min limit value is 2, max - 1000. If you want to fetch a single entry, select fetch mode 'First' or 'Last'.","limit-required":"Limit is required.","limit-range":"Limit should be in a range from 2 to 1000.","time-unit-milliseconds":"Milliseconds","time-unit-seconds":"Seconds","time-unit-minutes":"Minutes","time-unit-hours":"Hours","time-unit-days":"Days","time-value-range":"Allowing range from 1 to 2147483647.","start-interval-value-required":"Interval start is required.","end-interval-value-required":"Interval end is required.",filter:"Filter",switch:"Switch","math-templatization-tooltip":"This field support templatization. Use $[messageKey] to extract value from the message and ${metadataKey} to extract value from the metadata.","add-message-type":"Add message type","select-message-types-required":"At least one message type should be selected.","select-message-types":"Select message types","no-message-types-found":"No message types found","no-message-type-matching":"'{{messageType}}' not found.","create-new-message-type":"Create a new one.","message-types-required":"Message types are required.","client-attributes":"Client attributes","shared-attributes":"Shared attributes","server-attributes":"Server attributes","attributes-keys":"Attributes keys","attributes-keys-required":"Attributes keys are required","notify-device":"Notify device","send-attributes-updated-notification":"Send attributes updated notification","send-attributes-updated-notification-hint":"Send notification about updated attributes as a separate message to the rule engine queue.","send-attributes-deleted-notification":"Send attributes deleted notification","send-attributes-deleted-notification-hint":"Send notification about deleted attributes as a separate message to the rule engine queue.","update-attributes-only-on-value-change":"Save attributes only if the value changes","update-attributes-only-on-value-change-hint":"Updates the attributes on every incoming message disregarding if their value has changed. Increases API usage and reduces performance.","update-attributes-only-on-value-change-hint-enabled":"Updates the attributes only if their value has changed. If the value is not changed, no update to the attribute timestamp nor attribute change notification will be sent.","fetch-credentials-to-metadata":"Fetch credentials to metadata","notify-device-hint":"If the message arrives from the device, we will push it back to the device by default.","notify-device-delete-hint":"Send notification about deleted attributes to device.","latest-timeseries":"Latest time-series data keys","timeseries-keys":"Timeseries keys","timeseries-keys-required":"At least one timeseries key should be selected.","add-timeseries-key":"Add timeseries key","add-message-field":"Add message field","relation-search-parameters":"Relation search parameters","add-metadata-field":"Add metadata field","data-keys":"Message field names","copy-from":"Copy from","data-to-metadata":"Data to metadata","metadata-to-data":"Metadata to data","use-regular-expression-hint":"Use regular expression to copy keys by pattern",interval:"Interval","interval-required":"Interval is required","interval-hint":"Deduplication interval in seconds.","interval-min-error":"Min allowed value is 1","max-pending-msgs":"Max pending messages","max-pending-msgs-hint":"Maximum number of messages that are stored in memory for each unique deduplication id.","max-pending-msgs-required":"Max pending messages is required","max-pending-msgs-max-error":"Max allowed value is 1000","max-pending-msgs-min-error":"Min allowed value is 1","max-retries":"Max retries","max-retries-required":"Max retries is required","max-retries-hint":"Maximum number of retries to push the deduplicated messages into the queue. 10 seconds delay is used between retries","max-retries-max-error":"Max allowed value is 100","max-retries-min-error":"Min allowed value is 0",strategy:"Strategy","strategy-required":"Strategy is required","strategy-all-hint":"Return all messages that arrived during deduplication period as a single JSON array message. Where each element represents object with msg and metadata inner properties.","strategy-first-hint":"Return first message that arrived during deduplication period.","strategy-last-hint":"Return last message that arrived during deduplication period.",first:"First",last:"Last",all:"All","output-msg-type-hint":"The message type of the deduplication result.","queue-name-hint":"The queue name where the deduplication result will be published.",keys:"Keys","keys-required":"Keys are required","rename-keys-in":"Rename keys in",data:"Data",message:"Message",metadata:"Metadata","key-name":"Key name","key-name-required":"Key name is required","new-key-name":"New key name","new-key-name-required":"New key name is required","metadata-keys":"Metadata field names","json-path-expression":"JSON path expression","json-path-expression-required":"JSON path expression is required","json-path-expression-hint":"JSONPath specifies a path to an element or a set of elements in a JSON structure. '$' represents the root object or array.","relations-query":"Relations query","device-relations-query":"Device relations query","max-relation-level":"Max relation level","max-relation-level-error":"Value should be greater than 0 or unspecified.","relation-type":"Relation type","relation-type-pattern":"Relation type pattern","relation-type-pattern-required":"Relation type pattern is required","relation-types-list":"Relation types to propagate","relation-types-list-hint":"If Propagate relation types are not selected, alarms will be propagated without filtering by relation type.","unlimited-level":"Unlimited level","latest-telemetry":"Latest telemetry","add-telemetry-key":"Add telemetry key","delete-from":"Delete from","use-regular-expression-delete-hint":"Use regular expression to delete keys by pattern","fetch-into":"Fetch into","attr-mapping":"Attributes mapping:","source-attribute":"Source attribute key","source-attribute-required":"Source attribute key is required.","source-telemetry":"Source telemetry key","source-telemetry-required":"Source telemetry key is required.","target-key":"Target key","target-key-required":"Target key is required.","attr-mapping-required":"At least one mapping entry should be specified.","fields-mapping":"Fields mapping","relations-query-config-direction-suffix":"originator","add-device-profile":"Add device profile","profile-name":"Profile name","fetch-parameter-info-from-metadata-hint":'Metadata field \'{{perimeterKeyName}}\' should be defined in next formaat: {"latitude":48.196, "longitude":24.6532, "radius":100.0, "radiusUnit":"METER"}',"short-templatization-tooltip":"Use $[messageKey] to extract value from the message and ${metadataKey} to extract value from the metadata.","fields-mapping-required":"At least one field mapping should be specified.","at-least-one-field-required":"At least one input field must have a value(s) provided.","originator-fields-sv-map-hint":"Target key fields support templatization. Use $[messageKey] to extract value from the message and ${metadataKey} to extract value from the metadata.","sv-map-hint":"Only target key fields support templatization. Use $[messageKey] to extract value from the message and ${metadataKey} to extract value from the metadata.","source-field":"Source field","source-field-required":"Source field is required.","originator-source":"Originator source","originator-customer":"Customer","originator-tenant":"Tenant","originator-related":"Related","originator-alarm-originator":"Alarm Originator","originator-entity":"Entity","clone-message":"Clone message",transform:"Transform","default-ttl":"Default TTL in seconds","default-ttl-required":"Default TTL is required.","min-default-ttl-message":"Only 0 minimum TTL is allowed.","message-count":"Message count (0 - unlimited)","message-count-required":"Message count is required.","min-message-count-message":"Only 0 minimum message count is allowed.","period-seconds":"Period in seconds","period-seconds-required":"Period is required.","use-metadata-period-in-seconds-patterns":"Use period in seconds pattern","use-metadata-period-in-seconds-patterns-hint":"If selected, rule node use period in seconds interval pattern from message metadata or data assuming that intervals are in the seconds.","period-in-seconds-pattern":"Period in seconds pattern","period-in-seconds-pattern-required":"Period in seconds pattern is required","min-period-seconds-message":"Only 1 second minimum period is allowed.",originator:"Originator","message-body":"Message body","message-metadata":"Message metadata",generate:"Generate","test-generator-function":"Test generator function",generator:"Generator","test-filter-function":"Test filter function","test-switch-function":"Test switch function","test-transformer-function":"Test transformer function",transformer:"Transformer","alarm-create-condition":"Alarm create condition","test-condition-function":"Test condition function","alarm-clear-condition":"Alarm clear condition","alarm-details-builder":"Alarm details builder","test-details-function":"Test details function","alarm-type":"Alarm type","select-entity-types":"Select entity types","alarm-type-required":"Alarm type is required.","alarm-severity":"Alarm severity","alarm-severity-required":"Alarm severity is required","alarm-severity-pattern":"Alarm severity pattern","alarm-status-filter":"Alarm status filter","alarm-status-list-empty":"Alarm status list is empty","no-alarm-status-matching":"No alarm status matching were found.",propagate:"Propagate alarm to related entities","propagate-to-owner":"Propagate alarm to entity owner (Customer or Tenant)","propagate-to-tenant":"Propagate alarm to Tenant",condition:"Condition",details:"Details","to-string":"To string","test-to-string-function":"Test to string function","from-template":"From Template","from-template-required":"From Template is required","to-template":"To Template","to-template-required":"To Template is required","mail-address-list-template-hint":'Comma separated address list, use ${metadataKey} for value from metadata, $[messageKey] for value from message body',"cc-template":"Cc Template","bcc-template":"Bcc Template","subject-template":"Subject Template","subject-template-required":"Subject Template is required","body-template":"Body Template","body-template-required":"Body Template is required","dynamic-mail-body-type":"Dynamic mail body type","mail-body-type":"Mail body type","request-id-metadata-attribute":"Request Id Metadata attribute name","timeout-sec":"Timeout in seconds","timeout-required":"Timeout is required","min-timeout-message":"Only 0 minimum timeout value is allowed.","endpoint-url-pattern":"Endpoint URL pattern","endpoint-url-pattern-required":"Endpoint URL pattern is required","request-method":"Request method","use-simple-client-http-factory":"Use simple client HTTP factory","ignore-request-body":"Without request body","trim-double-quotes":"Message without quotes","trim-double-quotes-hint":"If selected, request body message payload will be sent without double quotes, i.e. msg = message body","read-timeout":"Read timeout in millis","read-timeout-hint":"The value of 0 means an infinite timeout","max-parallel-requests-count":"Max number of parallel requests","max-parallel-requests-count-hint":"The value of 0 specifies no limit in parallel processing",headers:"Headers","headers-hint":'Use ${metadataKey} for value from metadata, $[messageKey] for value from message body in header/value fields',header:"Header","header-required":"Header is required",value:"Value","value-required":"Value is required","topic-pattern":"Topic pattern","key-pattern":"Key pattern","key-pattern-hint":"Optional. If a valid partition number is specified, it will be used when sending the record. If no partition is specified, the key will be used instead. If neither is specified, a partition will be assigned in a round-robin fashion.","topic-pattern-required":"Topic pattern is required",topic:"Topic","topic-required":"Topic is required","bootstrap-servers":"Bootstrap servers","bootstrap-servers-required":"Bootstrap servers value is required","other-properties":"Other properties",key:"Key","key-required":"Key is required",retries:"Automatically retry times if fails","min-retries-message":"Only 0 minimum retries is allowed.","batch-size-bytes":"Produces batch size in bytes","min-batch-size-bytes-message":"Only 0 minimum batch size is allowed.","linger-ms":"Time to buffer locally (ms)","min-linger-ms-message":"Only 0 ms minimum value is allowed.","buffer-memory-bytes":"Client buffer max size in bytes","min-buffer-memory-message":"Only 0 minimum buffer size is allowed.",acks:"Number of acknowledgments","key-serializer":"Key serializer","key-serializer-required":"Key serializer is required","value-serializer":"Value serializer","value-serializer-required":"Value serializer is required","topic-arn-pattern":"Topic ARN pattern","topic-arn-pattern-required":"Topic ARN pattern is required","aws-access-key-id":"AWS Access Key ID","aws-access-key-id-required":"AWS Access Key ID is required","aws-secret-access-key":"AWS Secret Access Key","aws-secret-access-key-required":"AWS Secret Access Key is required","aws-region":"AWS Region","aws-region-required":"AWS Region is required","exchange-name-pattern":"Exchange name pattern","routing-key-pattern":"Routing key pattern","message-properties":"Message properties",host:"Host","host-required":"Host is required",port:"Port","port-required":"Port is required","port-range":"Port should be in a range from 1 to 65535.","virtual-host":"Virtual host",username:"Username",password:"Password","automatic-recovery":"Automatic recovery","connection-timeout-ms":"Connection timeout (ms)","min-connection-timeout-ms-message":"Only 0 ms minimum value is allowed.","handshake-timeout-ms":"Handshake timeout (ms)","min-handshake-timeout-ms-message":"Only 0 ms minimum value is allowed.","client-properties":"Client properties","queue-url-pattern":"Queue URL pattern","queue-url-pattern-required":"Queue URL pattern is required","delay-seconds":"Delay (seconds)","min-delay-seconds-message":"Only 0 seconds minimum value is allowed.","max-delay-seconds-message":"Only 900 seconds maximum value is allowed.",name:"Name","name-required":"Name is required","queue-type":"Queue type","sqs-queue-standard":"Standard","sqs-queue-fifo":"FIFO","gcp-project-id":"GCP project ID","gcp-project-id-required":"GCP project ID is required","gcp-service-account-key":"GCP service account key file","gcp-service-account-key-required":"GCP service account key file is required","pubsub-topic-name":"Topic name","pubsub-topic-name-required":"Topic name is required","message-attributes":"Message attributes","message-attributes-hint":'Use ${metadataKey} for value from metadata, $[messageKey] for value from message body in name/value fields',"connect-timeout":"Connection timeout (sec)","connect-timeout-required":"Connection timeout is required.","connect-timeout-range":"Connection timeout should be in a range from 1 to 200.","client-id":"Client ID","client-id-hint":'Optional. Leave empty for auto-generated Client ID. Be careful when specifying the Client ID. Majority of the MQTT brokers will not allow multiple connections with the same Client ID. To connect to such brokers, your mqtt Client ID must be unique. When platform is running in a micro-services mode, the copy of rule node is launched in each micro-service. This will automatically lead to multiple mqtt clients with the same ID and may cause failures of the rule node. To avoid such failures enable "Add Service ID as suffix to Client ID" option below.',"append-client-id-suffix":"Add Service ID as suffix to Client ID","client-id-suffix-hint":'Optional. Applied when "Client ID" specified explicitly. If selected then Service ID will be added to Client ID as a suffix. Helps to avoid failures when platform is running in a micro-services mode.',"device-id":"Device ID","device-id-required":"Device ID is required.","clean-session":"Clean session","enable-ssl":"Enable SSL",credentials:"Credentials","credentials-type":"Credentials type","credentials-type-required":"Credentials type is required.","credentials-anonymous":"Anonymous","credentials-basic":"Basic","credentials-pem":"PEM","credentials-pem-hint":"At least Server CA certificate file or a pair of Client certificate and Client private key files are required","credentials-sas":"Shared Access Signature","sas-key":"SAS Key","sas-key-required":"SAS Key is required.",hostname:"Hostname","hostname-required":"Hostname is required.","azure-ca-cert":"CA certificate file","username-required":"Username is required.","password-required":"Password is required.","ca-cert":"Server CA certificate file","private-key":"Client private key file",cert:"Client certificate file","no-file":"No file selected.","drop-file":"Drop a file or click to select a file to upload.","private-key-password":"Private key password","use-system-smtp-settings":"Use system SMTP settings","use-metadata-dynamic-interval":"Use dynamic interval","metadata-dynamic-interval-hint":"Interval start and end input fields support templatization. Note that the substituted template value should be set in milliseconds. Use $[messageKey] to extract value from the message and ${metadataKey} to extract value from the metadata.","use-metadata-interval-patterns-hint":"If selected, rule node use start and end interval patterns from message metadata or data assuming that intervals are in the milliseconds.","use-message-alarm-data":"Use message alarm data","overwrite-alarm-details":"Overwrite alarm details","use-alarm-severity-pattern":"Use alarm severity pattern","check-all-keys":"Check that all specified fields are present","check-all-keys-hint":"If selected, checks that all specified keys are present in the message data and metadata.","check-relation-to-specific-entity":"Check relation to specific entity","check-relation-to-specific-entity-tooltip":"If enabled, checks the presence of relation with a specific entity otherwise, checks the presence of relation with any entity. In both cases, relation lookup is based on configured direction and type.","check-relation-hint":"Checks existence of relation to specific entity or to any entity based on direction and relation type.","delete-relation-to-specific-entity":"Delete relation to specific entity","delete-relation-hint":"Deletes relation from the originator of the incoming message to the specified entity or list of entities based on direction and type.","remove-current-relations":"Remove current relations","remove-current-relations-hint":"Removes current relations from the originator of the incoming message based on direction and type.","change-originator-to-related-entity":"Change originator to related entity","change-originator-to-related-entity-hint":"Used to process submitted message as a message from another entity.","start-interval":"Interval start","end-interval":"Interval end","start-interval-required":"Interval start is required.","end-interval-required":"Interval end is required.","smtp-protocol":"Protocol","smtp-host":"SMTP host","smtp-host-required":"SMTP host is required.","smtp-port":"SMTP port","smtp-port-required":"You must supply a smtp port.","smtp-port-range":"SMTP port should be in a range from 1 to 65535.","timeout-msec":"Timeout ms","min-timeout-msec-message":"Only 0 ms minimum value is allowed.","enter-username":"Enter username","enter-password":"Enter password","enable-tls":"Enable TLS","tls-version":"TLS version","enable-proxy":"Enable proxy","use-system-proxy-properties":"Use system proxy properties","proxy-host":"Proxy host","proxy-host-required":"Proxy host is required.","proxy-port":"Proxy port","proxy-port-required":"Proxy port is required.","proxy-port-range":"Proxy port should be in a range from 1 to 65535.","proxy-user":"Proxy user","proxy-password":"Proxy password","proxy-scheme":"Proxy scheme","numbers-to-template":"Phone Numbers To Template","numbers-to-template-required":"Phone Numbers To Template is required","numbers-to-template-hint":'Comma separated Phone Numbers, use ${metadataKey} for value from metadata, $[messageKey] for value from message body',"sms-message-template":"SMS message Template","sms-message-template-required":"SMS message Template is required","use-system-sms-settings":"Use system SMS provider settings","min-period-0-seconds-message":"Only 0 second minimum period is allowed.","max-pending-messages":"Maximum pending messages","max-pending-messages-required":"Maximum pending messages is required.","max-pending-messages-range":"Maximum pending messages should be in a range from 1 to 100000.","originator-types-filter":"Originator types filter","interval-seconds":"Interval in seconds","interval-seconds-required":"Interval is required.","min-interval-seconds-message":"Only 1 second minimum interval is allowed.","output-timeseries-key-prefix":"Output timeseries key prefix","output-timeseries-key-prefix-required":"Output timeseries key prefix required.","separator-hint":'Press "Enter" to complete field input.',"select-details":"Select details","entity-details-id":"Id","entity-details-title":"Title","entity-details-country":"Country","entity-details-state":"State","entity-details-city":"City","entity-details-zip":"Zip","entity-details-address":"Address","entity-details-address2":"Address2","entity-details-additional_info":"Additional Info","entity-details-phone":"Phone","entity-details-email":"Email","fields-to-check":"Fields to check","add-detail":"Add detail","check-all-keys-tooltip":"If enabled, checks the presence of all fields listed in the message and metadata field names within the incoming message and its metadata.","fields-to-check-hint":'Press "Enter" to complete field name input. Multiple field names supported.',"entity-details-list-empty":"At least one detail should be selected.","alarm-status":"Alarm status","alarm-required":"At least one alarm status should be selected.","no-entity-details-matching":"No entity details matching were found.","custom-table-name":"Custom table name","custom-table-name-required":"Table Name is required","custom-table-hint":"Enter the table name without prefix 'cs_tb_'.","message-field":"Message field","message-field-required":"Message field is required.","table-col":"Table column","table-col-required":"Table column is required.","latitude-field-name":"Latitude field name","longitude-field-name":"Longitude field name","latitude-field-name-required":"Latitude field name is required.","longitude-field-name-required":"Longitude field name is required.","fetch-perimeter-info-from-metadata":"Fetch perimeter information from metadata","fetch-perimeter-info-from-metadata-tooltip":"If perimeter type is set to 'Polygon' the value of metadata field '{{perimeterKeyName}}' will be set as perimeter definition without additional parsing of the value. Otherwise, if perimeter type is set to 'Circle' the value of '{{perimeterKeyName}}' metadata field will be parsed to extract 'latitude', 'longitude', 'radius', 'radiusUnit' fields that uses for circle perimeter definition.","perimeter-key-name":"Perimeter key name","perimeter-key-name-hint":"Metadata field name that includes perimeter information.","perimeter-key-name-required":"Perimeter key name is required.","perimeter-circle":"Circle","perimeter-polygon":"Polygon","perimeter-type":"Perimeter type","circle-center-latitude":"Center latitude","circle-center-latitude-required":"Center latitude is required.","circle-center-longitude":"Center longitude","circle-center-longitude-required":"Center longitude is required.","range-unit-meter":"Meter","range-unit-kilometer":"Kilometer","range-unit-foot":"Foot","range-unit-mile":"Mile","range-unit-nautical-mile":"Nautical mile","range-units":"Range units","range-units-required":"Range units is required.",range:"Range","range-required":"Range is required.","polygon-definition":"Polygon definition","polygon-definition-required":"Polygon definition is required.","polygon-definition-hint":"Use the following format for manual definition of polygon: [[lat1,lon1],[lat2,lon2], ... ,[latN,lonN]].","min-inside-duration":"Minimal inside duration","min-inside-duration-value-required":"Minimal inside duration is required","min-inside-duration-time-unit":"Minimal inside duration time unit","min-outside-duration":"Minimal outside duration","min-outside-duration-value-required":"Minimal outside duration is required","min-outside-duration-time-unit":"Minimal outside duration time unit","tell-failure-if-absent":"Tell Failure","tell-failure-if-absent-hint":'If at least one selected key doesn\'t exist the outbound message will report "Failure".',"get-latest-value-with-ts":"Fetch timestamp for the latest telemetry values","get-latest-value-with-ts-hint":'If selected, the latest telemetry values will also include timestamp, e.g: "temp": "{"ts":1574329385897, "value":42}"',"use-redis-queue":"Use redis queue for message persistence","ignore-null-strings":"Ignore null strings","ignore-null-strings-hint":"If selected rule node will ignore entity fields with empty value.","trim-redis-queue":"Trim redis queue","redis-queue-max-size":"Redis queue max size","add-metadata-key-values-as-kafka-headers":"Add Message metadata key-value pairs to Kafka record headers","add-metadata-key-values-as-kafka-headers-hint":"If selected, key-value pairs from message metadata will be added to the outgoing records headers as byte arrays with predefined charset encoding.","charset-encoding":"Charset encoding","charset-encoding-required":"Charset encoding is required.","charset-us-ascii":"US-ASCII","charset-iso-8859-1":"ISO-8859-1","charset-utf-8":"UTF-8","charset-utf-16be":"UTF-16BE","charset-utf-16le":"UTF-16LE","charset-utf-16":"UTF-16","select-queue-hint":"The queue name can be selected from a drop-down list or add a custom name.","persist-alarm-rules":"Persist state of alarm rules","fetch-alarm-rules":"Fetch state of alarm rules","input-value-key":"Input value key","input-value-key-required":"Input value key is required.","output-value-key":"Output value key","output-value-key-required":"Output value key is required.","number-of-digits-after-floating-point":"Number of digits after floating point","number-of-digits-after-floating-point-range":"Number of digits after floating point should be in a range from 0 to 15.","failure-if-delta-negative":"Tell Failure if delta is negative","failure-if-delta-negative-tooltip":"Rule node forces failure of message processing if delta value is negative.","use-caching":"Use caching","use-caching-tooltip":'Rule node will cache the value of "{{inputValueKey}}" that arrives from the incoming message to improve performance. Note that the cache will not be updated if you modify the "{{inputValueKey}}" value elsewhere.',"add-time-difference-between-readings":'Add the time difference between "{{inputValueKey}}" readings',"add-time-difference-between-readings-tooltip":'If enabled, the rule node will add the "{{periodValueKey}}" to the outbound message.',"period-value-key":"Period value key","period-value-key-required":"Period value key is required.","general-pattern-hint":"Use ${metadataKey} for value from metadata, $[messageKey] for value from message body.","alarm-severity-pattern-hint":'Use ${metadataKey} for value from metadata, $[messageKey] for value from message body. Alarm severity should be system (CRITICAL, MAJOR etc.)',"output-node-name-hint":"The rule node name corresponds to the relation type of the output message, and it is used to forward messages to other rule nodes in the caller rule chain.","skip-latest-persistence":"Skip latest persistence","use-server-ts":"Use server ts","use-server-ts-hint":"Enable this setting to use the timestamp of the message processing instead of the timestamp from the message. Useful for all sorts of sequential processing if you merge messages from multiple sources (devices, assets, etc).","kv-map-pattern-hint":"All input fields support templatization. Use $[messageKey] to extract value from the message and ${metadataKey} to extract value from the metadata.","shared-scope":"Shared scope","server-scope":"Server scope","client-scope":"Client scope","attribute-type":"Attribute","constant-type":"Constant","time-series-type":"Time-series","message-body-type":"Message","message-metadata-type":"Metadata","argument-tile":"Arguments","no-arguments-prompt":"No arguments configured","result-title":"Result","functions-field-input":"Functions","no-option-found":"No option found","argument-source-field-input":"Source","argument-source-field-input-required":"Argument source is required.","argument-key-field-input":"Key","argument-key-field-input-required":"Argument key is required.","constant-value-field-input":"Constant value","constant-value-field-input-required":"Constant value is required.","attribute-scope-field-input":"Attribute scope","attribute-scope-field-input-required":"Attribute scope os required.","default-value-field-input":"Default value","type-field-input":"Type","type-field-input-required":"Type is required.","key-field-input":"Key","add-entity-type":"Add entity type","key-field-input-required":"Key is required.","number-floating-point-field-input":"Number of digits after floating point","number-floating-point-field-input-hint":"Use 0 to convert result to integer","add-to-message-field-input":"Add to message","add-to-metadata-field-input":"Add to metadata","custom-expression-field-input":"Mathematical Expression","custom-expression-field-input-required":"Mathematical expression is required","custom-expression-field-input-hint":"Specify a mathematical expression to evaluate. Default expression demonstrates how to transform Fahrenheit to Celsius","retained-message":"Retained","attributes-mapping":"Attributes mapping","latest-telemetry-mapping":"Latest telemetry mapping","add-mapped-attribute-to":"Add mapped attributes to","add-mapped-latest-telemetry-to":"Add mapped latest telemetry to","add-mapped-fields-to":"Add mapped fields to","add-selected-details-to":"Add selected details to","clear-selected-types":"Clear selected types","clear-selected-details":"Clear selected details","clear-selected-fields":"Clear selected fields","clear-selected-keys":"Clear selected keys","geofence-configuration":"Geofence configuration","coordinate-field-names":"Coordinate field names","coordinate-field-hint":"Rule node tries to retrieve the specified fields from the message. If they are not present, it will look them up in the metadata.","fetch-credentials-to":"Fetch credentials to","add-originator-attributes-to":"Add originator attributes to","originator-attributes":"Originator attributes","fetch-latest-telemetry-with-timestamp":"Fetch latest telemetry with timestamp","fetch-latest-telemetry-with-timestamp-tooltip":'If selected, latest telemetry values will be added to the outbound metadata with timestamp, e.g: "{{latestTsKeyName}}": "{"ts":1574329385897, "value":42}"',"tell-failure":"Tell failure if any of the attributes are missing","tell-failure-tooltip":'If at least one selected key doesn\'t exist the outbound message will report "Failure".',"created-time":"Created time","chip-help":"Press 'Enter' to complete {{inputName}} input. \nPress 'Backspace' to delete {{inputName}}. \nMultiple values supported.",detail:"detail","field-name":"field name","device-profile":"device profile","entity-type":"entity type","message-type":"message type","timeseries-key":"timeseries key",type:"Type","first-name":"First name","last-name":"Last name",label:"Label","originator-fields-mapping":"Originator fields mapping","add-mapped-originator-fields-to":"Add mapped originator fields to",fields:"Fields","skip-empty-fields":"Skip empty fields","skip-empty-fields-tooltip":"Fields with empty values will not be added to the output message/output metadata.","fetch-interval":"Fetch interval","fetch-strategy":"Fetch strategy","fetch-timeseries-from-to":"Fetch timeseries from {{startInterval}} {{startIntervalTimeUnit}} ago to {{endInterval}} {{endIntervalTimeUnit}} ago.","fetch-timeseries-from-to-invalid":'Fetch timeseries invalid ("Interval start" should be less than "Interval end").',"use-metadata-dynamic-interval-tooltip":"If selected, the rule node will use dynamic interval start and end based on the message and metadata patterns.","all-mode-hint":'If selected fetch mode "All" rule node will retrieve telemetry from the fetch interval with configurable query parameters.',"first-mode-hint":'If selected fetch mode "First" rule node will retrieve the closest telemetry to the fetch interval\'s start.',"last-mode-hint":'If selected fetch mode "Last" rule node will retrieve the closest telemetry to the fetch interval\'s end.',ascending:"Ascending",descending:"Descending",min:"Min",max:"Max",average:"Average",sum:"Sum",count:"Count",none:"None","last-level-relation-tooltip":"If selected, the rule node will search related entities only on the level set in the max relation level.","last-level-device-relation-tooltip":"If selected, the rule node will search related devices only on the level set in the max relation level.","data-to-fetch":"Data to fetch","mapping-of-customers-fields":"Mapping of customer's fields","map-fields-required":"All mapping fields are required.",attributes:"Attributes","related-device-attributes":"Related device attributes","add-selected-attributes-to":"Add selected attributes to","device-profiles":"Device profiles","mapping-of-tenant-fields":"Mapping of tenant's fields","add-attribute-key":"Add attribute key","message-template":"Message template","message-template-required":"Message template is required","use-system-slack-settings":"Use system slack settings","slack-api-token":"Slack API token","slack-api-token-required":"Slack API token is required"},"key-val":{key:"Key",value:"Value","see-examples":"See examples.","remove-entry":"Remove entry","remove-mapping-entry":"Remove mapping entry","add-mapping-entry":"Add mapping","add-entry":"Add entry","unique-key-value-pair-error":"'{{valText}}' must be different from the current '{{keyText}}'"},"mail-body-type":{"plain-text":"Plain Text",html:"HTML",dynamic:"Dynamic"}}},!0)}(e)}}e("RuleNodeCoreConfigModule",cr),cr.ɵfac=t.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:cr,deps:[{token:H.TranslateService}],target:t.ɵɵFactoryTarget.NgModule}),cr.ɵmod=t.ɵɵngDeclareNgModule({minVersion:"14.0.0",version:"15.2.9",ngImport:t,type:cr,declarations:[Je],imports:[O,I],exports:[Fn,tr,En,jn,mr,dr,Je]}),cr.ɵinj=t.ɵɵngDeclareInjector({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:cr,imports:[O,I,Fn,tr,En,jn,mr,dr]}),t.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"15.2.9",ngImport:t,type:cr,decorators:[{type:l,args:[{declarations:[Je],imports:[O,I],exports:[Fn,tr,En,jn,mr,dr,Je]}]}],ctorParameters:function(){return[{type:H.TranslateService}]}})}}}));//# sourceMappingURL=rulenode-core-config.js.map diff --git a/transport/coap/src/main/resources/tb-coap-transport.yml b/transport/coap/src/main/resources/tb-coap-transport.yml index 825b197e1d..437f551690 100644 --- a/transport/coap/src/main/resources/tb-coap-transport.yml +++ b/transport/coap/src/main/resources/tb-coap-transport.yml @@ -194,6 +194,7 @@ transport: # Queue configuration parameters queue: type: "${TB_QUEUE_TYPE:kafka}" # kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka) except of js executor topics (please use REMOTE_JS_EVAL_REQUEST_TOPIC and REMOTE_JS_EVAL_RESPONSE_TOPIC to specify custom topic names) kafka: # Kafka Bootstrap Servers bootstrap.servers: "${TB_KAFKA_SERVERS:localhost:9092}" diff --git a/transport/http/src/main/resources/tb-http-transport.yml b/transport/http/src/main/resources/tb-http-transport.yml index 315b138bfa..8d4d6fadf0 100644 --- a/transport/http/src/main/resources/tb-http-transport.yml +++ b/transport/http/src/main/resources/tb-http-transport.yml @@ -177,6 +177,7 @@ transport: # Queue configuration parameters queue: type: "${TB_QUEUE_TYPE:kafka}" # kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka) except of js executor topics (please use REMOTE_JS_EVAL_REQUEST_TOPIC and REMOTE_JS_EVAL_RESPONSE_TOPIC to specify custom topic names) kafka: # Kafka Bootstrap Servers bootstrap.servers: "${TB_KAFKA_SERVERS:localhost:9092}" diff --git a/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml b/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml index db4870e40b..8fd1c11e6e 100644 --- a/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml +++ b/transport/lwm2m/src/main/resources/tb-lwm2m-transport.yml @@ -273,6 +273,7 @@ transport: # Queue configuration properties queue: type: "${TB_QUEUE_TYPE:kafka}" # kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka) except of js executor topics (please use REMOTE_JS_EVAL_REQUEST_TOPIC and REMOTE_JS_EVAL_RESPONSE_TOPIC to specify custom topic names) kafka: # Kafka Bootstrap Servers bootstrap.servers: "${TB_KAFKA_SERVERS:localhost:9092}" diff --git a/transport/mqtt/src/main/resources/tb-mqtt-transport.yml b/transport/mqtt/src/main/resources/tb-mqtt-transport.yml index ff26bb6e38..6c51d18ab7 100644 --- a/transport/mqtt/src/main/resources/tb-mqtt-transport.yml +++ b/transport/mqtt/src/main/resources/tb-mqtt-transport.yml @@ -210,6 +210,7 @@ transport: # Queue configuration parameters queue: type: "${TB_QUEUE_TYPE:kafka}" # kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka) except of js executor topics (please use REMOTE_JS_EVAL_REQUEST_TOPIC and REMOTE_JS_EVAL_RESPONSE_TOPIC to specify custom topic names) kafka: # Kafka Bootstrap Servers bootstrap.servers: "${TB_KAFKA_SERVERS:localhost:9092}" diff --git a/transport/snmp/src/main/resources/tb-snmp-transport.yml b/transport/snmp/src/main/resources/tb-snmp-transport.yml index db883dcd30..eeb6807714 100644 --- a/transport/snmp/src/main/resources/tb-snmp-transport.yml +++ b/transport/snmp/src/main/resources/tb-snmp-transport.yml @@ -156,6 +156,7 @@ transport: # Queue configuration parameters queue: type: "${TB_QUEUE_TYPE:kafka}" # kafka (Apache Kafka) or aws-sqs (AWS SQS) or pubsub (PubSub) or service-bus (Azure Service Bus) or rabbitmq (RabbitMQ) + prefix: "${TB_QUEUE_PREFIX:}" # Global queue prefix. If specified, prefix is added before default topic name: 'prefix.default_topic_name'. Prefix is applied to all topics (and consumer groups for kafka) except of js executor topics (please use REMOTE_JS_EVAL_REQUEST_TOPIC and REMOTE_JS_EVAL_RESPONSE_TOPIC to specify custom topic names) kafka: # Kafka Bootstrap Servers bootstrap.servers: "${TB_KAFKA_SERVERS:localhost:9092}" diff --git a/ui-ngx/pom.xml b/ui-ngx/pom.xml index 84b5f8b98c..2c09d29af2 100644 --- a/ui-ngx/pom.xml +++ b/ui-ngx/pom.xml @@ -56,7 +56,7 @@ install-node-and-yarn - v16.15.1 + v16.20.2 v1.22.17 diff --git a/ui-ngx/src/app/core/auth/auth.service.ts b/ui-ngx/src/app/core/auth/auth.service.ts index f4777aae29..875cef30d1 100644 --- a/ui-ngx/src/app/core/auth/auth.service.ts +++ b/ui-ngx/src/app/core/auth/auth.service.ts @@ -370,7 +370,8 @@ export class AuthService { data: { title: translations['login.error'], message: loginError, - ok: translations['action.close'] + ok: translations['action.close'], + textMode: true } }; this.dialog.open(AlertDialogComponent, dialogConfig); diff --git a/ui-ngx/src/app/core/http/attribute.service.ts b/ui-ngx/src/app/core/http/attribute.service.ts index 9022a47eef..3ca29e425e 100644 --- a/ui-ngx/src/app/core/http/attribute.service.ts +++ b/ui-ngx/src/app/core/http/attribute.service.ts @@ -32,12 +32,18 @@ export class AttributeService { private http: HttpClient ) { } - public getEntityAttributes(entityId: EntityId, attributeScope: AttributeScope, + public getEntityAttributes(entityId: EntityId, attributeScope?: AttributeScope, keys?: Array, config?: RequestConfig): Observable> { - let url = `/api/plugins/telemetry/${entityId.entityType}/${entityId.id}/values/attributes/${attributeScope}`; + let url = `/api/plugins/telemetry/${entityId.entityType}/${entityId.id}/values/attributes`; + + if (attributeScope) { + url += `/${attributeScope}`; + } + if (keys && keys.length) { url += `?keys=${keys.join(',')}`; } + return this.http.get>(url, defaultHttpOptionsFromConfig(config)); } diff --git a/ui-ngx/src/app/core/services/resources.service.ts b/ui-ngx/src/app/core/services/resources.service.ts index 29d86fc2fb..f7a34c9ef5 100644 --- a/ui-ngx/src/app/core/services/resources.service.ts +++ b/ui-ngx/src/app/core/services/resources.service.ts @@ -68,7 +68,9 @@ export class ResourcesService { } const subject = new ReplaySubject(); this.loadedJsonResources[url] = subject; - this.http.get(url).subscribe( + const req$ = (url.endsWith('.raw') || url.endsWith('.svg') ? + this.http.get(url, {responseType: 'text'}) : this.http.get(url)) as Observable; + req$.subscribe( { next: (o) => { if (postProcess) { diff --git a/ui-ngx/src/app/modules/home/components/relation/relation-filters.component.html b/ui-ngx/src/app/modules/home/components/relation/relation-filters.component.html index 77b87ced08..062bba86d6 100644 --- a/ui-ngx/src/app/modules/home/components/relation/relation-filters.component.html +++ b/ui-ngx/src/app/modules/home/components/relation/relation-filters.component.html @@ -18,7 +18,7 @@
-
{{ 'relation.type' | translate }}
+
{{ 'relation.relation-type' | translate }}
{{ 'entity.entity-types' | translate }}
diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/basic-widget-config.module.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/basic-widget-config.module.ts index c26cf43542..3d303b01b7 100644 --- a/ui-ngx/src/app/modules/home/components/widget/config/basic/basic-widget-config.module.ts +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/basic-widget-config.module.ts @@ -70,6 +70,18 @@ import { import { ProgressBarBasicConfigComponent } from '@home/components/widget/config/basic/cards/progress-bar-basic-config.component'; +import { + RadialGaugeBasicConfigComponent +} from '@home/components/widget/config/basic/gauge/radial-gauge-basic-config.component'; +import { + ThermometerScaleGaugeBasicConfigComponent +} from '@home/components/widget/config/basic/gauge/thermometer-scale-gauge-basic-config.component'; +import { + CompassGaugeBasicConfigComponent +} from '@home/components/widget/config/basic/gauge/compass-gauge-basic-config.component'; +import { + LiquidLevelCardBasicConfigComponent +} from '@home/components/widget/config/basic/indicator/liquid-level-card-basic-config.component'; @NgModule({ declarations: [ @@ -91,7 +103,11 @@ import { WindSpeedDirectionBasicConfigComponent, SignalStrengthBasicConfigComponent, ValueChartCardBasicConfigComponent, - ProgressBarBasicConfigComponent + ProgressBarBasicConfigComponent, + RadialGaugeBasicConfigComponent, + ThermometerScaleGaugeBasicConfigComponent, + CompassGaugeBasicConfigComponent, + LiquidLevelCardBasicConfigComponent ], imports: [ CommonModule, @@ -117,7 +133,11 @@ import { WindSpeedDirectionBasicConfigComponent, SignalStrengthBasicConfigComponent, ValueChartCardBasicConfigComponent, - ProgressBarBasicConfigComponent + ProgressBarBasicConfigComponent, + RadialGaugeBasicConfigComponent, + ThermometerScaleGaugeBasicConfigComponent, + CompassGaugeBasicConfigComponent, + LiquidLevelCardBasicConfigComponent ] }) export class BasicWidgetConfigModule { @@ -137,5 +157,9 @@ export const basicWidgetConfigComponentsMap: {[key: string]: Type + + + + + +
+
widgets.gauge.gauge-appearance
+
+ + {{ 'widgets.gauge.units-title' | translate }} + +
+ + + + + + + +
+
+ +
+
widget-config.units-short
+
+ + + + + + +
+
+ +
+ + {{ 'widgets.gauge.value' | translate }} + +
+ + +
widget-config.decimals-suffix
+
+ + + + +
+
+ +
+
widgets.gauge.ticks
+
+
widgets.gauge.min-value-short
+ + + +
widgets.gauge.max-value-short
+ + + + + + + +
+
+ +
+
widgets.gauge.arrow-and-scale-color
+ + +
+
+
widgets.gauge.plate-color
+ + +
+
+
widgets.gauge.scale-color
+ + +
+ +
+
widgets.gauge.progress-bar
+
+
widgets.gauge.progress-bar-color-start
+ + +
+
+
widgets.gauge.progress-bar-color-end
+ + +
+
+
widgets.gauge.bar-stroke-color
+ + +
+
+ +
+
+
widget-config.card-appearance
+
+
{{ 'widget-config.background-color' | translate }}
+ + +
+
+
widget-config.show-card-buttons
+ + {{ 'fullscreen.fullscreen' | translate }} + +
+
+
{{ 'widget-config.card-border-radius' | translate }}
+ + + +
+
+ + +
diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/analog-gauge-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/analog-gauge-basic-config.component.ts new file mode 100644 index 0000000000..6e422105ec --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/analog-gauge-basic-config.component.ts @@ -0,0 +1,187 @@ +/// +/// Copyright © 2016-2023 The Thingsboard Authors +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. +/// + +import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; +import { Store } from '@ngrx/store'; +import { AppState } from '@core/core.state'; +import { BasicWidgetConfigComponent } from '@home/components/widget/config/widget-config.component.models'; +import { WidgetConfigComponentData } from '@home/models/widget-component.models'; +import { + datasourcesHasAggregation, + datasourcesHasOnlyComparisonAggregation, + WidgetConfig, +} from '@shared/models/widget.models'; +import { WidgetConfigComponent } from '@home/components/widget/widget-config.component'; +import { + getTimewindowConfig, + setTimewindowConfig +} from '@home/components/widget/config/timewindow-config-panel.component'; +import { formatValue, isUndefined } from '@core/utils'; +import { ColorType } from '@shared/models/widget-settings.models'; + +export class GaugeBasicConfigComponent extends BasicWidgetConfigComponent { + + public get displayTimewindowConfig(): boolean { + const datasources = this.radialGaugeWidgetConfigForm.get('datasources').value; + return datasourcesHasAggregation(datasources); + } + + public onlyHistoryTimewindow(): boolean { + const datasources = this.radialGaugeWidgetConfigForm.get('datasources').value; + return datasourcesHasOnlyComparisonAggregation(datasources); + } + + colorType = ColorType; + + radialGaugeWidgetConfigForm: UntypedFormGroup; + + valuePreviewFn = this._valuePreviewFn.bind(this); + + constructor(protected store: Store, + protected widgetConfigComponent: WidgetConfigComponent, + protected fb: UntypedFormBuilder) { + super(store, widgetConfigComponent); + } + + protected configForm(): UntypedFormGroup { + return this.radialGaugeWidgetConfigForm; + } + + protected setupDefaults(configData: WidgetConfigComponentData) { + super.setupDefaults(configData); + } + + protected onConfigSet(configData: WidgetConfigComponentData) { + this.radialGaugeWidgetConfigForm = this.fb.group({ + timewindowConfig: [getTimewindowConfig(configData.config), []], + datasources: [configData.config.datasources, []], + + showUnitTitle: [configData.config.settings?.showUnitTitle, []], + unitTitle: [configData.config.settings?.unitTitle, []], + titleFont: [configData.config.settings?.titleFont, []], + titleColor: [configData.config.settings?.titleFont?.color, []], + + units: [configData.config.units, []], + unitsFont: [configData.config.settings?.unitsFont, []], + unitsColor: [configData.config.settings?.unitsFont?.color, []], + + valueBox: [configData.config.settings?.valueBox, []], + valueInt: [configData.config.settings?.valueInt, []], + valueFont: [configData.config.settings?.valueFont, []], + valueColor: [configData.config.settings?.valueFont?.color, []], + + minValue: [configData.config.settings?.minValue, []], + maxValue: [configData.config.settings?.maxValue, []], + numbersFont: [configData.config.settings?.numbersFont, []], + numbersColor: [configData.config.settings?.numbersFont?.color, []], + + colorBarStroke: [configData.config.settings?.colorBarStroke, []], + + defaultColor: [configData.config.settings?.defaultColor, []], + colorPlate: [configData.config.settings?.colorPlate, []], + highlights: [configData.config.settings?.highlights, []], + + cardButtons: [this.getCardButtons(configData.config), []], + borderRadius: [configData.config.borderRadius, []], + backgroundColor: [configData.config.backgroundColor, []], + actions: [configData.config.actions || {}, []] + }); + } + + protected prepareOutputConfig(config: any): WidgetConfigComponentData { + setTimewindowConfig(this.widgetConfig.config, config.timewindowConfig); + this.widgetConfig.config.datasources = config.datasources; + this.widgetConfig.config.actions = config.actions; + + this.widgetConfig.config.settings = this.widgetConfig.config.settings || {}; + this.setCardButtons(config.cardButtons, this.widgetConfig.config); + this.widgetConfig.config.backgroundColor = config.backgroundColor; + + this.widgetConfig.config.settings.showUnitTitle = config.showUnitTitle; + this.widgetConfig.config.settings.unitTitle = config.unitTitle; + this.widgetConfig.config.settings.titleFont = config.titleFont; + this.widgetConfig.config.settings.titleFont.color = config.titleColor; + + this.widgetConfig.config.units = config.units; + this.widgetConfig.config.settings.unitsFont = config.unitsFont; + this.widgetConfig.config.settings.unitsFont.color = config.unitsColor; + + this.widgetConfig.config.settings.valueBox = config.valueBox; + this.widgetConfig.config.settings.valueInt = config.valueInt; + this.widgetConfig.config.settings.valueFont = config.valueFont; + this.widgetConfig.config.settings.valueFont.color = config.valueColor; + + this.widgetConfig.config.settings.minValue = config.minValue; + this.widgetConfig.config.settings.maxValue = config.maxValue; + this.widgetConfig.config.settings.numbersFont = config.numbersFont; + this.widgetConfig.config.settings.numbersFont.color = config.numbersColor; + + this.widgetConfig.config.settings.defaultColor = config.defaultColor; + this.widgetConfig.config.settings.colorPlate = config.colorPlate; + this.widgetConfig.config.settings.highlights = config.highlights.rangeList; + return this.widgetConfig; + } + + protected validatorTriggers(): string[] { + return ['showUnitTitle', 'valueBox']; + } + + protected updateValidators(emitEvent: boolean, trigger?: string) { + const showUnitTitle: boolean = this.radialGaugeWidgetConfigForm.get('showUnitTitle').value; + const valueBox: boolean = this.radialGaugeWidgetConfigForm.get('valueBox').value; + if (showUnitTitle) { + this.radialGaugeWidgetConfigForm.get('unitTitle').enable(); + this.radialGaugeWidgetConfigForm.get('titleFont').enable(); + this.radialGaugeWidgetConfigForm.get('titleColor').enable(); + } else { + this.radialGaugeWidgetConfigForm.get('unitTitle').disable(); + this.radialGaugeWidgetConfigForm.get('titleFont').disable(); + this.radialGaugeWidgetConfigForm.get('titleColor').disable(); + } + if (valueBox) { + this.radialGaugeWidgetConfigForm.get('valueInt').enable(); + this.radialGaugeWidgetConfigForm.get('valueFont').enable(); + this.radialGaugeWidgetConfigForm.get('valueColor').enable(); + } else { + this.radialGaugeWidgetConfigForm.get('valueInt').disable(); + this.radialGaugeWidgetConfigForm.get('valueFont').disable(); + this.radialGaugeWidgetConfigForm.get('valueColor').disable(); + } + this.radialGaugeWidgetConfigForm.get('unitTitle').updateValueAndValidity({emitEvent}); + this.radialGaugeWidgetConfigForm.get('titleFont').updateValueAndValidity({emitEvent}); + this.radialGaugeWidgetConfigForm.get('titleColor').updateValueAndValidity({emitEvent}); + this.radialGaugeWidgetConfigForm.get('valueInt').updateValueAndValidity({emitEvent}); + this.radialGaugeWidgetConfigForm.get('valueFont').updateValueAndValidity({emitEvent}); + this.radialGaugeWidgetConfigForm.get('valueColor').updateValueAndValidity({emitEvent}); + } + + private getCardButtons(config: WidgetConfig): string[] { + const buttons: string[] = []; + if (isUndefined(config.enableFullscreen) || config.enableFullscreen) { + buttons.push('fullscreen'); + } + return buttons; + } + + private setCardButtons(buttons: string[], config: WidgetConfig) { + config.enableFullscreen = buttons.includes('fullscreen'); + } + + private _valuePreviewFn(): string { + const units: string = this.radialGaugeWidgetConfigForm.get('units').value; + return formatValue(22, 0, units, true); + } +} diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/compass-gauge-basic-config.component.html b/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/compass-gauge-basic-config.component.html new file mode 100644 index 0000000000..a3a2636876 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/compass-gauge-basic-config.component.html @@ -0,0 +1,154 @@ + + + + + + + +
+
widget-config.appearance
+
+ + {{ 'widget-config.title' | translate }} + +
+ + + + + + + +
+
+
+ + {{ 'widget-config.icon' | translate }} + +
+ + + + +
+
+
+ +
+
widgets.gauge.compass-appearance
+
+
widgets.gauge.labels
+
+ + +
+
+
+
widgets.gauge.label-style
+
+ + + + +
+
+ +
+
widgets.gauge.major-ticks-color
+ + +
+
+
widgets.gauge.minor-ticks-color
+ + +
+
+
widgets.gauge.needle-color
+ + +
+
+
widgets.gauge.plate-color
+ + +
+
+ +
+
widget-config.card-appearance
+
+
{{ 'widget-config.background-color' | translate }}
+ + +
+
+
widget-config.show-card-buttons
+ + {{ 'fullscreen.fullscreen' | translate }} + +
+
+
{{ 'widget-config.card-border-radius' | translate }}
+ + + +
+
+ + +
diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/compass-gauge-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/compass-gauge-basic-config.component.ts new file mode 100644 index 0000000000..8bf0b5ea6e --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/compass-gauge-basic-config.component.ts @@ -0,0 +1,171 @@ +/// +/// Copyright © 2016-2023 The Thingsboard Authors +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. +/// + +import { Component } from '@angular/core'; +import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; +import { Store } from '@ngrx/store'; +import { AppState } from '@core/core.state'; +import { BasicWidgetConfigComponent } from '@home/components/widget/config/widget-config.component.models'; +import { WidgetConfigComponentData } from '@home/models/widget-component.models'; +import { + datasourcesHasAggregation, + datasourcesHasOnlyComparisonAggregation, + WidgetConfig, +} from '@shared/models/widget.models'; +import { WidgetConfigComponent } from '@home/components/widget/widget-config.component'; +import { + getTimewindowConfig, + setTimewindowConfig +} from '@home/components/widget/config/timewindow-config-panel.component'; +import { isUndefined } from '@core/utils'; + +@Component({ + selector: 'tb-compass-gauge-basic-config', + templateUrl: './compass-gauge-basic-config.component.html', + styleUrls: ['../basic-config.scss'] +}) +export class CompassGaugeBasicConfigComponent extends BasicWidgetConfigComponent { + + public get displayTimewindowConfig(): boolean { + const datasources = this.compassGaugeWidgetConfigForm.get('datasources').value; + return datasourcesHasAggregation(datasources); + } + + public onlyHistoryTimewindow(): boolean { + const datasources = this.compassGaugeWidgetConfigForm.get('datasources').value; + return datasourcesHasOnlyComparisonAggregation(datasources); + } + + compassGaugeWidgetConfigForm: UntypedFormGroup; + + constructor(protected store: Store, + protected widgetConfigComponent: WidgetConfigComponent, + protected fb: UntypedFormBuilder) { + super(store, widgetConfigComponent); + } + + protected configForm(): UntypedFormGroup { + return this.compassGaugeWidgetConfigForm; + } + + protected setupDefaults(configData: WidgetConfigComponentData) { + super.setupDefaults(configData); + } + + protected onConfigSet(configData: WidgetConfigComponentData) { + this.compassGaugeWidgetConfigForm = this.fb.group({ + timewindowConfig: [getTimewindowConfig(configData.config), []], + datasources: [configData.config.datasources, []], + + showTitle: [configData.config.showTitle, []], + title: [configData.config.title, []], + titleFont: [configData.config.titleFont, []], + titleColor: [configData.config.titleColor, []], + showTitleIcon: [configData.config.showTitleIcon, []], + titleIcon: [configData.config.titleIcon, []], + iconColor: [configData.config.iconColor, []], + + majorTicks: [configData.config.settings?.majorTicks, []], + majorTickFont: [configData.config.settings?.majorTickFont, []], + majorTickColor: [configData.config.settings?.majorTickFont.color, []], + colorMajorTicks: [configData.config.settings?.colorMajorTicks, []], + colorMinorTicks: [configData.config.settings?.colorMinorTicks, []], + colorPlate: [configData.config.settings?.colorPlate, []], + colorNeedle: [configData.config.settings?.colorNeedle, []], + + cardButtons: [this.getCardButtons(configData.config), []], + borderRadius: [configData.config.borderRadius, []], + backgroundColor: [configData.config.backgroundColor, []], + actions: [configData.config.actions || {}, []] + }); + } + + protected prepareOutputConfig(config: any): WidgetConfigComponentData { + setTimewindowConfig(this.widgetConfig.config, config.timewindowConfig); + this.widgetConfig.config.datasources = config.datasources; + this.widgetConfig.config.actions = config.actions; + + this.widgetConfig.config.showTitle = config.showTitle; + this.widgetConfig.config.title = config.title; + this.widgetConfig.config.titleFont = config.titleFont; + this.widgetConfig.config.titleColor = config.titleColor; + this.widgetConfig.config.showTitleIcon = config.showTitleIcon; + this.widgetConfig.config.titleIcon = config.titleIcon; + this.widgetConfig.config.iconColor = config.iconColor; + + this.widgetConfig.config.settings = this.widgetConfig.config.settings || {}; + this.setCardButtons(config.cardButtons, this.widgetConfig.config); + this.widgetConfig.config.backgroundColor = config.backgroundColor; + + this.widgetConfig.config.settings.majorTicks = config.majorTicks; + this.widgetConfig.config.settings.majorTickFont = config.majorTickFont; + this.widgetConfig.config.settings.majorTickFont.color = config.majorTickColor; + this.widgetConfig.config.settings.colorMajorTicks = config.colorMajorTicks; + this.widgetConfig.config.settings.colorMinorTicks = config.colorMinorTicks; + this.widgetConfig.config.settings.colorPlate = config.colorPlate; + this.widgetConfig.config.settings.colorNeedle = config.colorNeedle; + + return this.widgetConfig; + } + + protected validatorTriggers(): string[] { + return ['showTitle', 'showTitleIcon']; + } + + protected updateValidators(emitEvent: boolean, trigger?: string) { + const showTitle: boolean = this.compassGaugeWidgetConfigForm.get('showTitle').value; + const showTitleIcon: boolean = this.compassGaugeWidgetConfigForm.get('showTitleIcon').value; + if (showTitle) { + this.compassGaugeWidgetConfigForm.get('title').enable(); + this.compassGaugeWidgetConfigForm.get('titleFont').enable(); + this.compassGaugeWidgetConfigForm.get('titleColor').enable(); + this.compassGaugeWidgetConfigForm.get('showTitleIcon').enable({emitEvent: false}); + if (showTitleIcon) { + this.compassGaugeWidgetConfigForm.get('titleIcon').enable(); + this.compassGaugeWidgetConfigForm.get('iconColor').enable(); + } else { + this.compassGaugeWidgetConfigForm.get('titleIcon').disable(); + this.compassGaugeWidgetConfigForm.get('iconColor').disable(); + } + } else { + this.compassGaugeWidgetConfigForm.get('title').disable(); + this.compassGaugeWidgetConfigForm.get('titleFont').disable(); + this.compassGaugeWidgetConfigForm.get('titleColor').disable(); + this.compassGaugeWidgetConfigForm.get('showTitleIcon').disable({emitEvent: false}); + this.compassGaugeWidgetConfigForm.get('titleIcon').disable(); + this.compassGaugeWidgetConfigForm.get('iconColor').disable(); + } + this.compassGaugeWidgetConfigForm.get('title').updateValueAndValidity({emitEvent}); + this.compassGaugeWidgetConfigForm.get('titleFont').updateValueAndValidity({emitEvent}); + this.compassGaugeWidgetConfigForm.get('titleColor').updateValueAndValidity({emitEvent}); + this.compassGaugeWidgetConfigForm.get('showTitleIcon').updateValueAndValidity({emitEvent: false}); + this.compassGaugeWidgetConfigForm.get('titleIcon').updateValueAndValidity({emitEvent}); + this.compassGaugeWidgetConfigForm.get('iconColor').updateValueAndValidity({emitEvent}); + } + + + private getCardButtons(config: WidgetConfig): string[] { + const buttons: string[] = []; + if (isUndefined(config.enableFullscreen) || config.enableFullscreen) { + buttons.push('fullscreen'); + } + return buttons; + } + + private setCardButtons(buttons: string[], config: WidgetConfig) { + config.enableFullscreen = buttons.includes('fullscreen'); + } +} diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/radial-gauge-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/radial-gauge-basic-config.component.ts new file mode 100644 index 0000000000..ec756b6605 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/radial-gauge-basic-config.component.ts @@ -0,0 +1,45 @@ +/// +/// Copyright © 2016-2023 The Thingsboard Authors +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. +/// + +import { Component } from '@angular/core'; +import { UntypedFormBuilder } from '@angular/forms'; +import { Store } from '@ngrx/store'; +import { AppState } from '@core/core.state'; +import { + GaugeBasicConfigComponent +} from '@home/components/widget/config/basic/gauge/analog-gauge-basic-config.component'; +import { WidgetConfigComponent } from '@home/components/widget/widget-config.component'; +import { WidgetConfigComponentData } from '@home/models/widget-component.models'; + +@Component({ + selector: 'tb-radial-gauge-basic-config', + templateUrl: './analog-gauge-basic-config.component.html', + styleUrls: ['../basic-config.scss'] +}) +export class RadialGaugeBasicConfigComponent extends GaugeBasicConfigComponent { + + gaugeType = 'radial'; + + constructor(protected store: Store, + protected widgetConfigComponent: WidgetConfigComponent, + protected fb: UntypedFormBuilder) { + super(store, widgetConfigComponent, fb); + } + + protected onConfigSet(configData: WidgetConfigComponentData) { + super.onConfigSet(configData); + } +} diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/thermometer-scale-gauge-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/thermometer-scale-gauge-basic-config.component.ts new file mode 100644 index 0000000000..97e3a0c69f --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/gauge/thermometer-scale-gauge-basic-config.component.ts @@ -0,0 +1,59 @@ +/// +/// Copyright © 2016-2023 The Thingsboard Authors +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. +/// + +import { Component } from '@angular/core'; +import { UntypedFormBuilder } from '@angular/forms'; +import { Store } from '@ngrx/store'; +import { AppState } from '@core/core.state'; +import { + GaugeBasicConfigComponent +} from '@home/components/widget/config/basic/gauge/analog-gauge-basic-config.component'; +import { WidgetConfigComponent } from '@home/components/widget/widget-config.component'; +import { WidgetConfigComponentData } from '@home/models/widget-component.models'; + +@Component({ + selector: 'tb-thermometer-scale-gauge-basic-config', + templateUrl: './analog-gauge-basic-config.component.html', + styleUrls: ['../basic-config.scss'] +}) +export class ThermometerScaleGaugeBasicConfigComponent extends GaugeBasicConfigComponent { + + gaugeType = 'linear'; + + constructor(protected store: Store, + protected widgetConfigComponent: WidgetConfigComponent, + protected fb: UntypedFormBuilder) { + super(store, widgetConfigComponent, fb); + } + + protected onConfigSet(configData: WidgetConfigComponentData) { + super.onConfigSet(configData); + this.radialGaugeWidgetConfigForm.addControl('colorBarStroke', + this.fb.control(configData.config.settings?.colorBarStroke, [])); + this.radialGaugeWidgetConfigForm.addControl('colorBarProgress', + this.fb.control(configData.config.settings?.colorBarProgress, [])); + this.radialGaugeWidgetConfigForm.addControl('colorBarProgressEnd', + this.fb.control(configData.config.settings?.colorBarProgressEnd, [])); + } + + protected prepareOutputConfig(config): WidgetConfigComponentData { + const outputConfig = super.prepareOutputConfig(config); + this.widgetConfig.config.settings.colorBarStroke = config.colorBarStroke; + this.widgetConfig.config.settings.colorBarProgress = config.colorBarProgress; + this.widgetConfig.config.settings.colorBarProgressEnd = config.colorBarProgressEnd; + return outputConfig; + } +} diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/liquid-level-card-basic-config.component.html b/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/liquid-level-card-basic-config.component.html new file mode 100644 index 0000000000..8fe70c10d3 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/liquid-level-card-basic-config.component.html @@ -0,0 +1,318 @@ + + + + + + +
+
widget-config.appearance
+
+ + {{ 'widgets.liquid-level-card.title' | translate }} + +
+ + + + + + + +
+
+
+ + {{ 'widgets.liquid-level-card.icon' | translate }} + +
+ + + + + + + + +
+
+
+
+
widgets.liquid-level-card.shape
+ + + {{ DataSourceTypeTranslations.get(type) | translate }} + + +
+ + + {{ ShapesTranslationMap.get(shape) | translate }} + + + +
+
widgets.liquid-level-card.shape-attribute-name
+ + +
+
+
widgets.liquid-level-card.shape-by-attribute
+
+
+
+
+
+ + + {{ LevelCardLayoutTranslationMap.get(layout) | translate }} + + +
+
+
widgets.liquid-level-card.units
+
+
widgets.liquid-level-card.datasource-units
+
+ + +
+
+
+
widgets.liquid-level-card.widget-units
+
+ + + + {{ DataSourceTypeTranslations.get(type) | translate }} + + + + + + + + + +
+
+
+
widgets.liquid-level-card.total-volume
+
+ + + + {{ DataSourceTypeTranslations.get(type) | translate }} + + + + + + + warning + + + + + + + + +
+
+
+
+
widgets.liquid-level-card.color-and-font
+
+
widgets.liquid-level-card.tank-color
+ + +
+
+
widgets.liquid-level-card.liquid-color
+ + +
+
+
widgets.liquid-level-card.value
+
+ + +
widget-config.decimals-suffix
+
+ + + + +
+
+
+
widgets.liquid-level-card.total-volume
+
+ + + + +
+
+
+
+ + + + + {{ 'widget-config.tooltip' | translate }} + + + + +
+ + {{ 'widgets.liquid-level-card.level' | translate }} + +
+ + + + +
widget-config.decimals-suffix
+
+ + + + +
+
+
+ + {{ 'widgets.value-card.date' | translate }} + +
+ + + + + +
+
+
+
widgets.liquid-level-card.tooltip-background
+ + +
+
+
widgets.liquid-level-card.background-blur
+ + +
px
+
+
+
+
+
+
+
widget-config.card-appearance
+
+
{{ 'widgets.background.background' | translate }}
+ + +
+
+
widget-config.show-card-buttons
+ + {{ 'fullscreen.fullscreen' | translate }} + +
+
+
{{ 'widget-config.card-border-radius' | translate }}
+ + + +
+
+ + +
diff --git a/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/liquid-level-card-basic-config.component.ts b/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/liquid-level-card-basic-config.component.ts new file mode 100644 index 0000000000..4144d7db0b --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/config/basic/indicator/liquid-level-card-basic-config.component.ts @@ -0,0 +1,444 @@ +/// +/// Copyright © 2016-2023 The Thingsboard Authors +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. +/// + +import { ChangeDetectorRef, Component, Injector, ViewChild } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { Store } from '@ngrx/store'; +import { AppState } from '@core/core.state'; +import { BasicWidgetConfigComponent } from '@home/components/widget/config/widget-config.component.models'; +import { WidgetConfigComponentData } from '@home/models/widget-component.models'; +import { + DataKey, + Datasource, + datasourcesHasAggregation, + datasourcesHasOnlyComparisonAggregation, + DatasourceType, + WidgetConfig, +} from '@shared/models/widget.models'; +import { WidgetConfigComponent } from '@home/components/widget/widget-config.component'; +import { DataKeyType } from '@shared/models/telemetry/telemetry.models'; +import { + getTimewindowConfig, + setTimewindowConfig +} from '@home/components/widget/config/timewindow-config-panel.component'; +import { formatValue, isDefined, isUndefined } from '@core/utils'; +import { + cssSizeToStrSize, + DateFormatProcessor, + DateFormatSettings, + resolveCssSize +} from '@shared/models/widget-settings.models'; +import { + CapacityUnits, + createShapeLayout, + levelCardDefaultSettings, + LevelCardLayout, + levelCardLayoutTranslations, + LevelCardWidgetSettings, + LiquidWidgetDataSourceType, + LiquidWidgetDataSourceTypeTranslations, + loadSvgShapesMapping, + optionsFilter, + Shapes, + ShapesTranslations, + updatedFormSettingsValidators +} from '@home/components/widget/lib/indicator/liquid-level-widget.models'; +import { UnitsType } from '@shared/models/unit.models'; +import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; +import { ImageCardsSelectComponent } from '@home/components/widget/lib/settings/common/image-cards-select.component'; +import { map, share, tap } from 'rxjs/operators'; +import { Observable, of, ReplaySubject } from 'rxjs'; +import { ResourcesService } from '@core/services/resources.service'; +import { UtilsService } from '@core/services/utils.service'; + +@Component({ + selector: 'liquid-level-card-basic-config', + templateUrl: './liquid-level-card-basic-config.component.html', + styleUrls: ['../basic-config.scss'] +}) +export class LiquidLevelCardBasicConfigComponent extends BasicWidgetConfigComponent { + + @ViewChild('layoutsImageCardsSelect', { static: false }) layoutsImageCardsSelect: ImageCardsSelectComponent; + + @ViewChild('shapesImageCardsSelect', { static: false }) shapesImageCardsSelect: ImageCardsSelectComponent; + + private get datasource(): Datasource { + if (this.widgetConfig.config.datasources && this.widgetConfig.config.datasources) { + return this.widgetConfig.config.datasources[0]; + } else { + return null; + } + } + + public get volumeInput(): boolean { + const datasourceUnits = this.levelCardWidgetConfigForm.get('datasourceUnits').value; + const layout: LevelCardLayout = this.levelCardWidgetConfigForm.get('layout').value; + + if (layout === LevelCardLayout.absolute) { + return true; + } + return datasourceUnits !== CapacityUnits.percent; + } + + public get displayTimewindowConfig(): boolean { + const datasources = this.levelCardWidgetConfigForm.get('datasources').value; + return datasourcesHasAggregation(datasources); + } + + public onlyHistoryTimewindow(): boolean { + const datasources = this.levelCardWidgetConfigForm.get('datasources').value; + return datasourcesHasOnlyComparisonAggregation(datasources); + } + + LevelCardLayout = LevelCardLayout; + LevelCardLayouts = Object.values(LevelCardLayout) as LevelCardLayout[]; + LevelCardLayoutTranslationMap = levelCardLayoutTranslations; + + DataSourceType = LiquidWidgetDataSourceType; + DataSourceTypes = Object.values(LiquidWidgetDataSourceType) as LiquidWidgetDataSourceType[]; + DataSourceTypeTranslations = LiquidWidgetDataSourceTypeTranslations; + + shapes = Object.values(Shapes) as Shapes[]; + shapesImageMap: Map = new Map(); + ShapesTranslationMap = ShapesTranslations; + + unitsType = UnitsType; + + levelCardWidgetConfigForm: FormGroup; + + valuePreviewFn = this._valuePreviewFn.bind(this); + + tooltipValuePreviewFn = this._tooltipValuePreviewFn.bind(this); + + totalVolumeValuePreviewFn = this._totalVolumeValuePreviewFn.bind(this); + + datePreviewFn = this._datePreviewFn.bind(this); + + private keySearchText: string; + private latestKeySearchTextResult: Array; + + private functionTypeKeys: Array = []; + + private lastKeysId: string; + private lastFetchedKeys: Array; + + constructor(protected store: Store, + protected widgetConfigComponent: WidgetConfigComponent, + private cd: ChangeDetectorRef, + private $injector: Injector, + private fb: FormBuilder, + private resourcesService: ResourcesService, + private sanitizer: DomSanitizer, + private utils: UtilsService) { + super(store, widgetConfigComponent); + } + + protected configForm(): FormGroup { + return this.levelCardWidgetConfigForm; + } + + protected setupConfig(widgetConfig: WidgetConfigComponentData) { + this.createSvgShapesMapping(); + + for (const type of this.utils.getPredefinedFunctionsList()) { + this.functionTypeKeys.push({ + name: type, + type: DataKeyType.function + }); + } + super.setupConfig(widgetConfig); + } + + protected setupDefaults(configData: WidgetConfigComponentData) { + this.setupDefaultDatasource(configData, [{ name: 'fuelLevel', label: 'Fuel Level', type: DataKeyType.timeseries }]); + } + + protected onConfigSet(configData: WidgetConfigComponentData) { + const settings: LevelCardWidgetSettings = {...levelCardDefaultSettings, ...(configData.config.settings || {})}; + const iconSize = resolveCssSize(configData.config.iconSize); + + this.levelCardWidgetConfigForm = this.fb.group({ + timewindowConfig: [getTimewindowConfig(configData.config), []], + datasources: [configData.config.datasources, []], + + layout: [settings.layout, []], + tankSelectionType: [settings.tankSelectionType, []], + selectedShape: [settings.selectedShape, [Validators.required]], + shapeAttributeName: [settings.shapeAttributeName, [Validators.required]], + tankColor: [settings.tankColor, []], + datasourceUnits: [settings.datasourceUnits, [Validators.required]], + + showTitle: [configData.config.showTitle, []], + title: [configData.config.title, []], + titleFont: [configData.config.titleFont, []], + titleColor: [configData.config.titleColor, []], + showTitleIcon: [configData.config.showTitleIcon, []], + iconSize: [iconSize[0], [Validators.min(0)]], + iconSizeUnit: [iconSize[1], []], + titleIcon: [configData.config.titleIcon, []], + iconColor: [configData.config.iconColor, []], + + volumeSource: [settings.volumeSource, []], + volumeConstant: [settings.volumeConstant, [Validators.required, Validators.min(0.1)]], + volumeAttributeName: [settings.volumeAttributeName, [Validators.required]], + volumeUnits: [settings.volumeUnits, [Validators.required]], + volumeFont: [settings.volumeFont, []], + volumeColor: [settings.volumeColor, []], + units: [settings.units, [Validators.required]], + widgetUnitsSource: [settings.widgetUnitsSource, [Validators.required]], + widgetUnitsAttributeName: [settings.widgetUnitsAttributeName, [Validators.required]], + decimals: [configData.config.decimals, []], + liquidColor: [settings.liquidColor, []], + valueFont: [settings.valueFont, []], + valueColor: [settings.valueColor, []], + + showTooltip: [settings.showTooltip, []], + showTooltipLevel: [settings.showTooltipLevel, []], + tooltipUnits: [settings.tooltipUnits, []], + tooltipLevelDecimals: [settings.tooltipLevelDecimals, []], + tooltipLevelFont: [settings.tooltipLevelFont, []], + tooltipLevelColor: [settings.tooltipLevelColor, []], + showTooltipDate: [settings.showTooltipDate, []], + tooltipDateFormat: [settings.tooltipDateFormat, []], + tooltipDateFont: [settings.tooltipDateFont, []], + tooltipDateColor: [settings.tooltipDateColor, []], + tooltipBackgroundColor: [settings.tooltipBackgroundColor, []], + tooltipBackgroundBlur: [settings.tooltipBackgroundBlur, []], + + background: [settings.background], + cardButtons: [this.getCardButtons(configData.config), []], + borderRadius: [configData.config.borderRadius, []], + + actions: [configData.config.actions || {}, []] + }); + + this.levelCardWidgetConfigForm.get('selectedShape').valueChanges.subscribe(() => { + this.cd.detectChanges(); + this.layoutsImageCardsSelect?.imageCardsSelectOptions.notifyOnChanges(); + }); + } + + protected prepareOutputConfig(config: any): WidgetConfigComponentData { + setTimewindowConfig(this.widgetConfig.config, config.timewindowConfig); + this.widgetConfig.config.datasources = config.datasources; + + this.widgetConfig.config.showTitle = config.showTitle; + this.widgetConfig.config.title = config.title; + this.widgetConfig.config.titleFont = config.titleFont; + this.widgetConfig.config.titleColor = config.titleColor; + + this.widgetConfig.config.showTitleIcon = config.showTitleIcon; + this.widgetConfig.config.iconSize = cssSizeToStrSize(config.iconSize, config.iconSizeUnit); + this.widgetConfig.config.titleIcon = config.titleIcon; + this.widgetConfig.config.iconColor = config.iconColor; + + this.widgetConfig.config.decimals = config.decimals; + + this.widgetConfig.config.settings = this.widgetConfig.config.settings || {}; + + this.widgetConfig.config.settings.layout = config.layout; + + this.widgetConfig.config.settings.tankSelectionType = config.tankSelectionType; + this.widgetConfig.config.settings.selectedShape = config.selectedShape; + this.widgetConfig.config.settings.shapeAttributeName = config.shapeAttributeName; + this.widgetConfig.config.settings.tankColor = config.tankColor; + this.widgetConfig.config.settings.datasourceUnits = config.datasourceUnits; + + this.widgetConfig.config.settings.volumeSource = config.volumeSource; + this.widgetConfig.config.settings.volumeConstant = config.volumeConstant; + this.widgetConfig.config.settings.volumeAttributeName = config.volumeAttributeName; + this.widgetConfig.config.settings.volumeUnits = config.volumeUnits; + this.widgetConfig.config.settings.volumeFont = config.volumeFont; + this.widgetConfig.config.settings.volumeColor = config.volumeColor; + this.widgetConfig.config.settings.units = config.units; + this.widgetConfig.config.settings.widgetUnitsSource = config.widgetUnitsSource; + this.widgetConfig.config.settings.widgetUnitsAttributeName = config.widgetUnitsAttributeName; + this.widgetConfig.config.settings.liquidColor = config.liquidColor; + this.widgetConfig.config.settings.valueFont = config.valueFont; + this.widgetConfig.config.settings.valueColor = config.valueColor; + + this.widgetConfig.config.settings.showTooltip = config.showTooltip; + this.widgetConfig.config.settings.showTooltipLevel = config.showTooltipLevel; + this.widgetConfig.config.settings.tooltipUnits = config.tooltipUnits; + this.widgetConfig.config.settings.tooltipLevelDecimals = config.tooltipLevelDecimals; + this.widgetConfig.config.settings.tooltipLevelFont = config.tooltipLevelFont; + this.widgetConfig.config.settings.tooltipLevelColor = config.tooltipLevelColor; + this.widgetConfig.config.settings.showTooltipDate = config.showTooltipDate; + this.widgetConfig.config.settings.tooltipDateFormat = config.tooltipDateFormat; + this.widgetConfig.config.settings.tooltipDateFont = config.tooltipDateFont; + this.widgetConfig.config.settings.tooltipDateColor = config.tooltipDateColor; + this.widgetConfig.config.settings.tooltipBackgroundColor = config.tooltipBackgroundColor; + this.widgetConfig.config.settings.tooltipBackgroundBlur = config.tooltipBackgroundBlur; + + this.widgetConfig.config.settings.background = config.background; + this.setCardButtons(config.cardButtons, this.widgetConfig.config); + this.widgetConfig.config.borderRadius = config.borderRadius; + + this.widgetConfig.config.actions = config.actions; + return this.widgetConfig; + } + + protected validatorTriggers(): string[] { + return [ + 'showTooltip', 'showTooltipLevel', 'tankSelectionType', 'datasourceUnits', 'showTitleIcon', 'volumeSource', + 'showTooltipDate', 'layout', 'showTitle', 'widgetUnitsSource' + ]; + } + + protected updateValidators(emitEvent: boolean, trigger?: string) { + updatedFormSettingsValidators(this.levelCardWidgetConfigForm); + + const showTitleIcon: boolean = this.levelCardWidgetConfigForm.get('showTitleIcon').value; + const showTitle: boolean = this.levelCardWidgetConfigForm.get('showTitle').value; + if (showTitle) { + this.levelCardWidgetConfigForm.get('title').enable({emitEvent: false}); + this.levelCardWidgetConfigForm.get('titleFont').enable({emitEvent: false}); + this.levelCardWidgetConfigForm.get('titleColor').enable({emitEvent: false}); + this.levelCardWidgetConfigForm.get('showTitleIcon').enable({emitEvent: false}); + if (showTitleIcon) { + this.levelCardWidgetConfigForm.get('titleIcon').enable({emitEvent: false}); + this.levelCardWidgetConfigForm.get('iconColor').enable({emitEvent: false}); + this.levelCardWidgetConfigForm.get('iconSize').enable({emitEvent: false}); + this.levelCardWidgetConfigForm.get('iconSizeUnit').enable({emitEvent: false}); + } else { + this.levelCardWidgetConfigForm.get('titleIcon').disable({emitEvent: false}); + this.levelCardWidgetConfigForm.get('iconColor').disable({emitEvent: false}); + this.levelCardWidgetConfigForm.get('iconSize').disable({emitEvent: false}); + this.levelCardWidgetConfigForm.get('iconSizeUnit').disable({emitEvent: false}); + } + } else { + this.levelCardWidgetConfigForm.get('title').disable({emitEvent: false}); + this.levelCardWidgetConfigForm.get('titleFont').disable({emitEvent: false}); + this.levelCardWidgetConfigForm.get('titleColor').disable({emitEvent: false}); + this.levelCardWidgetConfigForm.get('showTitleIcon').disable({emitEvent: false}); + this.levelCardWidgetConfigForm.get('titleIcon').disable({emitEvent: false}); + this.levelCardWidgetConfigForm.get('iconColor').disable({emitEvent: false}); + this.levelCardWidgetConfigForm.get('iconSize').disable({emitEvent: false}); + this.levelCardWidgetConfigForm.get('iconSizeUnit').disable({emitEvent: false}); + } + } + + private getCardButtons(config: WidgetConfig): string[] { + const buttons: string[] = []; + if (isUndefined(config.enableDataExport) || config.enableDataExport) { + buttons.push('dataExport'); + } + if (isUndefined(config.enableFullscreen) || config.enableFullscreen) { + buttons.push('fullscreen'); + } + return buttons; + } + + private setCardButtons(buttons: string[], config: WidgetConfig) { + config.enableDataExport = buttons.includes('dataExport'); + config.enableFullscreen = buttons.includes('fullscreen'); + } + + private _valuePreviewFn(): string { + const units: string = this.levelCardWidgetConfigForm.get('units').value; + const decimals: number = this.levelCardWidgetConfigForm.get('decimals').value; + return formatValue(22, decimals, units, true); + } + + private _tooltipValuePreviewFn() { + const units: string = this.levelCardWidgetConfigForm.get('tooltipUnits').value; + const decimals: number = this.levelCardWidgetConfigForm.get('tooltipLevelDecimals').value; + return formatValue(32, decimals, units, true); + } + + private _totalVolumeValuePreviewFn() { + const value = this.levelCardWidgetConfigForm.get('volumeConstant').value; + const datasourceUnits = this.levelCardWidgetConfigForm.get('datasourceUnits').value; + const decimals: number = this.widgetConfig.config.decimals; + let units: string = this.widgetConfig.config.units; + + if (datasourceUnits !== CapacityUnits.percent) { + units = datasourceUnits; + } + + return formatValue((isDefined(value) ? value : 500), decimals, units, true); + } + + private _datePreviewFn(): string { + const dateFormat: DateFormatSettings = this.levelCardWidgetConfigForm.get('tooltipDateFormat').value; + const processor = DateFormatProcessor.fromSettings(this.$injector, dateFormat); + processor.update(Date.now()); + return processor.formatted; + } + + private createSvgShapesMapping(): void { + loadSvgShapesMapping(this.resourcesService).subscribe(shapeMap => { + this.shapesImageMap = shapeMap; + + this.cd.detectChanges(); + this.layoutsImageCardsSelect?.imageCardsSelectOptions.notifyOnChanges(); + this.shapesImageCardsSelect?.imageCardsSelectOptions.notifyOnChanges(); + }); + } + + createShape(svg: string, layout: LevelCardLayout): SafeUrl { + return createShapeLayout(svg, layout, this.sanitizer); + } + + public fetchOptions(searchText: string): Observable> { + if (this.keySearchText !== searchText || !this.lastFetchedKeys) { + this.keySearchText = searchText; + const dataKeyFilter = optionsFilter(this.keySearchText); + return this.getKeys().pipe( + tap(res => this.lastFetchedKeys !== res ? this.lastFetchedKeys = res : []), + map(name => name?.filter(dataKeyFilter).map(key => key.name)), + tap(res => this.latestKeySearchTextResult = res) + ); + } + return of(this.latestKeySearchTextResult); + } + + private getKeys(): Observable> { + let fetchObservable: Observable>; + const callbacks = this.widgetConfigComponent.widgetConfigCallbacks; + if (this.datasource?.type === DatasourceType.function) { + fetchObservable = of(this.functionTypeKeys); + } else if (this.datasource?.type === DatasourceType.entity && this.datasource?.entityAliasId || + this.datasource?.type === DatasourceType.device && this.datasource?.deviceId) { + if (this.datasource?.type === DatasourceType.device) { + if (this.lastKeysId !== this.datasource?.deviceId || !this.lastFetchedKeys) { + this.lastKeysId = this.datasource.deviceId; + fetchObservable = callbacks.fetchEntityKeysForDevice(this.datasource?.deviceId, [DataKeyType.attribute]); + } else { + fetchObservable = of(this.lastFetchedKeys); + } + } else { + if (this.lastKeysId !== this.datasource?.entityAliasId || !this.lastFetchedKeys) { + this.lastKeysId = this.datasource.entityAliasId; + fetchObservable = callbacks.fetchEntityKeys(this.datasource?.entityAliasId, [DataKeyType.attribute]); + } else { + fetchObservable = of(this.lastFetchedKeys); + } + } + } else { + this.lastKeysId = null; + fetchObservable = of([]); + } + return fetchObservable.pipe( + share({ + connector: () => new ReplaySubject(1), + resetOnError: false, + resetOnComplete: false, + resetOnRefCountZero: false + }) + ); + } +} diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/indicator/liquid-level-widget.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/indicator/liquid-level-widget.component.html new file mode 100644 index 0000000000..4c14686b9c --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/lib/indicator/liquid-level-widget.component.html @@ -0,0 +1,29 @@ + +
+
+ +
+
+
+
+ {{ error }} +
+
+
+
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/indicator/liquid-level-widget.component.scss b/ui-ngx/src/app/modules/home/components/widget/lib/indicator/liquid-level-widget.component.scss new file mode 100644 index 0000000000..046d1a7d3e --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/lib/indicator/liquid-level-widget.component.scss @@ -0,0 +1,72 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +.tb-liquid-level-panel { + width: 100%; + height: 100%; + position: relative; + display: flex; + flex-direction: column; + gap: 16px; + padding: 20px 24px 24px 24px; + &.tb-liquid-level-pointer { + cursor: pointer; + } + > div:not(.tb-liquid-level-overlay) { + z-index: 1; + } + .tb-liquid-level-overlay { + position: absolute; + top: 12px; + left: 12px; + bottom: 12px; + right: 12px; + } + div.tb-widget-title { + padding: 0; + } + .tb-liquid-level-content { + min-height: 0; + flex: 1; + display: flex; + justify-content: center; + } + .tb-liquid-level-error { + position: absolute; + display: flex; + inset: 0; + width: 100%; + height: 100%; + align-items: center; + justify-content: center; + + &-container { + border-radius: 4px; + margin: 16px; + padding: 8px 12px; + background: #848484; + display: flex; + flex-direction: column; + gap: 8px; + + & > * { + font-weight: 500; + letter-spacing: .25px; + text-align: center; + color: #fff; + } + } + } +} diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/indicator/liquid-level-widget.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/indicator/liquid-level-widget.component.ts new file mode 100644 index 0000000000..9bb7053c3e --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/lib/indicator/liquid-level-widget.component.ts @@ -0,0 +1,575 @@ +/// +/// Copyright © 2016-2023 The Thingsboard Authors +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. +/// + +import { + ChangeDetectorRef, + Component, + ElementRef, + Input, + OnInit, + TemplateRef, + ViewChild, + ViewEncapsulation +} from '@angular/core'; +import { WidgetContext } from '@home/models/widget-component.models'; +import { isDefined, isDefinedAndNotNull, isEmptyStr, isNotEmptyStr, isNumeric, isUndefinedOrNull } from '@core/utils'; +import { + CapacityUnits, + ConversionType, + convertLiters, + createAbsoluteLayout, + createPercentLayout, + extractValue, + levelCardDefaultSettings, + LevelCardLayout, + LevelCardWidgetSettings, + LiquidWidgetDataSourceType, + Shapes, + SvgInfo, + SvgLimits, + svgMapping +} from '@home/components/widget/lib/indicator/liquid-level-widget.models'; +import { forkJoin, Observable, of } from 'rxjs'; +import { map, switchMap } from 'rxjs/operators'; +import { EntityId } from '@shared/models/id/entity-id'; +import { + backgroundStyle, + ColorProcessor, + ComponentStyle, + cssTextFromInlineStyle, + DateFormatProcessor, + inlineTextStyle, + overlayStyle +} from '@shared/models/widget-settings.models'; +import { ResourcesService } from '@core/services/resources.service'; +import { NULL_UUID } from '@shared/models/id/has-uuid'; +import { TranslateService } from '@ngx-translate/core'; +import ITooltipsterInstance = JQueryTooltipster.ITooltipsterInstance; + +@Component({ + selector: 'tb-liquid-level-widget', + templateUrl: './liquid-level-widget.component.html', + styleUrls: ['./liquid-level-widget.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class LiquidLevelWidgetComponent implements OnInit { + + @ViewChild('liquidLevelContent', {static: true}) + liquidLevelContent: ElementRef; + + @Input() + ctx: WidgetContext; + + @Input() + widgetTitlePanel: TemplateRef; + + backgroundStyle: ComponentStyle = {}; + overlayStyle: ComponentStyle = {}; + + hasCardClickAction = false; + + errorsMsg: string[] = []; + + private svgParams: SvgInfo; + + private svg: JQuery; + private tooltip: ITooltipsterInstance; + private overlayContainer: JQuery; + private shape: Shapes; + + private settings: LevelCardWidgetSettings; + + private tankColor: ColorProcessor; + private valueColor: ColorProcessor; + private liquidColor: ColorProcessor; + private backgroundOverlayColor: ColorProcessor; + private tooltipLevelColor: ColorProcessor; + + private tooltipDateFormat: DateFormatProcessor; + + private volume: number; + private tooltipContent: string; + private widgetUnits: string; + + private capacityUnits = Object.values(CapacityUnits); + + constructor(private cd: ChangeDetectorRef, + private resourcesService: ResourcesService, + private translate: TranslateService) { + } + + ngOnInit(): void { + this.ctx.$scope.liquidLevelWidget = this; + this.settings = {...levelCardDefaultSettings, ...this.ctx.settings}; + this.declareStyles(); + + this.backgroundStyle = backgroundStyle(this.settings.background); + this.overlayStyle = overlayStyle(this.settings.background.overlay); + + this.hasCardClickAction = this.ctx.actionsApi.getActionDescriptors('cardClick').length > 0; + + this.getData().subscribe(data => { + if (data) { + const { svg, volume, units } = data; + if (svg && isNotEmptyStr(svg) && this.liquidLevelContent.nativeElement) { + const jQueryContainerElement = $(this.liquidLevelContent.nativeElement); + jQueryContainerElement.html(svg); + this.svg = jQueryContainerElement.find('svg'); + this.createSVG(); + this.createValueElement(); + + if (this.settings.showTooltip && (this.settings.showTooltipLevel || this.settings.showTooltipDate)) { + this.createTooltip(); + } + } + + if (isDefined(volume) && !isNaN(Number(volume))) { + this.volume = Number(volume); + } + + if (units) { + this.widgetUnits = units; + } + + this.update(true); + } + }); + } + + private declareStyles(): void { + this.tankColor = ColorProcessor.fromSettings(this.settings.tankColor); + this.valueColor = ColorProcessor.fromSettings(this.settings.valueColor); + this.liquidColor = ColorProcessor.fromSettings(this.settings.liquidColor); + this.backgroundOverlayColor = ColorProcessor.fromSettings(this.settings.backgroundOverlayColor); + this.tooltipLevelColor = ColorProcessor.fromSettings(this.settings.tooltipLevelColor); + + this.tooltipDateFormat = DateFormatProcessor.fromSettings(this.ctx.$injector, this.settings.tooltipDateFormat); + } + + private getData(): Observable<{ svg: string; volume: number; units: string }> { + const entityId: EntityId = { + entityType: this.ctx.datasources[0].entityType, + id: this.ctx.datasources[0].entityId + }; + + return this.getShape(entityId).pipe( + switchMap(shape => { + this.shape = shape; + this.svgParams = svgMapping.get(shape); + if (this.svgParams) { + return forkJoin([ + this.resourcesService.loadJsonResource(this.svgParams.svg), + this.getTankersParams(entityId) + ]).pipe( + map(params => ({svg: params[0], ...params[1]})) + ); + } + return of(null); + }) + ); + } + + public onInit() { + const borderRadius = this.ctx.$widgetElement.css('borderRadius'); + this.overlayStyle = {...this.overlayStyle, ...{borderRadius}}; + this.cd.detectChanges(); + } + + public update(ignoreAnimation?: boolean) { + if (this.svg) { + this.updateData(ignoreAnimation); + } + } + + public destroy() { + + } + + private createSVG() { + if (this.svg) { + this.svg.css('display', 'block') + .css('overflow', 'hidden') + .css('width', '100%') + .css('height', '100%'); + } + } + + private updateData(ignoreAnimation?: boolean) { + const data = this.ctx.data[0]?.data[0]; + if (data && isDefinedAndNotNull(data[1])) { + const percentage = isNumeric(data[1]) ? this.convertInputData(data[1]) : 0; + this.updateSvg(percentage, ignoreAnimation); + this.updateValueElement(data[1], percentage); + + if (this.settings.showTooltip && (this.settings.showTooltipLevel || this.settings.showTooltipDate)) { + this.updateTooltip(data); + } + } + } + + private createTooltip(): void { + this.tooltipContent = this.getTooltipContent(); + + import('tooltipster').then(() => { + if ($.tooltipster && this.tooltip) { + this.tooltip.destroy(); + this.tooltip = null; + } + this.tooltip = this.svg.tooltipster({ + contentAsHTML: true, + theme: 'tooltipster-shadow', + side: 'top', + delay: 10, + distance: this.settings.showTitle ? -33 : -63, + triggerClose: { + click: true, + tap: true, + scroll: true, + mouseleave: true + }, + animation: 'grow', + updateAnimation: null, + trackOrigin: true, + functionBefore: (instance, helper) => { + instance.content(this.tooltipContent); + }, + functionReady: (instance, helper) => { + const tooltipsterBoxStyles: JQuery.PlainObject = { + backgroundColor: this.settings.tooltipBackgroundColor, + backdropFilter: `blur(${this.settings.tooltipBackgroundBlur}px)`, + width: '100%', + height: '100%' + }; + + $(helper.tooltip).css('max-width', this.svg.width() + 'px'); + $(helper.tooltip).css('max-height', this.svg.height() + 'px'); + $(helper.tooltip).find('.tooltipster-box').css(tooltipsterBoxStyles); + $(helper.tooltip).find('.tooltipster-arrow').empty(); + + instance.reposition(); + } + }).tooltipster('instance'); + }); + } + + private createValueElement(): void { + const jQueryContainerElement = $(this.liquidLevelContent.nativeElement); + const containerOverlay = jQueryContainerElement.find('.container-overlay'); + const percentageOverlay = jQueryContainerElement.find('.percentage-overlay'); + const absoluteOverlay = jQueryContainerElement.find('.absolute-overlay'); + + if (this.settings.layout === LevelCardLayout.absolute && !this.errorsMsg.length) { + this.overlayContainer = absoluteOverlay; + percentageOverlay.css('visibility', 'hidden'); + if (!this.settings.showBackgroundOverlay) { + absoluteOverlay.css('visibility', 'hidden'); + } + } else if (this.settings.layout === LevelCardLayout.percentage && !this.errorsMsg.length) { + this.overlayContainer = percentageOverlay; + absoluteOverlay.css('visibility', 'hidden'); + if (!this.settings.showBackgroundOverlay) { + percentageOverlay.css('visibility', 'hidden'); + } + } else { + containerOverlay.css('visibility', 'hidden'); + } + + if (this.overlayContainer) { + this.overlayContainer.attr('fill', this.backgroundOverlayColor.color); + this.overlayContainer.removeAttr('fill-opacity'); + } + } + + private getShape(entityId: EntityId): Observable { + if (this.settings.tankSelectionType === LiquidWidgetDataSourceType.attribute && entityId.id !== NULL_UUID) { + return this.ctx.attributeService.getEntityAttributes(entityId, null, [this.settings.shapeAttributeName]) + .pipe(map(attributes => { + const shape = extractValue(attributes, this.settings.shapeAttributeName); + if (!shape || !svgMapping.has(shape)) { + this.createdErrorMgs(this.settings.shapeAttributeName, isUndefinedOrNull(shape) || isEmptyStr(shape)); + return this.settings.selectedShape; + } + return shape; + } + )); + } + return of(this.settings.selectedShape); + } + + private getTankersParams(entityId: EntityId): Observable<{ volume: number; units: string }> { + const isVolumeStatic = this.settings.layout !== LevelCardLayout.absolute + && this.settings.datasourceUnits === CapacityUnits.percent + || this.settings.volumeSource === LiquidWidgetDataSourceType.static; + const isUnitStatic = this.settings.layout !== LevelCardLayout.absolute || + this.settings.widgetUnitsSource === LiquidWidgetDataSourceType.static; + + const attributeKeys: string[] = []; + + if (!isVolumeStatic) { + attributeKeys.push(this.settings.volumeAttributeName); + } + + if (!isUnitStatic) { + attributeKeys.push(this.settings.widgetUnitsAttributeName); + } + + if (!attributeKeys.length || entityId.id === NULL_UUID) { + return of({ + volume: this.settings.volumeConstant, + units: this.settings.units + }); + } + + return this.ctx.attributeService.getEntityAttributes(entityId, null, attributeKeys).pipe( + map(attributes => { + let volume = isVolumeStatic ? this.settings.volumeConstant : extractValue(attributes, this.settings.volumeAttributeName); + let units = isUnitStatic ? this.settings.units : extractValue(attributes, this.settings.widgetUnitsAttributeName); + + if (!isVolumeStatic && (!volume || !isNumeric(volume) || volume < 0.1)) { + this.createdErrorMgs(this.settings.volumeAttributeName, isUndefinedOrNull(volume) || isEmptyStr(volume)); + volume = this.settings.volumeConstant; + } + + if (!isUnitStatic) { + if (isNotEmptyStr(units)) { + const normalizeUnits = units.normalize().trim(); + units = this.capacityUnits.find(unit => unit.normalize() === normalizeUnits); + } + if (isUndefinedOrNull(units) || !isNotEmptyStr(units)) { + this.createdErrorMgs(this.settings.widgetUnitsAttributeName, isUndefinedOrNull(units) || isEmptyStr(units)); + units = this.settings.units; + } + } + + return { + volume, + units + }; + }) + ); + } + + private createdErrorMgs(attributeName: string, isEmpty = false) { + if (isEmpty) { + this.errorsMsg.push(this.translate.instant('widgets.liquid-level-card.attribute-key-not-set', {attributeName})); + } else { + this.errorsMsg.push(this.translate.instant('widgets.liquid-level-card.attribute-key-invalid', {attributeName})); + } + this.cd.markForCheck(); + } + + private updateSvg(percentage: number, ignoreAnimation?: boolean) { + const yLimits: SvgLimits = { + min: this.svgParams.limits.min, + max: this.svgParams.limits.max + }; + + const newYPos = this.calculatePosition(percentage, yLimits); + this.updateShapeColor(percentage); + this.updateLevel(newYPos, percentage, ignoreAnimation); + } + + private calculatePosition(percentage: number, limits: SvgLimits): number { + if (percentage >= 100) { + return limits.max; + } if (percentage <= 0) { + return limits.min; + } + return limits.min + (percentage / 100) * (limits.max - limits.min); + } + + private updateTooltip(value: [number, any]): void { + this.tooltipContent = this.getTooltipContent(value); + + if (this.tooltip) { + this.tooltip.content(this.tooltipContent); + } + } + + private updateLevel(newY: number, percentage: number, ignoreAnimation = false): void { + this.liquidColor.update(percentage); + const jQueryContainerElement = $(this.liquidLevelContent.nativeElement); + const fill = jQueryContainerElement.find('.tb-liquid-fill'); + const surfaces = jQueryContainerElement.find('.tb-liquid-surface'); + const surfacePositionAttr = this.shape !== Shapes.vCylinder ? 'y' : 'cy'; + const animationSpeed = 500; + + const levelColor = this.errorsMsg.length ? 'transparent' : this.liquidColor.color; + + if (ignoreAnimation) { + fill.css({y : newY}); + } else { + fill.animate({y : newY}, animationSpeed); + } + fill.attr('fill', levelColor); + + surfaces.each((index, element) => { + const $element = $(element); + if (ignoreAnimation) { + $element.css({[surfacePositionAttr]: newY}); + } else { + $element.animate({[surfacePositionAttr]: newY}, animationSpeed); + } + if ($element.hasClass('tb-liquid')) { + $element.attr('fill', levelColor); + } + }); + } + + private updateShapeColor(value: number): void { + const jQueryContainerElement = $(this.liquidLevelContent.nativeElement); + const shapeStrokes = jQueryContainerElement.find('.tb-shape-stroke'); + const shapeFill = jQueryContainerElement.find('.tb-shape-fill'); + this.tankColor.update(value); + + const shapeColor = this.errorsMsg.length ? '#CACACA' : this.tankColor.color; + + shapeStrokes.each((index, element) => { + $(element).attr('stroke', shapeColor); + }); + + shapeFill.each((index, element) => { + $(element).attr('fill', shapeColor); + }); + } + + private updateValueElement(data: any, percentage: number): void { + let content: string; + let container: JQuery; + const jQueryContainerElement = $(this.liquidLevelContent.nativeElement); + let value = 'N/A'; + + if (isNumeric(data)) { + value = convertLiters(this.convertOutputData(percentage), this.widgetUnits as CapacityUnits, ConversionType.from) + .toFixed(this.settings.decimals || 0); + } + this.valueColor.update(value); + const valueTextStyle = cssTextFromInlineStyle({...inlineTextStyle(this.settings.valueFont), + color: this.valueColor.color}); + this.backgroundOverlayColor.update(percentage); + if (this.overlayContainer) { + this.overlayContainer.attr('fill', this.backgroundOverlayColor.color); + } + + if (this.settings.layout === LevelCardLayout.absolute) { + const volumeInLiters: number = convertLiters(this.volume, this.settings.volumeUnits as CapacityUnits, ConversionType.to); + const volume = convertLiters(volumeInLiters, this.widgetUnits as CapacityUnits, ConversionType.from) + .toFixed(this.settings.decimals || 0); + + const volumeTextStyle = cssTextFromInlineStyle({...inlineTextStyle(this.settings.volumeFont), + color: this.settings.volumeColor}); + + container = jQueryContainerElement.find('.absolute-value-container'); + content = createAbsoluteLayout({inputValue: value, volume}, + {valueStyle: valueTextStyle, volumeStyle: volumeTextStyle}, this.widgetUnits); + + } else if (this.settings.layout === LevelCardLayout.percentage) { + container = jQueryContainerElement.find('.percentage-value-container'); + content = createPercentLayout(value, valueTextStyle); + } + + if (content && container) { + container.html(content); + } + } + + private getTooltipContent(value?: [number, any]): string { + const contentValue = value || [0, '']; + let tooltipValue: string | number = 'N/A'; + + if (isNumeric(contentValue[1])) { + tooltipValue = this.convertTooltipData(contentValue[1]); + } + + this.tooltipLevelColor.update(tooltipValue); + this.tooltipDateFormat.update(contentValue[0]); + + const levelTextStyle = cssTextFromInlineStyle({...inlineTextStyle(this.settings.tooltipLevelFont), + color: this.tooltipLevelColor.color}); + + const dateTextStyle = cssTextFromInlineStyle({...inlineTextStyle(this.settings.tooltipDateFont), + color: this.settings.tooltipDateColor, overflow: 'hidden', 'text-overflow': 'ellipsis', 'white-space': 'nowrap'}); + + let content = `
`; + + if (this.settings.showTooltipLevel) { + const levelValue = typeof tooltipValue == 'number' + ? `${tooltipValue.toFixed(this.settings.tooltipLevelDecimals)} ${this.settings.tooltipUnits}` + : 'N/A'; + content += this.createTooltipContent( + this.ctx.translate.instant('widgets.liquid-level-card.level'), + levelValue, + levelTextStyle + ); + } + + if (this.settings.showTooltipDate) { + content += this.createTooltipContent( + this.ctx.translate.instant('widgets.liquid-level-card.last-update'), + this.tooltipDateFormat.formatted, + dateTextStyle + ); + } + + content += '
'; + + return content; + } + + private createTooltipContent(labelText: string, contentValue: string, textStyle: string): string { + return `
+ + +
`; + } + + private convertInputData(value: number): number { + if (this.settings.datasourceUnits !== CapacityUnits.percent) { + return (convertLiters(value, this.settings.datasourceUnits, ConversionType.to) / + convertLiters(this.volume, this.settings.volumeUnits, ConversionType.to)) * 100; + } + + return value; + } + + private convertOutputData(value: number): number { + if (this.widgetUnits !== CapacityUnits.percent) { + return convertLiters(this.volume * (value / 100), this.settings.volumeUnits, ConversionType.to); + } + + return value; + } + + private convertTooltipData(value: number): number { + const percentage = this.convertInputData(value); + if (this.settings.tooltipUnits !== CapacityUnits.percent) { + const liters = this.convertOutputData(percentage); + + return convertLiters(liters, this.settings.tooltipUnits, ConversionType.from); + } else { + return percentage; + } + } + + public cardClick($event: Event) { + this.ctx.actionsApi.cardClick($event); + } +} diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/indicator/liquid-level-widget.models.ts b/ui-ngx/src/app/modules/home/components/widget/lib/indicator/liquid-level-widget.models.ts new file mode 100644 index 0000000000..cf526d6c97 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/lib/indicator/liquid-level-widget.models.ts @@ -0,0 +1,623 @@ +/// +/// Copyright © 2016-2023 The Thingsboard Authors +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. +/// + +import { + BackgroundSettings, + BackgroundType, + ColorSettings, + constantColor, + cssTextFromInlineStyle, + DateFormatSettings, + Font, + lastUpdateAgoDateFormat +} from '@shared/models/widget-settings.models'; +import { DataKey, WidgetConfig } from '@shared/models/widget.models'; +import { AttributeData, DataKeyType } from '@shared/models/telemetry/telemetry.models'; +import { forkJoin, Observable, of } from 'rxjs'; +import { singleEntityFilterFromDeviceId } from '@shared/models/query/query.models'; +import { EntityType } from '@shared/models/entity-type.models'; +import { catchError, map, mergeMap } from 'rxjs/operators'; +import { EntityService } from '@core/http/entity.service'; +import { IAliasController } from '@core/api/widget-api.models'; +import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; +import { ResourcesService } from '@core/services/resources.service'; +import { FormGroup } from '@angular/forms'; + +export interface SvgInfo { + svg: string; + limits: SvgLimits; +} + +export interface SvgLimits { + min: number; + max: number; +} + +export interface LevelCardWidgetSettings extends WidgetConfig { + tankSelectionType: LiquidWidgetDataSourceType; + selectedShape: Shapes; + shapeAttributeName: string; + tankColor: ColorSettings; + datasourceUnits: CapacityUnits; + layout: LevelCardLayout; + volumeSource: LiquidWidgetDataSourceType; + volumeConstant: number; + volumeAttributeName: string; + volumeUnits: CapacityUnits; + volumeFont: Font; + volumeColor: string; + liquidColor: ColorSettings; + valueFont: Font; + widgetUnitsSource: LiquidWidgetDataSourceType; + widgetUnitsAttributeName: string; + valueColor: ColorSettings; + showBackgroundOverlay: boolean; + backgroundOverlayColor: ColorSettings; + showTooltip: boolean; + showTooltipLevel: boolean; + tooltipUnits: CapacityUnits; + tooltipLevelDecimals: number; + tooltipLevelFont: Font; + tooltipLevelColor: ColorSettings; + showTooltipDate: boolean; + tooltipDateFormat: DateFormatSettings; + tooltipDateFont: Font; + tooltipDateColor: string; + tooltipBackgroundColor: string; + tooltipBackgroundBlur: number; + background: BackgroundSettings; +} + +export enum Shapes { + vOval = 'Vertical Oval', + vCylinder = 'Vertical Cylinder', + vCapsule = 'Vertical Capsule', + rectangle = 'Rectangle', + hOval = 'Horizontal Oval', + hEllipse = 'Horizontal Ellipse', + hDishEnds = 'Horizontal Dish Ends', + hCylinder = 'Horizontal Cylinder', + hCapsule = 'Horizontal Capsule', + hElliptical_2_1 = 'Horizontal 2:1 Elliptical' +} + +export enum CapacityUnits { + percent = '%', + liters = 'L', + cubicMillimeter = 'mm³', + cubicCentimeter = 'cm³', + cubicMeter = 'm³', + cubicKilometer = 'km³', + milliliter = 'mL', + hectoliter = 'hl', + cubicInch = 'in³', + cubicFoot = 'ft³', + cubicYard = 'yd³', + fluidOunce = 'fl-oz', + pint = 'pt', + quart = 'qt', + gallon = 'gal', + oilBarrels = 'bbl' +} + +export enum LevelCardLayout { + simple = 'simple', + percentage = 'percentage', + absolute = 'absolute' +} + +export enum LiquidWidgetDataSourceType { + static = 'static', + attribute = 'attribute' +} + +export enum ConversionType { + to = 'to', + from = 'from', +} + +export const svgMapping = new Map( + [ + [ + Shapes.vOval, + { + svg: 'assets/widget/liquid-level/shapes/vertical-oval.svg', + limits: { min: 171, max: 51 } + } + ], + [ + Shapes.vCylinder, + { + svg: 'assets/widget/liquid-level/shapes/vertical-cylinder.svg', + limits: { min: 161, max: 55 } + } + ], + [ + Shapes.vCapsule, + { + svg: 'assets/widget/liquid-level/shapes/vertical-capsule.svg', + limits: { min: 197, max: 25 } + } + ], + [ + Shapes.rectangle, + { + svg: 'assets/widget/liquid-level/shapes/rectangle.svg', + limits: { min: 169, max: 52 } + } + ], + [ + Shapes.hOval, + { + svg: 'assets/widget/liquid-level/shapes/horizontal-oval.svg', + limits: { min: 160, max: 63 } + } + ], + [ + Shapes.hEllipse, + { + svg: 'assets/widget/liquid-level/shapes/horizontal-ellipse.svg', + limits: { min: 160, max: 64 } + } + ], + [ + Shapes.hDishEnds, + { + svg: 'assets/widget/liquid-level/shapes/horizontal-dish-ends.svg', + limits: { min: 173, max: 50 } + } + ], + [ + Shapes.hCylinder, + { + svg: 'assets/widget/liquid-level/shapes/horizontal-cylinder.svg', + limits: { min: 165, max: 56 } + } + ], + [ + Shapes.hCapsule, + { + svg: 'assets/widget/liquid-level/shapes/horizontal-capsule.svg', + limits: { min: 171, max: 52 } + } + ], + [ + Shapes.hElliptical_2_1, + { + svg: 'assets/widget/liquid-level/shapes/horizontal-2_1-elliptical.svg', + limits: { min: 173, max: 50 } + } + ] + ] +); + +export const levelCardLayoutTranslations = new Map( + [ + [LevelCardLayout.simple, 'widgets.liquid-level-card.layout-simple'], + [LevelCardLayout.percentage, 'widgets.liquid-level-card.layout-percentage'], + [LevelCardLayout.absolute, 'widgets.liquid-level-card.layout-absolute'] + ] +); + +export const LiquidWidgetDataSourceTypeTranslations = new Map( + [ + [LiquidWidgetDataSourceType.static, 'widgets.liquid-level-card.static'], + [LiquidWidgetDataSourceType.attribute, 'widgets.liquid-level-card.attribute'] + ] +); + +export const ShapesTranslations = new Map( + [ + [Shapes.vOval, 'widgets.liquid-level-card.v-oval'], + [Shapes.vCylinder, 'widgets.liquid-level-card.v-cylinder'], + [Shapes.vCapsule, 'widgets.liquid-level-card.v-capsule'], + [Shapes.rectangle, 'widgets.liquid-level-card.rectangle'], + [Shapes.hOval, 'widgets.liquid-level-card.h-oval'], + [Shapes.hEllipse, 'widgets.liquid-level-card.h-ellipse'], + [Shapes.hDishEnds, 'widgets.liquid-level-card.h-dish-ends'], + [Shapes.hCylinder, 'widgets.liquid-level-card.h-cylinder'], + [Shapes.hCapsule, 'widgets.liquid-level-card.h-capsule'], + [Shapes.hElliptical_2_1, 'widgets.liquid-level-card.h-elliptical_2_1'] + ] +); + +export const levelCardDefaultSettings: LevelCardWidgetSettings = { + tankSelectionType: LiquidWidgetDataSourceType.static, + selectedShape: Shapes.vCylinder, + shapeAttributeName: 'tankShape', + tankColor: constantColor('#242770'), + datasourceUnits: CapacityUnits.percent, + layout: LevelCardLayout.percentage, + showTitle: false, + title: 'Liquid level', + titleFont: { + family: 'Roboto', + size: 16, + sizeUnit: 'px', + style: 'normal', + weight: '500', + lineHeight: '1.5' + }, + titleColor: 'rgba(0, 0, 0, 0.87)', + showTitleIcon: false, + titleIcon: 'water_drop', + iconColor: '#5469FF', + volumeSource: LiquidWidgetDataSourceType.static, + volumeConstant: 500, + volumeUnits: CapacityUnits.liters, + volumeAttributeName: 'volume', + volumeFont: { + family: 'Roboto', + size: 14, + sizeUnit: 'px', + style: 'normal', + weight: '500', + lineHeight: '100%' + }, + volumeColor: 'rgba(0, 0, 0, 0.18)', + units: CapacityUnits.percent as string, + widgetUnitsSource: LiquidWidgetDataSourceType.static, + widgetUnitsAttributeName: 'units', + decimals: 0, + liquidColor: constantColor('#7A8BFF'), + valueFont: { + family: 'Roboto', + size: 24, + sizeUnit: 'px', + style: 'normal', + weight: '500', + lineHeight: '100%' + }, + valueColor: constantColor('rgba(0, 0, 0, 0.87)'), + showBackgroundOverlay: true, + backgroundOverlayColor: constantColor('rgba(255, 255, 255, 0.76)'), + showTooltip: true, + showTooltipLevel: true, + tooltipUnits: CapacityUnits.percent, + tooltipLevelDecimals: 0, + tooltipLevelFont: { + family: 'Roboto', + size: 13, + sizeUnit: 'px', + style: 'normal', + weight: '500', + lineHeight: '100%' + }, + tooltipLevelColor: constantColor('rgba(0, 0, 0, 0.76)'), + showTooltipDate: true, + tooltipDateFormat: lastUpdateAgoDateFormat(), + tooltipDateFont: { + family: 'Roboto', + size: 13, + sizeUnit: 'px', + style: 'normal', + weight: '500', + lineHeight: '100%' + }, + tooltipDateColor: 'rgba(0, 0, 0, 0.76)', + tooltipBackgroundColor: 'rgba(255, 255, 255, 0.76)', + tooltipBackgroundBlur: 3, + background: { + type: BackgroundType.color, + color: '#fff', + overlay: { + enabled: false, + color: 'rgba(255,255,255,0.72)', + blur: 3 + } + } +}; + +export const convertLiters = (value: number, units: CapacityUnits, conversionType: ConversionType): number => { + let factor: number; + + switch (units) { + case CapacityUnits.liters: + return value; + case CapacityUnits.cubicMillimeter: + factor = 1e6; + break; + case CapacityUnits.cubicCentimeter: + case CapacityUnits.milliliter: + factor = 1e3; + break; + case CapacityUnits.cubicMeter: + factor = 1e-3; + break; + case CapacityUnits.cubicKilometer: + factor = 1e-15; + break; + case CapacityUnits.hectoliter: + factor = 0.01; + break; + case CapacityUnits.cubicInch: + factor = 61.0237; + break; + case CapacityUnits.cubicFoot: + factor = 1 / 28.3168; + break; + case CapacityUnits.cubicYard: + factor = 1 / 764.555; + break; + case CapacityUnits.fluidOunce: + factor = 33.814; + break; + case CapacityUnits.pint: + factor = 1 / 0.473176; + break; + case CapacityUnits.quart: + factor = 1 / 0.946353; + break; + case CapacityUnits.gallon: + factor = 1 / 3.78541; + break; + case CapacityUnits.oilBarrels: + factor = 1 / 158.987; + break; + default: + return value; + // throw new Error(`Unknown unit: ${units}`); + } + + return conversionType === ConversionType.to ? value / factor : value * factor; +}; + +export const extractValue = (attributes: Array, attributeName: string): T | undefined => { + return attributes.find(attr => attr.key === attributeName)?.value; +}; + +export const valueContainerStyleDefaults = cssTextFromInlineStyle({ + width: '100%', + height: '100%', + display: 'flex', + gap: '8px', + 'text-align': 'center', + 'align-items': 'center', + 'align-content': 'center', + 'justify-content': 'center', + 'font-family': 'Roboto, Helvetica Neue, sans-serif' +}); + +export const valueTextStyleDefaults = 'letter-spacing: normal; font-style: normal; font-weight: 500; line-height: 100%;' + + ' font-size: 24px; font-family: Roboto, Helvetica Neue, sans-serif; color: #000000DE'; + +export const volumeTextStyleDefaults = 'letter-spacing: normal; font-style: normal; font-weight: 500;' + + ' line-height: 100%; font-size: 14px; font-family: Roboto, Helvetica Neue, sans-serif; color: rgba(0, 0, 0, 0.18)'; + +export const createAbsoluteLayout = (values?: {inputValue: number | string; volume: number | string}, + styles?: {valueStyle: string; volumeStyle: string}, + units?: string): string => { + const inputValue = values?.inputValue ? values?.inputValue : 500; + const valueTextStyle = styles?.valueStyle ? styles?.valueStyle : valueTextStyleDefaults; + const volume = values?.volume ? values?.volume : 1000; + const volumeTextStyle = styles?.volumeStyle ? styles?.volumeStyle : volumeTextStyleDefaults; + const displayUnits = units ? units : CapacityUnits.liters; + + return `
+
+ +
+ +
+ +
`; +}; + +export const createPercentLayout = (value: number | string = 50, valueTextStyle: string = valueTextStyleDefaults): string => + `
+ +
`; + +export const optionsFilter = (searchText: string): ((key: DataKey) => boolean) => + key => key?.name.toUpperCase().includes(searchText?.toUpperCase()); + +export const fetchEntityKeysForDevice = (deviceId: string, dataKeyTypes: Array, + entityService: EntityService): Observable> => { + const entityFilter = singleEntityFilterFromDeviceId(deviceId); + return entityService.getEntityKeysByEntityFilter( + entityFilter, + dataKeyTypes, [EntityType.DEVICE], + {ignoreLoading: true, ignoreErrors: true} + ).pipe( + catchError(() => of([])) + ); +}; + +export const fetchEntityKeys = (entityAliasId: string, dataKeyTypes: Array, + entityService: EntityService, aliasController: IAliasController): Observable> => + aliasController.getAliasInfo(entityAliasId).pipe( + mergeMap((aliasInfo) => entityService.getEntityKeysByEntityFilter( + aliasInfo.entityFilter, + dataKeyTypes, [], + {ignoreLoading: true, ignoreErrors: true} + )), + catchError(() => of([] as Array)) + ); + + +export const createShapeLayout = (svg: string, layout: LevelCardLayout, sanitizer: DomSanitizer): SafeUrl => { + if (svg && layout) { + const parser = new DOMParser(); + const svgImage = parser.parseFromString(svg, 'image/svg+xml'); + + if (layout === LevelCardLayout.simple) { + svgImage.querySelector('.container-overlay').remove(); + } else if (layout === LevelCardLayout.percentage) { + svgImage.querySelector('.absolute-overlay').remove(); + svgImage.querySelector('.percentage-value-container').innerHTML = createPercentLayout(); + } else { + svgImage.querySelector('.absolute-value-container').innerHTML = createAbsoluteLayout(); + svgImage.querySelector('.percentage-overlay').remove(); + } + + const encodedSvg = encodeURIComponent(svgImage.documentElement.outerHTML); + + return sanitizer.bypassSecurityTrustResourceUrl(`data:image/svg+xml,${encodedSvg}`); + } +}; + +export const loadSvgShapesMapping = (resourcesService: ResourcesService): Observable> => { + const obsArray: Array> = []; + const shapesImageMap: Map = new Map(); + svgMapping.forEach((value, shape) => { + const obs = resourcesService.loadJsonResource(value.svg).pipe( + map((svg) => ({svg, shape})) + ); + + obsArray.push(obs); + }); + + return forkJoin(obsArray).pipe( + map(svgData => { + for (const data of svgData) { + shapesImageMap.set(data.shape, data.svg); + } + return shapesImageMap; + }) + ); +}; + +export const updatedFormSettingsValidators = (formGroup: FormGroup) => { + const datasourceUnits: string = formGroup.get('datasourceUnits').value; + const layout: LevelCardLayout = formGroup.get('layout').value; + const volumeSource: LiquidWidgetDataSourceType = formGroup.get('volumeSource').value; + const widgetUnitsSource: LiquidWidgetDataSourceType = formGroup.get('widgetUnitsSource').value; + const showTooltipLevel: boolean = formGroup.get('showTooltipLevel').value; + const showTooltipDate: boolean = formGroup.get('showTooltipDate').value; + const showTooltip: boolean = formGroup.get('showTooltip').value; + const tankSelectionType: LiquidWidgetDataSourceType = formGroup.get('tankSelectionType').value; + + if (tankSelectionType === LiquidWidgetDataSourceType.static) { + formGroup.get('selectedShape').enable({emitEvent: false}); + formGroup.get('shapeAttributeName').disable({emitEvent: false}); + } else { + formGroup.get('selectedShape').disable({emitEvent: false}); + formGroup.get('shapeAttributeName').enable({emitEvent: false}); + } + + switch (layout) { + case LevelCardLayout.simple: + case LevelCardLayout.percentage: + formGroup.get('widgetUnitsSource').disable({emitEvent: false}); + formGroup.get('units').disable({emitEvent: false}); + formGroup.get('widgetUnitsAttributeName').disable({emitEvent: false}); + + if (datasourceUnits !== CapacityUnits.percent) { + formGroup.get('volumeSource').enable({emitEvent: false}); + formGroup.get('volumeUnits').enable({emitEvent: false}); + if (volumeSource === LiquidWidgetDataSourceType.static) { + formGroup.get('volumeConstant').enable({emitEvent: false}); + formGroup.get('volumeAttributeName').disable({emitEvent: false}); + } else { + formGroup.get('volumeConstant').disable({emitEvent: false}); + formGroup.get('volumeAttributeName').enable({emitEvent: false}); + } + } else { + formGroup.get('volumeSource').disable({emitEvent: false}); + formGroup.get('volumeConstant').disable({emitEvent: false}); + formGroup.get('volumeAttributeName').disable({emitEvent: false}); + formGroup.get('volumeUnits').disable({emitEvent: false}); + } + + if (layout === LevelCardLayout.simple) { + formGroup.get('decimals')?.disable({emitEvent: false}); + formGroup.get('valueFont').disable({emitEvent: false}); + formGroup.get('valueColor').disable({emitEvent: false}); + } else { + formGroup.get('decimals')?.enable({emitEvent: false}); + formGroup.get('valueFont').enable({emitEvent: false}); + formGroup.get('valueColor').enable({emitEvent: false}); + } + + formGroup.get('volumeFont').disable({emitEvent: false}); + formGroup.get('volumeColor').disable({emitEvent: false}); + + break; + case LevelCardLayout.absolute: + formGroup.get('widgetUnitsSource').enable({emitEvent: false}); + if (widgetUnitsSource === LiquidWidgetDataSourceType.static) { + formGroup.get('units').enable({emitEvent: false}); + formGroup.get('widgetUnitsAttributeName').disable({emitEvent: false}); + } else { + formGroup.get('units').disable({emitEvent: false}); + formGroup.get('widgetUnitsAttributeName').enable({emitEvent: false}); + } + + formGroup.get('volumeSource').enable({emitEvent: false}); + formGroup.get('volumeUnits').enable({emitEvent: false}); + if (volumeSource === LiquidWidgetDataSourceType.static) { + formGroup.get('volumeConstant').enable({emitEvent: false}); + formGroup.get('volumeAttributeName').disable({emitEvent: false}); + } else { + formGroup.get('volumeConstant').disable({emitEvent: false}); + formGroup.get('volumeAttributeName').enable({emitEvent: false}); + } + + if (formGroup.get('decimals')) { + formGroup.get('decimals').enable({emitEvent: false}); + } + formGroup.get('valueFont').enable({emitEvent: false}); + formGroup.get('valueColor').enable({emitEvent: false}); + + formGroup.get('volumeFont').enable({emitEvent: false}); + formGroup.get('volumeColor').enable({emitEvent: false}); + + break; + } + + if (showTooltip) { + formGroup.get('showTooltipLevel').enable({emitEvent: false}); + formGroup.get('showTooltipDate').enable({emitEvent: false}); + formGroup.get('tooltipBackgroundColor').enable({emitEvent: false}); + formGroup.get('tooltipBackgroundBlur').enable({emitEvent: false}); + + if (showTooltipLevel) { + formGroup.get('tooltipLevelDecimals').enable({emitEvent: false}); + formGroup.get('tooltipLevelFont').enable({emitEvent: false}); + formGroup.get('tooltipLevelColor').enable({emitEvent: false}); + formGroup.get('tooltipUnits').enable({emitEvent: false}); + } else { + formGroup.get('tooltipUnits').disable({emitEvent: false}); + formGroup.get('tooltipLevelDecimals').disable({emitEvent: false}); + formGroup.get('tooltipLevelFont').disable({emitEvent: false}); + formGroup.get('tooltipLevelColor').disable({emitEvent: false}); + } + + if (showTooltipDate) { + formGroup.get('tooltipDateFormat').enable({emitEvent: false}); + formGroup.get('tooltipDateFont').enable({emitEvent: false}); + formGroup.get('tooltipDateColor').enable({emitEvent: false}); + } else { + formGroup.get('tooltipDateFormat').disable({emitEvent: false}); + formGroup.get('tooltipDateFont').disable({emitEvent: false}); + formGroup.get('tooltipDateColor').disable({emitEvent: false}); + } + } else { + formGroup.get('showTooltipLevel').disable({emitEvent: false}); + formGroup.get('showTooltipDate').disable({emitEvent: false}); + formGroup.get('tooltipBackgroundColor').disable({emitEvent: false}); + formGroup.get('tooltipBackgroundBlur').disable({emitEvent: false}); + + formGroup.get('tooltipUnits').disable({emitEvent: false}); + formGroup.get('tooltipLevelDecimals').disable({emitEvent: false}); + formGroup.get('tooltipLevelFont').disable({emitEvent: false}); + formGroup.get('tooltipLevelColor').disable({emitEvent: false}); + + formGroup.get('tooltipDateFormat').disable({emitEvent: false}); + formGroup.get('tooltipDateFont').disable({emitEvent: false}); + formGroup.get('tooltipDateColor').disable({emitEvent: false}); + } +}; diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-list.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-list.component.html new file mode 100644 index 0000000000..8db7f074de --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-list.component.html @@ -0,0 +1,50 @@ + +
{{ panelTitle }}
+
+
+
+
+
widgets.color.from
+ + + +
widgets.color.to
+ + + + + +
+ +
+
+
+ diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-list.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-list.component.ts new file mode 100644 index 0000000000..f135d77092 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-list.component.ts @@ -0,0 +1,136 @@ +/// +/// Copyright © 2016-2023 The Thingsboard Authors +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. +/// + +import { Component, forwardRef, Input, OnDestroy, OnInit } from '@angular/core'; +import { + AbstractControl, + ControlValueAccessor, + FormGroup, + NG_VALUE_ACCESSOR, + UntypedFormArray, + UntypedFormBuilder, + UntypedFormGroup +} from '@angular/forms'; +import { ColorRange } from '@shared/models/widget-settings.models'; +import { TbPopoverComponent } from '@shared/components/popover.component'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; + +@Component({ + selector: 'tb-color-range-list', + templateUrl: './color-range-list.component.html', + styleUrls: ['color-settings-panel.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ColorRangeListComponent), + multi: true + } + ] +}) +export class ColorRangeListComponent implements OnInit, ControlValueAccessor, OnDestroy { + + @Input() + disabled: boolean; + + @Input() + popover: TbPopoverComponent; + + @Input() + panelTitle: string; + + modelValue: any; + + colorRangeListFormGroup: UntypedFormGroup; + + private destroy$ = new Subject(); + + private propagateChange = null; + + constructor(private fb: UntypedFormBuilder) {} + + ngOnInit(): void { + this.colorRangeListFormGroup = this.fb.group({ + rangeList: this.fb.array([]) + }); + + this.colorRangeListFormGroup.valueChanges.pipe( + takeUntil(this.destroy$) + ).subscribe(() => this.updateModel()); + } + + ngOnDestroy() { + this.destroy$.next(); + this.destroy$.complete(); + } + + registerOnChange(fn: any): void { + this.propagateChange = fn; + } + + registerOnTouched(fn: any): void { + } + + setDisabledState(isDisabled: boolean): void { + this.disabled = isDisabled; + } + + writeValue(value: any): void { + if (value && value?.length) { + value.forEach((r) => this.rangeListFormArray.push(this.colorRangeControl(r), {emitEvent: false})); + } + } + + private colorRangeControl(range: ColorRange): UntypedFormGroup { + return this.fb.group({ + from: [range?.from, []], + to: [range?.to, []], + color: [range?.color, []] + }); + } + + get rangeListFormArray(): UntypedFormArray { + return this.colorRangeListFormGroup.get('rangeList') as UntypedFormArray; + } + + get rangeListFormGroups(): FormGroup[] { + return this.rangeListFormArray.controls as FormGroup[]; + } + + trackByRange(index: number, rangeControl: AbstractControl): any { + return rangeControl; + } + + removeRange(index: number) { + this.rangeListFormArray.removeAt(index); + this.colorRangeListFormGroup.markAsDirty(); + setTimeout(() => {this.popover?.updatePosition();}, 0); + } + + addRange() { + const newRange: ColorRange = { + color: 'rgba(0,0,0,0.87)' + }; + this.rangeListFormArray.push(this.colorRangeControl(newRange)); + this.colorRangeListFormGroup.markAsDirty(); + setTimeout(() => {this.popover?.updatePosition();}, 0); + } + + updateModel() { + this.propagateChange(this.colorRangeListFormGroup.get('rangeList').value); + } + +} diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-panel.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-panel.component.html new file mode 100644 index 0000000000..449562f184 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-panel.component.html @@ -0,0 +1,57 @@ + +
+
widgets.color.color-settings
+
+ + +
+
+ + + +
+ +
+
+
+ + + +
+
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-panel.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-panel.component.ts new file mode 100644 index 0000000000..bdc9500605 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-panel.component.ts @@ -0,0 +1,78 @@ +/// +/// Copyright © 2016-2023 The Thingsboard Authors +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. +/// + +import { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation } from '@angular/core'; +import { PageComponent } from '@shared/components/page.component'; +import { ColorRange } from '@shared/models/widget-settings.models'; +import { TbPopoverComponent } from '@shared/components/popover.component'; +import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; +import { Store } from '@ngrx/store'; +import { AppState } from '@core/core.state'; +import { deepClone } from '@core/utils'; +import { + ColorRangeSettingsComponent +} from '@home/components/widget/lib/settings/common/color-range-settings.component'; + +@Component({ + selector: 'tb-color-range-panel', + templateUrl: './color-range-panel.component.html', + providers: [], + styleUrls: ['./color-settings-panel.component.scss'], + encapsulation: ViewEncapsulation.None +}) +export class ColorRangePanelComponent extends PageComponent implements OnInit { + + @Input() + colorRangeSettings: Array; + + @Input() + popover: TbPopoverComponent; + + @Input() + settingsComponents: ColorRangeSettingsComponent[]; + + @Output() + colorRangeApplied = new EventEmitter>(); + + colorRangeFormGroup: UntypedFormGroup; + + constructor(private fb: UntypedFormBuilder, + protected store: Store) { + super(store); + } + + ngOnInit(): void { + this.colorRangeFormGroup = this.fb.group({ + rangeList: [this.colorRangeSettings, []] + }); + } + + copyColorSettings(comp: ColorRangeSettingsComponent) { + this.colorRangeSettings = deepClone(comp.modelValue); + this.colorRangeFormGroup.get('rangeList').patchValue(this.colorRangeSettings || [], {emitEvent: false}); + this.colorRangeFormGroup.markAsDirty(); + } + + cancel() { + this.popover?.hide(); + } + + applyColorRangeSettings() { + const colorRangeSettings = this.colorRangeFormGroup.get('rangeList').value; + this.colorRangeApplied.emit(colorRangeSettings); + } + +} diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-settings.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-settings.component.html new file mode 100644 index 0000000000..cf0298e99a --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-settings.component.html @@ -0,0 +1,27 @@ + + diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-settings.component.ts new file mode 100644 index 0000000000..989bdb2844 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-range-settings.component.ts @@ -0,0 +1,166 @@ +/// +/// Copyright © 2016-2023 The Thingsboard Authors +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. +/// + +import { + Component, + forwardRef, + Injectable, + Input, + OnDestroy, + OnInit, + Renderer2, + ViewContainerRef +} from '@angular/core'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { ColorRange, ComponentStyle } from '@shared/models/widget-settings.models'; +import { MatButton } from '@angular/material/button'; +import { TbPopoverService } from '@shared/components/popover.service'; +import { ColorRangePanelComponent } from '@home/components/widget/lib/settings/common/color-range-panel.component'; + +@Injectable() +export class ColorRangeSettingsComponentService { + + private colorSettingsComponents = new Set(); + + constructor() {} + + public registerColorSettingsComponent(comp: ColorRangeSettingsComponent) { + this.colorSettingsComponents.add(comp); + } + + public unregisterColorSettingsComponent(comp: ColorRangeSettingsComponent) { + this.colorSettingsComponents.delete(comp); + } + + public getOtherColorSettingsComponents(comp: ColorRangeSettingsComponent): ColorRangeSettingsComponent[] { + const result: ColorRangeSettingsComponent[] = []; + for (const component of this.colorSettingsComponents.values()) { + if (component.settingsKey && component.modelValue && component !== comp) { + result.push(component); + } + } + return result; + } + +} + +@Component({ + selector: 'tb-color-range-settings', + templateUrl: './color-range-settings.component.html', + styleUrls: [], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ColorRangeSettingsComponent), + multi: true + } + ] +}) +export class ColorRangeSettingsComponent implements OnInit, ControlValueAccessor, OnDestroy { + + @Input() + disabled: boolean; + + @Input() + settingsKey: string; + + modelValue: Array; + + colorStyle: ComponentStyle = {}; + + private propagateChange = null; + + constructor(private popoverService: TbPopoverService, + private renderer: Renderer2, + private viewContainerRef: ViewContainerRef, + private colorSettingsComponentService: ColorRangeSettingsComponentService) {} + + ngOnInit(): void { + this.colorSettingsComponentService.registerColorSettingsComponent(this); + } + + ngOnDestroy() { + this.colorSettingsComponentService.unregisterColorSettingsComponent(this); + } + + registerOnChange(fn: any): void { + this.propagateChange = fn; + } + + registerOnTouched(fn: any): void { + } + + setDisabledState(isDisabled: boolean): void { + this.disabled = isDisabled; + this.updateColorStyle(); + } + + writeValue(value: Array): void { + this.modelValue = value; + this.updateColorStyle(); + } + + openColorRangeSettingsPopup($event: Event, matButton: MatButton) { + if ($event) { + $event.stopPropagation(); + } + const trigger = matButton._elementRef.nativeElement; + if (this.popoverService.hasPopover(trigger)) { + this.popoverService.hidePopover(trigger); + } else { + const ctx: any = { + colorRangeSettings: this.modelValue, + settingsComponents: this.colorSettingsComponentService.getOtherColorSettingsComponents(this) + }; + const colorRangeSettingsPanelPopover = this.popoverService.displayPopover(trigger, this.renderer, + this.viewContainerRef, ColorRangePanelComponent, 'left', true, null, + ctx, + {}, + {}, {}, true); + colorRangeSettingsPanelPopover.tbComponentRef.instance.popover = colorRangeSettingsPanelPopover; + colorRangeSettingsPanelPopover.tbComponentRef.instance.colorRangeApplied.subscribe((colorRangeSettings) => { + colorRangeSettingsPanelPopover.hide(); + this.modelValue = colorRangeSettings; + this.updateColorStyle(); + this.propagateChange(this.modelValue); + }); + } + } + + private updateColorStyle() { + if (!this.disabled && this.modelValue) { + let colors: string[] = []; + if (this.modelValue.length) { + const rangeColors = this.modelValue.slice(0, Math.min(3, this.modelValue.length)).map(r => r.color); + colors = colors.concat(rangeColors); + } + if (colors.length === 1) { + this.colorStyle = {backgroundColor: colors[0]}; + } else { + const gradientValues: string[] = []; + const step = 100 / colors.length; + for (let i = 0; i < colors.length; i++) { + gradientValues.push(`${colors[i]} ${step*i}%`); + gradientValues.push(`${colors[i]} ${step*(i+1)}%`); + } + this.colorStyle = {background: `linear-gradient(90deg, ${gradientValues.join(', ')})`}; + } + } else { + this.colorStyle = {}; + } + } + +} diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-settings-panel.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-settings-panel.component.html index 8712322d2c..1864e781dd 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-settings-panel.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/color-settings-panel.component.html @@ -34,7 +34,11 @@
- + +
@@ -72,43 +76,6 @@
- -
-
widgets.color.value-range
-
-
-
-
-
widgets.color.from
- - - -
widgets.color.to
- - - - - -
- -
-
-
- -
-
this.colorRangeControl(r))), + rangeList: [this.colorSettings?.rangeList, []], colorFunction: [this.colorSettings?.colorFunction, []] } ); @@ -76,51 +76,15 @@ export class ColorSettingsPanelComponent extends PageComponent implements OnInit }); } - private colorRangeControl(range: ColorRange): AbstractControl { - return this.fb.group({ - from: [range?.from, []], - to: [range?.to, []], - color: [range?.color, []] - }); - } - - get rangeListFormArray(): UntypedFormArray { - return this.colorSettingsFormGroup.get('rangeList') as UntypedFormArray; - } - - get rangeListFormGroups(): FormGroup[] { - return this.rangeListFormArray.controls as FormGroup[]; - } - - trackByRange(index: number, rangeControl: AbstractControl): any { - return rangeControl; - } - - removeRange(index: number) { - this.rangeListFormArray.removeAt(index); - this.colorSettingsFormGroup.markAsDirty(); - setTimeout(() => {this.popover?.updatePosition();}, 0); - } - - addRange() { - const newRange: ColorRange = { - color: 'rgba(0,0,0,0.87)' - }; - this.rangeListFormArray.push(this.colorRangeControl(newRange)); - this.colorSettingsFormGroup.markAsDirty(); - setTimeout(() => {this.popover?.updatePosition();}, 0); - } - copyColorSettings(comp: ColorSettingsComponent) { const sourceSettings = deepClone(comp.modelValue); this.colorSettings = sourceSettings; this.colorSettingsFormGroup.patchValue({ type: this.colorSettings.type, color: this.colorSettings.color, - colorFunction: this.colorSettings.colorFunction + colorFunction: this.colorSettings.colorFunction, + rangeList: this.colorSettings.rangeList || [] }, {emitEvent: false}); - this.colorSettingsFormGroup.setControl('rangeList', - this.fb.array((this.colorSettings.rangeList || []).map(r => this.colorRangeControl(r))), {emitEvent: false}); this.colorSettingsFormGroup.markAsDirty(); } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings-panel.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings-panel.component.html index 44163fae26..c5687be400 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings-panel.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/font-settings-panel.component.html @@ -73,7 +73,7 @@
-
+
widgets.widget-font.line-height
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/image-cards-select.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/image-cards-select.component.html index 52bd5907bd..35d7157fb4 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/image-cards-select.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/image-cards-select.component.html @@ -33,7 +33,7 @@
{{ option.name }}
- +
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/image-cards-select.component.scss b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/image-cards-select.component.scss index 37c06ed239..0cda7679e5 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/image-cards-select.component.scss +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/image-cards-select.component.scss @@ -95,6 +95,11 @@ min-height: 0; display: flex; justify-content: center; + + .tb-image-cards-option-image { + max-width: 100%; + max-height: 100%; + } } &.selected { .tb-image-cards-option-background { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/image-cards-select.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/image-cards-select.component.ts index d75c4a5fc9..4f11a51223 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/image-cards-select.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/image-cards-select.component.ts @@ -32,11 +32,12 @@ import { BehaviorSubject, combineLatest, Observable, Subject } from 'rxjs'; import { map, share, startWith, takeUntil } from 'rxjs/operators'; import { BreakpointObserver } from '@angular/cdk/layout'; import { MediaBreakpoints } from '@shared/models/constants'; +import { SafeUrl } from '@angular/platform-browser'; export interface ImageCardsSelectOption { name: string; value: any; - image: string; + image: string | SafeUrl; } @Directive( @@ -49,7 +50,7 @@ export class ImageCardsSelectOptionDirective { @Input() value: any; - @Input() image: string; + @Input() image: string | SafeUrl; get viewValue(): string { return (this._element?.nativeElement.textContent || '').trim(); diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/widget-settings-common.module.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/widget-settings-common.module.ts index 4018549863..7c2022c5d4 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/widget-settings-common.module.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/common/widget-settings-common.module.ts @@ -45,7 +45,12 @@ import { } from '@home/components/widget/lib/settings/common/background-settings-panel.component'; import { CountWidgetSettingsComponent -} from "@home/components/widget/lib/settings/common/count-widget-settings.component"; +} from '@home/components/widget/lib/settings/common/count-widget-settings.component'; +import { ColorRangeListComponent } from '@home/components/widget/lib/settings/common/color-range-list.component'; +import { ColorRangePanelComponent } from '@home/components/widget/lib/settings/common/color-range-panel.component'; +import { + ColorRangeSettingsComponent, ColorRangeSettingsComponentService +} from '@home/components/widget/lib/settings/common/color-range-settings.component'; @NgModule({ declarations: [ @@ -63,7 +68,10 @@ import { ValueSourceComponent, LegendConfigComponent, WidgetFontComponent, - CountWidgetSettingsComponent + CountWidgetSettingsComponent, + ColorRangeListComponent, + ColorRangePanelComponent, + ColorRangeSettingsComponent ], imports: [ CommonModule, @@ -85,10 +93,14 @@ import { ValueSourceComponent, LegendConfigComponent, WidgetFontComponent, - CountWidgetSettingsComponent + CountWidgetSettingsComponent, + ColorRangeListComponent, + ColorRangePanelComponent, + ColorRangeSettingsComponent ], providers: [ - ColorSettingsComponentService + ColorSettingsComponentService, + ColorRangeSettingsComponentService ] }) export class WidgetSettingsCommonModule { diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-compass-widget-settings.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-compass-widget-settings.component.html index bbb7874523..96c16c0359 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-compass-widget-settings.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-compass-widget-settings.component.html @@ -15,153 +15,127 @@ limitations under the License. --> -
-
- widgets.gauge.ticks-settings - - widgets.gauge.major-ticks-names - - - {{tickName}} - cancel - - - - - - -
- - widgets.gauge.minor-ticks-count - - - - -
- - {{ 'widgets.gauge.show-stroke-ticks' | translate }} - -
- widgets.gauge.major-ticks-font - -
-
-
- widgets.gauge.plate-settings - - - - {{ 'widgets.gauge.show-plate-border' | translate }} - -
- + +
+
widgets.gauge.ticks-settings
+
+
widgets.gauge.labels
+
+ + +
+
+
+
widgets.gauge.label-style
+
+ + + + +
+
+ +
+
widgets.gauge.major-ticks
+ - - widgets.gauge.border-width - - -
-
-
- widgets.gauge.needle-settings - - widgets.gauge.needle-circle-size - - -
- +
+
+
widgets.gauge.minor-ticks
+
+ + + + + +
+
+ +
+ + {{ 'widgets.gauge.show-stroke-ticks' | translate }} + +
+
+ +
+
widgets.gauge.plate-settings
+
+
widgets.gauge.plate-color
+ - +
+
+ + {{ 'widgets.gauge.show-plate-border' | translate }} + +
+ + + + + +
+
+
+ +
+
widgets.gauge.needle-settings
+
+
widgets.gauge.needle-circle
+
+ + + + + +
+
+
+
widgets.gauge.needle-color
+ - - -
- widgets.gauge.animation-settings +
+
+ +
- {{ 'widgets.gauge.enable-animation' | translate }} - + widget-config.advanced-settings -
- - widgets.gauge.animation-duration - - - - widgets.gauge.animation-rule - - - {{ 'widgets.gauge.animation-linear' | translate }} - - - {{ 'widgets.gauge.animation-quad' | translate }} - - - {{ 'widgets.gauge.animation-quint' | translate }} - - - {{ 'widgets.gauge.animation-cycle' | translate }} - - - {{ 'widgets.gauge.animation-bounce' | translate }} - - - {{ 'widgets.gauge.animation-elastic' | translate }} - - - {{ 'widgets.gauge.animation-dequad' | translate }} - - - {{ 'widgets.gauge.animation-dequint' | translate }} - - - {{ 'widgets.gauge.animation-decycle' | translate }} - - - {{ 'widgets.gauge.animation-debounce' | translate }} - - - {{ 'widgets.gauge.animation-delastic' | translate }} - - - - - widgets.gauge.animation-target +
+
widgets.gauge.animation-target
+ {{ 'widgets.gauge.animation-target-needle' | translate }} @@ -171,8 +145,53 @@ -
+
+
+
widgets.gauge.animation-duration-rule
+
+ + + + + + + {{ 'widgets.gauge.animation-linear' | translate }} + + + {{ 'widgets.gauge.animation-quad' | translate }} + + + {{ 'widgets.gauge.animation-quint' | translate }} + + + {{ 'widgets.gauge.animation-cycle' | translate }} + + + {{ 'widgets.gauge.animation-bounce' | translate }} + + + {{ 'widgets.gauge.animation-elastic' | translate }} + + + {{ 'widgets.gauge.animation-dequad' | translate }} + + + {{ 'widgets.gauge.animation-dequint' | translate }} + + + {{ 'widgets.gauge.animation-decycle' | translate }} + + + {{ 'widgets.gauge.animation-debounce' | translate }} + + + {{ 'widgets.gauge.animation-delastic' | translate }} + + + +
+
- - + + diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-compass-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-compass-widget-settings.component.ts index 5a2a2b2678..6ae485c49b 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-compass-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-compass-widget-settings.component.ts @@ -19,9 +19,7 @@ import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; import { Component } from '@angular/core'; -import { MatChipInputEvent } from '@angular/material/chips'; import { COMMA, ENTER, SEMICOLON } from '@angular/cdk/keycodes'; -import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; @Component({ selector: 'tb-analogue-compass-widget-settings', @@ -81,6 +79,7 @@ export class AnalogueCompassWidgetSettingsComponent extends WidgetSettingsCompon colorMinorTicks: [settings.colorMinorTicks, []], showStrokeTicks: [settings.showStrokeTicks, []], majorTickFont: [settings.majorTickFont, []], + majorTickColor: [settings.majorTickFont.color, []], // Plate settings colorPlate: [settings.colorPlate, []], @@ -131,41 +130,8 @@ export class AnalogueCompassWidgetSettingsComponent extends WidgetSettingsCompon this.analogueCompassWidgetSettingsForm.get('animationTarget').updateValueAndValidity({emitEvent}); } - majorTicksNamesList(): string[] { - return this.analogueCompassWidgetSettingsForm.get('majorTicks').value; - } - - removeMajorTickName(tickName: string): void { - const tickNames: string[] = this.analogueCompassWidgetSettingsForm.get('majorTicks').value; - const index = tickNames.indexOf(tickName); - if (index >= 0) { - tickNames.splice(index, 1); - this.analogueCompassWidgetSettingsForm.get('majorTicks').setValue(tickNames); - this.analogueCompassWidgetSettingsForm.get('majorTicks').markAsDirty(); - } - } - - addMajorTickName(event: MatChipInputEvent): void { - const input = event.chipInput.inputElement; - const value = event.value; - - const tickNames: string[] = this.analogueCompassWidgetSettingsForm.get('majorTicks').value; - - if ((value || '').trim()) { - tickNames.push(value.trim()); - this.analogueCompassWidgetSettingsForm.get('majorTicks').setValue(tickNames); - this.analogueCompassWidgetSettingsForm.get('majorTicks').markAsDirty(); - } - - if (input) { - input.value = ''; - } - } - - majorTickNameDrop(event: CdkDragDrop): void { - const tickNames: string[] = this.analogueCompassWidgetSettingsForm.get('majorTicks').value; - moveItemInArray(tickNames, event.previousIndex, event.currentIndex); - this.analogueCompassWidgetSettingsForm.get('majorTicks').setValue(tickNames); - this.analogueCompassWidgetSettingsForm.get('majorTicks').markAsDirty(); + protected prepareOutputSettings(settings) { + settings.majorTickFont.color = this.analogueCompassWidgetSettingsForm.get('majorTickColor').value; + return settings; } } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-gauge-widget-settings.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-gauge-widget-settings.component.html index c2264d7aca..7769dab6a3 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-gauge-widget-settings.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-gauge-widget-settings.component.html @@ -15,7 +15,7 @@ limitations under the License. --> -
+ @@ -24,330 +24,382 @@ - - -
- widgets.gauge.ticks-settings -
- - widgets.gauge.min-value - - - - widgets.gauge.max-value - - -
-
- - widgets.gauge.major-ticks-count - - - - -
-
- - widgets.gauge.minor-ticks-count - - - - -
-
- widgets.gauge.tick-numbers-font - -
-
-
- widgets.gauge.unit-title-settings - - - - - {{ 'widgets.gauge.show-unit-title' | translate }} - - - - widget-config.advanced-settings - - - -
- - widgets.gauge.unit-title - - -
- widgets.gauge.title-font - -
-
-
-
-
-
- widgets.gauge.units-settings -
- widgets.gauge.units-font - -
-
-
- widgets.gauge.value-box-settings + +
+
widgets.gauge.ticks-settings
+
+
widgets.gauge.ticks
+
+
widgets.gauge.min-value-short
+ + + +
widgets.gauge.max-value-short
+ + + + + + + +
+
+ +
+
widgets.gauge.major-ticks-count
+
+ + + + + +
+
+ +
+
widgets.gauge.minor-ticks-count
+
+ + + + + +
+
+
+ +
+
widgets.gauge.units-settings
+
+ + {{ 'widgets.gauge.units-title' | translate }} + +
+ + + + + + + +
+
+ +
+
widget-config.units-short
+
+ + + + +
+
+
+ +
- - {{ 'widgets.gauge.show-value-box' | translate }} + {{ 'widgets.gauge.value-box' | translate }} - + widget-config.advanced-settings -
- - widgets.gauge.value-int - +
+
widgets.gauge.value-int
+ + -
- widgets.gauge.value-font - -
-
- +
+
+
widgets.gauge.value-text
+
+
widgets.gauge.value-text
+
+ + + + +
+
+
+
widgets.gauge.value-text-shadow
+ - +
+
+
+
widgets.gauge.value-box
+
+
widgets.gauge.rect-stroke-color-start
+ + +
+ +
+
widgets.gauge.rect-stroke-color-end
+ -
-
- +
+ +
+
widgets.gauge.background-color
+ - +
+ +
+
widgets.gauge.shadow-color
+ -
- + + - -
- widgets.gauge.plate-settings - - - - {{ 'widgets.gauge.show-plate-border' | translate }} - -
-
- widgets.gauge.needle-settings -
- + + +
+
widgets.gauge.plate-settings
+
+
widgets.gauge.plate-color
+ - +
+
+ + {{ 'widgets.gauge.show-plate-border' | translate }} + +
+
+ +
+
widgets.gauge.needle-settings
+
+
widgets.gauge.needle-color-start
+ -
-
- + + +
+
widgets.gauge.needle-color-end
+ - +
+ +
+
widgets.gauge.needle-color-shadow-up
+ -
-
-
- widgets.gauge.highlights-settings - - widgets.gauge.highlights-width - - -
- widgets.gauge.highlights -
-
-
- - -
-
-
- widgets.gauge.no-highlights -
-
- -
+
+ +
+
widgets.gauge.needle-color-shadow-down
+ + +
+ + +
+
widgets.gauge.scale-settings
+
+
widgets.gauge.scale
+
+ + + + +
-
-
-
- widgets.gauge.animation-settings + + + +
- {{ 'widgets.gauge.enable-animation' | translate }} - + widget-config.advanced-settings -
- - widgets.gauge.animation-duration - - - - widgets.gauge.animation-rule - - - {{ 'widgets.gauge.animation-linear' | translate }} - - - {{ 'widgets.gauge.animation-quad' | translate }} - - - {{ 'widgets.gauge.animation-quint' | translate }} - - - {{ 'widgets.gauge.animation-cycle' | translate }} - - - {{ 'widgets.gauge.animation-bounce' | translate }} - - - {{ 'widgets.gauge.animation-elastic' | translate }} - - - {{ 'widgets.gauge.animation-dequad' | translate }} - - - {{ 'widgets.gauge.animation-dequint' | translate }} - - - {{ 'widgets.gauge.animation-decycle' | translate }} - - - {{ 'widgets.gauge.animation-debounce' | translate }} - - - {{ 'widgets.gauge.animation-delastic' | translate }} - - - -
+
+
widgets.gauge.animation-duration-rule
+
+ + + + + + + {{ 'widgets.gauge.animation-linear' | translate }} + + + {{ 'widgets.gauge.animation-quad' | translate }} + + + {{ 'widgets.gauge.animation-quint' | translate }} + + + {{ 'widgets.gauge.animation-cycle' | translate }} + + + {{ 'widgets.gauge.animation-bounce' | translate }} + + + {{ 'widgets.gauge.animation-elastic' | translate }} + + + {{ 'widgets.gauge.animation-dequad' | translate }} + + + {{ 'widgets.gauge.animation-dequint' | translate }} + + + {{ 'widgets.gauge.animation-decycle' | translate }} + + + {{ 'widgets.gauge.animation-debounce' | translate }} + + + {{ 'widgets.gauge.animation-delastic' | translate }} + + + +
+
-
- + + -
- widgets.gauge.radial-gauge-settings -
- - widgets.gauge.start-ticks-angle - +
+
widgets.gauge.radial-gauge-settings
+
+
widgets.gauge.start-ticks-angle
+ + + +
+
+
widgets.gauge.ticks-angle
+ + - - widgets.gauge.ticks-angle - +
+
+
widgets.gauge.needle-circle-size
+ + -
- - widgets.gauge.needle-circle-size - - -
+ + + +
-
- widgets.gauge.linear-gauge-settings -
- - widgets.gauge.bar-stroke-width - - - - -
-
- +
+
widgets.gauge.linear-gauge-settings
+
+
widgets.gauge.bar-stroke
+
+ + + + + +
+
+ +
+
widgets.gauge.bar-background-color
+ - +
+
+
widgets.gauge.bar-background-color-end
+ -
-
- + + +
+
widgets.gauge.progress-bar-color-start
+ - +
+
+
widgets.gauge.progress-bar-color-end
+ -
-
+ + + + +
+ + +
+
{{ 'widgets.gauge.arrow-and-scale-color' | translate }}
+ + +
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-gauge-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-gauge-widget-settings.component.ts index 07f2be69bd..3257987f4a 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-gauge-widget-settings.component.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/analogue-gauge-widget-settings.component.ts @@ -15,11 +15,9 @@ /// import { WidgetSettings, WidgetSettingsComponent } from '@shared/models/widget.models'; -import { AbstractControl, UntypedFormArray, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; +import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; -import { GaugeHighlight } from '@home/components/widget/lib/settings/gauge/gauge-highlight.component'; -import { CdkDragDrop } from '@angular/cdk/drag-drop'; export class AnalogueGaugeWidgetSettingsComponent extends WidgetSettingsComponent { @@ -119,19 +117,24 @@ export class AnalogueGaugeWidgetSettingsComponent extends WidgetSettingsComponen minorTicks: [settings.majorTicksCount, [Validators.min(0)]], colorMinorTicks: [settings.colorMinorTicks, []], numbersFont: [settings.numbersFont, []], + numbersColor: [settings.numbersFont.color, []], // Unit title settings showUnitTitle: [settings.showUnitTitle, []], unitTitle: [settings.unitTitle, []], titleFont: [settings.titleFont, []], + titleColor: [settings.titleFont.color, []], // Units settings unitsFont: [settings.unitsFont, []], + unitsColor: [settings.unitsFont.color, []], // Value box settings valueBox: [settings.valueBox, []], valueInt: [settings.valueInt, [Validators.min(0)]], valueFont: [settings.valueFont, []], + valueColor: [settings.valueFont.color, []], + valueColorShadow: [settings.valueFont.shadowColor, []], colorValueBoxRect: [settings.colorValueBoxRect, []], colorValueBoxRectEnd: [settings.colorValueBoxRectEnd, []], colorValueBoxBackground: [settings.colorValueBoxBackground, []], @@ -149,7 +152,7 @@ export class AnalogueGaugeWidgetSettingsComponent extends WidgetSettingsComponen // Highlights settings highlightsWidth: [settings.highlightsWidth, [Validators.min(0)]], - highlights: this.prepareHighlightsFormArray(settings.highlights), + highlights: [settings.highlights, []], // Animation settings animation: [settings.animation, []], @@ -170,13 +173,16 @@ export class AnalogueGaugeWidgetSettingsComponent extends WidgetSettingsComponen if (showUnitTitle) { this.analogueGaugeWidgetSettingsForm.get('unitTitle').enable(); this.analogueGaugeWidgetSettingsForm.get('titleFont').enable(); + this.analogueGaugeWidgetSettingsForm.get('titleColor').enable(); } else { this.analogueGaugeWidgetSettingsForm.get('unitTitle').disable(); this.analogueGaugeWidgetSettingsForm.get('titleFont').disable(); + this.analogueGaugeWidgetSettingsForm.get('titleColor').disable(); } if (valueBox) { this.analogueGaugeWidgetSettingsForm.get('valueInt').enable(); this.analogueGaugeWidgetSettingsForm.get('valueFont').enable(); + this.analogueGaugeWidgetSettingsForm.get('valueColor').enable(); this.analogueGaugeWidgetSettingsForm.get('colorValueBoxRect').enable(); this.analogueGaugeWidgetSettingsForm.get('colorValueBoxRectEnd').enable(); this.analogueGaugeWidgetSettingsForm.get('colorValueBoxBackground').enable(); @@ -184,6 +190,7 @@ export class AnalogueGaugeWidgetSettingsComponent extends WidgetSettingsComponen } else { this.analogueGaugeWidgetSettingsForm.get('valueInt').disable(); this.analogueGaugeWidgetSettingsForm.get('valueFont').disable(); + this.analogueGaugeWidgetSettingsForm.get('valueColor').disable(); this.analogueGaugeWidgetSettingsForm.get('colorValueBoxRect').disable(); this.analogueGaugeWidgetSettingsForm.get('colorValueBoxRectEnd').disable(); this.analogueGaugeWidgetSettingsForm.get('colorValueBoxBackground').disable(); @@ -198,8 +205,10 @@ export class AnalogueGaugeWidgetSettingsComponent extends WidgetSettingsComponen } this.analogueGaugeWidgetSettingsForm.get('unitTitle').updateValueAndValidity({emitEvent}); this.analogueGaugeWidgetSettingsForm.get('titleFont').updateValueAndValidity({emitEvent}); + this.analogueGaugeWidgetSettingsForm.get('titleColor').updateValueAndValidity({emitEvent}); this.analogueGaugeWidgetSettingsForm.get('valueInt').updateValueAndValidity({emitEvent}); this.analogueGaugeWidgetSettingsForm.get('valueFont').updateValueAndValidity({emitEvent}); + this.analogueGaugeWidgetSettingsForm.get('valueColor').updateValueAndValidity({emitEvent}); this.analogueGaugeWidgetSettingsForm.get('colorValueBoxRect').updateValueAndValidity({emitEvent}); this.analogueGaugeWidgetSettingsForm.get('colorValueBoxRectEnd').updateValueAndValidity({emitEvent}); this.analogueGaugeWidgetSettingsForm.get('colorValueBoxBackground').updateValueAndValidity({emitEvent}); @@ -208,50 +217,17 @@ export class AnalogueGaugeWidgetSettingsComponent extends WidgetSettingsComponen this.analogueGaugeWidgetSettingsForm.get('animationRule').updateValueAndValidity({emitEvent}); } - protected doUpdateSettings(settingsForm: UntypedFormGroup, settings: WidgetSettings) { - settingsForm.setControl('highlights', this.prepareHighlightsFormArray(settings.highlights), {emitEvent: false}); - } - - private prepareHighlightsFormArray(highlights: GaugeHighlight[] | undefined): UntypedFormArray { - const highlightsControls: Array = []; - if (highlights) { - highlights.forEach((highlight) => { - highlightsControls.push(this.fb.control(highlight, [Validators.required])); - }); + protected prepareOutputSettings(settings) { + settings.numbersFont.color = this.analogueGaugeWidgetSettingsForm.get('numbersColor').value; + if (settings.titleFont) { + settings.titleFont.color = this.analogueGaugeWidgetSettingsForm.get('titleColor').value; } - return this.fb.array(highlightsControls); - } - - highlightsFormArray(): UntypedFormArray { - return this.analogueGaugeWidgetSettingsForm.get('highlights') as UntypedFormArray; - } - - public trackByHighlightControl(index: number, highlightControl: AbstractControl): any { - return highlightControl; - } - - public removeHighlight(index: number) { - (this.analogueGaugeWidgetSettingsForm.get('highlights') as UntypedFormArray).removeAt(index); - } - - public addHighlight() { - const highlight: GaugeHighlight = { - from: null, - to: null, - color: null - }; - const highlightsArray = this.analogueGaugeWidgetSettingsForm.get('highlights') as UntypedFormArray; - const highlightControl = this.fb.control(highlight, [Validators.required]); - (highlightControl as any).new = true; - highlightsArray.push(highlightControl); - this.analogueGaugeWidgetSettingsForm.updateValueAndValidity(); - } - - highlightDrop(event: CdkDragDrop) { - const highlightsArray = this.analogueGaugeWidgetSettingsForm.get('highlights') as UntypedFormArray; - const highlight = highlightsArray.at(event.previousIndex); - highlightsArray.removeAt(event.previousIndex); - highlightsArray.insert(event.currentIndex, highlight); + settings.unitsFont.color = this.analogueGaugeWidgetSettingsForm.get('unitsColor').value; + if (settings.valueFont) { + settings.valueFont.color = this.analogueGaugeWidgetSettingsForm.get('valueColor').value; + settings.valueFont.shadowColor = this.analogueGaugeWidgetSettingsForm.get('valueColorShadow').value; + } + return settings; } } diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/gauge-highlight.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/gauge-highlight.component.html deleted file mode 100644 index f92edfcde5..0000000000 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/gauge-highlight.component.html +++ /dev/null @@ -1,61 +0,0 @@ - - - -
- -
-
{{ highlightRangeText() }}
-
-
-
-
-
- - -
-
- -
- -
-
- - widgets.gauge.highlight-from - - - - widgets.gauge.highlight-to - - -
- - -
-
-
-
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/gauge-highlight.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/gauge-highlight.component.ts deleted file mode 100644 index e5c1ec9fbc..0000000000 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/gauge/gauge-highlight.component.ts +++ /dev/null @@ -1,116 +0,0 @@ -/// -/// Copyright © 2016-2023 The Thingsboard Authors -/// -/// Licensed under the Apache License, Version 2.0 (the "License"); -/// you may not use this file except in compliance with the License. -/// You may obtain a copy of the License at -/// -/// http://www.apache.org/licenses/LICENSE-2.0 -/// -/// Unless required by applicable law or agreed to in writing, software -/// distributed under the License is distributed on an "AS IS" BASIS, -/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -/// See the License for the specific language governing permissions and -/// limitations under the License. -/// - -import { Component, EventEmitter, forwardRef, Input, OnInit, Output } from '@angular/core'; -import { ControlValueAccessor, UntypedFormBuilder, UntypedFormGroup, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; -import { PageComponent } from '@shared/components/page.component'; -import { Store } from '@ngrx/store'; -import { AppState } from '@core/core.state'; -import { TranslateService } from '@ngx-translate/core'; -import { isNumber } from '@core/utils'; - -export interface GaugeHighlight { - from: number; - to: number; - color: string; -} - -@Component({ - selector: 'tb-gauge-highlight', - templateUrl: './gauge-highlight.component.html', - styleUrls: ['./gauge-highlight.component.scss'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => GaugeHighlightComponent), - multi: true - } - ] -}) -export class GaugeHighlightComponent extends PageComponent implements OnInit, ControlValueAccessor { - - @Input() - disabled: boolean; - - @Input() - expanded = false; - - @Output() - removeHighlight = new EventEmitter(); - - private modelValue: GaugeHighlight; - - private propagateChange = null; - - public gaugeHighlightFormGroup: UntypedFormGroup; - - constructor(protected store: Store, - private translate: TranslateService, - private fb: UntypedFormBuilder) { - super(store); - } - - ngOnInit(): void { - this.gaugeHighlightFormGroup = this.fb.group({ - from: [null, []], - to: [null, []], - color: [null, []] - }); - this.gaugeHighlightFormGroup.valueChanges.subscribe(() => { - this.updateModel(); - }); - } - - registerOnChange(fn: any): void { - this.propagateChange = fn; - } - - registerOnTouched(fn: any): void { - } - - setDisabledState(isDisabled: boolean): void { - this.disabled = isDisabled; - if (isDisabled) { - this.gaugeHighlightFormGroup.disable({emitEvent: false}); - } else { - this.gaugeHighlightFormGroup.enable({emitEvent: false}); - } - } - - writeValue(value: GaugeHighlight): void { - this.modelValue = value; - this.gaugeHighlightFormGroup.patchValue( - value, {emitEvent: false} - ); - } - - highlightRangeText(): string { - const value: GaugeHighlight = this.gaugeHighlightFormGroup.value; - const from = isNumber(value.from) ? value.from : 0; - const to = isNumber(value.to) ? value.to : 0; - return `${from} - ${to}`; - } - - private updateModel() { - const value: GaugeHighlight = this.gaugeHighlightFormGroup.value; - this.modelValue = value; - if (this.gaugeHighlightFormGroup.valid) { - this.propagateChange(this.modelValue); - } else { - this.propagateChange(null); - } - } -} diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/liquid-level-card-widget-settings.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/liquid-level-card-widget-settings.component.html new file mode 100644 index 0000000000..59119c1fb8 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/liquid-level-card-widget-settings.component.html @@ -0,0 +1,260 @@ + + +
+
+
+
+
widgets.liquid-level-card.shape
+ + + {{ DataSourceTypeTranslations.get(type) | translate }} + + +
+ + + {{ ShapesTranslationMap.get(shape) | translate }} + + + +
+
widgets.liquid-level-card.shape-attribute-name
+ + +
+
+
widgets.liquid-level-card.shape-by-attribute
+
+
+
+
+
+
+
+
widgets.liquid-level-card.layout
+ + + {{ LevelCardLayoutTranslationMap.get(layout) | translate }} + + +
+
+
widgets.liquid-level-card.units
+
+
widgets.liquid-level-card.datasource-units
+ + +
+
+
widgets.liquid-level-card.widget-units
+
+ + + + {{ DataSourceTypeTranslations.get(type) | translate }} + + + + + + + + + +
+
+
+
widgets.liquid-level-card.total-volume
+
+ + + + {{ DataSourceTypeTranslations.get(type) | translate }} + + + + + + + warning + + + + + + + + +
+
+
+
+
widgets.liquid-level-card.color-and-font
+
+
widgets.liquid-level-card.tank-color
+ + +
+
+
widgets.liquid-level-card.liquid-color
+ + +
+
+
{{ 'widgets.background.background' | translate }}
+ + +
+
+
widgets.liquid-level-card.value
+
+ + + + +
+
+
+
widgets.liquid-level-card.total-volume
+
+ + + + +
+
+
+ + {{ 'widgets.liquid-level-card.background-overlay' | translate }} + + + +
+
+
+ + + + + {{ 'widget-config.tooltip' | translate }} + + + + +
+ + {{ 'widgets.liquid-level-card.level' | translate }} + +
+ + + + +
widget-config.decimals-suffix
+
+ + + + +
+
+
+ + {{ 'widgets.value-card.date' | translate }} + +
+ + + + + +
+
+
+
widgets.liquid-level-card.tooltip-background
+ + +
+
+
widgets.liquid-level-card.background-blur
+ + +
px
+
+
+
+
+
+
+
diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/liquid-level-card-widget-settings.component.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/liquid-level-card-widget-settings.component.ts new file mode 100644 index 0000000000..14f906d453 --- /dev/null +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/indicator/liquid-level-card-widget-settings.component.ts @@ -0,0 +1,306 @@ +/// +/// Copyright © 2016-2023 The Thingsboard Authors +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. +/// + +import { ChangeDetectorRef, Component, Injector, ViewChild } from '@angular/core'; +import { + DataKey, + Datasource, + DatasourceType, + WidgetSettings, + WidgetSettingsComponent +} from '@shared/models/widget.models'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { Store } from '@ngrx/store'; +import { AppState } from '@core/core.state'; +import { formatValue, isDefined } from '@core/utils'; +import { WidgetConfigComponentData } from '@home/models/widget-component.models'; +import { DateFormatProcessor, DateFormatSettings } from '@shared/models/widget-settings.models'; +import { + CapacityUnits, + createShapeLayout, + fetchEntityKeys, + fetchEntityKeysForDevice, + levelCardDefaultSettings, + LevelCardLayout, + levelCardLayoutTranslations, + LiquidWidgetDataSourceType, + LiquidWidgetDataSourceTypeTranslations, + loadSvgShapesMapping, + optionsFilter, + Shapes, + ShapesTranslations, + updatedFormSettingsValidators +} from '@home/components/widget/lib/indicator/liquid-level-widget.models'; +import { UnitsType } from '@shared/models/unit.models'; +import { ImageCardsSelectComponent } from '@home/components/widget/lib/settings/common/image-cards-select.component'; +import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; +import { Observable, of, ReplaySubject } from 'rxjs'; +import { map, share, tap } from 'rxjs/operators'; +import { ResourcesService } from '@core/services/resources.service'; +import { DataKeyType } from '@shared/models/telemetry/telemetry.models'; +import { UtilsService } from '@core/services/utils.service'; +import { EntityService } from '@core/http/entity.service'; + +@Component({ + selector: 'liquid-level-card-widget-settings', + templateUrl: './liquid-level-card-widget-settings.component.html', + styleUrls: [] +}) +export class LiquidLevelCardWidgetSettingsComponent extends WidgetSettingsComponent { + + @ViewChild('layoutsImageCardsSelect', { static: false }) layoutsImageCardsSelect: ImageCardsSelectComponent; + + @ViewChild('shapesImageCardsSelect', { static: false }) shapesImageCardsSelect: ImageCardsSelectComponent; + + public get volumeInput(): boolean { + const datasourceUnits = this.levelCardWidgetSettingsForm.get('datasourceUnits').value; + const layout: LevelCardLayout = this.levelCardWidgetSettingsForm.get('layout').value; + + if (layout === LevelCardLayout.absolute) { + return true; + } + return datasourceUnits !== CapacityUnits.percent; + } + + private get datasource(): Datasource { + if (this.widgetConfig.config.datasources && this.widgetConfig.config.datasources) { + return this.widgetConfig.config.datasources[0]; + } else { + return null; + } + } + + LevelCardLayout = LevelCardLayout; + LevelCardLayouts = Object.values(LevelCardLayout) as LevelCardLayout[]; + LevelCardLayoutTranslationMap = levelCardLayoutTranslations; + + DataSourceType = LiquidWidgetDataSourceType; + DataSourceTypes = Object.values(LiquidWidgetDataSourceType) as LiquidWidgetDataSourceType[]; + DataSourceTypeTranslations = LiquidWidgetDataSourceTypeTranslations; + + shapes = Object.values(Shapes) as Shapes[]; + shapesImageMap: Map = new Map(); + ShapesTranslationMap = ShapesTranslations; + + unitsType = UnitsType; + + levelCardWidgetSettingsForm: FormGroup; + + valuePreviewFn = this._valuePreviewFn.bind(this); + + tooltipValuePreviewFn = this._tooltipValuePreviewFn.bind(this); + + totalVolumeValuePreviewFn = this._totalVolumeValuePreviewFn.bind(this); + + datePreviewFn = this._datePreviewFn.bind(this); + + private keySearchText: string; + private latestKeySearchTextResult: Array; + + private functionTypeKeys: Array = []; + + private lastKeysId: string; + private lastFetchedKeys: Array; + + constructor(protected store: Store, + private $injector: Injector, + private fb: FormBuilder, + private resourcesService: ResourcesService, + private sanitizer: DomSanitizer, + private cd: ChangeDetectorRef, + private utils: UtilsService, + private entityService: EntityService) { + super(store); + } + + protected settingsForm(): FormGroup { + return this.levelCardWidgetSettingsForm; + } + + protected onWidgetConfigSet(widgetConfig: WidgetConfigComponentData) { + this.createSvgShapesMapping(); + + for (const type of this.utils.getPredefinedFunctionsList()) { + this.functionTypeKeys.push({ + name: type, + type: DataKeyType.function + }); + } + } + + protected defaultSettings(): WidgetSettings { + return levelCardDefaultSettings; + } + + protected onSettingsSet(settings: WidgetSettings) { + this.levelCardWidgetSettingsForm = this.fb.group({ + tankSelectionType: [settings.tankSelectionType, []], + selectedShape: [settings.selectedShape, [Validators.required]], + shapeAttributeName: [settings.shapeAttributeName, [Validators.required]], + tankColor: [settings.tankColor, []], + datasourceUnits: [settings.datasourceUnits, [Validators.required]], + + layout: [settings.layout, []], + + volumeSource: [settings.volumeSource, []], + volumeConstant: [settings.volumeConstant, [Validators.required, Validators.min(0.1)]], + volumeAttributeName: [settings.volumeAttributeName, [Validators.required]], + volumeUnits: [settings.volumeUnits, [Validators.required]], + volumeFont: [settings.volumeFont, []], + volumeColor: [settings.volumeColor, []], + valueFont: [settings.valueFont, []], + valueColor: [settings.valueColor, []], + units: [settings.units, [Validators.required]], + widgetUnitsSource: [settings.widgetUnitsSource, [Validators.required]], + widgetUnitsAttributeName: [settings.widgetUnitsAttributeName, [Validators.required]], + showBackgroundOverlay: [settings.showBackgroundOverlay, []], + backgroundOverlayColor: [settings.backgroundOverlayColor, []], + + liquidColor: [settings.liquidColor, []], + background: [settings.background], + + showTooltip: [settings.showTooltip, []], + showTooltipLevel: [settings.showTooltipLevel, []], + tooltipUnits: [settings.tooltipUnits, []], + tooltipLevelDecimals: [settings.tooltipLevelDecimals, []], + tooltipLevelFont: [settings.tooltipLevelFont, []], + tooltipLevelColor: [settings.tooltipLevelColor, []], + showTooltipDate: [settings.showTooltipDate, []], + tooltipDateFormat: [settings.tooltipDateFormat, []], + tooltipDateFont: [settings.tooltipDateFont, []], + tooltipDateColor: [settings.tooltipDateColor, []], + tooltipBackgroundColor: [settings.tooltipBackgroundColor, []], + tooltipBackgroundBlur: [settings.tooltipBackgroundBlur, []], + }); + + this.levelCardWidgetSettingsForm.get('selectedShape').valueChanges.subscribe(() => { + this.cd.detectChanges(); + this.layoutsImageCardsSelect?.imageCardsSelectOptions.notifyOnChanges(); + }); + } + + protected validatorTriggers(): string[] { + return [ + 'showBackgroundOverlay', 'showTooltip', 'showTooltipLevel', 'tankSelectionType', 'datasourceUnits', + 'showTooltipDate', 'layout', 'volumeSource', 'widgetUnitsSource' + ]; + } + + protected updateValidators(emitEvent: boolean, trigger?: string) { + updatedFormSettingsValidators(this.levelCardWidgetSettingsForm); + + if (this.levelCardWidgetSettingsForm.get('showBackgroundOverlay').value) { + this.levelCardWidgetSettingsForm.get('backgroundOverlayColor').enable({emitEvent: false}); + } else { + this.levelCardWidgetSettingsForm.get('backgroundOverlayColor').disable({emitEvent: false}); + } + } + + private createSvgShapesMapping(): void { + loadSvgShapesMapping(this.resourcesService).subscribe(shapeMap => { + this.shapesImageMap = shapeMap; + + this.cd.detectChanges(); + this.layoutsImageCardsSelect?.imageCardsSelectOptions.notifyOnChanges(); + this.shapesImageCardsSelect?.imageCardsSelectOptions.notifyOnChanges(); + }); + } + + createShape(svg: string, layout: LevelCardLayout): SafeUrl { + return createShapeLayout(svg, layout, this.sanitizer); + } + + private _valuePreviewFn(): string { + const units: string = this.widgetConfig.config.units; + const decimals: number = this.widgetConfig.config.decimals; + return formatValue(32, decimals, units, true); + } + + private _tooltipValuePreviewFn() { + const units: string = this.levelCardWidgetSettingsForm.get('tooltipUnits').value; + const decimals: number = this.levelCardWidgetSettingsForm.get('tooltipLevelDecimals').value; + return formatValue(32, decimals, units, true); + } + + private _totalVolumeValuePreviewFn() { + const value = this.levelCardWidgetSettingsForm.get('volumeConstant').value; + const datasourceUnits = this.levelCardWidgetSettingsForm.get('datasourceUnits').value; + const decimals: number = this.widgetConfig.config.decimals; + let units: string = this.widgetConfig.config.units; + + if (datasourceUnits !== CapacityUnits.percent) { + units = datasourceUnits; + } + + return formatValue((isDefined(value) ? value : 500), decimals, units, true); + } + + private _datePreviewFn(): string { + const dateFormat: DateFormatSettings = this.levelCardWidgetSettingsForm.get('tooltipDateFormat').value; + const processor = DateFormatProcessor.fromSettings(this.$injector, dateFormat); + processor.update(Date.now()); + return processor.formatted; + } + + public fetchOptions(searchText: string): Observable> { + if (this.keySearchText !== searchText) { + this.keySearchText = searchText; + const dataKeyFilter = optionsFilter(this.keySearchText); + return this.getKeys().pipe( + tap(res => this.lastFetchedKeys !== res ? this.lastFetchedKeys = res : []), + map(name => name?.filter(dataKeyFilter).map(key => key.name)), + tap(res => this.latestKeySearchTextResult = res) + ); + } + return of(this.latestKeySearchTextResult); + } + + private getKeys(): Observable> { + let fetchObservable: Observable>; + if (this.datasource?.type === DatasourceType.function) { + fetchObservable = of(this.functionTypeKeys); + } else if (this.datasource?.type === DatasourceType.entity && this.datasource?.entityAliasId || + this.datasource?.type === DatasourceType.device && this.datasource?.deviceId) { + if (this.datasource?.type === DatasourceType.device) { + if (this.lastKeysId !== this.datasource?.deviceId || !this.lastFetchedKeys) { + this.lastKeysId = this.datasource.deviceId; + fetchObservable = fetchEntityKeysForDevice(this.datasource?.deviceId, [DataKeyType.attribute], + this.entityService); + } else { + fetchObservable = of(this.lastFetchedKeys); + } + } else { + if (this.lastKeysId !== this.datasource?.entityAliasId || !this.lastFetchedKeys) { + this.lastKeysId = this.datasource.entityAliasId; + fetchObservable = fetchEntityKeys(this.datasource?.entityAliasId, [DataKeyType.attribute], + this.entityService, this.aliasController); + } else { + fetchObservable = of(this.lastFetchedKeys); + } + } + } else { + fetchObservable = of([]); + } + return fetchObservable.pipe( + share({ + connector: () => new ReplaySubject(1), + resetOnError: false, + resetOnComplete: false, + resetOnRefCountZero: false + }) + ); + } +} diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/settings/widget-settings.module.ts b/ui-ngx/src/app/modules/home/components/widget/lib/settings/widget-settings.module.ts index 33b4323fdf..2366bd0321 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/settings/widget-settings.module.ts +++ b/ui-ngx/src/app/modules/home/components/widget/lib/settings/widget-settings.module.ts @@ -58,7 +58,6 @@ import { import { AlarmsTableKeySettingsComponent } from '@home/components/widget/lib/settings/alarm/alarms-table-key-settings.component'; -import { GaugeHighlightComponent } from '@home/components/widget/lib/settings/gauge/gauge-highlight.component'; import { AnalogueRadialGaugeWidgetSettingsComponent } from '@home/components/widget/lib/settings/gauge/analogue-radial-gauge-widget-settings.component'; @@ -300,6 +299,9 @@ import { import { ProgressBarWidgetSettingsComponent } from '@home/components/widget/lib/settings/cards/progress-bar-widget-settings.component'; +import { + LiquidLevelCardWidgetSettingsComponent +} from '@home/components/widget/lib/settings/indicator/liquid-level-card-widget-settings.component'; @NgModule({ declarations: [ @@ -318,7 +320,6 @@ import { EntitiesTableKeySettingsComponent, AlarmsTableWidgetSettingsComponent, AlarmsTableKeySettingsComponent, - GaugeHighlightComponent, AnalogueRadialGaugeWidgetSettingsComponent, AnalogueLinearGaugeWidgetSettingsComponent, AnalogueCompassWidgetSettingsComponent, @@ -410,7 +411,8 @@ import { WindSpeedDirectionWidgetSettingsComponent, SignalStrengthWidgetSettingsComponent, ValueChartCardWidgetSettingsComponent, - ProgressBarWidgetSettingsComponent + ProgressBarWidgetSettingsComponent, + LiquidLevelCardWidgetSettingsComponent ], imports: [ CommonModule, @@ -434,7 +436,6 @@ import { EntitiesTableKeySettingsComponent, AlarmsTableWidgetSettingsComponent, AlarmsTableKeySettingsComponent, - GaugeHighlightComponent, AnalogueRadialGaugeWidgetSettingsComponent, AnalogueLinearGaugeWidgetSettingsComponent, AnalogueCompassWidgetSettingsComponent, @@ -526,7 +527,8 @@ import { WindSpeedDirectionWidgetSettingsComponent, SignalStrengthWidgetSettingsComponent, ValueChartCardWidgetSettingsComponent, - ProgressBarWidgetSettingsComponent + ProgressBarWidgetSettingsComponent, + LiquidLevelCardWidgetSettingsComponent, ] }) export class WidgetSettingsModule { @@ -607,5 +609,6 @@ export const widgetSettingsComponentsMap: {[key: string]: Type -
- - - -
- admin.general-settings -
-
-
- - -
- -
-
- - admin.base-url - - - {{ 'admin.base-url-required' | translate }} - - - + + + +
+ admin.general-settings +
+
+
+ + +
+ + +
+ + admin.base-url + + + {{ 'admin.base-url-required' | translate }} + + +
+ {{ 'admin.prohibit-different-url' | translate }} - -
admin.prohibit-different-url-hint
-
- + +
+
+
+ + +
+ +
+
+ + + +
admin.device-connectivity.device-connectivity
+
+
+ + +
+ +
+
+ + {{ "admin.device-connectivity.http-s" | translate }} + {{ 'admin.device-connectivity.mqtt-s' | translate }} + {{ 'admin.device-connectivity.coap-s' | translate }} + +
{{ 'admin.device-connectivity.hint' | translate }}
+
+
+ + + + + + + + + + + + + +
+ + {{ 'admin.device-connectivity.' + protocol | translate }} + +
+ + admin.device-connectivity.host + + + + admin.device-connectivity.port + + + {{ 'admin.device-connectivity.port-pattern' | translate }} + + + {{ 'admin.device-connectivity.port-range' | translate }} + + +
-
+ +
+ + +
-
-
-
+ + + diff --git a/ui-ngx/src/app/modules/home/pages/admin/general-settings.component.scss b/ui-ngx/src/app/modules/home/pages/admin/general-settings.component.scss index 4b2d51d1e9..80dcf76da8 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/general-settings.component.scss +++ b/ui-ngx/src/app/modules/home/pages/admin/general-settings.component.scss @@ -13,11 +13,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +@import "../../../../../scss/constants"; + :host { -} + .settings-card { + .toggle-group { + max-width: 670px; + width: 100%; + margin: 0 auto; + + .tb-form-hint { + text-align: center; + } + } -:host ::ng-deep { - .mat-checkbox-layout { - white-space: normal; + @media #{$mat-xs} { + .tb-form-row { + gap: 0; + } + } } } diff --git a/ui-ngx/src/app/modules/home/pages/admin/general-settings.component.ts b/ui-ngx/src/app/modules/home/pages/admin/general-settings.component.ts index 9aee40d431..f96e34f449 100644 --- a/ui-ngx/src/app/modules/home/pages/admin/general-settings.component.ts +++ b/ui-ngx/src/app/modules/home/pages/admin/general-settings.component.ts @@ -14,62 +14,130 @@ /// limitations under the License. /// -import { Component, OnInit } from '@angular/core'; +import { Component, OnDestroy } from '@angular/core'; import { Store } from '@ngrx/store'; import { AppState } from '@core/core.state'; import { PageComponent } from '@shared/components/page.component'; -import { Router } from '@angular/router'; -import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; -import { AdminSettings, GeneralSettings } from '@shared/models/settings.models'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { + AdminSettings, + DeviceConnectivityProtocol, + DeviceConnectivitySettings, + GeneralSettings +} from '@shared/models/settings.models'; import { AdminService } from '@core/http/admin.service'; import { HasConfirmForm } from '@core/guards/confirm-on-exit.guard'; +import { Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; @Component({ selector: 'tb-general-settings', templateUrl: './general-settings.component.html', styleUrls: ['./general-settings.component.scss', './settings-card.scss'] }) -export class GeneralSettingsComponent extends PageComponent implements OnInit, HasConfirmForm { +export class GeneralSettingsComponent extends PageComponent implements HasConfirmForm, OnDestroy { - generalSettings: UntypedFormGroup; - adminSettings: AdminSettings; + generalSettings: FormGroup; + deviceConnectivitySettingsForm: FormGroup; + + protocol: DeviceConnectivityProtocol = 'http'; + + private adminSettings: AdminSettings; + private deviceConnectivitySettings: AdminSettings; + + private readonly destroy$ = new Subject(); constructor(protected store: Store, - private router: Router, private adminService: AdminService, - public fb: UntypedFormBuilder) { + public fb: FormBuilder) { super(store); + this.buildGeneralServerSettingsForm(); + this.adminService.getAdminSettings('general') + .subscribe(adminSettings => this.processGeneralSettings(adminSettings)); + this.buildDeviceConnectivitySettingsForm(); + this.adminService.getAdminSettings('connectivity') + .subscribe(deviceConnectivitySettings => this.processDeviceConnectivitySettings(deviceConnectivitySettings)); } - ngOnInit() { - this.buildGeneralServerSettingsForm(); - this.adminService.getAdminSettings('general').subscribe( - (adminSettings) => { - this.adminSettings = adminSettings; - this.generalSettings.reset(this.adminSettings.jsonValue); - } - ); + ngOnDestroy() { + super.ngOnDestroy(); + this.destroy$.next(); + this.destroy$.complete(); } - buildGeneralServerSettingsForm() { + private buildGeneralServerSettingsForm() { this.generalSettings = this.fb.group({ baseUrl: ['', [Validators.required]], prohibitDifferentUrl: ['',[]] }); } + private buildDeviceConnectivitySettingsForm() { + this.deviceConnectivitySettingsForm = this.fb.group({ + http: this.buildDeviceConnectivityInfoForm(), + https: this.buildDeviceConnectivityInfoForm(), + mqtt: this.buildDeviceConnectivityInfoForm(), + mqtts: this.buildDeviceConnectivityInfoForm(), + coap: this.buildDeviceConnectivityInfoForm(), + coaps: this.buildDeviceConnectivityInfoForm() + }); + } + + private buildDeviceConnectivityInfoForm(): FormGroup { + const formGroup = this.fb.group({ + enabled: [false, []], + host: [{value: '', disabled: true}], + port: [{value: null, disabled: true}, [Validators.min(1), Validators.max(65535), Validators.pattern('[0-9]*')]] + }); + formGroup.get('enabled').valueChanges.pipe( + takeUntil(this.destroy$) + ).subscribe(value => { + if (value) { + formGroup.get('host').enable({emitEvent: false}); + formGroup.get('port').enable({emitEvent: false}); + } else { + formGroup.get('host').disable({emitEvent: false}); + formGroup.get('port').disable({emitEvent: false}); + } + }); + return formGroup; + } + save(): void { this.adminSettings.jsonValue = {...this.adminSettings.jsonValue, ...this.generalSettings.value}; - this.adminService.saveAdminSettings(this.adminSettings).subscribe( - (adminSettings) => { - this.adminSettings = adminSettings; - this.generalSettings.reset(this.adminSettings.jsonValue); - } - ); + this.adminService.saveAdminSettings(this.adminSettings) + .subscribe(adminSettings => this.processGeneralSettings(adminSettings)); + } + + saveDeviceConnectivitySettings(): void { + this.deviceConnectivitySettings.jsonValue = { + ...this.deviceConnectivitySettings.jsonValue, + ...this.deviceConnectivitySettingsForm.value + }; + this.adminService.saveAdminSettings(this.deviceConnectivitySettings) + .subscribe(deviceConnectivitySettings => this.processDeviceConnectivitySettings(deviceConnectivitySettings)); + } + + discardGeneralSettings(): void { + this.generalSettings.reset(this.adminSettings.jsonValue); + } + + discardDeviceConnectivitySettings(): void { + this.deviceConnectivitySettingsForm.reset(this.deviceConnectivitySettings.jsonValue); + } + + private processGeneralSettings(generalSettings: AdminSettings): void { + this.adminSettings = generalSettings; + this.generalSettings.reset(this.adminSettings.jsonValue); + } + + private processDeviceConnectivitySettings(deviceConnectivitySettings: AdminSettings): void { + this.deviceConnectivitySettings = deviceConnectivitySettings; + this.deviceConnectivitySettingsForm.reset(this.deviceConnectivitySettings.jsonValue); } - confirmForm(): UntypedFormGroup { - return this.generalSettings; + confirmForm(): FormGroup { + return this.generalSettings.dirty ? this.generalSettings : this.deviceConnectivitySettingsForm; } } diff --git a/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle.component.html b/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle.component.html index bfc61fb98c..fcebcc1e6c 100644 --- a/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle.component.html +++ b/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle.component.html @@ -58,6 +58,10 @@ {{descriptionInput.value?.length || 0}}/1024 + + widgets-bundle.order + + diff --git a/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle.component.ts b/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle.component.ts index f7634e5c53..be34b38161 100644 --- a/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle.component.ts +++ b/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle.component.ts @@ -50,7 +50,8 @@ export class WidgetsBundleComponent extends EntityComponent { { title: [entity ? entity.title : '', [Validators.required, Validators.maxLength(255)]], image: [entity ? entity.image : ''], - description: [entity ? entity.description : '', Validators.maxLength(1024)] + description: [entity ? entity.description : '', Validators.maxLength(1024)], + order: [entity ? entity.order : null] } ); } @@ -59,7 +60,8 @@ export class WidgetsBundleComponent extends EntityComponent { this.entityForm.patchValue({ title: entity.title, image: entity.image, - description: entity.description + description: entity.description, + order: entity.order }); } } diff --git a/ui-ngx/src/app/shared/components/dialog/alert-dialog.component.html b/ui-ngx/src/app/shared/components/dialog/alert-dialog.component.html index de56079efd..fb0c93b491 100644 --- a/ui-ngx/src/app/shared/components/dialog/alert-dialog.component.html +++ b/ui-ngx/src/app/shared/components/dialog/alert-dialog.component.html @@ -16,7 +16,12 @@ -->

{{data.title}}

-
+ +
+
+ +
+
diff --git a/ui-ngx/src/app/shared/components/dialog/alert-dialog.component.ts b/ui-ngx/src/app/shared/components/dialog/alert-dialog.component.ts index c29d66b1cc..c7c26bc7a2 100644 --- a/ui-ngx/src/app/shared/components/dialog/alert-dialog.component.ts +++ b/ui-ngx/src/app/shared/components/dialog/alert-dialog.component.ts @@ -21,6 +21,7 @@ export interface AlertDialogData { title: string; message: string; ok: string; + textMode?: boolean; } @Component({ diff --git a/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.ts b/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.ts index cb7cc7b63d..580a8fb891 100644 --- a/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.ts +++ b/ui-ngx/src/app/shared/components/entity/entity-subtype-list.component.ts @@ -166,7 +166,7 @@ export class EntitySubTypeListComponent implements ControlValueAccessor, OnInit, : this.translate.instant('device.any-device'); this.secondaryPlaceholder = '+' + this.translate.instant('device.device-type'); this.noSubtypesMathingText = 'device.no-device-types-matching'; - this.subtypeListEmptyText = 'device.device-type-list-empty'; + this.subtypeListEmptyText = 'device.device-profile-type-list-empty'; this.broadcastSubscription = this.broadcast.on('deviceSaved', () => { this.entitySubtypes = null; }); diff --git a/ui-ngx/src/app/shared/components/markdown.component.ts b/ui-ngx/src/app/shared/components/markdown.component.ts index 7936d2f51a..168242da0f 100644 --- a/ui-ngx/src/app/shared/components/markdown.component.ts +++ b/ui-ngx/src/app/shared/components/markdown.component.ts @@ -179,6 +179,7 @@ export class TbMarkdownComponent implements OnChanges { this.error = null; } catch (error) { readyObservable = this.handleError(template, error, styles); + this.cd.detectChanges(); } readyObservable.subscribe(() => { this.ready.emit(); diff --git a/ui-ngx/src/app/shared/components/rule-chain/rule-chain-select.component.scss b/ui-ngx/src/app/shared/components/rule-chain/rule-chain-select.component.scss index c69661ad76..9cbb97cba9 100644 --- a/ui-ngx/src/app/shared/components/rule-chain/rule-chain-select.component.scss +++ b/ui-ngx/src/app/shared/components/rule-chain/rule-chain-select.component.scss @@ -16,7 +16,10 @@ :host { min-width: 52px; width: 100%; - padding: 0 6px; + padding: 0; + .tb-rule-select { + width: 100%; + } .tb-rule-chain-select { display: flex; min-height: 100%; diff --git a/ui-ngx/src/app/shared/components/string-autocomplete.component.html b/ui-ngx/src/app/shared/components/string-autocomplete.component.html new file mode 100644 index 0000000000..4750f71d63 --- /dev/null +++ b/ui-ngx/src/app/shared/components/string-autocomplete.component.html @@ -0,0 +1,51 @@ + + + {{label}} + + + + warning + + + {{errorText}} + + + + + + + diff --git a/ui-ngx/src/app/shared/components/string-autocomplete.component.scss b/ui-ngx/src/app/shared/components/string-autocomplete.component.scss new file mode 100644 index 0000000000..2d96ee0d5e --- /dev/null +++ b/ui-ngx/src/app/shared/components/string-autocomplete.component.scss @@ -0,0 +1,43 @@ +/** + * Copyright © 2016-2023 The Thingsboard Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +:host { + mat-form-field { + display: flex; + flex: 1; + max-width: 100%; + box-sizing: border-box; + + .tb-autocomplete.tb-option-input-autocomplete { + .mat-mdc-option { + border-bottom: none; + + .mdc-list-item__primary-text { + flex: 1; + display: flex; + flex-direction: row; + gap: 8px; + + .tb-option { + font-size: 14px; + font-weight: 400; + line-height: 20px; + letter-spacing: 0.2px; + } + } + } + } + } +} diff --git a/ui-ngx/src/app/shared/components/string-autocomplete.component.ts b/ui-ngx/src/app/shared/components/string-autocomplete.component.ts new file mode 100644 index 0000000000..df17ace6c7 --- /dev/null +++ b/ui-ngx/src/app/shared/components/string-autocomplete.component.ts @@ -0,0 +1,180 @@ +/// +/// Copyright © 2016-2023 The Thingsboard Authors +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. +/// + +import { + Component, + Input, + forwardRef, + OnInit, + ViewChild, + ElementRef +} from '@angular/core'; +import { + ControlValueAccessor, + NG_VALUE_ACCESSOR, + FormControl, + Validators, + FormBuilder +} from '@angular/forms'; +import { Observable, of } from 'rxjs'; +import { tap, map, switchMap, take } from 'rxjs/operators'; +import { TranslateService } from '@ngx-translate/core'; +import { coerceBoolean } from '@shared/decorators/coercion'; +import { MatFormFieldAppearance, SubscriptSizing } from '@angular/material/form-field'; + +@Component({ + selector: 'tb-string-autocomplete', + templateUrl: './string-autocomplete.component.html', + styleUrls: ['./string-autocomplete.component.scss'], + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => StringAutocompleteComponent), + multi: true + } + ] +}) +export class StringAutocompleteComponent implements ControlValueAccessor, OnInit { + + @ViewChild('nameInput', {static: true}) nameInput: ElementRef; + + @Input() + disabled: boolean; + + @Input() + @coerceBoolean() + required = false; + + @Input() + fetchOptionsFn: (searchText?: string) => Observable>; + + @Input() + placeholderText: string = this.translate.instant('widget-config.set'); + + @Input() + subscriptSizing: SubscriptSizing = 'dynamic'; + + @Input() + additionalClass: string | string[] | Record = 'tb-inline-field tb-suffix-show-on-hover'; + + @Input() + appearance: MatFormFieldAppearance = 'outline'; + + @Input() + label: string; + + @Input() + tooltipClass = 'tb-error-tooltip'; + + @Input() + errorText: string; + + @Input() + @coerceBoolean() + showInlineError = false; + + selectionFormControl: FormControl; + + modelValue: string | null; + + filteredOptions$: Observable>; + + searchText = ''; + + private dirty = false; + + private propagateChange = (_val: any) => {}; + + constructor(private fb: FormBuilder, + private translate: TranslateService) { + } + + ngOnInit() { + this.selectionFormControl = this.fb.control('', this.required ? [Validators.required] : []); + this.filteredOptions$ = this.selectionFormControl.valueChanges + .pipe( + tap(value => this.updateView(value)), + map(value => value ? value : ''), + switchMap(value => this.fetchOptionsFn ? this.fetchOptionsFn(value) : of([])) + ); + } + + writeValue(option?: string): void { + this.searchText = ''; + this.modelValue = option ? option : null; + + if (this.fetchOptionsFn) { + this.fetchOptionsFn(option) + .pipe( + map(options => { + if (options) { + const foundOption = options.find(opt => opt === option); + return foundOption ? foundOption : option; + } + + return option; + }), + take(1) + ) + .subscribe(result => { + this.selectionFormControl.patchValue(result, { emitEvent: false }); + this.dirty = true; + }); + } else { + this.selectionFormControl.patchValue(null, { emitEvent: false }); + this.dirty = true; + } + } + + onFocus() { + if (this.dirty) { + this.selectionFormControl.updateValueAndValidity({onlySelf: true, emitEvent: true}); + this.dirty = false; + } + } + + updateView(value: string) { + this.searchText = value ? value : ''; + if (this.modelValue !== value) { + this.modelValue = value; + this.propagateChange(this.modelValue); + } + } + + registerOnChange(fn: any): void { + this.propagateChange = fn; + } + + registerOnTouched(fn: any): void { + } + + setDisabledState(isDisabled: boolean): void { + this.disabled = isDisabled; + if (this.disabled) { + this.selectionFormControl.disable({emitEvent: false}); + } else { + this.selectionFormControl.enable({emitEvent: false}); + } + } + + clear() { + this.selectionFormControl.patchValue(null, {emitEvent: true}); + setTimeout(() => { + this.nameInput.nativeElement.blur(); + this.nameInput.nativeElement.focus(); + }, 0); + } +} diff --git a/ui-ngx/src/app/shared/components/unit-input.component.html b/ui-ngx/src/app/shared/components/unit-input.component.html index c15b232444..b0f3625eb0 100644 --- a/ui-ngx/src/app/shared/components/unit-input.component.html +++ b/ui-ngx/src/app/shared/components/unit-input.component.html @@ -20,13 +20,20 @@ placeholder="{{ 'widget-config.set' | translate }}" (focusin)="onFocus()" [matAutocomplete]="unitsAutocomplete"> - + + warning + >; @@ -73,7 +87,7 @@ export class UnitInputComponent implements ControlValueAccessor, OnInit { } ngOnInit() { - this.unitsFormControl = this.fb.control('', []); + this.unitsFormControl = this.fb.control('', this.required ? [Validators.required] : []); this.filteredUnits = this.unitsFormControl.valueChanges .pipe( tap(value => { @@ -157,11 +171,16 @@ export class UnitInputComponent implements ControlValueAccessor, OnInit { private unitsConstant(): Observable> { if (this.fetchUnits$ === null) { this.fetchUnits$ = getUnits(this.resourcesService).pipe( - map(units => units.map(u => ({ - symbol: u.symbol, - name: this.translate.instant(u.name), - tags: u.tags - }))), + map((units) => { + if (this.tagFilter) { + units = units.filter(u => u.tags.includes(this.tagFilter)); + } + return units.map(u => ({ + symbol: u.symbol, + name: this.translate.instant(u.name), + tags: u.tags + })); + }), shareReplay(1) ); } diff --git a/ui-ngx/src/app/shared/models/settings.models.ts b/ui-ngx/src/app/shared/models/settings.models.ts index 14f601dbe4..9238dae197 100644 --- a/ui-ngx/src/app/shared/models/settings.models.ts +++ b/ui-ngx/src/app/shared/models/settings.models.ts @@ -87,6 +87,16 @@ export interface GeneralSettings { baseUrl: string; } +export type DeviceConnectivityProtocol = 'http' | 'https' | 'mqtt' | 'mqtts' | 'coap' | 'coaps'; + +export interface DeviceConnectivityInfo { + enabled: boolean; + host: string; + port: number; +} + +export type DeviceConnectivitySettings = Record; + export interface UserPasswordPolicy { minimumLength: number; minimumUppercaseLetters: number; diff --git a/ui-ngx/src/app/shared/models/unit.models.ts b/ui-ngx/src/app/shared/models/unit.models.ts index 7d9f88a068..408c0b23b9 100644 --- a/ui-ngx/src/app/shared/models/unit.models.ts +++ b/ui-ngx/src/app/shared/models/unit.models.ts @@ -23,6 +23,15 @@ export interface Unit { tags: string[]; } +export enum UnitsType { + capacity = 'capacity' +} + +export enum Units { + percent = '%', + liters = 'L' +} + export const unitBySymbol = (_units: Array, symbol: string): Unit => _units.find(u => u.symbol === symbol); const searchUnitTags = (unit: Unit, searchText: string): boolean => diff --git a/ui-ngx/src/app/shared/models/widget-settings.models.ts b/ui-ngx/src/app/shared/models/widget-settings.models.ts index bd10859e55..165a4369bc 100644 --- a/ui-ngx/src/app/shared/models/widget-settings.models.ts +++ b/ui-ngx/src/app/shared/models/widget-settings.models.ts @@ -401,6 +401,33 @@ export const textStyle = (font?: Font, letterSpacing = 'normal'): ComponentStyle return style; }; +export const inlineTextStyle = (font?: Font, letterSpacing = 'normal'): ComponentStyle => { + const style: ComponentStyle = { + letterSpacing + }; + if (font?.style) { + style['font-style'] = font.style; + } + if (font?.weight) { + style['font-weight'] = font.weight; + } + if (font?.lineHeight) { + style['line-height'] = font.lineHeight; + } + if (font?.size) { + style['font-size'] = (font.size + (font.sizeUnit || 'px')); + } + if (font?.family) { + style['font-family'] = font.family + + (font.family !== 'Roboto' ? ', Roboto' : ''); + } + return style; +}; + +export const cssTextFromInlineStyle = (styleObj: { [key: string]: string | number }): string => Object.entries(styleObj) + .map(([key, value]) => `${key}: ${value}`) + .join('; '); + export const isFontSet = (font: Font): boolean => (!!font && !!font.style && !!font.weight && !!font.size && !!font.family); export const isFontPartiallySet = (font: Font): boolean => (!!font && (!!font.style || !!font.weight || !!font.size || !!font.family)); diff --git a/ui-ngx/src/app/shared/models/widgets-bundle.model.ts b/ui-ngx/src/app/shared/models/widgets-bundle.model.ts index c7eb999221..476c6ee029 100644 --- a/ui-ngx/src/app/shared/models/widgets-bundle.model.ts +++ b/ui-ngx/src/app/shared/models/widgets-bundle.model.ts @@ -24,4 +24,5 @@ export interface WidgetsBundle extends BaseData, ExportableEnti title: string; image: string; description: string; + order: number; } diff --git a/ui-ngx/src/app/shared/shared.module.ts b/ui-ngx/src/app/shared/shared.module.ts index 2211f2e0e1..042e453fe1 100644 --- a/ui-ngx/src/app/shared/shared.module.ts +++ b/ui-ngx/src/app/shared/shared.module.ts @@ -199,6 +199,7 @@ import { MaterialIconsComponent } from '@shared/components/material-icons.compon import { ColorPickerPanelComponent } from '@shared/components/color-picker/color-picker-panel.component'; import { TbIconComponent } from '@shared/components/icon.component'; import { HintTooltipIconComponent } from '@shared/components/hint-tooltip-icon.component'; +import { StringAutocompleteComponent } from '@shared/components/string-autocomplete.component'; export function MarkedOptionsFactory(markedOptionsService: MarkedOptionsService) { return markedOptionsService; @@ -374,6 +375,7 @@ export function MarkedOptionsFactory(markedOptionsService: MarkedOptionsService) ToggleOption, ToggleSelectComponent, UnitInputComponent, + StringAutocompleteComponent, MaterialIconsComponent, RuleChainSelectComponent, TbIconComponent, @@ -609,6 +611,7 @@ export function MarkedOptionsFactory(markedOptionsService: MarkedOptionsService) ToggleOption, ToggleSelectComponent, UnitInputComponent, + StringAutocompleteComponent, MaterialIconsComponent, RuleChainSelectComponent, TbIconComponent, diff --git a/ui-ngx/src/assets/help/en_US/widget/lib/indicator/shape_attribute_fn.md b/ui-ngx/src/assets/help/en_US/widget/lib/indicator/shape_attribute_fn.md new file mode 100644 index 0000000000..f2e69877d2 --- /dev/null +++ b/ui-ngx/src/assets/help/en_US/widget/lib/indicator/shape_attribute_fn.md @@ -0,0 +1,69 @@ +#### Shape attribute name + +A string expression value that allows you dynamically select shape image depending on attribute name (ex. tankShape). + +**Attribute values that could be used to add the image:** + +Alt text + +``` +Vertical Oval +{:copy-code} +``` +Alt text + +``` +Vertical Cylinder +{:copy-code} +``` +Alt text + +``` +Vertical Capsule +{:copy-code} +``` +Alt text + +``` +Rectangle +{:copy-code} +``` +Alt text + +``` +Horizontal Oval +{:copy-code} +``` +Alt text + +``` +Horizontal Ellipse +{:copy-code} +``` +Alt text + +``` +Horizontal Dish Ends +{:copy-code} +``` +Alt text + +``` +Horizontal Cylinder +{:copy-code} +``` +Alt text + +``` +Horizontal Capsule +{:copy-code} +``` +Alt text + +``` +Horizontal 2:1 Elliptical +{:copy-code} +``` + +
+
diff --git a/ui-ngx/src/assets/locale/locale.constant-de_DE.json b/ui-ngx/src/assets/locale/locale.constant-de_DE.json index 631f0f63aa..87579470d2 100644 --- a/ui-ngx/src/assets/locale/locale.constant-de_DE.json +++ b/ui-ngx/src/assets/locale/locale.constant-de_DE.json @@ -212,7 +212,7 @@ "filter-type-single-entity": "Einzelne Entität", "filter-type-entity-list": "Entitätsliste", "filter-type-entity-name": "Entitätsname", - "filter-type-entity-type": "Entitätstyp", + "filter-type-entity-type": "Entitätstyp", "filter-type-state-entity": "Entität aus dem Dashboard Status", "filter-type-state-entity-description": "Entität aus den Dashboard Status Parametern", "filter-type-asset-type": "Objekttyp", @@ -768,17 +768,17 @@ "edge": "Edge", "edge-instances": "Kanteninstanzen", "edge-file": "Edge-Datei", - "management": "Rand verwalten", - "no-edges-matching": "Keine passenden Rand '{{entity}}' gefunden.", - "add": "Rand hinzufügen", - "no-edges-text": "Kein Rand gefunden.", - "edge-details": "Details der Rand", - "add-edge-text": "Neue Rand hinzufügen", - "delete": "Rand löschen", - "delete-edge-title": "Möchten Sie des Rands wirklich löschen '{{edgeName}}'?", - "delete-edge-text": "Seien Sie vorsichtig, nach der Bestätigung werden der Rand und alle zugehörigen Daten nicht wiederhergestellt.", - "delete-edges-title": "Sind Sie sicher, dass Sie die Rand löschen möchten { count, plural, =1 {1 Rand} other {# Rand} }?", - "delete-edges-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Rand entfernt und alle zugehörigen Daten werden nicht wiederhergestellt.", + "management": "Edge verwalten", + "no-edges-matching": "Keine passenden Edge '{{entity}}' gefunden.", + "add": "Edge hinzufügen", + "no-edges-text": "Keine Edge gefunden.", + "edge-details": "Details der Edge", + "add-edge-text": "Neue Edge hinzufügen", + "delete": "Edge löschen", + "delete-edge-title": "Möchten Sie des Edges wirklich löschen '{{edgeName}}'?", + "delete-edge-text": "Seien Sie vorsichtig, nach der Bestätigung werden der Edge und alle zugehörigen Daten nicht wiederhergestellt.", + "delete-edges-title": "Sind Sie sicher, dass Sie die Edge löschen möchten { count, plural, =1 {1 Edge} other {# Edges} }?", + "delete-edges-text": "Vorsicht, nach Bestätigung werden alle ausgewählten Edge entfernt und alle zugehörigen Daten werden nicht wiederhergestellt.", "name": "Name", "name-starts-with": "Der Kantenname beginnt mit", "name-required": "Name ist erforderlich.", @@ -787,62 +787,62 @@ "events": "Ereignisse", "copy-id": "Regelketten-ID kopieren", "id-copied-message": "Regelketten-ID wurde in die Zwischenablage kopiert", - "sync": "Sync Edge", - "edge-required": "Rand ist erforderlich.", - "edge-type": "Randtyp", - "edge-type-required": "Randtyp ist erforderlich.", + "sync": "Edge synchonisieren", + "edge-required": "Edge ist erforderlich.", + "edge-type": "Edgetyp", + "edge-type-required": "Edgetyp ist erforderlich.", "event-action": "Ereignisaktion", "entity-id": "Entität ID", - "select-edge-type": "Randtyp auswählen", + "select-edge-type": "Edgetyp auswählen", "assign-to-customer": "Einem Kunden zuordnen", - "assign-to-customer-text": "Bitte wählen Sie den Kunden aus, dem die Rand zugeordnet werden sollen", - "assign-edge-to-customer": "Rand dem Kunden zuordnen", - "assign-edge-to-customer-text": "Bitte wählen Sie die Rand aus, die dem Kunden zugeordnet werden sollen", + "assign-to-customer-text": "Bitte wählen Sie den Kunden aus, dem die Edge zugeordnet werden sollen", + "assign-edge-to-customer": "Edge dem Kunden zuordnen", + "assign-edge-to-customer-text": "Bitte wählen Sie die Edge aus, die dem Kunden zugeordnet werden sollen", "assignedToCustomer": "Dem Kunden zugewiesen", "edge-public": "Edge ist öffentlich", "assigned-to-customer": "Kunden Zuordnung", "unassign-from-customer": "Kunden Zuordnung aufgehoben", - "unassign-edge-title": "Sind Sie sicher, dass Sie die Zuordnung zum Rand '{{edgeName}}' wirklich aufheben möchten?", - "unassign-edge-text": "Nach der Bestätigung ist der Rand nicht zugeordnet und für den Kunden nicht zugänglich.", - "unassign-edges-title": "Sind Sie sicher, dass Sie die Zuordnung aufheben möchten { count, plural, =1 {1 Rand} other {# Rand} }?", + "unassign-edge-title": "Sind Sie sicher, dass Sie die Zuordnung zum Edge '{{edgeName}}' wirklich aufheben möchten?", + "unassign-edge-text": "Nach der Bestätigung ist der Edge nicht zugeordnet und für den Kunden nicht zugänglich.", + "unassign-edges-title": "Sind Sie sicher, dass Sie die Zuordnung aufheben möchten { count, plural, =1 {1 Edge} other {# Edges} }?", "unassign-edges-text": "Nach der Bestätigung werden alle ausgewählten Kanten nicht zugewiesen und sind für den Kunden nicht zugänglich.", - "make-public": "Rand öffentlich machen", - "make-public-edge-title": "Sind Sie sicher, dass Sie der Rand '{{edgeName}}' öffentlich machen möchten?", + "make-public": "Edge öffentlich machen", + "make-public-edge-title": "Sind Sie sicher, dass Sie der Edge '{{edgeName}}' öffentlich machen möchten?", "make-public-edge-text": "Nach Bestätigung wird der Rabd und alle zugehörigen Daten anderen zugänglich gemacht.", - "make-private": "Rand privat machen", + "make-private": "Edge privat machen", "public": "Öffentlich", - "make-private-edge-title": "Sind Sie sicher, dass Sie der Rand '{{edgeName}}' privat machen möchten?", - "make-private-edge-text": "Nach der Bestätigung werden der Rand und dessen Daten privat und sind für andere nicht mehr zugänglich.", - "import": "Rand importieren", + "make-private-edge-title": "Sind Sie sicher, dass Sie der Edge '{{edgeName}}' privat machen möchten?", + "make-private-edge-text": "Nach der Bestätigung werden der Edge und dessen Daten privat und sind für andere nicht mehr zugänglich.", + "import": "Edge importieren", "label": "Bezeichnung", "load-entity-error": "Entität nicht gefunden. Fehler beim Laden der Informationen", - "assign-new-edge": "Neue Rand zuordnen", - "unassign-from-edge": "Rand zuweisen", - "edge-key": "Rand Schlüssel", - "copy-edge-key": "Rand Schlüssel kopieren", - "edge-key-copied-message": "Rand Schlüssel wurde in die Zwischenablage kopiert", - "edge-secret": "Rand Geheimnis", - "copy-edge-secret": "Rand Geheimnis kopieren", - "edge-secret-copied-message": "Rand Geheimnis wurde in die Zwischenablage kopiert", - "edge-assets": "Rand-Objekte verwalten", - "edge-devices": "Rand-Geräte verwalten", - "edge-entity-views": "Rand-Entitätsansichten verwalten", - "edge-dashboards": "Rand-Dashboards verwalten", - "edge-rulechains": "Kantenregelketten", - "assets": "Rand Objekte", + "assign-new-edge": "Neue Edge zuordnen", + "unassign-from-edge": "Edge zuweisen", + "edge-key": "Edge-Schlüssel", + "copy-edge-key": "Edge-Schlüssel kopieren", + "edge-key-copied-message": "Edge-Schlüssel wurde in die Zwischenablage kopiert", + "edge-secret": "Edge-Geheimnis", + "copy-edge-secret": "Edge-Geheimnis kopieren", + "edge-secret-copied-message": "Edge-Geheimnis wurde in die Zwischenablage kopiert", + "edge-assets": "Edge-Objekte verwalten", + "edge-devices": "Edge-Geräte verwalten", + "edge-entity-views": "Edge-Entitätsansichten verwalten", + "edge-dashboards": "Edge-Dashboards verwalten", + "edge-rulechains": "Edge-Regelketten", + "assets": "Edge Objekte", "devices": "Objekte Geräte", "entity-views": "Objekte Entitätsansichten", - "dashboard": "Kanten-Dashboard", - "dashboards": "Rand Dashboards", + "dashboard": "Edge-Dashboard", + "dashboards": "Edge-Dashboards", "rulechain-templates": "Regelkettenvorlagen", - "rulechains": "Rand Regelketten", - "search": "Kanten durchsuchen", - "selected-edges": "{count, plural, =1 {1 Rand} other {# Rand} } ausgewählt", + "rulechains": "Edge-Regelketten", + "search": "Edges durchsuchen", + "selected-edges": "{count, plural, =1 {1 Edge} other {# Edges} } ausgewählt", "any-edge": "Beliebige Kante", - "no-edge-types-matching": "Es wurden keine Kantentypen gefunden, die mit '{{entitySubtype}}' übereinstimmen.", - "edge-type-list-empty": "Keine Kantentypen ausgewählt.", - "edge-types": "Kantentypen", - "enter-edge-type": "Geben Sie den Kantentyp ein", + "no-edge-types-matching": "Es wurden keine Edgetypen gefunden, die mit '{{entitySubtype}}' übereinstimmen.", + "edge-type-list-empty": "Keine Edgetypen ausgewählt.", + "edge-types": "Edgetypen", + "enter-edge-type": "Geben Sie den Edgetyp ein", "deployed": "Bereitgestellt", "pending": "Steht aus", "downlinks": "Downlinks", @@ -855,38 +855,38 @@ "edge-event": { "type-dashboard": "Dashboard", "type-asset": "Asset", - "type-device": "Device", - "type-device-profile": "Device Profile", - "type-entity-view": "Entity View", + "type-device": "Gerät", + "type-device-profile": "Geräteprofile", + "type-entity-view": "Entitätsansicht", "type-alarm": "Alarm", - "type-rule-chain": "Rule Chain", - "type-rule-chain-metadata": "Rule Chain Metadata", + "type-rule-chain": "Regelkette", + "type-rule-chain-metadata": "Regelkettenmetadaten", "type-edge": "Edge", - "type-user": "User", - "type-customer": "Customer", - "type-relation": "Relation", - "type-widgets-bundle": "Widgets Bundle", - "type-widgets-type": "Widgets Type", - "type-admin-settings": "Admin Settings", - "action-type-added": "Added", - "action-type-deleted": "Deleted", - "action-type-updated": "Updated", - "action-type-post-attributes": "Post Attributes", - "action-type-attributes-updated": "Attributes Updated", - "action-type-attributes-deleted": "Attributes Deleted", - "action-type-timeseries-updated": "Timeseries Updated", - "action-type-credentials-updated": "Credentials Updated", - "action-type-assigned-to-customer": "Assigned to Customer", - "action-type-unassigned-from-customer": "Unassigned from Customer", - "action-type-relation-add-or-update": "Relation Add or Update", - "action-type-relation-deleted": "Relation Deleted", - "action-type-rpc-call": "RPC Call", - "action-type-alarm-ack": "Alarm Ack", - "action-type-alarm-clear": "Alarm Clear", - "action-type-assigned-to-edge": "Assigned to Edge", - "action-type-unassigned-from-edge": "Unassigned from Edge", - "action-type-credentials-request": "Credentials Request", - "action-type-entity-merge-request": "Entity Merge Request" + "type-user": "Benutzer", + "type-customer": "Kunde", + "type-relation": "Beziehung", + "type-widgets-bundle": "Widgetpaket", + "type-widgets-type": "Widgettyp", + "type-admin-settings": "Admineinstellungen", + "action-type-added": "Hinzugefügt", + "action-type-deleted": "Gelöscht", + "action-type-updated": "Aktualisiert", + "action-type-post-attributes": "Attribute posten", + "action-type-attributes-updated": "Attribute Aktualisiert", + "action-type-attributes-deleted": "Attribute Gelöscht", + "action-type-timeseries-updated": "Timeseries Aktualisiert", + "action-type-credentials-updated": "Zugangsdaten Aktualisiert", + "action-type-assigned-to-customer": "Dem Kunden zugewiesen", + "action-type-unassigned-from-customer": "Kundenzuweisung aufgehoben", + "action-type-relation-add-or-update": "Beziehung hinzufügen oder Aktualisieren", + "action-type-relation-deleted": "Beziehung gelöscht", + "action-type-rpc-call": "RPC-Aufruf", + "action-type-alarm-ack": "Alarm zurkenntnisnehmen", + "action-type-alarm-clear": "Alarm löschen", + "action-type-assigned-to-edge": "Der Edge zuweisen", + "action-type-unassigned-from-edge": "Edge-Zuweisung aufheben", + "action-type-credentials-request": "Zugangsdatenabfrage", + "action-type-entity-merge-request": "Entitäts-Merge-Request" }, "error": { "unable-to-connect": "Es konnte keine Verbindung zum Server hergestellt werden! Bitte überprüfen Sie Ihre Internetverbindung.", @@ -980,10 +980,10 @@ "type-rulenodes": "Regelknoten", "list-of-rulenodes": "{ count, plural, =1 {Ein Regelknoten} other {Liste von # Regelknoten} }", "rulenode-name-starts-with": "Regelknoten beginnend mit '{{prefix}}'", - "type-edge": "Randtyp", - "type-edges": "Randtyp", - "list-of-edges": "{ count, plural, =1 {1 Rand} other {# Rand} }", - "edge-name-starts-with": "Rand beginnend mit '{{prefix}}'", + "type-edge": "Edgetyp", + "type-edges": "Eandtyp", + "list-of-edges": "{ count, plural, =1 {1 Edge} other {# Edges} }", + "edge-name-starts-with": "Edge beginnend mit '{{prefix}}'", "type-current-customer": "Aktueller Kunde", "search": "Entitäten suchen", "selected-entities": "{ count, plural, =1 {Entität} other {# Entitäten} } ausgewählt", @@ -1125,7 +1125,7 @@ }, "extension": { "extensions": "Erweiterungen", - "selected-extensions": "{ count, plural, =1 {Erweiterung} other {# extensions} } ausgewählt", + "selected-extensions": "{ count, plural, =1 {Erweiterung} other {# Erweiterungen} } ausgewählt", "type": "Typ", "key": "Schlüssel", "value": "Wert", @@ -1139,7 +1139,7 @@ "edit": "Erweiterung bearbeiten", "delete-extension-title": "Möchten Sie die Erweiterung '{{extensionId}}' wirklich löschen?", "delete-extension-text": "Vorsicht, nach Bestätigung werden die Erweiterung und alle zugehörigen Daten nicht wiederhergestellt.", - "delete-extensions-title": "Möchten Sie wirklich löschen? { count, plural, =1 {1 extension} other {# extensions} }?", + "delete-extensions-title": "Möchten Sie wirklich { count, plural, =1 {1 Erweiterung} other {# Erweiterungen} } löschen?", "delete-extensions-text": "Vorsicht, nach der Bestätigung werden alle ausgewählten Erweiterungen entfernt.", "converters": "Konverter", "converter-id": "Konverter-ID", @@ -1166,7 +1166,7 @@ "host": "Host", "port": "Port", "port-range": "Der Port sollte im Bereich von 1 bis 65535 liegen.", - "ssl": "Ssl", + "ssl": "SSL", "credentials": "Zugangsdaten", "username": "Benutzername", "password": "Passwort", @@ -1229,7 +1229,7 @@ "opc-keystore": "Schlüsselspeicher", "opc-type": "Typ", "opc-keystore-type": "Typ", - "opc-keystore-location": "Standort *", + "opc-keystore-location": "Speicherort *", "opc-keystore-password": "Passwort", "opc-keystore-alias": "Alias", "opc-keystore-key-password": "Schlüsselpasswort", diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json index b1e7e1d179..5ad86dc47a 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -105,6 +105,23 @@ "base-url-required": "Base URL is required.", "prohibit-different-url": "Prohibit to use hostname from the client request headers", "prohibit-different-url-hint": "This setting should be enabled for production environments. May cause security issues when disabled", + "device-connectivity": { + "device-connectivity": "Device connectivity", + "http-s": "HTTP(s)", + "mqtt-s": "MQTT(s)", + "coap-s": "COAP(s)", + "http": "HTTP", + "https": "HTTPs", + "mqtt": "MQTT", + "mqtts": "MQTTs", + "coap": "COAP", + "coaps": "COAPs", + "hint": "If host or port fields are empty, default protocol value will be used.", + "host": "Host", + "port": "Port", + "port-pattern": "Port must be a positive integer.", + "port-range": "Port should be in a range from 1 to 65535." + }, "mail-from": "Mail From", "mail-from-required": "Mail From is required.", "smtp-protocol": "SMTP protocol", @@ -1384,6 +1401,7 @@ "any-device": "Any device", "no-device-types-matching": "No device profiles matching '{{entitySubtype}}' were found.", "device-type-list-empty": "No device profiles selected!", + "device-profile-type-list-empty": "At least one device profile should be selected.", "device-types": "Device types", "name": "Name", "name-required": "Name is required.", @@ -4233,20 +4251,20 @@ "carat": "Carat", "cubic-millimeter": "Cubic Millimeter", "cubic-centimeter": "Cubic Centimeter", - "cubic-meter": "Cubic Meter/s", - "cubic-kilometer": "Cubic Kilometers", + "cubic-meter": "Cubic Meter", + "cubic-kilometer": "Cubic Kilometer", "microliter": "Microliter", "milliliter": "Milliliter", "liter": "Liter", "hectoliter": "Hectolitre", "cubic-inch": "Cubic Inch", "cubic-foot": "Cubic Foot", - "cubic-yard": "Cubic Yards", + "cubic-yard": "Cubic Yard", "fluid-ounce": "Fluid Ounce", "pint": "Pint", "quart": "Quart", "gallon": "Gallon", - "oil-barrels": "Oil Barrels", + "oil-barrels": "Oil Barrel", "cubic-meter-per-kilogram": "Cubic Meter per Kilogram", "gill": "Gill", "hogshead": "Hogshead", @@ -4290,7 +4308,6 @@ "ton-force-per-square-inch": "Ton-force per Square Inch", "kilonewton-per-square-meter": "Kilonewton per Square Meter", "newton-per-square-millimeter": "Newton per Square Millimeter", - "microjoule": "Microjoule", "millijoule": "Millijoule", "joule": "Joule", @@ -4916,6 +4933,7 @@ "title-max-length": "Title should be less than 256", "description": "Description", "image-preview": "Image preview", + "order": "Order", "add-widgets-bundle-text": "Add new widgets bundle", "no-widgets-bundles-text": "No widgets bundles found", "empty": "Widgets bundle is empty", @@ -5013,6 +5031,7 @@ "title-icon": "Title icon", "display-icon": "Display title icon", "card-icon": "Card icon", + "icon": "Icon", "icon-color": "Icon color", "icon-size": "Icon size", "advanced-settings": "Advanced settings", @@ -5033,7 +5052,9 @@ "show-card-buttons": "Show card buttons", "card-border-radius": "Card border radius", "card-appearance": "Card appearance", - "color": "Color" + "color": "Color", + "tooltip": "Tooltip", + "units-required": "Unit is required." }, "widget-type": { "import": "Import widget type", @@ -5357,10 +5378,14 @@ "ticks-settings": "Ticks settings", "min-value": "Minimum value", "max-value": "Maximum value", + "min-value-short": "min", + "max-value-short": "max", "start-ticks-angle": "Start ticks angle", "ticks-angle": "Ticks angle", + "major-ticks": "Major ticks", "major-ticks-count": "Major ticks count", "major-ticks-color": "Major ticks color", + "minor-ticks": "Minor ticks", "minor-ticks-count": "Minor ticks count", "minor-ticks-color": "Minor ticks color", "tick-numbers-font": "Tick numbers font", @@ -5372,21 +5397,29 @@ "units-font": "Units text font", "value-box-settings": "Value box settings", "show-value-box": "Show value box", + "value-box": "Value box", "value-int": "Digits count for integer part of value", + "value-text": "Value text", + "value-text-shadow": "Value text shadow", "value-font": "Value text font", + "rect-stroke-color-start": "Rectangle stroke color - start gradient", + "rect-stroke-color-end": "Rectangle stroke color - end gradient", + "background-color": "Background color", + "shadow-color": "Shadow color", "value-box-rect-stroke-color": "Value box rectangle stroke color", "value-box-rect-stroke-color-end": "Value box rectangle stroke color - end gradient", "value-box-background-color": "Value box background color", "value-box-shadow-color": "Value box shadow color", "plate-settings": "Plate settings", - "show-plate-border": "Show plate border", + "show-plate-border": "Plate border", "plate-color": "Plate color", "needle-settings": "Needle settings", "needle-circle-size": "Needle circle size", "needle-color": "Needle color", + "needle-color-start": "Needle color - start gradient", "needle-color-end": "Needle color - end gradient", "needle-color-shadow-up": "Upper half of the needle shadow color", - "needle-color-shadow-down": "Drop shadow needle color", + "needle-color-shadow-down": "Drop shadow", "highlights-settings": "Highlights settings", "highlights-width": "Highlights width", "highlights": "Highlights", @@ -5396,7 +5429,8 @@ "no-highlights": "No highlights configured", "add-highlight": "Add highlight", "animation-settings": "Animation settings", - "enable-animation": "Enable animation", + "enable-animation": "Animation", + "animation-duration-rule": "Animation duration and rule", "animation-duration": "Animation duration", "animation-rule": "Animation rule", "animation-linear": "Linear", @@ -5411,17 +5445,21 @@ "animation-debounce": "Debounce", "animation-delastic": "Delastic", "linear-gauge-settings": "Linear gauge settings", + "bar-stroke": "Bar stroke", "bar-stroke-width": "Bar stroke width", "bar-stroke-color": "Bar stroke color", - "bar-background-color": "Gauge bar background color", + "bar-background-color": "Bar background color - start gradient", "bar-background-color-end": "Bar background color - end gradient", "progress-bar-color": "Progress bar color", + "progress-bar": "Progress bar", + "progress-bar-color-start": "Progress bar color - start gradient", "progress-bar-color-end": "Progress bar color - end gradient", "major-ticks-names": "Major ticks names", "show-stroke-ticks": "Show ticks stroke", "major-ticks-font": "Major ticks font", "border-color": "Border color", "border-width": "Border width", + "needle-circle": "Needle circle", "needle-circle-color": "Needle circle color", "animation-target": "Animation target", "animation-target-needle": "Needle", @@ -5465,7 +5503,18 @@ "tick-color": "Tick color", "tick-values": "Tick values", "no-tick-values": "No tick values configured", - "add-tick-value": "Add tick value" + "add-tick-value": "Add tick value", + "gauge-appearance": "Gauge appearance", + "units-title": "Units title", + "value": "Value", + "ticks": "Ticks", + "arrow-and-scale-color": "Arrow and scale default color", + "scale-settings": "Scale settings", + "scale": "Scale", + "scale-color": "Scale colors", + "compass-appearance": "Compass appearance", + "labels": "Labels", + "label-style": "Label style" }, "gpio": { "pin": "Pin", @@ -6069,6 +6118,52 @@ "value-card-style": "Value card style", "auto-scale": "Auto scale" }, + "liquid-level-card": { + "layout-simple": "Simple", + "layout-percentage": "Percentage", + "layout-absolute": "Absolute", + "layout": "Layout", + "background-overlay": "Value background overlay", + "total-volume": "Total volume", + "tank": "Tank", + "shape": "Shape", + "datasource-units": "Source units", + "widget-units": "Widget units", + "decimals": "Decimals", + "liquid": "Liquid", + "liquid-color": "Liquid color", + "value": "Value", + "value-font": "Value font", + "level": "Level", + "last-update": "Last update", + "shape-by-attribute": "Set tank shape by attribute name", + "tooltip-background": "Background color", + "background-blur": "Background blur", + "tank-color": "Tank color", + "static": "Static", + "see-examples": "See examples", + "attribute": "Attribute", + "shape-type": "Type", + "v-oval": "Vertical Oval", + "v-cylinder": "Vertical Cylinder", + "v-capsule": "Vertical Capsule", + "rectangle": "Rectangle", + "h-oval": "Horizontal Oval", + "h-ellipse": "Horizontal Ellipse", + "h-dish-ends": "Horizontal Dish Ends", + "h-cylinder": "Horizontal Cylinder", + "h-capsule": "Horizontal Capsule", + "h-elliptical_2_1": "Horizontal 2:1 Elliptical", + "icon": "Card icon", + "title": "Card title", + "units": "Units", + "color-and-font": "Color and font", + "shape-attribute-name": "Attribute name", + "total-volume-required": "Total volume is required.", + "attribute-name-required": "Attribute name is required.", + "attribute-key-not-set": "Attribute '{{attributeName}}' key not set", + "attribute-key-invalid": "Attribute '{{attributeName}}' key is invalid" + }, "aggregated-value-card": { "subtitle": "Subtitle", "chart": "Chart", diff --git a/ui-ngx/src/assets/metadata/units.json b/ui-ngx/src/assets/metadata/units.json index 5d680c6e2c..3237d6620b 100644 --- a/ui-ngx/src/assets/metadata/units.json +++ b/ui-ngx/src/assets/metadata/units.json @@ -249,7 +249,7 @@ }, { "name": "unit.liter", - "symbol": "l", + "symbol": "L", "tags": ["volume","capacity","extent","liter","liters","l"] }, { @@ -1113,7 +1113,7 @@ "symbol": "%", "tags": ["power source","state of charge (SoC)","battery","battery level","level","humidity","moisture","percentage", "relative humidity","water content","soil moisture","irrigation","water in soil","soil water content","VWC", - "Volumetric Water Content","Total Harmonic Distortion","THD","power quality","UV Transmittance","%"] + "Volumetric Water Content","Total Harmonic Distortion","THD","power quality","UV Transmittance","%", "capacity"] }, { "name": "unit.rssi", diff --git a/ui-ngx/src/assets/widget/liquid-level/shapes/horizontal-2_1-elliptical.svg b/ui-ngx/src/assets/widget/liquid-level/shapes/horizontal-2_1-elliptical.svg new file mode 100644 index 0000000000..d6196e5f71 --- /dev/null +++ b/ui-ngx/src/assets/widget/liquid-level/shapes/horizontal-2_1-elliptical.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui-ngx/src/assets/widget/liquid-level/shapes/horizontal-capsule.svg b/ui-ngx/src/assets/widget/liquid-level/shapes/horizontal-capsule.svg new file mode 100644 index 0000000000..20319f34e7 --- /dev/null +++ b/ui-ngx/src/assets/widget/liquid-level/shapes/horizontal-capsule.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui-ngx/src/assets/widget/liquid-level/shapes/horizontal-cylinder.svg b/ui-ngx/src/assets/widget/liquid-level/shapes/horizontal-cylinder.svg new file mode 100644 index 0000000000..e05fb41e99 --- /dev/null +++ b/ui-ngx/src/assets/widget/liquid-level/shapes/horizontal-cylinder.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui-ngx/src/assets/widget/liquid-level/shapes/horizontal-dish-ends.svg b/ui-ngx/src/assets/widget/liquid-level/shapes/horizontal-dish-ends.svg new file mode 100644 index 0000000000..af0195c782 --- /dev/null +++ b/ui-ngx/src/assets/widget/liquid-level/shapes/horizontal-dish-ends.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui-ngx/src/assets/widget/liquid-level/shapes/horizontal-ellipse.svg b/ui-ngx/src/assets/widget/liquid-level/shapes/horizontal-ellipse.svg new file mode 100644 index 0000000000..5d0c0b2307 --- /dev/null +++ b/ui-ngx/src/assets/widget/liquid-level/shapes/horizontal-ellipse.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui-ngx/src/assets/widget/liquid-level/shapes/horizontal-oval.svg b/ui-ngx/src/assets/widget/liquid-level/shapes/horizontal-oval.svg new file mode 100644 index 0000000000..86af838fb2 --- /dev/null +++ b/ui-ngx/src/assets/widget/liquid-level/shapes/horizontal-oval.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui-ngx/src/assets/widget/liquid-level/shapes/rectangle.svg b/ui-ngx/src/assets/widget/liquid-level/shapes/rectangle.svg new file mode 100644 index 0000000000..800093c1d4 --- /dev/null +++ b/ui-ngx/src/assets/widget/liquid-level/shapes/rectangle.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui-ngx/src/assets/widget/liquid-level/shapes/vertical-capsule.svg b/ui-ngx/src/assets/widget/liquid-level/shapes/vertical-capsule.svg new file mode 100644 index 0000000000..dde2f5b903 --- /dev/null +++ b/ui-ngx/src/assets/widget/liquid-level/shapes/vertical-capsule.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui-ngx/src/assets/widget/liquid-level/shapes/vertical-cylinder.svg b/ui-ngx/src/assets/widget/liquid-level/shapes/vertical-cylinder.svg new file mode 100644 index 0000000000..7c15c4af9f --- /dev/null +++ b/ui-ngx/src/assets/widget/liquid-level/shapes/vertical-cylinder.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui-ngx/src/assets/widget/liquid-level/shapes/vertical-oval.svg b/ui-ngx/src/assets/widget/liquid-level/shapes/vertical-oval.svg new file mode 100644 index 0000000000..89dd578803 --- /dev/null +++ b/ui-ngx/src/assets/widget/liquid-level/shapes/vertical-oval.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ui-ngx/src/form.scss b/ui-ngx/src/form.scss index 93272af3ca..3b29fe986c 100644 --- a/ui-ngx/src/form.scss +++ b/ui-ngx/src/form.scss @@ -368,14 +368,20 @@ .mat-mdc-text-field-wrapper { .mat-mdc-form-field-icon-suffix { padding: 0; - display: none; + display: flex; + align-items: center; + + > *:not(.tb-suffix-show-always) { + display: none; + } } } &:hover { .mat-mdc-text-field-wrapper { .mat-mdc-form-field-icon-suffix { - display: flex; - align-items: center; + > * { + display: block; + } } } } diff --git a/ui-ngx/src/styles.scss b/ui-ngx/src/styles.scss index 0ee154cf7d..ee6f6374cf 100644 --- a/ui-ngx/src/styles.scss +++ b/ui-ngx/src/styles.scss @@ -342,6 +342,12 @@ mat-label { } } +mat-icon { + &.tb-error { + color: rgb(221, 44, 0); + } +} + .tb-error-messages { height: 24px; //30px margin-top: -6px; @@ -356,6 +362,13 @@ mat-label { color: rgb(221, 44, 0); } +.mat-mdc-tooltip.tb-error-tooltip { + .mdc-tooltip__surface { + background-color: rgba(209, 39, 48, 0.12); + color: rgba(209, 39, 48, 1); + } +} + .tb-autocomplete { .mat-mdc-option { border-bottom: 1px solid #eee;