-1&&t.kvList.splice(e,1)}function l(){t.kvList||(t.kvList=[]),t.kvList.push({key:"",value:""})}function s(){var e={};t.kvList.forEach(function(t){t.key&&(e[t.key]=t.value)}),r.$setViewValue(e),d()}function d(){var e=!0;t.required&&!t.kvList.length&&(e=!1),r.$setValidity("kvMap",e)}var u=o.default;n.html(u),t.ngModelCtrl=r,t.removeKeyVal=i,t.addKeyVal=l,t.kvList=[],t.$watch("query",function(e,n){angular.equals(e,n)||r.$setViewValue(t.query)}),r.$render=function(){if(r.$viewValue){var e=r.$viewValue;t.kvList.length=0;for(var n in e)t.kvList.push({key:n,value:e[n]})}t.$watch("kvList",function(e,t){angular.equals(e,t)||s()},!0),d()},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{required:"=ngRequired",disabled:"=ngDisabled",requiredText:"=",keyText:"=",keyRequiredText:"=",valText:"=",valRequiredText:"="},link:t}}r.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(41),o=a(i);n(5)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function r(e,t){var n=function(n,a,r,i){var l=o.default;a.html(l),n.types=t,n.$watch("query",function(e,t){angular.equals(e,t)||i.$setViewValue(n.query)}),i.$render=function(){n.query=i.$viewValue},e(a.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}r.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(42),o=a(i)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function r(e,t){var n=function(n,a,r,i){var l=o.default;a.html(l),n.ruleNodeTypes=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||i.$setViewValue(n.configuration)}),i.$render=function(){n.configuration=i.$viewValue},e(a.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}r.$inject=["$compile","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(43),o=a(i)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(87),i=a(r),o=n(89),l=a(o),s=n(90),d=a(s);t.default=angular.module("thingsboard.ruleChain.config.transform",[]).directive("tbTransformationNodeChangeOriginatorConfig",i.default).directive("tbTransformationNodeScriptConfig",l.default).directive("tbTransformationNodeToEmailConfig",d.default).name},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function r(e,t,n){var a=function(a,r,i,l){var s=o.default;r.html(s),a.$watch("configuration",function(e,t){angular.equals(e,t)||l.$setViewValue(a.configuration)}),l.$render=function(){a.configuration=l.$viewValue},a.testScript=function(e){var r=angular.copy(a.configuration.jsScript);n.testNodeScript(e,r,"update",t.instant("tb.rulenode.transformer")+"","Transform",["msg","metadata","msgType"],a.ruleNodeId).then(function(e){a.configuration.jsScript=e,l.$setDirty()})},e(r.contents())(a)};return{restrict:"E",require:"^ngModel",scope:{ruleNodeId:"="},link:a}}r.$inject=["$compile","$translate","ruleNodeScriptTest"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(44),o=a(i)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function r(e){var t=function(t,n,a,r){var i=o.default;n.html(i),t.$watch("configuration",function(e,n){angular.equals(e,n)||r.$setViewValue(t.configuration)}),r.$render=function(){t.configuration=r.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}r.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(45),o=a(i)},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var r=n(94),i=a(r),o=n(80),l=a(o),s=n(73),d=a(s),u=n(88),c=a(u),m=n(53),g=a(m),p=n(69),f=a(p),b=n(86),v=a(b),y=n(68),h=a(y),q=n(85),$=a(q),k=n(93),x=a(k);t.default=angular.module("thingsboard.ruleChain.config",[i.default,l.default,d.default,c.default,g.default]).directive("tbNodeEmptyConfig",f.default).directive("tbRelationsQueryConfig",v.default).directive("tbDeviceRelationsQueryConfig",h.default).directive("tbKvMapConfig",$.default).config(x.default).name},function(e,t){"use strict";function n(e){var t={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-name-pattern-hint":"Name pattern, use ${metaKeyName} to substitute variables from metadata","entity-type-pattern":"Type pattern","entity-type-pattern-required":"Type pattern is required","entity-type-pattern-hint":"Type pattern, use ${metaKeyName} to substitute variables from metadata","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-name-pattern-hint":"Customer name pattern, use ${metaKeyName} to substitute variables from metadata","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.","start-interval":"Start Interval","end-interval":"End Interval","start-interval-time-unit":"Start Interval Time Unit","end-interval-time-unit":"End Interval Time Unit","fetch-mode":"Fetch mode","fetch-mode-hint":"If selected fetch mode 'ALL' you able to choose telemetry sampling order.","order-by":"Order by","order-by-hint":"Select to choose telemetry sampling order.","time-unit-milliseconds":"Milliseconds","time-unit-seconds":"Seconds","time-unit-minutes":"Minutes","time-unit-hours":"Hours","time-unit-days":"Days","time-value-range":"Time value should be in a range from 1 to 2147483647'.","start-interval-value-required":"Start interval value is required.","end-interval-value-required":"End interval value is required.",filter:"Filter",switch:"Switch","message-type":"Message type","message-type-required":"Message type is required.","message-types-filter":"Message types filter","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","latest-timeseries":"Latest timeseries","data-keys":"Message data","metadata-keys":"Message metadata","relations-query":"Relations query","device-relations-query":"Device relations query","max-relation-level":"Max relation level","relation-type-pattern":"Relation type pattern","relation-type-pattern-hint":"Relation type pattern, use ${metaKeyName} to substitute variables from metadata","relation-type-pattern-required":"Relation type pattern is required","unlimited-level":"Unlimited level","latest-telemetry":"Latest telemetry","attr-mapping":"Attributes mapping","source-attribute":"Source attribute","source-attribute-required":"Source attribute is required.","source-telemetry":"Source telemetry","source-telemetry-required":"Source telemetry is required.","target-attribute":"Target attribute","target-attribute-required":"Target attribute is required.","attr-mapping-required":"At least one attribute mapping should be specified.","fields-mapping":"Fields mapping","fields-mapping-required":"At least one field mapping should be specified.","source-field":"Source field","source-field-required":"Source field is required.","originator-source":"Originator source","originator-customer":"Customer","originator-tenant":"Tenant","originator-related":"Related","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.","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","alarm-type-required":"Alarm type is required.","alarm-severity":"Alarm severity","alarm-severity-required":"Alarm severity is required",propagate:"Propagate",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","from-template-hint":"From address template, use ${metaKeyName} to substitute variables from metadata","to-template":"To Template","to-template-required":"To Template is required","mail-address-list-template-hint":"Comma separated address list, use ${metaKeyName} to substitute variables from metadata","cc-template":"Cc Template","bcc-template":"Bcc Template","subject-template":"Subject Template","subject-template-required":"Subject Template is required","subject-template-hint":"Mail subject template, use ${metaKeyName} to substitute variables from metadata","body-template":"Body Template","body-template-required":"Body Template is required","body-template-hint":"Mail body template, use ${metaKeyName} to substitute variables from metadata","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","endpoint-url-pattern-hint":"HTTP URL address pattern, use ${metaKeyName} to substitute variables from metadata","request-method":"Request method","use-simple-client-http-factory":"Use simple client HTTP factory",headers:"Headers","headers-hint":"Use ${metaKeyName} in header/value fields to substitute variables from metadata",header:"Header","header-required":"Header is required",value:"Value","value-required":"Value is required","topic-pattern":"Topic pattern","topic-pattern-required":"Topic pattern is required","mqtt-topic-pattern-hint":"MQTT topic pattern, use ${metaKeyName} to substitute variables from metadata","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","topic-arn-pattern-hint":"Topic ARN pattern, use ${metaKeyName} to substitute variables from metadata","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","queue-url-pattern-hint":"Queue URL pattern, use ${metaKeyName} to substitute variables from metadata","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","message-attributes":"Message attributes","message-attributes-hint":"Use ${metaKeyName} in name/value fields to substitute variables from metadata","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","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","username-required":"Username is required.","password-required":"Password is required.","ca-cert":"CA certificate file *","private-key":"Private key file *",cert:"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-interval-patterns":"Use metadata interval patterns","use-metadata-interval-patterns-hint":"If selected, rule node use start and end interval patterns from message metadata assuming that intervals are in the milliseconds.","use-message-alarm-data":"Use message alarm data","check-all-keys":"Check that all selected keys 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-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-pattern":"Start interval pattern","end-interval-pattern":"End interval pattern","start-interval-pattern-required":"Start interval pattern is required","end-interval-pattern-required":"End interval pattern is required","start-interval-pattern-hint":"Start interval pattern, use ${metaKeyName} to substitute variables from metadata","end-interval-pattern-hint":"End interval pattern, use ${metaKeyName} to substitute variables from metadata","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","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":'You should press "enter" to complete field input.'},"key-val":{key:"Key",value:"Value","remove-entry":"Remove entry","add-entry":"Add entry"}}};e.translations("en_US",t)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=n},function(e,t,n){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function r(e){(0,o.default)(e)}r.$inject=["$translateProvider"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var i=n(92),o=a(i)},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=angular.module("thingsboard.ruleChain.config.types",[]).constant("ruleNodeTypes",{originatorSource:{CUSTOMER:{name:"tb.rulenode.originator-customer",value:"CUSTOMER"},TENANT:{name:"tb.rulenode.originator-tenant",value:"TENANT"},RELATED:{name:"tb.rulenode.originator-related",value:"RELATED"}},fetchModeType:["FIRST","LAST","ALL"],samplingOrder:["ASC","DESC"],httpRequestType:["GET","POST","PUT","DELETE"],sqsQueueType:{STANDARD:{name:"tb.rulenode.sqs-queue-standard",value:"STANDARD"},FIFO:{name:"tb.rulenode.sqs-queue-fifo",value:"FIFO"}},timeUnit:{MILLISECONDS:{value:"MILLISECONDS",name:"tb.rulenode.time-unit-milliseconds"},SECONDS:{value:"SECONDS",name:"tb.rulenode.time-unit-seconds"},MINUTES:{value:"MINUTES",name:"tb.rulenode.time-unit-minutes"},HOURS:{value:"HOURS",name:"tb.rulenode.time-unit-hours"},DAYS:{value:"DAYS",name:"tb.rulenode.time-unit-days"}},mqttCredentialTypes:{anonymous:{value:"anonymous",name:"tb.rulenode.credentials-anonymous"},basic:{value:"basic",name:"tb.rulenode.credentials-basic"},"cert.PEM":{value:"cert.PEM",name:"tb.rulenode.credentials-pem"}}}).name}]));
+!function(e){function t(i){if(n[i])return n[i].exports;var a=n[i]={exports:{},id:i,loaded:!1};return e[i].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}var n={};return t.m=e,t.c=n,t.p="/static/",t(0)}(function(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))switch(typeof e[t]){case"function":break;case"object":e[t]=function(t){var n=t.slice(1),i=e[t[0]];return function(e,t,a){i.apply(this,[e,t,a].concat(n))}}(e[t]);break;default:e[t]=e[e[t]]}return e}([function(e,t,n){e.exports=n(99)},function(e,t){},1,1,1,1,function(e,t){e.exports=" "},function(e,t){e.exports=' {{scope.name | translate}} '},function(e,t){e.exports=" {{ 'tb.rulenode.test-details-function' | translate }}
tb.rulenode.alarm-type-required
tb.rulenode.entity-type-pattern-hint
"},function(e,t){e.exports=" {{ 'tb.rulenode.test-details-function' | translate }}
{{ 'tb.rulenode.use-message-alarm-data' | translate }} {{ 'tb.rulenode.propagate' | translate }} "},function(e,t){e.exports=" {{ ('relation.search-direction.' + direction) | translate}} tb.rulenode.relation-type-pattern-required
tb.rulenode.relation-type-pattern-hint
{{ 'tb.rulenode.create-entity-if-not-exists' | translate }} tb.rulenode.create-entity-if-not-exists-hint
{{ 'tb.rulenode.remove-current-relations' | translate }} tb.rulenode.remove-current-relations-hint
{{ 'tb.rulenode.change-originator-to-related-entity' | translate }} tb.rulenode.change-originator-to-related-entity-hint
tb.rulenode.entity-cache-expiration-required
tb.rulenode.entity-cache-expiration-range
tb.rulenode.entity-cache-expiration-hint
"},function(e,t){e.exports=" {{ 'tb.rulenode.delete-relation-to-specific-entity' | translate }} tb.rulenode.delete-relation-hint
{{ ('relation.search-direction.' + direction) | translate}} tb.rulenode.relation-type-pattern-required
tb.rulenode.relation-type-pattern-hint
tb.rulenode.entity-cache-expiration-required
tb.rulenode.entity-cache-expiration-range
tb.rulenode.entity-cache-expiration-hint
"},function(e,t){e.exports=" tb.rulenode.message-count-required
tb.rulenode.min-message-count-message
tb.rulenode.period-seconds-required
tb.rulenode.min-period-seconds-message
{{ 'tb.rulenode.test-generator-function' | translate }}
"},function(e,t){e.exports=' '},function(e,t){e.exports=' '},function(e,t){e.exports=" {{ 'tb.rulenode.test-to-string-function' | translate }}
"},function(e,t){e.exports=' tb.rulenode.topic-pattern-required
tb.rulenode.mqtt-topic-pattern-hint
{{ \'tb.rulenode.clean-session\' | translate }} {{ \'tb.rulenode.enable-ssl\' | translate }} {{ \'tb.rulenode.credentials\' | translate }}
{{ ruleNodeTypes.mqttCredentialTypes[configuration.credentials.type].name | translate }}
{{ \'tb.rulenode.credentials\' | translate }}
{{ ruleNodeTypes.mqttCredentialTypes[configuration.credentials.type].name | translate }}
{{credentialsValue.name | translate}} tb.rulenode.credentials-type-required
tb.rulenode.no-file
{{configuration.credentials.caCertFileName}}
tb.rulenode.no-file
{{configuration.credentials.certFileName}}
tb.rulenode.no-file
{{configuration.credentials.privateKeyFileName}}
'},function(e,t){e.exports=" ";
+},function(e,t){e.exports=" "},function(e,t){e.exports=' '},function(e,t){e.exports=' tb.rulenode.endpoint-url-pattern-required
tb.rulenode.endpoint-url-pattern-hint
{{ type }} {{ \'tb.rulenode.use-simple-client-http-factory\' | translate }} tb.rulenode.headers-hint
'},function(e,t){e.exports=" "},function(e,t){e.exports=" "},function(e,t){e.exports=' '},function(e,t){e.exports=' {{ \'tb.rulenode.use-system-smtp-settings\' | translate }} '},function(e,t){e.exports=" "},function(e,t){e.exports=' '},function(e,t){e.exports=" "},function(e,t){e.exports=" "},function(e,t){e.exports=' {{ (\'relation.search-direction.\' + direction) | translate}}
relation.relation-type
device.device-types
'},function(e,t){e.exports=" {{ 'tb.rulenode.latest-telemetry' | translate }} "},function(e,t){e.exports=' '},function(e,t){e.exports=' {{\'tb.rulenode.entity-details-\'+item.toLowerCase() | translate}} tb.rulenode.no-entity-details-matching {{\'tb.rulenode.entity-details-\'+$chip.toLowerCase() | translate}} tb.rulenode.entity-details-list-empty
{{ \'tb.rulenode.add-to-metadata\' | translate }} tb.rulenode.add-to-metadata-hint
'},function(e,t){e.exports=' {{ type }} tb.rulenode.fetch-mode-hint
{{ type }} tb.rulenode.order-by-hint
{{ \'tb.rulenode.use-metadata-interval-patterns\' | translate }} tb.rulenode.use-metadata-interval-patterns-hint
tb.rulenode.start-interval-value-required
tb.rulenode.time-value-range
tb.rulenode.time-value-range
{{timeUnit.name | translate}} tb.rulenode.end-interval-value-required
tb.rulenode.time-value-range
tb.rulenode.time-value-range
{{timeUnit.name | translate}} tb.rulenode.start-interval-pattern-required
tb.rulenode.start-interval-pattern-hint
tb.rulenode.end-interval-pattern-required
tb.rulenode.end-interval-pattern-hint
'},function(e,t){e.exports=' '},function(e,t){e.exports=' '},function(e,t){e.exports=" {{ 'tb.rulenode.latest-telemetry' | translate }} "},30,function(e,t){e.exports=' tb.rulenode.separator-hint
tb.rulenode.separator-hint
{{ \'tb.rulenode.check-all-keys\' | translate }} tb.rulenode.check-all-keys-hint
'},function(e,t){e.exports=" {{ 'tb.rulenode.check-relation-to-specific-entity' | translate }} tb.rulenode.check-relation-hint
{{ ('relation.search-direction.' + direction) | translate}}
";
+},function(e,t){e.exports=' '},function(e,t){e.exports=' {{item}} tb.rulenode.no-message-types-found
{{$chip.name}} tb.rulenode.message-types-required
'},function(e,t){e.exports=' '},function(e,t){e.exports=" {{ 'tb.rulenode.test-filter-function' | translate }}
"},function(e,t){e.exports=" {{ 'tb.rulenode.test-switch-function' | translate }}
"},function(e,t){e.exports=' {{ \'tb.key-val.add-entry\' | translate }} add {{ \'action.add\' | translate }}
'},function(e,t){e.exports=" "},function(e,t){e.exports=' {{ source.name | translate}} '},function(e,t){e.exports=" {{ 'tb.rulenode.test-transformer-function' | translate }}
"},function(e,t){e.exports=" tb.rulenode.from-template-required
tb.rulenode.from-template-hint
tb.rulenode.to-template-required
tb.rulenode.mail-address-list-template-hint
tb.rulenode.mail-address-list-template-hint
tb.rulenode.mail-address-list-template-hint
tb.rulenode.subject-template-required
tb.rulenode.subject-template-hint
tb.rulenode.body-template-required
tb.rulenode.body-template-hint
"},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.types=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(6),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.types=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(7),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n,i){var a=function(a,r,l,s){var d=o.default;r.html(d),a.types=n,a.$watch("configuration",function(e,t){angular.equals(e,t)||s.$setViewValue(a.configuration)}),s.$render=function(){a.configuration=s.$viewValue},a.testDetailsBuildJs=function(e){var n=angular.copy(a.configuration.alarmDetailsBuildJs);i.testNodeScript(e,n,"json",t.instant("tb.rulenode.details")+"","Details",["msg","metadata","msgType"],a.ruleNodeId).then(function(e){a.configuration.alarmDetailsBuildJs=e,s.$setDirty()})},e(r.contents())(a)};return{restrict:"E",require:"^ngModel",scope:{ruleNodeId:"="},link:a}}a.$inject=["$compile","$translate","types","ruleNodeScriptTest"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(8),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n,i){var a=function(a,r,l,s){var d=o.default;r.html(d),a.types=n,a.$watch("configuration",function(e,t){angular.equals(e,t)||s.$setViewValue(a.configuration)}),s.$render=function(){a.configuration=s.$viewValue},a.testDetailsBuildJs=function(e){var n=angular.copy(a.configuration.alarmDetailsBuildJs);i.testNodeScript(e,n,"json",t.instant("tb.rulenode.details")+"","Details",["msg","metadata","msgType"],a.ruleNodeId).then(function(e){a.configuration.alarmDetailsBuildJs=e,s.$setDirty()})},e(r.contents())(a)};return{restrict:"E",require:"^ngModel",scope:{ruleNodeId:"="},link:a}}a.$inject=["$compile","$translate","types","ruleNodeScriptTest"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(9),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.types=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(10),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.types=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(11),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n,i){var a=function(a,r,l,s){var d=o.default;r.html(d),a.types=n,a.originator=null,a.$watch("configuration",function(e,t){angular.equals(e,t)||s.$setViewValue(a.configuration)}),s.$render=function(){a.configuration=s.$viewValue,a.configuration.originatorId&&a.configuration.originatorType?a.originator={id:a.configuration.originatorId,entityType:a.configuration.originatorType}:a.originator=null,a.$watch("originator",function(e,t){angular.equals(e,t)||(a.originator?(s.$viewValue.originatorId=a.originator.id,s.$viewValue.originatorType=a.originator.entityType):(s.$viewValue.originatorId=null,s.$viewValue.originatorType=null))},!0)},a.testScript=function(e){var n=angular.copy(a.configuration.jsScript);i.testNodeScript(e,n,"generate",t.instant("tb.rulenode.generator")+"","Generate",["prevMsg","prevMetadata","prevMsgType"],a.ruleNodeId).then(function(e){a.configuration.jsScript=e,s.$setDirty()})},e(r.contents())(a)};return{restrict:"E",require:"^ngModel",scope:{ruleNodeId:"="},link:a}}a.$inject=["$compile","$translate","types","ruleNodeScriptTest"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a,n(1);var r=n(12),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.ruleNodeTypes=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{readonly:"=ngReadonly"},link:n}}a.$inject=["$compile","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(13),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var a=n(72),r=i(a),o=n(51),l=i(o),s=n(56),d=i(s),u=n(53),c=i(u),m=n(52),g=i(m),p=n(60),f=i(p),b=n(66),v=i(b),y=n(67),h=i(y),q=n(65),$=i(q),x=n(59),k=i(x),T=n(70),C=i(T),w=n(71),M=i(w),N=n(64),_=i(N),S=n(61),E=i(S),P=n(69),F=i(P),V=n(63),A=i(V),I=n(62),j=i(I),O=n(50),D=i(O),R=n(73),K=i(R),L=n(55),U=i(L),z=n(54),B=i(z),H=n(68),Y=i(H),G=n(57),Q=i(G);t.default=angular.module("thingsboard.ruleChain.config.action",[]).directive("tbActionNodeTimeseriesConfig",r.default).directive("tbActionNodeAttributesConfig",l.default).directive("tbActionNodeGeneratorConfig",d.default).directive("tbActionNodeCreateAlarmConfig",c.default).directive("tbActionNodeClearAlarmConfig",g.default).directive("tbActionNodeLogConfig",f.default).directive("tbActionNodeRpcReplyConfig",v.default).directive("tbActionNodeRpcRequestConfig",h.default).directive("tbActionNodeRestApiCallConfig",$.default).directive("tbActionNodeKafkaConfig",k.default).directive("tbActionNodeSnsConfig",C.default).directive("tbActionNodeSqsConfig",M.default).directive("tbActionNodeRabbitMqConfig",_.default).directive("tbActionNodeMqttConfig",E.default).directive("tbActionNodeSendEmailConfig",F.default).directive("tbActionNodeMsgDelayConfig",A.default).directive("tbActionNodeMsgCountConfig",j.default).directive("tbActionNodeAssignToCustomerConfig",D.default).directive("tbActionNodeUnAssignToCustomerConfig",K.default).directive("tbActionNodeDeleteRelationConfig",U.default).directive("tbActionNodeCreateRelationConfig",B.default).directive("tbActionNodeCustomTableConfig",Y.default).directive("tbActionNodeGpsGeofencingConfig",Q.default).name},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.ackValues=["all","-1","0","1"],t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(14),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n){var i=function(i,a,r,l){var s=o.default;a.html(s),i.$watch("configuration",function(e,t){angular.equals(e,t)||l.$setViewValue(i.configuration)}),l.$render=function(){i.configuration=l.$viewValue},i.testScript=function(e){var a=angular.copy(i.configuration.jsScript);n.testNodeScript(e,a,"string",t.instant("tb.rulenode.to-string")+"","ToString",["msg","metadata","msgType"],i.ruleNodeId).then(function(e){i.configuration.jsScript=e,l.$setDirty()})},e(a.contents())(i)};return{restrict:"E",require:"^ngModel",scope:{ruleNodeId:"="},link:i}}a.$inject=["$compile","$translate","ruleNodeScriptTest"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(15),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n){var i=function(i,a,r,l){var s=o.default;a.html(s),i.$mdExpansionPanel=t,i.ruleNodeTypes=n,i.credentialsTypeChanged=function(){var e=i.configuration.credentials.type;i.configuration.credentials={},i.configuration.credentials.type=e,i.updateValidity()},i.certFileAdded=function(e,t){var n=new FileReader;n.onload=function(n){i.$apply(function(){if(n.target.result){l.$setDirty();var a=n.target.result;a&&a.length>0&&("caCert"==t&&(i.configuration.credentials.caCertFileName=e.name,i.configuration.credentials.caCert=a),"privateKey"==t&&(i.configuration.credentials.privateKeyFileName=e.name,i.configuration.credentials.privateKey=a),"Cert"==t&&(i.configuration.credentials.certFileName=e.name,i.configuration.credentials.cert=a)),i.updateValidity()}})},n.readAsText(e.file)},i.clearCertFile=function(e){l.$setDirty(),"caCert"==e&&(i.configuration.credentials.caCertFileName=null,i.configuration.credentials.caCert=null),"privateKey"==e&&(i.configuration.credentials.privateKeyFileName=null,i.configuration.credentials.privateKey=null),"Cert"==e&&(i.configuration.credentials.certFileName=null,i.configuration.credentials.cert=null),i.updateValidity()},i.updateValidity=function(){var e=!0,t=i.configuration.credentials;t.type==n.mqttCredentialTypes["cert.PEM"].value&&(t.caCert&&t.cert&&t.privateKey||(e=!1)),l.$setValidity("Certs",e)},i.$watch("configuration",function(e,t){angular.equals(e,t)||l.$setViewValue(i.configuration)}),l.$render=function(){i.configuration=l.$viewValue},e(a.contents())(i)};return{restrict:"E",require:"^ngModel",scope:{readonly:"=ngReadonly"},link:i}}a.$inject=["$compile","$mdExpansionPanel","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a,n(2);var r=n(16),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(17),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(18),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.messageProperties=[null,"BASIC","TEXT_PLAIN","MINIMAL_BASIC","MINIMAL_PERSISTENT_BASIC","PERSISTENT_BASIC","PERSISTENT_TEXT_PLAIN"],t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{readonly:"=ngReadonly"},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(19),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.ruleNodeTypes=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{readonly:"=ngReadonly"},link:n}}a.$inject=["$compile","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(20),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(21),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(22),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(23),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.smtpProtocols=["smtp","smtps"],t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{readonly:"=ngReadonly"},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(24),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(25),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.ruleNodeTypes=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{readonly:"=ngReadonly"},link:n}}a.$inject=["$compile","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(26),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(27),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.types=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(28),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.types=t,n.$watch("query",function(e,t){angular.equals(e,t)||r.$setViewValue(n.query)}),r.$render=function(){n.query=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(29),o=i(r)},function(e,t){"use strict";function n(e){var t=function(t,n,i,a){n.html(""),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}n.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=n},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(30),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l);var s=186;n.separatorKeys=[t.KEY_CODE.ENTER,t.KEY_CODE.COMMA,s],n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","$mdConstant"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(31),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.ruleNodeTypes=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),n.entityDetailsList=[];for(var s in t.entityDetails){var d=s;n.entityDetailsList.push(d)}r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(32),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n){var i=function(i,a,r,l){
+var s=o.default;a.html(s);var d=186;i.separatorKeys=[t.KEY_CODE.ENTER,t.KEY_CODE.COMMA,d],i.ruleNodeTypes=n,i.aggPeriodTimeUnits={},i.aggPeriodTimeUnits.MINUTES=n.timeUnit.MINUTES,i.aggPeriodTimeUnits.HOURS=n.timeUnit.HOURS,i.aggPeriodTimeUnits.DAYS=n.timeUnit.DAYS,i.aggPeriodTimeUnits.MILLISECONDS=n.timeUnit.MILLISECONDS,i.aggPeriodTimeUnits.SECONDS=n.timeUnit.SECONDS,i.$watch("configuration",function(e,t){angular.equals(e,t)||l.$setViewValue(i.configuration)}),l.$render=function(){i.configuration=l.$viewValue},e(a.contents())(i)};return{restrict:"E",require:"^ngModel",scope:{},link:i}}a.$inject=["$compile","$mdConstant","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(33),o=i(r);n(3)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var a=n(81),r=i(a),o=n(82),l=i(o),s=n(77),d=i(s),u=n(83),c=i(u),m=n(76),g=i(m),p=n(84),f=i(p),b=n(79),v=i(b),y=n(78),h=i(y);t.default=angular.module("thingsboard.ruleChain.config.enrichment",[]).directive("tbEnrichmentNodeOriginatorAttributesConfig",r.default).directive("tbEnrichmentNodeOriginatorFieldsConfig",l.default).directive("tbEnrichmentNodeDeviceAttributesConfig",d.default).directive("tbEnrichmentNodeRelatedAttributesConfig",c.default).directive("tbEnrichmentNodeCustomerAttributesConfig",g.default).directive("tbEnrichmentNodeTenantAttributesConfig",f.default).directive("tbEnrichmentNodeGetTelemetryFromDatabase",v.default).directive("tbEnrichmentNodeEntityDetailsConfig",h.default).name},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l);var s=186;n.separatorKeys=[t.KEY_CODE.ENTER,t.KEY_CODE.COMMA,s],n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","$mdConstant"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(34),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(35),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(36),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(37),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l);var s=186;n.separatorKeys=[t.KEY_CODE.ENTER,t.KEY_CODE.COMMA,s],n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","$mdConstant"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(38),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.types=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(39),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.ruleNodeTypes=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{readonly:"=ngReadonly"},link:n}}a.$inject=["$compile","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(40),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var a=n(91),r=i(a),o=n(89),l=i(o),s=n(92),d=i(s),u=n(86),c=i(u),m=n(90),g=i(m),p=n(85),f=i(p),b=n(87),v=i(b);t.default=angular.module("thingsboard.ruleChain.config.filter",[]).directive("tbFilterNodeScriptConfig",r.default).directive("tbFilterNodeMessageTypeConfig",l.default).directive("tbFilterNodeSwitchConfig",d.default).directive("tbFilterNodeCheckRelationConfig",c.default).directive("tbFilterNodeOriginatorTypeConfig",g.default).directive("tbFilterNodeCheckMessageConfig",f.default).directive("tbFilterNodeGpsGeofencingConfig",v.default).name},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n){var i=function(i,a,r,l){function s(){if(l.$viewValue){for(var e=[],t=0;t-1&&t.kvList.splice(e,1)}function l(){t.kvList||(t.kvList=[]),t.kvList.push({key:"",value:""})}function s(){var e={};t.kvList.forEach(function(t){t.key&&(e[t.key]=t.value)}),a.$setViewValue(e),d()}function d(){var e=!0;t.required&&!t.kvList.length&&(e=!1),a.$setValidity("kvMap",e)}var u=o.default;n.html(u),t.ngModelCtrl=a,t.removeKeyVal=r,t.addKeyVal=l,t.kvList=[],t.$watch("query",function(e,n){angular.equals(e,n)||a.$setViewValue(t.query)}),a.$render=function(){if(a.$viewValue){var e=a.$viewValue;t.kvList.length=0;for(var n in e)t.kvList.push({key:n,value:e[n]})}t.$watch("kvList",function(e,t){angular.equals(e,t)||s()},!0),d()},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{required:"=ngRequired",disabled:"=ngDisabled",requiredText:"=",keyText:"=",keyRequiredText:"=",valText:"=",valRequiredText:"="},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(45),o=i(r);n(5)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.types=t,n.$watch("query",function(e,t){angular.equals(e,t)||r.$setViewValue(n.query)}),r.$render=function(){n.query=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","types"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(46),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t){var n=function(n,i,a,r){var l=o.default;i.html(l),n.ruleNodeTypes=t,n.$watch("configuration",function(e,t){angular.equals(e,t)||r.$setViewValue(n.configuration)}),r.$render=function(){n.configuration=r.$viewValue},e(i.contents())(n)};return{restrict:"E",require:"^ngModel",scope:{},link:n}}a.$inject=["$compile","ruleNodeTypes"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(47),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var a=n(95),r=i(a),o=n(97),l=i(o),s=n(98),d=i(s);t.default=angular.module("thingsboard.ruleChain.config.transform",[]).directive("tbTransformationNodeChangeOriginatorConfig",r.default).directive("tbTransformationNodeScriptConfig",l.default).directive("tbTransformationNodeToEmailConfig",d.default).name},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e,t,n){var i=function(i,a,r,l){var s=o.default;a.html(s),i.$watch("configuration",function(e,t){angular.equals(e,t)||l.$setViewValue(i.configuration)}),l.$render=function(){i.configuration=l.$viewValue},i.testScript=function(e){var a=angular.copy(i.configuration.jsScript);n.testNodeScript(e,a,"update",t.instant("tb.rulenode.transformer")+"","Transform",["msg","metadata","msgType"],i.ruleNodeId).then(function(e){i.configuration.jsScript=e,l.$setDirty()})},e(a.contents())(i)};return{restrict:"E",require:"^ngModel",scope:{ruleNodeId:"="},link:i}}a.$inject=["$compile","$translate","ruleNodeScriptTest"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(48),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){var t=function(t,n,i,a){var r=o.default;n.html(r),t.$watch("configuration",function(e,n){angular.equals(e,n)||a.$setViewValue(t.configuration)}),a.$render=function(){t.configuration=a.$viewValue},e(n.contents())(t)};return{restrict:"E",require:"^ngModel",scope:{},link:t}}a.$inject=["$compile"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(49),o=i(r)},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var a=n(102),r=i(a),o=n(88),l=i(o),s=n(80),d=i(s),u=n(96),c=i(u),m=n(58),g=i(m),p=n(75),f=i(p),b=n(94),v=i(b),y=n(74),h=i(y),q=n(93),$=i(q),x=n(101),k=i(x);t.default=angular.module("thingsboard.ruleChain.config",[r.default,l.default,d.default,c.default,g.default]).directive("tbNodeEmptyConfig",f.default).directive("tbRelationsQueryConfig",v.default).directive("tbDeviceRelationsQueryConfig",h.default).directive("tbKvMapConfig",$.default).config(k.default).name},function(e,t){"use strict";function n(e){var t={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-name-pattern-hint":"Name pattern, use ${metaKeyName} to substitute variables from metadata","entity-type-pattern":"Type pattern","entity-type-pattern-required":"Type pattern is required","entity-type-pattern-hint":"Type pattern, use ${metaKeyName} to substitute variables from metadata","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-name-pattern-hint":"Customer name pattern, use ${metaKeyName} to substitute variables from metadata","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.","start-interval":"Start Interval","end-interval":"End Interval","start-interval-time-unit":"Start Interval Time Unit","end-interval-time-unit":"End Interval Time Unit","fetch-mode":"Fetch mode","fetch-mode-hint":"If selected fetch mode 'ALL' you able to choose telemetry sampling order.","order-by":"Order by","order-by-hint":"Select to choose telemetry sampling order.","time-unit-milliseconds":"Milliseconds","time-unit-seconds":"Seconds","time-unit-minutes":"Minutes","time-unit-hours":"Hours","time-unit-days":"Days","time-value-range":"Time value should be in a range from 1 to 2147483647'.","start-interval-value-required":"Start interval value is required.","end-interval-value-required":"End interval value is required.",filter:"Filter",switch:"Switch","message-type":"Message type","message-type-required":"Message type is required.","message-types-filter":"Message types filter","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","latest-timeseries":"Latest timeseries","data-keys":"Message data","metadata-keys":"Message metadata","relations-query":"Relations query","device-relations-query":"Device relations query","max-relation-level":"Max relation level","relation-type-pattern":"Relation type pattern","relation-type-pattern-hint":"Relation type pattern, use ${metaKeyName} to substitute variables from metadata","relation-type-pattern-required":"Relation type pattern is required","unlimited-level":"Unlimited level","latest-telemetry":"Latest telemetry","attr-mapping":"Attributes mapping","source-attribute":"Source attribute","source-attribute-required":"Source attribute is required.","source-telemetry":"Source telemetry","source-telemetry-required":"Source telemetry is required.","target-attribute":"Target attribute","target-attribute-required":"Target attribute is required.","attr-mapping-required":"At least one attribute mapping should be specified.","fields-mapping":"Fields mapping","fields-mapping-required":"At least one field mapping should be specified.","source-field":"Source field","source-field-required":"Source field is required.","originator-source":"Originator source","originator-customer":"Customer","originator-tenant":"Tenant","originator-related":"Related","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.","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","alarm-type-required":"Alarm type is required.","alarm-severity":"Alarm severity","alarm-severity-required":"Alarm severity is required",propagate:"Propagate",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","from-template-hint":"From address template, use ${metaKeyName} to substitute variables from metadata","to-template":"To Template","to-template-required":"To Template is required","mail-address-list-template-hint":"Comma separated address list, use ${metaKeyName} to substitute variables from metadata","cc-template":"Cc Template","bcc-template":"Bcc Template","subject-template":"Subject Template","subject-template-required":"Subject Template is required","subject-template-hint":"Mail subject template, use ${metaKeyName} to substitute variables from metadata","body-template":"Body Template","body-template-required":"Body Template is required","body-template-hint":"Mail body template, use ${metaKeyName} to substitute variables from metadata","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","endpoint-url-pattern-hint":"HTTP URL address pattern, use ${metaKeyName} to substitute variables from metadata","request-method":"Request method","use-simple-client-http-factory":"Use simple client HTTP factory",headers:"Headers","headers-hint":"Use ${metaKeyName} in header/value fields to substitute variables from metadata",header:"Header","header-required":"Header is required",value:"Value","value-required":"Value is required","topic-pattern":"Topic pattern","topic-pattern-required":"Topic pattern is required","mqtt-topic-pattern-hint":"MQTT topic pattern, use ${metaKeyName} to substitute variables from metadata","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","topic-arn-pattern-hint":"Topic ARN pattern, use ${metaKeyName} to substitute variables from metadata","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","queue-url-pattern-hint":"Queue URL pattern, use ${metaKeyName} to substitute variables from metadata","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","message-attributes":"Message attributes","message-attributes-hint":"Use ${metaKeyName} in name/value fields to substitute variables from metadata","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","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","username-required":"Username is required.","password-required":"Password is required.","ca-cert":"CA certificate file *","private-key":"Private key file *",cert:"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-interval-patterns":"Use metadata interval patterns","use-metadata-interval-patterns-hint":"If selected, rule node use start and end interval patterns from message metadata assuming that intervals are in the milliseconds.","use-message-alarm-data":"Use message alarm data","check-all-keys":"Check that all selected keys 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-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-pattern":"Start interval pattern","end-interval-pattern":"End interval pattern","start-interval-pattern-required":"Start interval pattern is required","end-interval-pattern-required":"End interval pattern is required","start-interval-pattern-hint":"Start interval pattern, use ${metaKeyName} to substitute variables from metadata","end-interval-pattern-hint":"End interval pattern, use ${metaKeyName} to substitute variables from metadata","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","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":'You should press "enter" to complete field input.',"entity-details":"Select entity details:","entity-details-country":"Country","entity-details-state":"State","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","add-to-metadata":"Add selected details to message metadata","add-to-metadata-hint":"If selected, adds the selected details keys to the message metadata instead of message data.","entity-details-list-empty":"No entity details 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":"You should 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-key-name":"Latitude key name","longitude-key-name":"Longitude key name","latitude-key-name-required":"Latitude key name is required.","longitude-key-name-required":"Longitude key name is required.","fetch-perimeter-info-from-message-metadata":"Fetch perimeter information from message metadata","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:"Range","range-required":"Range is required.","polygon-definition":"Polygon definition","polygon-definition-required":"Polygon definition is required.","polygon-definition-hint":"Please, use the following format for manual definition of polygon: [[lat1,lon1],[lon2,lon4], ... ,[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"},"key-val":{key:"Key",value:"Value","remove-entry":"Remove entry","add-entry":"Add entry"}}};e.translations("en_US",t)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=n},function(e,t,n){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function a(e){(0,o.default)(e)}a.$inject=["$translateProvider"],Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var r=n(100),o=i(r)},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=angular.module("thingsboard.ruleChain.config.types",[]).constant("ruleNodeTypes",{originatorSource:{CUSTOMER:{name:"tb.rulenode.originator-customer",value:"CUSTOMER"},TENANT:{name:"tb.rulenode.originator-tenant",value:"TENANT"},RELATED:{name:"tb.rulenode.originator-related",value:"RELATED"}},fetchModeType:["FIRST","LAST","ALL"],samplingOrder:["ASC","DESC"],httpRequestType:["GET","POST","PUT","DELETE"],entityDetails:{COUNTRY:{name:"tb.rulenode.entity-details-country",value:"COUNTRY"},STATE:{name:"tb.rulenode.entity-details-state",value:"STATE"},ZIP:{name:"tb.rulenode.entity-details-zip",value:"ZIP"},ADDRESS:{name:"tb.rulenode.entity-details-address",value:"ADDRESS"},ADDRESS2:{name:"tb.rulenode.entity-details-address2",value:"ADDRESS2"},PHONE:{name:"tb.rulenode.entity-details-phone",value:"PHONE"},EMAIL:{name:"tb.rulenode.entity-details-email",value:"EMAIL"},ADDITIONAL_INFO:{name:"tb.rulenode.entity-details-additional_info",
+value:"ADDITIONAL_INFO"}},sqsQueueType:{STANDARD:{name:"tb.rulenode.sqs-queue-standard",value:"STANDARD"},FIFO:{name:"tb.rulenode.sqs-queue-fifo",value:"FIFO"}},perimeterType:{CIRCLE:{name:"tb.rulenode.perimeter-circle",value:"CIRCLE"},POLYGON:{name:"tb.rulenode.perimeter-polygon",value:"POLYGON"}},timeUnit:{MILLISECONDS:{value:"MILLISECONDS",name:"tb.rulenode.time-unit-milliseconds"},SECONDS:{value:"SECONDS",name:"tb.rulenode.time-unit-seconds"},MINUTES:{value:"MINUTES",name:"tb.rulenode.time-unit-minutes"},HOURS:{value:"HOURS",name:"tb.rulenode.time-unit-hours"},DAYS:{value:"DAYS",name:"tb.rulenode.time-unit-days"}},rangeUnit:{METER:{value:"METER",name:"tb.rulenode.range-unit-meter"},KILOMETER:{value:"KILOMETER",name:"tb.rulenode.range-unit-kilometer"},FOOT:{value:"FOOT",name:"tb.rulenode.range-unit-foot"},MILE:{value:"MILE",name:"tb.rulenode.range-unit-mile"},NAUTICAL_MILE:{value:"NAUTICAL_MILE",name:"tb.rulenode.range-unit-nautical-mile"}},mqttCredentialTypes:{anonymous:{value:"anonymous",name:"tb.rulenode.credentials-anonymous"},basic:{value:"basic",name:"tb.rulenode.credentials-basic"},"cert.PEM":{value:"cert.PEM",name:"tb.rulenode.credentials-pem"}}}).name}]));
//# sourceMappingURL=rulenode-core-config.js.map
\ No newline at end of file
diff --git a/ui/package-lock.json b/ui/package-lock.json
index 9b8224e0ff..84f64c627d 100644
--- a/ui/package-lock.json
+++ b/ui/package-lock.json
@@ -468,9 +468,9 @@
"integrity": "sha512-o+V/OzwNGpS30QmgP7DJWTdBJ2BMDut481qqB72sM0L59dkO6TNjRV7qubQCntGqGe98h9vObweQUVYTfEO4vg=="
},
"angular-material": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/angular-material/-/angular-material-1.1.9.tgz",
- "integrity": "sha512-kxyigi+7823k/31qQ0j6wL5FkCe/mw2bAg1kfEFzIvhUoe5Myr+0YoQyN8D8EGaaOyolXU/VPtxgKSfOCSLEBw=="
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/angular-material/-/angular-material-1.1.13.tgz",
+ "integrity": "sha512-qWc5WOhRa/sbQmiRwenOla2Pky3w+wgW0l5Wp3J6jmB/WWxMWW7+JMdCXo1diGEETTKTF2vLdeWTceDTNehmSw=="
},
"angular-material-data-table": {
"version": "0.10.10",
@@ -5239,12 +5239,14 @@
"balanced-match": {
"version": "1.0.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -5259,17 +5261,20 @@
"code-point-at": {
"version": "1.1.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"core-util-is": {
"version": "1.0.2",
@@ -5386,7 +5391,8 @@
"inherits": {
"version": "2.0.3",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"ini": {
"version": "1.3.5",
@@ -5398,6 +5404,7 @@
"version": "1.0.0",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@@ -5412,6 +5419,7 @@
"version": "3.0.4",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@@ -5419,12 +5427,14 @@
"minimist": {
"version": "0.0.8",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"minipass": {
"version": "2.2.4",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"safe-buffer": "^5.1.1",
"yallist": "^3.0.0"
@@ -5443,6 +5453,7 @@
"version": "0.5.1",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -5523,7 +5534,8 @@
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"object-assign": {
"version": "4.1.1",
@@ -5535,6 +5547,7 @@
"version": "1.4.0",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"wrappy": "1"
}
@@ -5656,6 +5669,7 @@
"version": "1.0.2",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@@ -7675,6 +7689,22 @@
}
}
},
+ "jstree": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/jstree/-/jstree-3.3.7.tgz",
+ "integrity": "sha512-yzzalO1TbZ4HdPezO43LesGI4Wv2sB0Nl+4GfwO0YYvehGws5qtTAhlBISxfur9phMLwCtf9GjHlRx2ZLXyRnw==",
+ "requires": {
+ "jquery": ">=1.9.1"
+ }
+ },
+ "jstree-bootstrap-theme": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/jstree-bootstrap-theme/-/jstree-bootstrap-theme-1.0.1.tgz",
+ "integrity": "sha1-fV7cc6hG6Np/lPV6HMXd7p2eq0s=",
+ "requires": {
+ "jquery": ">=1.9.1"
+ }
+ },
"keycode": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz",
@@ -8328,6 +8358,18 @@
"tinycolor2": "*"
}
},
+ "md-date-range-picker": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/md-date-range-picker/-/md-date-range-picker-0.8.4.tgz",
+ "integrity": "sha512-TgLyozMJypi92yvXaljLcermTFhd1+0rlaVwV+Duo0EplbKfDJfFF3WohWhB7VmPwJNP//o44sUlecY+r/ZvXA==",
+ "requires": {
+ "angular": "^1.5.8",
+ "angular-animate": "^1.5.8",
+ "angular-aria": "^1.5.8",
+ "angular-material": "^1.1.0",
+ "angular-messages": "^1.5.8"
+ }
+ },
"mdPickers": {
"version": "git://github.com/alenaksu/mdPickers.git#72592ae51c81a7260701055ea21870efa57fa7c8",
"from": "git://github.com/alenaksu/mdPickers.git#0.7.5"
diff --git a/ui/package.json b/ui/package.json
index 2600c62438..b6701e4e61 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -27,7 +27,7 @@
"angular-gridster": "^0.13.14",
"angular-hotkeys": "^1.7.0",
"angular-jwt": "^0.1.6",
- "angular-material": "1.1.9",
+ "angular-material": "1.1.13",
"angular-material-data-table": "^0.10.9",
"angular-material-expansion-panel": "^0.7.2",
"angular-material-icons": "^0.7.1",
@@ -60,11 +60,14 @@
"jquery.terminal": "^1.5.0",
"js-beautify": "^1.6.4",
"json-schema-defaults": "^0.2.0",
+ "jstree": "^3.3.7",
+ "jstree-bootstrap-theme": "^1.0.1",
"leaflet": "^1.0.3",
"leaflet-providers": "^1.1.17",
"material-ui": "^0.16.1",
"material-ui-number-input": "^5.0.16",
"md-color-picker": "0.2.6",
+ "md-date-range-picker": "^0.8.4",
"mdPickers": "git://github.com/alenaksu/mdPickers.git#0.7.5",
"moment": "^2.15.0",
"ngFlowchart": "git://github.com/thingsboard/ngFlowchart.git#master",
diff --git a/ui/src/app/admin/admin.controller.js b/ui/src/app/admin/admin.controller.js
index c697726137..1fd0b22eeb 100644
--- a/ui/src/app/admin/admin.controller.js
+++ b/ui/src/app/admin/admin.controller.js
@@ -13,6 +13,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
+import './settings-card.scss';
+
/*@ngInject*/
export default function AdminController(adminService, toast, $scope, $rootScope, $state, $translate) {
diff --git a/ui/src/app/admin/general-settings.tpl.html b/ui/src/app/admin/general-settings.tpl.html
index 7023e133dd..0e651f8233 100644
--- a/ui/src/app/admin/general-settings.tpl.html
+++ b/ui/src/app/admin/general-settings.tpl.html
@@ -15,8 +15,8 @@
limitations under the License.
-->
-
-
+
+
admin.general-settings
diff --git a/ui/src/app/admin/outgoing-mail-settings.tpl.html b/ui/src/app/admin/outgoing-mail-settings.tpl.html
index 14049defd3..855da256c6 100644
--- a/ui/src/app/admin/outgoing-mail-settings.tpl.html
+++ b/ui/src/app/admin/outgoing-mail-settings.tpl.html
@@ -15,8 +15,8 @@
limitations under the License.
-->
-
-
+
+
admin.outgoing-mail-settings
diff --git a/ui/src/app/admin/settings-card.scss b/ui/src/app/admin/settings-card.scss
new file mode 100644
index 0000000000..9cbf5266b0
--- /dev/null
+++ b/ui/src/app/admin/settings-card.scss
@@ -0,0 +1,23 @@
+/**
+ * Copyright © 2016-2019 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 "../../scss/constants";
+
+md-card.settings-card {
+ @media (min-width: $layout-breakpoint-sm) {
+ width: 60%;
+ }
+}
diff --git a/ui/src/app/alarm/alarm-details-dialog.controller.js b/ui/src/app/alarm/alarm-details-dialog.controller.js
index f5e6c92e1c..3da3fa616e 100644
--- a/ui/src/app/alarm/alarm-details-dialog.controller.js
+++ b/ui/src/app/alarm/alarm-details-dialog.controller.js
@@ -14,6 +14,7 @@
* limitations under the License.
*/
import 'brace/ext/language_tools';
+import 'brace/ext/searchbox';
import 'brace/mode/json';
import 'brace/theme/github';
import beautify from 'js-beautify';
diff --git a/ui/src/app/api/entity-relation.service.js b/ui/src/app/api/entity-relation.service.js
index ad5dc63da4..9294ca39d4 100644
--- a/ui/src/app/api/entity-relation.service.js
+++ b/ui/src/app/api/entity-relation.service.js
@@ -164,13 +164,13 @@ function EntityRelationService($http, $q) {
return deferred.promise;
}
- function findByQuery(query) {
+ function findByQuery(query, config) {
var deferred = $q.defer();
var url = '/api/relations';
- $http.post(url, query).then(function success(response) {
+ $http.post(url, query, config).then(function success(response) {
deferred.resolve(response.data);
- }, function fail() {
- deferred.reject();
+ }, function fail(e) {
+ deferred.reject(e);
});
return deferred.promise;
}
diff --git a/ui/src/app/api/time.service.js b/ui/src/app/api/time.service.js
index 1acea59b5b..6d6fe8b730 100644
--- a/ui/src/app/api/time.service.js
+++ b/ui/src/app/api/time.service.js
@@ -256,13 +256,13 @@ function TimeService($translate, $http, $q, types) {
return timewindow;
}
- function toHistoryTimewindow(timewindow, startTimeMs, endTimeMs) {
-
- var interval = 0;
+ function toHistoryTimewindow(timewindow, startTimeMs, endTimeMs, interval) {
if (timewindow.history) {
- interval = timewindow.history.interval;
+ interval = angular.isDefined(interval) ? interval : timewindow.history.interval;
} else if (timewindow.realtime) {
interval = timewindow.realtime.interval;
+ } else {
+ interval = 0;
}
var aggType;
diff --git a/ui/src/app/api/user.service.js b/ui/src/app/api/user.service.js
index 3349558204..ffcdc5f896 100644
--- a/ui/src/app/api/user.service.js
+++ b/ui/src/app/api/user.service.js
@@ -362,6 +362,25 @@ function UserService($http, $q, $rootScope, adminService, dashboardService, time
$location.search('publicId', null);
deferred.reject();
});
+ } else if (locationSearch.accessToken) {
+ var token = locationSearch.accessToken;
+ var refreshToken = locationSearch.refreshToken;
+ $location.search('accessToken', null);
+ if (refreshToken) {
+ $location.search('refreshToken', null);
+ }
+ try {
+ updateAndValidateToken(token, 'jwt_token', false);
+ if (refreshToken) {
+ updateAndValidateToken(refreshToken, 'refresh_token', false);
+ } else {
+ store.remove('refresh_token');
+ store.remove('refresh_token_expiration');
+ }
+ } catch (e) {
+ deferred.reject();
+ }
+ procceedJwtTokenValidate();
} else {
procceedJwtTokenValidate();
}
diff --git a/ui/src/app/api/widget.service.js b/ui/src/app/api/widget.service.js
index a32d2b0f5c..4859f7f409 100644
--- a/ui/src/app/api/widget.service.js
+++ b/ui/src/app/api/widget.service.js
@@ -21,7 +21,9 @@ import thingsboardLedLight from '../components/led-light.directive';
import thingsboardTimeseriesTableWidget from '../widget/lib/timeseries-table-widget';
import thingsboardAlarmsTableWidget from '../widget/lib/alarms-table-widget';
import thingsboardEntitiesTableWidget from '../widget/lib/entities-table-widget';
+import thingsboardEntitiesHierarchyWidget from '../widget/lib/entities-hierarchy-widget';
import thingsboardExtensionsTableWidget from '../widget/lib/extensions-table-widget';
+import thingsboardDateRangeNavigatorWidget from '../widget/lib/date-range-navigator/date-range-navigator';
import thingsboardRpcWidgets from '../widget/lib/rpc';
@@ -32,6 +34,8 @@ import TbAnalogueCompass from '../widget/lib/analogue-compass';
import TbCanvasDigitalGauge from '../widget/lib/canvas-digital-gauge';
import TbMapWidget from '../widget/lib/map-widget';
import TbMapWidgetV2 from '../widget/lib/map-widget2';
+import TripAnimationWidget from '../widget/lib/tripAnimation/trip-animation-widget';
+
import 'jquery.terminal/js/jquery.terminal.min.js';
import 'jquery.terminal/css/jquery.terminal.min.css';
@@ -42,8 +46,10 @@ import cssjs from '../../vendor/css.js/css';
import thingsboardTypes from '../common/types.constant';
import thingsboardUtils from '../common/utils.service';
-export default angular.module('thingsboard.api.widget', ['oc.lazyLoad', thingsboardLedLight, thingsboardTimeseriesTableWidget,
- thingsboardAlarmsTableWidget, thingsboardEntitiesTableWidget, thingsboardExtensionsTableWidget, thingsboardRpcWidgets, thingsboardTypes, thingsboardUtils])
+export default angular.module('thingsboard.api.widget', ['oc.lazyLoad', thingsboardLedLight,
+ thingsboardTimeseriesTableWidget, thingsboardAlarmsTableWidget, thingsboardEntitiesTableWidget,
+ thingsboardEntitiesHierarchyWidget, thingsboardExtensionsTableWidget, thingsboardDateRangeNavigatorWidget,
+ thingsboardRpcWidgets, thingsboardTypes, thingsboardUtils, TripAnimationWidget])
.factory('widgetService', WidgetService)
.name;
diff --git a/ui/src/app/app.js b/ui/src/app/app.js
index dbef8a9c6b..3fd4115a2b 100644
--- a/ui/src/app/app.js
+++ b/ui/src/app/app.js
@@ -29,6 +29,7 @@ import 'angular-translate-storage-cookie';
import 'angular-translate-handler-log';
import 'angular-translate-interpolation-messageformat';
import 'md-color-picker';
+import 'md-date-range-picker';
import mdPickers from 'mdPickers';
import ngSanitize from 'angular-sanitize';
import FBAngular from 'angular-fullscreen';
@@ -52,7 +53,8 @@ import 'react-schema-form';
import react from 'ngreact';
import '@flowjs/ng-flow/dist/ng-flow-standalone.min';
import 'ngFlowchart/dist/ngFlowchart';
-
+import 'jstree/dist/jstree.min';
+import 'jstree-bootstrap-theme/dist/themes/proton/style.min.css';
import 'typeface-roboto';
import 'font-awesome/css/font-awesome.min.css';
import 'angular-material/angular-material.min.css';
@@ -65,6 +67,7 @@ import 'angular-hotkeys/build/hotkeys.min.css';
import 'angular-carousel/dist/angular-carousel.min.css';
import 'angular-material-expansion-panel/dist/md-expansion-panel.min.css';
import 'ngFlowchart/dist/flowchart.css';
+import 'md-date-range-picker/src/md-date-range-picker.css';
import '../scss/main.scss';
import thingsboardThirdpartyFix from './common/thirdparty-fix';
@@ -106,6 +109,7 @@ angular.module('thingsboard', [
angularSocialshare,
'pascalprecht.translate',
'mdColorPicker',
+ 'ngMaterialDateRangePicker',
mdPickers,
ngSanitize,
FBAngular.name,
diff --git a/ui/src/app/audit/audit-log-details-dialog.controller.js b/ui/src/app/audit/audit-log-details-dialog.controller.js
index ec839d5d3d..1093abc05a 100644
--- a/ui/src/app/audit/audit-log-details-dialog.controller.js
+++ b/ui/src/app/audit/audit-log-details-dialog.controller.js
@@ -15,6 +15,7 @@
*/
import $ from 'jquery';
import 'brace/ext/language_tools';
+import 'brace/ext/searchbox';
import 'brace/mode/java';
import 'brace/theme/github';
diff --git a/ui/src/app/common/utils.service.js b/ui/src/app/common/utils.service.js
index 0b8d23a726..f140893d2b 100644
--- a/ui/src/app/common/utils.service.js
+++ b/ui/src/app/common/utils.service.js
@@ -499,6 +499,8 @@ function Utils($mdColorPalette, $rootScope, $window, $translate, $q, $timeout, t
label = label.split(variable).join(datasource.entityName);
} else if (variableName === 'aliasName') {
label = label.split(variable).join(datasource.aliasName);
+ } else if (variableName === 'entityDescription') {
+ label = label.split(variable).join(datasource.entityDescription);
}
match = varsRegex.exec(pattern);
}
diff --git a/ui/src/app/components/contact.directive.js b/ui/src/app/components/contact.directive.js
index 93912882ed..cab6f52111 100644
--- a/ui/src/app/components/contact.directive.js
+++ b/ui/src/app/components/contact.directive.js
@@ -283,7 +283,7 @@ function Contact($compile, $templateCache) {
"Austria": "[0-9]{4}",
"Belgium": "[0-9]{4}",
"Brazil": "[0-9]{5}[\\-]?[0-9]{3}",
- "Canada": "[A-Za-z][0-9][A-Za-z] [0-9][A-Za-z][0-9]",
+ "Canada": "^(?!.*[DFIOQU])[A-VXY][0-9][A-Z][ -]?[0-9][A-Z][0-9]$",
"Denmark": "[0-9]{3,4}",
"Faroe Islands": "[0-9]{3,4}",
"Netherlands": "[1-9][0-9]{3}\\s?[a-zA-Z]{2}",
diff --git a/ui/src/app/components/dashboard.directive.js b/ui/src/app/components/dashboard.directive.js
index 5ffd218acc..831ecc29f6 100644
--- a/ui/src/app/components/dashboard.directive.js
+++ b/ui/src/app/components/dashboard.directive.js
@@ -219,14 +219,14 @@ function DashboardController($scope, $rootScope, $element, $timeout, $mdMedia, $
}
}, 0);
},
- onUpdateTimewindow: function(startTimeMs, endTimeMs) {
+ onUpdateTimewindow: function(startTimeMs, endTimeMs, interval) {
if (!vm.originalDashboardTimewindow) {
vm.originalDashboardTimewindow = angular.copy(vm.dashboardTimewindow);
}
$timeout(function() {
- vm.dashboardTimewindow = timeService.toHistoryTimewindow(vm.dashboardTimewindow, startTimeMs, endTimeMs);
+ vm.dashboardTimewindow = timeService.toHistoryTimewindow(vm.dashboardTimewindow, startTimeMs, endTimeMs, interval);
}, 0);
- }
+ },
};
addResizeListener(gridsterParent[0], onGridsterParentResize); // eslint-disable-line no-undef
diff --git a/ui/src/app/components/js-func.directive.js b/ui/src/app/components/js-func.directive.js
index cb3d58788f..bb600b789e 100644
--- a/ui/src/app/components/js-func.directive.js
+++ b/ui/src/app/components/js-func.directive.js
@@ -17,6 +17,7 @@ import './js-func.scss';
import ace from 'brace';
import 'brace/ext/language_tools';
+import 'brace/ext/searchbox';
import $ from 'jquery';
import thingsboardToast from '../services/toast';
import thingsboardUtils from '../common/utils.service';
diff --git a/ui/src/app/components/json-content.directive.js b/ui/src/app/components/json-content.directive.js
index 6686059a95..668d163a6d 100644
--- a/ui/src/app/components/json-content.directive.js
+++ b/ui/src/app/components/json-content.directive.js
@@ -16,6 +16,7 @@
import './json-content.scss';
import 'brace/ext/language_tools';
+import 'brace/ext/searchbox';
import 'brace/mode/json';
import 'brace/mode/text';
import 'brace/snippets/json';
diff --git a/ui/src/app/components/json-form.directive.js b/ui/src/app/components/json-form.directive.js
index 1b460b6238..80f8a6cdda 100644
--- a/ui/src/app/components/json-form.directive.js
+++ b/ui/src/app/components/json-form.directive.js
@@ -71,7 +71,10 @@ function JsonForm($compile, $templateCache, $mdColorPicker) {
$compile(element.contents())(childScope);
}
+ scope.isFullscreen = false;
+
scope.formProps = {
+ isFullscreen: false,
option: {
formDefaults: {
startEmpty: true
@@ -86,6 +89,10 @@ function JsonForm($compile, $templateCache, $mdColorPicker) {
},
onColorClick: function(event, key, val) {
scope.showColorPicker(event, val);
+ },
+ onToggleFullscreen: function() {
+ scope.isFullscreen = !scope.isFullscreen;
+ scope.formProps.isFullscreen = scope.isFullscreen;
}
};
@@ -116,6 +123,8 @@ function JsonForm($compile, $templateCache, $mdColorPicker) {
});
}
+ scope.onFullscreenChanged = function() {}
+
scope.validate = function(){
if (scope.schema && scope.model) {
var result = utils.validateBySchema(scope.schema, scope.model);
diff --git a/ui/src/app/components/json-form.tpl.html b/ui/src/app/components/json-form.tpl.html
index c15f3f5eb1..f5096c25b7 100644
--- a/ui/src/app/components/json-form.tpl.html
+++ b/ui/src/app/components/json-form.tpl.html
@@ -15,4 +15,6 @@
limitations under the License.
-->
-
\ No newline at end of file
+
+
+
diff --git a/ui/src/app/components/json-object-edit.directive.js b/ui/src/app/components/json-object-edit.directive.js
index cc4ada19b6..a79eecb64e 100644
--- a/ui/src/app/components/json-object-edit.directive.js
+++ b/ui/src/app/components/json-object-edit.directive.js
@@ -16,6 +16,7 @@
import './json-object-edit.scss';
import 'brace/ext/language_tools';
+import 'brace/ext/searchbox';
import 'brace/mode/json';
import 'brace/snippets/json';
diff --git a/ui/src/app/components/nav-tree.directive.js b/ui/src/app/components/nav-tree.directive.js
new file mode 100644
index 0000000000..119ef98529
--- /dev/null
+++ b/ui/src/app/components/nav-tree.directive.js
@@ -0,0 +1,206 @@
+/*
+ * Copyright © 2016-2019 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 './nav-tree.scss';
+
+/* eslint-disable import/no-unresolved, import/default */
+
+import navTreeTemplate from './nav-tree.tpl.html';
+
+/* eslint-enable import/no-unresolved, import/default */
+
+export default angular.module('thingsboard.directives.navTree', [])
+ .directive('tbNavTree', NavTree)
+ .name;
+
+/*@ngInject*/
+function NavTree() {
+ return {
+ restrict: "E",
+ scope: true,
+ bindToController: {
+ loadNodes: '=',
+ editCallbacks: '=',
+ enableSearch: '@?',
+ onNodeSelected: '&',
+ onNodesInserted: '&',
+ searchCallback: '&?'
+ },
+ controller: NavTreeController,
+ controllerAs: 'vm',
+ templateUrl: navTreeTemplate
+ };
+}
+
+/*@ngInject*/
+function NavTreeController($scope, $element, types) {
+
+ var vm = this;
+ vm.types = types;
+
+ $scope.$watch('vm.loadNodes', (newVal) => {
+ if (newVal) {
+ initTree();
+ }
+ });
+
+ function initTree() {
+ var config = {
+ core: {
+ multiple: false,
+ check_callback: true,
+ themes: { name: 'proton', responsive: true },
+ data: vm.loadNodes
+ }
+ };
+
+ if (vm.enableSearch) {
+ config.plugins = ["search"];
+ config.search = {
+ case_sensitive: false,
+ show_only_matches: true,
+ show_only_matches_children: false,
+ search_leaves_only: false
+ };
+ if (vm.searchCallback) {
+ config.search.search_callback = (searchText, node) => vm.searchCallback({searchText: searchText, node: node});
+ }
+ }
+
+ vm.treeElement = angular.element('.tb-nav-tree-container', $element)
+ .jstree(config);
+
+ vm.treeElement.on("changed.jstree", function (e, data) {
+ if (vm.onNodeSelected) {
+ vm.onNodeSelected({node: data.instance.get_selected(true)[0], event: e});
+ }
+ });
+
+ vm.treeElement.on("model.jstree", function (e, data) {
+ if (vm.onNodesInserted) {
+ vm.onNodesInserted({nodes: data.nodes, parent: data.parent});
+ }
+ });
+
+ if (vm.editCallbacks) {
+ vm.editCallbacks.selectNode = (id) => {
+ var node = vm.treeElement.jstree('get_node', id);
+ if (node) {
+ vm.treeElement.jstree('deselect_all', true);
+ vm.treeElement.jstree('select_node', node);
+ }
+ };
+ vm.editCallbacks.deselectAll = () => {
+ vm.treeElement.jstree('deselect_all');
+ };
+ vm.editCallbacks.getNode = (id) => {
+ var node = vm.treeElement.jstree('get_node', id);
+ return node;
+ };
+ vm.editCallbacks.getParentNodeId = (id) => {
+ var node = vm.treeElement.jstree('get_node', id);
+ if (node) {
+ return vm.treeElement.jstree('get_parent', node);
+ }
+ };
+ vm.editCallbacks.openNode = (id, cb) => {
+ var node = vm.treeElement.jstree('get_node', id);
+ if (node) {
+ vm.treeElement.jstree('open_node', node, cb);
+ }
+ };
+ vm.editCallbacks.nodeIsOpen = (id) => {
+ var node = vm.treeElement.jstree('get_node', id);
+ if (node) {
+ return vm.treeElement.jstree('is_open', node);
+ } else {
+ return true;
+ }
+ };
+ vm.editCallbacks.nodeIsLoaded = (id) => {
+ var node = vm.treeElement.jstree('get_node', id);
+ if (node) {
+ return vm.treeElement.jstree('is_loaded', node);
+ } else {
+ return true;
+ }
+ };
+ vm.editCallbacks.refreshNode = (id) => {
+ if (id === '#') {
+ vm.treeElement.jstree('refresh');
+ vm.treeElement.jstree('redraw');
+ } else {
+ var node = vm.treeElement.jstree('get_node', id);
+ if (node) {
+ var opened = vm.treeElement.jstree('is_open', node);
+ vm.treeElement.jstree('refresh_node', node);
+ vm.treeElement.jstree('redraw');
+ if (node.children && opened/* && !node.children.length*/) {
+ vm.treeElement.jstree('open_node', node);
+ }
+ }
+ }
+ };
+ vm.editCallbacks.updateNode = (id, newName) => {
+ var node = vm.treeElement.jstree('get_node', id);
+ if (node) {
+ vm.treeElement.jstree('rename_node', node, newName);
+ }
+ };
+ vm.editCallbacks.createNode = (parentId, node, pos) => {
+ var parentNode = vm.treeElement.jstree('get_node', parentId);
+ if (parentNode) {
+ vm.treeElement.jstree('create_node', parentNode, node, pos);
+ }
+ };
+ vm.editCallbacks.deleteNode = (id) => {
+ var node = vm.treeElement.jstree('get_node', id);
+ if (node) {
+ vm.treeElement.jstree('delete_node', node);
+ }
+ };
+ vm.editCallbacks.disableNode = (id) => {
+ var node = vm.treeElement.jstree('get_node', id);
+ if (node) {
+ vm.treeElement.jstree('disable_node', node);
+ }
+ };
+ vm.editCallbacks.enableNode = (id) => {
+ var node = vm.treeElement.jstree('get_node', id);
+ if (node) {
+ vm.treeElement.jstree('enable_node', node);
+ }
+ };
+ vm.editCallbacks.setNodeHasChildren = (id, hasChildren) => {
+ var node = vm.treeElement.jstree('get_node', id);
+ if (node) {
+ if (!node.children || !node.children.length) {
+ node.children = hasChildren;
+ node.state.loaded = !hasChildren;
+ node.state.opened = false;
+ vm.treeElement.jstree('_node_changed', node.id);
+ vm.treeElement.jstree('redraw');
+ }
+ }
+ };
+ vm.editCallbacks.search = (searchText) => {
+ vm.treeElement.jstree('search', searchText);
+ };
+ vm.editCallbacks.clearSearch = () => {
+ vm.treeElement.jstree('clear_search');
+ };
+ }
+ }
+}
diff --git a/ui/src/app/components/nav-tree.scss b/ui/src/app/components/nav-tree.scss
new file mode 100644
index 0000000000..4a9ac4739b
--- /dev/null
+++ b/ui/src/app/components/nav-tree.scss
@@ -0,0 +1,346 @@
+/**
+ * Copyright © 2016-2019 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-nav-tree-container {
+ padding: 15px;
+ font-family: Roboto, "Helvetica Neue", sans-serif;
+
+ &.jstree-proton {
+ .jstree-node,
+ .jstree-icon {
+ background-image: url("../../png/jstree/32px.png");
+ }
+
+ .jstree-last {
+ background: transparent;
+ }
+
+ .jstree-themeicon-custom {
+ background-image: none;
+
+ &.material-icons {
+ font-size: 18px;
+ }
+ }
+
+ .jstree-anchor {
+ font-size: 16px;
+ }
+ }
+
+ &.jstree-proton-small {
+ .jstree-node,
+ .jstree-icon {
+ background-image: url("../../png/jstree/32px.png");
+ }
+
+ .jstree-last {
+ background: transparent;
+ }
+
+ .jstree-themeicon-custom {
+ background-image: none;
+
+ &.material-icons {
+ font-size: 14px;
+ }
+ }
+
+ .jstree-anchor {
+ font-size: 14px;
+ }
+ }
+
+ &.jstree-proton-large {
+ .jstree-node,
+ .jstree-icon {
+ background-image: url("../../png/jstree/32px.png");
+ }
+
+ .jstree-last {
+ background: transparent;
+ }
+
+ .jstree-themeicon-custom {
+ background-image: none;
+
+ &.material-icons {
+ font-size: 24px;
+ }
+ }
+
+ .jstree-anchor {
+ font-size: 20px;
+ }
+ }
+
+ a {
+ border-bottom: none;
+
+ i.jstree-themeicon-custom {
+ &.tb-user-group {
+ &::before {
+ content: "account_circle";
+ }
+ }
+
+ &.tb-customer-group {
+ &::before {
+ content: "supervisor_account";
+ }
+ }
+
+ &.tb-asset-group {
+ &::before {
+ content: "domain";
+ }
+ }
+
+ &.tb-device-group {
+ &::before {
+ content: "devices_other";
+ }
+ }
+
+ &.tb-entity-view-group {
+ &::before {
+ content: "view_quilt";
+ }
+ }
+
+ &.tb-dashboard-group {
+ &::before {
+ content: "dashboard";
+ }
+ }
+
+ &.tb-customer {
+ &::before {
+ content: "supervisor_account";
+ }
+ }
+ }
+ }
+}
+
+@media (max-width: 768px) {
+ .tb-nav-tree-container {
+ &.jstree-proton-responsive {
+ .jstree-node,
+ .jstree-icon,
+ .jstree-node > .jstree-ocl,
+ .jstree-themeicon,
+ .jstree-checkbox {
+ background-image: url("../../png/jstree/40px.png");
+ background-size: 120px 240px;
+ }
+
+ .jstree-container-ul {
+ overflow: visible;
+ }
+
+ .jstree-themeicon-custom {
+ background-color: transparent;
+ background-image: none;
+ background-position: 0 0;
+
+ &.material-icons {
+ margin: 0;
+ font-size: 24px;
+ }
+ }
+
+ .jstree-node,
+ .jstree-leaf > .jstree-ocl {
+ background: 0 0;
+ }
+
+ .jstree-node {
+ min-width: 40px;
+ min-height: 40px;
+ margin-left: 40px;
+ line-height: 40px;
+ white-space: nowrap;
+ background-repeat: repeat-y;
+ background-position: -80px 0;
+ }
+
+ .jstree-last {
+ background: 0 0;
+ }
+
+ .jstree-anchor {
+ height: 40px;
+ font-size: 1.1em;
+ font-weight: 700;
+ line-height: 40px;
+ text-shadow: 1px 1px #fff;
+ }
+
+ .jstree-icon,
+ .jstree-icon:empty {
+ width: 40px;
+ height: 40px;
+ line-height: 40px;
+ }
+
+ > {
+ .jstree-container-ul > .jstree-node {
+ margin-right: 0;
+ margin-left: 0;
+ }
+ }
+
+ .jstree-ocl,
+ .jstree-themeicon,
+ .jstree-checkbox {
+ background-size: 120px 240px;
+ }
+
+ .jstree-leaf > .jstree-ocl {
+ background: 0 0;
+ background-position: -40px -120px;
+ }
+
+ .jstree-last > .jstree-ocl {
+ background-position: -40px -160px;
+ }
+
+ .jstree-open > .jstree-ocl {
+ background-position: 0 0 !important;
+ }
+
+ .jstree-closed > .jstree-ocl {
+ background-position: 0 -40px !important;
+ }
+
+ .jstree-themeicon {
+ background-position: -40px -40px;
+ }
+
+ .jstree-checkbox,
+ .jstree-checkbox:hover {
+ background-position: -40px -80px;
+ }
+
+ &.jstree-checkbox-selection {
+ .jstree-clicked > .jstree-checkbox,
+ .jstree-clicked > .jstree-checkbox:hover {
+ background-position: 0 -80px;
+ }
+ }
+
+ .jstree-checked > .jstree-checkbox,
+ .jstree-checked > .jstree-checkbox:hover {
+ background-position: 0 -80px;
+ }
+
+ .jstree-anchor > .jstree-undetermined,
+ .jstree-anchor > .jstree-undetermined:hover {
+ background-position: 0 -120px;
+ }
+
+ .jstree-striped {
+ background: 0 0;
+ }
+
+ .jstree-wholerow {
+ height: 40px;
+ background: #ebebeb;
+ border-top: 1px solid rgba(255, 255, 255, .7);
+ border-bottom: 1px solid rgba(64, 64, 64, .2);
+ }
+
+ .jstree-wholerow-hovered {
+ background: #e7f4f9;
+ }
+
+ .jstree-wholerow-clicked {
+ background: #beebff;
+ }
+
+ .jstree-children {
+ .jstree-last > .jstree-wholerow {
+ box-shadow: inset 0 -6px 3px -5px #666;
+ }
+
+ .jstree-open > .jstree-wholerow {
+ border-top: 0;
+ box-shadow: inset 0 6px 3px -5px #666;
+ }
+
+ .jstree-open + .jstree-open {
+ box-shadow: none;
+ }
+ }
+
+ &.jstree-rtl {
+ .jstree-node {
+ margin-right: 40px;
+ margin-left: 0;
+ }
+
+ .jstree-container-ul > .jstree-node {
+ margin-right: 0;
+ }
+
+ .jstree-closed > .jstree-ocl {
+ background-position: -40px 0 !important;
+ }
+ }
+ }
+ }
+}
+
+.tb-nav-tree .md-button.tb-active {
+ font-weight: 500;
+ background-color: rgba(255, 255, 255, .15);
+}
+
+.tb-nav-tree,
+.tb-nav-tree ul {
+ margin-top: 0;
+ list-style: none;
+
+ &:first-child {
+ padding: 0;
+ }
+
+ li {
+ .md-button {
+ width: 100%;
+ max-height: 40px;
+ padding: 0 16px;
+ margin: 0;
+ overflow: hidden;
+ line-height: 40px;
+ color: inherit;
+ text-align: left;
+ text-decoration: none;
+ text-overflow: ellipsis;
+ text-transform: none;
+ text-rendering: optimizeLegibility;
+ white-space: nowrap;
+ cursor: pointer;
+ border-radius: 0;
+
+ span {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ }
+ }
+}
diff --git a/ui/src/app/components/nav-tree.tpl.html b/ui/src/app/components/nav-tree.tpl.html
new file mode 100644
index 0000000000..88612965ff
--- /dev/null
+++ b/ui/src/app/components/nav-tree.tpl.html
@@ -0,0 +1,18 @@
+
+
diff --git a/ui/src/app/components/react/json-form-ace-editor.jsx b/ui/src/app/components/react/json-form-ace-editor.jsx
index a1f576bc43..0720b86a41 100644
--- a/ui/src/app/components/react/json-form-ace-editor.jsx
+++ b/ui/src/app/components/react/json-form-ace-editor.jsx
@@ -21,6 +21,7 @@ import reactCSS from 'reactcss';
import AceEditor from 'react-ace';
import FlatButton from 'material-ui/FlatButton';
import 'brace/ext/language_tools';
+import 'brace/ext/searchbox';
import 'brace/theme/github';
import fixAceEditor from './../ace-editor-fix';
@@ -34,8 +35,10 @@ class ThingsboardAceEditor extends React.Component {
this.onFocus = this.onFocus.bind(this);
this.onTidy = this.onTidy.bind(this);
this.onLoad = this.onLoad.bind(this);
+ this.onToggleFull = this.onToggleFull.bind(this);
var value = props.value ? props.value + '' : '';
this.state = {
+ isFull: false,
value: value,
focused: false
};
@@ -76,9 +79,26 @@ class ThingsboardAceEditor extends React.Component {
}
onLoad(editor) {
+ this.aceEditor = editor;
fixAceEditor(editor);
}
+ onToggleFull() {
+ this.setState({ isFull: !this.state.isFull });
+ this.props.onToggleFullscreen();
+ this.updateAceEditorSize = true;
+ }
+
+ componentDidUpdate() {
+ if (this.updateAceEditorSize) {
+ if (this.aceEditor) {
+ this.aceEditor.resize();
+ this.aceEditor.renderer.updateFull();
+ }
+ this.updateAceEditorSize = false;
+ }
+ }
+
render() {
const styles = reactCSS({
@@ -108,18 +128,23 @@ class ThingsboardAceEditor extends React.Component {
if (this.state.focused) {
labelClass += " tb-focused";
}
-
+ var containerClass = "tb-container";
+ var style = this.props.form.style || {width: '100%'};
+ if (this.state.isFull) {
+ containerClass += " fullscreen-form-field";
+ }
return (
-
+
+
+ style={style}/>
{this.props.error}
+ style={{opacity: this.props.valid ? '0' : '1'}}>{this.props.error}
);
}
diff --git a/ui/src/app/components/react/json-form-ace-editor.scss b/ui/src/app/components/react/json-form-ace-editor.scss
index 3ae4530b9c..fa32b74a07 100644
--- a/ui/src/app/components/react/json-form-ace-editor.scss
+++ b/ui/src/app/components/react/json-form-ace-editor.scss
@@ -13,6 +13,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
+.fullscreen-form-field {
+ .json-form-ace-editor {
+ height: calc(100% - 60px);
+ }
+}
+
.json-form-ace-editor {
position: relative;
height: 100%;
diff --git a/ui/src/app/components/react/json-form-array.jsx b/ui/src/app/components/react/json-form-array.jsx
index b42bac55a8..46f6457b0f 100644
--- a/ui/src/app/components/react/json-form-array.jsx
+++ b/ui/src/app/components/react/json-form-array.jsx
@@ -131,7 +131,7 @@ class ThingsboardArray extends React.Component {
}
let forms = this.props.form.items.map(function(form, index){
var copy = this.copyWithIndex(form, i);
- return this.props.builder(copy, this.props.model, index, this.props.onChange, this.props.onColorClick, this.props.mapper, this.props.builder);
+ return this.props.builder(copy, this.props.model, index, this.props.onChange, this.props.onColorClick, this.props.onToggleFullscreen, this.props.mapper, this.props.builder);
}.bind(this));
arrays.push(
diff --git a/ui/src/app/components/react/json-form-fieldset.jsx b/ui/src/app/components/react/json-form-fieldset.jsx
index 8434025c7b..5a0f94017c 100644
--- a/ui/src/app/components/react/json-form-fieldset.jsx
+++ b/ui/src/app/components/react/json-form-fieldset.jsx
@@ -19,7 +19,7 @@ class ThingsboardFieldSet extends React.Component {
render() {
let forms = this.props.form.items.map(function(form, index){
- return this.props.builder(form, this.props.model, index, this.props.onChange, this.props.onColorClick, this.props.mapper, this.props.builder);
+ return this.props.builder(form, this.props.model, index, this.props.onChange, this.props.onColorClick, this.props.onToggleFullscreen, this.props.mapper, this.props.builder);
}.bind(this));
return (
diff --git a/ui/src/app/components/react/json-form-react.jsx b/ui/src/app/components/react/json-form-react.jsx
index 59d007532c..18b2de26ef 100644
--- a/ui/src/app/components/react/json-form-react.jsx
+++ b/ui/src/app/components/react/json-form-react.jsx
@@ -50,7 +50,8 @@ ReactSchemaForm.propTypes = {
model: React.PropTypes.object,
option: React.PropTypes.object,
onModelChange: React.PropTypes.func,
- onColorClick: React.PropTypes.func
+ onColorClick: React.PropTypes.func,
+ onToggleFullscreen: React.PropTypes.func
}
ReactSchemaForm.defaultProps = {
diff --git a/ui/src/app/components/react/json-form-schema-form.jsx b/ui/src/app/components/react/json-form-schema-form.jsx
index 4c3aefe66e..47d20426b7 100644
--- a/ui/src/app/components/react/json-form-schema-form.jsx
+++ b/ui/src/app/components/react/json-form-schema-form.jsx
@@ -63,6 +63,7 @@ class ThingsboardSchemaForm extends React.Component {
this.onChange = this.onChange.bind(this);
this.onColorClick = this.onColorClick.bind(this);
+ this.onToggleFullscreen = this.onToggleFullscreen.bind(this);
this.hasConditions = false;
}
@@ -78,7 +79,11 @@ class ThingsboardSchemaForm extends React.Component {
this.props.onColorClick(event, key, val);
}
- builder(form, model, index, onChange, onColorClick, mapper) {
+ onToggleFullscreen() {
+ this.props.onToggleFullscreen();
+ }
+
+ builder(form, model, index, onChange, onColorClick, onToggleFullscreen, mapper) {
var type = form.type;
let Field = this.mapper[type];
if(!Field) {
@@ -91,7 +96,7 @@ class ThingsboardSchemaForm extends React.Component {
return null;
}
}
- return
+ return
}
render() {
@@ -101,11 +106,16 @@ class ThingsboardSchemaForm extends React.Component {
mapper = _.merge(this.mapper, this.props.mapper);
}
let forms = merged.map(function(form, index) {
- return this.builder(form, this.props.model, index, this.onChange, this.onColorClick, mapper);
+ return this.builder(form, this.props.model, index, this.onChange, this.onColorClick, this.onToggleFullscreen, mapper);
}.bind(this));
+ let formClass = 'SchemaForm';
+ if (this.props.isFullscreen) {
+ formClass += ' SchemaFormFullscreen';
+ }
+
return (
- {forms}
+ {forms}
);
}
}
diff --git a/ui/src/app/components/react/json-form.scss b/ui/src/app/components/react/json-form.scss
index eabf2725ef..d36ec5c0e8 100644
--- a/ui/src/app/components/react/json-form.scss
+++ b/ui/src/app/components/react/json-form.scss
@@ -21,6 +21,24 @@ $swift-ease-out-timing-function: cubic-bezier(.25, .8, .25, 1) !default;
$input-label-float-offset: 6px !default;
$input-label-float-scale: .75 !default;
+.SchemaForm {
+ &.SchemaFormFullscreen {
+ position: relative;
+ width: 100%;
+ height: 100%;
+
+ > div:not(.fullscreen-form-field) {
+ display: none;
+ }
+
+ > div.fullscreen-form-field {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ }
+ }
+}
+
.json-form-error {
position: relative;
bottom: -5px;
diff --git a/ui/src/app/components/widget/widget.controller.js b/ui/src/app/components/widget/widget.controller.js
index a58064320c..b5ad7ac0d5 100644
--- a/ui/src/app/components/widget/widget.controller.js
+++ b/ui/src/app/components/widget/widget.controller.js
@@ -76,9 +76,9 @@ export default function WidgetController($scope, $state, $timeout, $window, $ele
defaultSubscription: null,
dashboardTimewindow: dashboardTimewindow,
timewindowFunctions: {
- onUpdateTimewindow: function(startTimeMs, endTimeMs) {
+ onUpdateTimewindow: function(startTimeMs, endTimeMs, interval) {
if (widgetContext.defaultSubscription) {
- widgetContext.defaultSubscription.onUpdateTimewindow(startTimeMs, endTimeMs);
+ widgetContext.defaultSubscription.onUpdateTimewindow(startTimeMs, endTimeMs, interval);
}
},
onResetTimewindow: function() {
diff --git a/ui/src/app/entity/relation/relation-dialog.controller.js b/ui/src/app/entity/relation/relation-dialog.controller.js
index 7ce2d4bd51..cd4bcebcfb 100644
--- a/ui/src/app/entity/relation/relation-dialog.controller.js
+++ b/ui/src/app/entity/relation/relation-dialog.controller.js
@@ -14,6 +14,7 @@
* limitations under the License.
*/
import 'brace/ext/language_tools';
+import 'brace/ext/searchbox';
import 'brace/mode/json';
import 'brace/theme/github';
import beautify from 'js-beautify';
diff --git a/ui/src/app/event/event-content-dialog.controller.js b/ui/src/app/event/event-content-dialog.controller.js
index 80fc739056..9fb8a5a4ec 100644
--- a/ui/src/app/event/event-content-dialog.controller.js
+++ b/ui/src/app/event/event-content-dialog.controller.js
@@ -15,6 +15,7 @@
*/
import $ from 'jquery';
import 'brace/ext/language_tools';
+import 'brace/ext/searchbox';
import 'brace/mode/java';
import 'brace/theme/github';
import beautify from 'js-beautify';
diff --git a/ui/src/app/extension/extensions-forms/extension-form-http.directive.js b/ui/src/app/extension/extensions-forms/extension-form-http.directive.js
index 47a2b860c5..616d70d0e4 100644
--- a/ui/src/app/extension/extensions-forms/extension-form-http.directive.js
+++ b/ui/src/app/extension/extensions-forms/extension-form-http.directive.js
@@ -14,6 +14,7 @@
* limitations under the License.
*/
import 'brace/ext/language_tools';
+import 'brace/ext/searchbox';
import 'brace/mode/json';
import 'brace/theme/github';
diff --git a/ui/src/app/extension/extensions-forms/extension-form-modbus.directive.js b/ui/src/app/extension/extensions-forms/extension-form-modbus.directive.js
index 36686be529..52b2e16a1d 100644
--- a/ui/src/app/extension/extensions-forms/extension-form-modbus.directive.js
+++ b/ui/src/app/extension/extensions-forms/extension-form-modbus.directive.js
@@ -14,6 +14,7 @@
* limitations under the License.
*/
import 'brace/ext/language_tools';
+import 'brace/ext/searchbox';
import 'brace/mode/json';
import 'brace/theme/github';
diff --git a/ui/src/app/extension/extensions-forms/extension-form-opc.directive.js b/ui/src/app/extension/extensions-forms/extension-form-opc.directive.js
index a9b1d73519..1598fd04ef 100644
--- a/ui/src/app/extension/extensions-forms/extension-form-opc.directive.js
+++ b/ui/src/app/extension/extensions-forms/extension-form-opc.directive.js
@@ -14,6 +14,7 @@
* limitations under the License.
*/
import 'brace/ext/language_tools';
+import 'brace/ext/searchbox';
import 'brace/mode/json';
import 'brace/theme/github';
diff --git a/ui/src/app/layout/index.js b/ui/src/app/layout/index.js
index bb450490a8..c0ef817a3b 100644
--- a/ui/src/app/layout/index.js
+++ b/ui/src/app/layout/index.js
@@ -27,6 +27,7 @@ import thingsboardApiUser from '../api/user.service';
import thingsboardNoAnimate from '../components/no-animate.directive';
import thingsboardOnFinishRender from '../components/finish-render.directive';
import thingsboardSideMenu from '../components/side-menu.directive';
+import thingsboardNavTree from '../components/nav-tree.directive';
import thingsboardDashboardAutocomplete from '../components/dashboard-autocomplete.directive';
import thingsboardKvMap from '../components/kv-map.directive';
import thingsboardJsonObjectEdit from '../components/json-object-edit.directive';
@@ -89,6 +90,7 @@ export default angular.module('thingsboard.home', [
thingsboardNoAnimate,
thingsboardOnFinishRender,
thingsboardSideMenu,
+ thingsboardNavTree,
thingsboardDashboardAutocomplete,
thingsboardKvMap,
thingsboardJsonObjectEdit,
diff --git a/ui/src/app/locale/locale.constant-de_DE.json b/ui/src/app/locale/locale.constant-de_DE.json
index bc241e28a5..9b3fee13c2 100644
--- a/ui/src/app/locale/locale.constant-de_DE.json
+++ b/ui/src/app/locale/locale.constant-de_DE.json
@@ -1549,6 +1549,65 @@
"widget-type-file": "Widget-Typdatei",
"invalid-widget-type-file-error": "Widget-Typ kann nicht importiert werden: Ungültige Datenstruktur des Widget-Typs."
},
+ "widgets": {
+ "date-range-navigator": {
+ "localizationMap": {
+ "Sun": "So.",
+ "Mon": "Mo.",
+ "Tue": "Di.",
+ "Wed": "Mi.",
+ "Thu": "Do.",
+ "Fri": "Fr.",
+ "Sat": "Sa.",
+ "Jan": "Jan.",
+ "Feb": "Feb.",
+ "Mar": "März",
+ "Apr": "Apr.",
+ "May": "Mai",
+ "Jun": "Juni",
+ "Jul": "Juli",
+ "Aug": "Aug.",
+ "Sep": "Sep.",
+ "Oct": "Okt.",
+ "Nov": "Nov.",
+ "Dec": "Dez.",
+ "January": "Januar",
+ "February": "Februar",
+ "March": "März",
+ "April": "April",
+ "June": "Juni",
+ "July": "Juli",
+ "August": "August",
+ "September": "September",
+ "October": "Oktober",
+ "November": "November",
+ "December": "Dezember",
+ "Custom Date Range": "Benutzerdefinierter Datumsbereich",
+ "Date Range Template": "Datumsbereichsvorlage",
+ "Today": "Heute",
+ "Yesterday": "Gestern",
+ "This Week": "Diese Woche",
+ "Last Week": "Letzte Woche",
+ "This Month": "Diesen Monat",
+ "Last Month": "Im vergangenen Monat",
+ "Year": "Jahr",
+ "This Year": "Dieses Jahr",
+ "Last Year": "Vergangenes Jahr",
+ "Date picker": "Datumsauswahl",
+ "Hour": "Stunde",
+ "Day": "Tag",
+ "Week": "Woche",
+ "2 weeks": "2 Wochen",
+ "Month": "Monat",
+ "3 months": "3 Monate",
+ "6 months": "6 Monate",
+ "Custom interval": "Benutzerdefiniertes Intervall",
+ "Interval": "Intervall",
+ "Step size": "Schrittlänge",
+ "Ok": "Ok"
+ }
+ }
+ },
"icon": {
"icon": "Symbol",
"select-icon": "Symbol auswählen",
@@ -1577,7 +1636,8 @@
"es_ES": "Spanisch",
"ja_JA": "Japanisch",
"tr_TR": "Türkisch",
- "fa_IR": "Persisch"
+ "fa_IR": "Persisch",
+ "uk_UA": "Ukrainisch"
}
}
}
\ No newline at end of file
diff --git a/ui/src/app/locale/locale.constant-en_US.json b/ui/src/app/locale/locale.constant-en_US.json
index 9e38c55aaa..bc31a90de0 100644
--- a/ui/src/app/locale/locale.constant-en_US.json
+++ b/ui/src/app/locale/locale.constant-en_US.json
@@ -1295,7 +1295,8 @@
"metadata-required": "Metadata entries can't be empty.",
"output": "Output",
"test": "Test",
- "help": "Help"
+ "help": "Help",
+ "reset-debug-mode": "Reset debug mode in all nodes"
},
"tenant": {
"tenant": "Tenant",
@@ -1554,6 +1555,65 @@
"widget-type-file": "Widget type file",
"invalid-widget-type-file-error": "Unable to import widget type: Invalid widget type data structure."
},
+ "widgets": {
+ "date-range-navigator": {
+ "localizationMap": {
+ "Sun": "Sun",
+ "Mon": "Mon",
+ "Tue": "Tue",
+ "Wed": "Wed",
+ "Thu": "Thu",
+ "Fri": "Fri",
+ "Sat": "Sat",
+ "Jan": "Jan",
+ "Feb": "Feb",
+ "Mar": "Mar",
+ "Apr": "Apr",
+ "May": "May",
+ "Jun": "Jun",
+ "Jul": "Jul",
+ "Aug": "Aug",
+ "Sep": "Sep",
+ "Oct": "Oct",
+ "Nov": "Nov",
+ "Dec": "Dec",
+ "January": "January",
+ "February": "February",
+ "March": "March",
+ "April": "April",
+ "June": "June",
+ "July": "July",
+ "August": "August",
+ "September": "September",
+ "October": "October",
+ "November": "November",
+ "December": "December",
+ "Custom Date Range": "Custom Date Range",
+ "Date Range Template": "Date Range Template",
+ "Today": "Today",
+ "Yesterday": "Yesterday",
+ "This Week": "This Week",
+ "Last Week": "Last Week",
+ "This Month": "This Month",
+ "Last Month": "Last Month",
+ "Year": "Year",
+ "This Year": "This Year",
+ "Last Year": "Last Year",
+ "Date picker": "Date picker",
+ "Hour": "Hour",
+ "Day": "Day",
+ "Week": "Week",
+ "2 weeks": "2 Weeks",
+ "Month": "Month",
+ "3 months": "3 Months",
+ "6 months": "6 Months",
+ "Custom interval": "Custom interval",
+ "Interval": "Interval",
+ "Step size": "Step size",
+ "Ok": "Ok"
+ }
+ }
+ },
"icon": {
"icon": "Icon",
"select-icon": "Select icon",
@@ -1566,7 +1626,8 @@
"row-click": "On row click",
"polygon-click": "On polygon click",
"marker-click": "On marker click",
- "tooltip-tag-action": "Tooltip tag action"
+ "tooltip-tag-action": "Tooltip tag action",
+ "node-selected": "On node selected"
}
},
"language": {
@@ -1582,7 +1643,8 @@
"es_ES": "Spanish",
"ja_JA": "Japanese",
"tr_TR": "Turkish",
- "fa_IR": "Persian"
+ "fa_IR": "Persian",
+ "uk_UA": "Ukrainian"
}
}
}
\ No newline at end of file
diff --git a/ui/src/app/locale/locale.constant-es_ES.json b/ui/src/app/locale/locale.constant-es_ES.json
index 48ace08e6b..5dd0f51623 100644
--- a/ui/src/app/locale/locale.constant-es_ES.json
+++ b/ui/src/app/locale/locale.constant-es_ES.json
@@ -1549,6 +1549,65 @@
"widget-type-file": "Archivo de tipo de widget",
"invalid-widget-type-file-error": "No se puede importar tipo de widget: Estructura de datos del tipo de widget es inválida."
},
+ "widgets": {
+ "date-range-navigator": {
+ "localizationMap": {
+ "Sun": "Dom.",
+ "Mon": "Lun.",
+ "Tue": "Mar.",
+ "Wed": "Mié",
+ "Thu": "Jue.",
+ "Fri": "Vie.",
+ "Sat": "Sáb.",
+ "Jan": "Ene.",
+ "Feb": "Feb.",
+ "Mar": "Mar.",
+ "Apr": "Abr.",
+ "May": "May.",
+ "Jun": "Jun.",
+ "Jul": "Jul.",
+ "Aug": "Ago.",
+ "Sep": "Sept.",
+ "Oct": "Oct.",
+ "Nov": "Nov.",
+ "Dec": "Dic.",
+ "January": "Enero",
+ "February": "Febrero",
+ "March": "Marzo",
+ "April": "Abril",
+ "June": "Junio",
+ "July": "Julio",
+ "August": "Agosto",
+ "September": "Septiembre",
+ "October": "Octubre",
+ "November": "Noviembre",
+ "December": "Diciembre",
+ "Custom Date Range": "Intervalo de fechas personalizado",
+ "Date Range Template": "Plantilla de rango de fechas",
+ "Today": "Hoy",
+ "Yesterday": "Ayer",
+ "This Week": "Esta semana",
+ "Last Week": "La semana pasada",
+ "This Month": "Este mes",
+ "Last Month": "El mes pasado",
+ "Year": "Año",
+ "This Year": "Este año",
+ "Last Year": "Último",
+ "Date picker": "Date picker",
+ "Hour": "Hora",
+ "Day": "Día",
+ "Week": "Semana",
+ "2 weeks": "2 Semanas",
+ "Month": "Mes",
+ "3 months": "3 Meses",
+ "6 months": "6 Meses",
+ "Custom interval": "Intervalo personalizado",
+ "Interval": "Intervalo",
+ "Step size": "Numero de pie",
+ "Ok": "De acuerdo"
+ }
+ }
+ },
"icon": {
"icon": "Icono",
"select-icon": "Seleccionar icono",
@@ -1577,7 +1636,8 @@
"es_ES": "Español",
"ja_JA": "Japonés",
"tr_TR": "Turco",
- "fa_IR": "Persa"
+ "fa_IR": "Persa",
+ "uk_UA": "Ucraniano"
}
}
}
\ No newline at end of file
diff --git a/ui/src/app/locale/locale.constant-fa_IR.json b/ui/src/app/locale/locale.constant-fa_IR.json
index de9b2a4f5e..a3173c1197 100644
--- a/ui/src/app/locale/locale.constant-fa_IR.json
+++ b/ui/src/app/locale/locale.constant-fa_IR.json
@@ -1549,6 +1549,65 @@
"widget-type-file": "پرونده نوع ويجت",
"invalid-widget-type-file-error": ".وارد کردن نوع ويجت ممکن نيست: ساختار داده نوع ويجت نامعتبر است"
},
+ "widgets": {
+ "date-range-navigator": {
+ "localizationMap": {
+ "Sun": "یکشنبه",
+ "Mon": "دوشنبه",
+ "Tue": "سهشنبه",
+ "Wed": "چهارشنبه",
+ "Thu": "پنجشنبه",
+ "Fri": "جمعه",
+ "Sat": "شنبه",
+ "Jan": "ژانویهٔ",
+ "Feb": "فوریهٔ",
+ "Mar": "مارس",
+ "Apr": "آوریل",
+ "May": "مهٔ",
+ "Jun": "ژوئن",
+ "Jul": "ژوئیهٔ",
+ "Aug": "اوت",
+ "Sep": "سپتامبر",
+ "Oct": "اکتبر",
+ "Nov": "نوامبر",
+ "Dec": "دسامبر",
+ "January": "January",
+ "February": "February",
+ "March": "March",
+ "April": "April",
+ "June": "June",
+ "July": "July",
+ "August": "August",
+ "September": "September",
+ "October": "October",
+ "November": "November",
+ "December": "December",
+ "Custom Date Range": "Custom Date Range",
+ "Date Range Template": "Date Range Template",
+ "Today": "Today",
+ "Yesterday": "Yesterday",
+ "This Week": "This Week",
+ "Last Week": "Last Week",
+ "This Month": "This Month",
+ "Last Month": "Last Month",
+ "Year": "Year",
+ "This Year": "This Year",
+ "Last Year": "Last Year",
+ "Date picker": "Date picker",
+ "Hour": "Hour",
+ "Day": "Day",
+ "Week": "Week",
+ "2 weeks": "2 weeks",
+ "Month": "Month",
+ "3 months": "3 months",
+ "6 months": "6 months",
+ "Custom interval": "Custom interval",
+ "Interval": "Interval",
+ "Step size": "Step size",
+ "Ok": "Ok"
+ }
+ }
+ },
"icon": {
"icon": "آيکون",
"select-icon": "انتخاب آيکون",
@@ -1576,7 +1635,8 @@
"es_ES": "اسپانيولي",
"ja_JA": "ژاپني",
"tr_TR": "ترکي",
- "fa_IR": "فارسي"
+ "fa_IR": "فارسي",
+ "uk_UA": "اوکراین"
}
}
}
diff --git a/ui/src/app/locale/locale.constant-fr_FR.json b/ui/src/app/locale/locale.constant-fr_FR.json
index f22f90548b..a9159e323f 100644
--- a/ui/src/app/locale/locale.constant-fr_FR.json
+++ b/ui/src/app/locale/locale.constant-fr_FR.json
@@ -1014,7 +1014,8 @@
"zh_CN": "Chinois",
"ja_JA": "Japonaise",
"tr_TR": "Turc",
- "fa_IR": "Persane"
+ "fa_IR": "Persane",
+ "uk_UA": "Ukrainien"
}
},
"layout": {
@@ -1436,6 +1437,65 @@
"invalid-widget-type-file-error": "Impossible d'importer le type de widget: structure de données de type widget invalide.",
"widget-type-file": "Fichier de type Widget"
},
+ "widgets": {
+ "date-range-navigator": {
+ "localizationMap": {
+ "Sun": "Dim.",
+ "Mon": "Lun.",
+ "Tue": "Mar.",
+ "Wed": "Mer.",
+ "Thu": "Jeu.",
+ "Fri": "Ven.",
+ "Sat": "Sam.",
+ "Jan": "Janv.",
+ "Feb": "Févr.",
+ "Mar": "Mars",
+ "Apr": "Avr.",
+ "May": "Mai",
+ "Jun": "Juin",
+ "Jul": "Juil.",
+ "Aug": "Août",
+ "Sep": "Sept.",
+ "Oct": "Oct.",
+ "Nov": "Nov.",
+ "Dec": "Déc.",
+ "January": "Janvier",
+ "February": "Février",
+ "March": "Mars",
+ "April": "Avril",
+ "June": "Juin",
+ "July": "Juillet",
+ "August": "Août",
+ "September": "Septembre",
+ "October": "Octobre",
+ "November": "Novembre",
+ "December": "Décembre",
+ "Custom Date Range": "Plage de dates personnalisée",
+ "Date Range Template": "Modèle de plage de dates",
+ "Today": "Aujourd'hui",
+ "Yesterday": "Hier",
+ "This Week": "Cette semaine",
+ "Last Week": "La semaine dernière",
+ "This Month": "Ce mois-ci",
+ "Last Month": "Le mois dernier",
+ "Year": "Année",
+ "This Year": "Cette année",
+ "Last Year": "L'année dernière",
+ "Date picker": "Sélecteur de date",
+ "Hour": "Heure",
+ "Day": "Journée",
+ "Week": "La semaine",
+ "2 weeks": "2 Semaines",
+ "Month": "Mois",
+ "3 months": "3 Mois",
+ "6 months": "6 Mois",
+ "Custom interval": "Intervalle personnalisé",
+ "Interval": "Intervalle",
+ "Step size": "Taille de pas",
+ "Ok": "Ok"
+ }
+ }
+ },
"widgets-bundle": {
"add": "Ajouter un groupe de widgets",
"add-widgets-bundle-text": "Ajouter un nouveau groupe de widgets",
diff --git a/ui/src/app/locale/locale.constant-it_IT.json b/ui/src/app/locale/locale.constant-it_IT.json
index 986fdc19a0..aac0132ab8 100644
--- a/ui/src/app/locale/locale.constant-it_IT.json
+++ b/ui/src/app/locale/locale.constant-it_IT.json
@@ -1554,6 +1554,65 @@
"widget-type-file": "File tipo di widget",
"invalid-widget-type-file-error": "Impossibile importare un tipo di widget: struttura dati del widget non valida."
},
+ "widgets": {
+ "date-range-navigator": {
+ "localizationMap": {
+ "Sun": "Dom",
+ "Mon": "Lun",
+ "Tue": "Mar",
+ "Wed": "Mer",
+ "Thu": "Gio",
+ "Fri": "Ven",
+ "Sat": "Sab",
+ "Jan": "Gen",
+ "Feb": "Feb",
+ "Mar": "Mar",
+ "Apr": "Apr",
+ "May": "Mag",
+ "Jun": "Giu",
+ "Jul": "Lug",
+ "Aug": "Ago",
+ "Sep": "Set",
+ "Oct": "Ott",
+ "Nov": "Nov",
+ "Dec": "Dic",
+ "January": "Gennaio",
+ "February": "Febbraio",
+ "March": "Marzo",
+ "April": "Aprile",
+ "June": "Giugno",
+ "July": "Luglio",
+ "August": "Agosto",
+ "September": "Settembre",
+ "October": "Ottobre",
+ "November": "Novembre",
+ "December": "Dicembre",
+ "Custom Date Range": "Intervallo di date personalizzato",
+ "Date Range Template": "Modello di intervallo di date",
+ "Today": "Oggi",
+ "Yesterday": "Ieri",
+ "This Week": "Questa settimana",
+ "Last Week": "La settimana scorsa",
+ "This Month": "Questo mese",
+ "Last Month": "Lo scorso mese",
+ "Year": "Anno",
+ "This Year": "Quest'anno",
+ "Last Year": "L'anno scorso",
+ "Date picker": "Date picker",
+ "Hour": "Ora",
+ "Day": "Giorno",
+ "Week": "Settimana",
+ "2 weeks": "2 Settimane",
+ "Month": "Mese",
+ "3 months": "3 Mesi",
+ "6 months": "6 Mesi",
+ "Custom interval": "Intervallo personalizzato",
+ "Interval": "Intervallo",
+ "Step size": "Dimensione del passo",
+ "Ok": "Ok"
+ }
+ }
+ },
"icon": {
"icon": "Icona",
"select-icon": "Seleziona icona",
@@ -1582,7 +1641,8 @@
"es_ES": "Spagnolo",
"ja_JA": "Giapponese",
"tr_TR": "Turco",
- "fa_IR": "Persiana"
+ "fa_IR": "Persiana",
+ "uk_UA": "Ucraino"
}
}
}
diff --git a/ui/src/app/locale/locale.constant-ja_JA.json b/ui/src/app/locale/locale.constant-ja_JA.json
index 9fe6971ff9..7395725867 100644
--- a/ui/src/app/locale/locale.constant-ja_JA.json
+++ b/ui/src/app/locale/locale.constant-ja_JA.json
@@ -1205,10 +1205,10 @@
"tenant-required": "テナントが必要です"
},
"timeinterval": {
- "seconds-interval": "{ seconds, select, 1 {1 second} other {# seconds} }",
- "minutes-interval": "{ minutes, select, 1 {1 minute} other {# minutes} }",
- "hours-interval": "{ hours, select, 1 {1 hour} other {# hours} }",
- "days-interval": "{ days, select, 1 {1 day} other {# days} }",
+ "seconds-interval": "{ seconds, plural, 1 {1 second} other {# seconds} }",
+ "minutes-interval": "{ minutes, plural, 1 {1 minute} other {# minutes} }",
+ "hours-interval": "{ hours, plural, 1 {1 hour} other {# hours} }",
+ "days-interval": "{ days, plural, 1 {1 day} other {# days} }",
"days": "日々",
"hours": "時間",
"minutes": "分",
@@ -1216,10 +1216,10 @@
"advanced": "上級"
},
"timewindow": {
- "days": "{ days, select, 1 { day } other {# days } }",
- "hours": "{ hours, select, 0 { hour } 1 {1 hour } other {# hours } }",
- "minutes": "{ minutes, select, 0 { minute } 1 {1 minute } other {# minutes } }",
- "seconds": "{ seconds, select, 0 { second } 1 {1 second } other {# seconds } }",
+ "days": "{ days, plural, 1 { day } other {# days } }",
+ "hours": "{ hours, plural, 0 { hour } 1 {1 hour } other {# hours } }",
+ "minutes": "{ minutes, plural, 0 { minute } 1 {1 minute } other {# minutes } }",
+ "seconds": "{ seconds, plural, 0 { second } 1 {1 second } other {# seconds } }",
"realtime": "リアルタイム",
"history": "歴史",
"last-prefix": "最終",
@@ -1432,6 +1432,65 @@
"widget-type-file": "ウィジェットタイプファイル",
"invalid-widget-type-file-error": "ウィジェットタイプをインポートできません:ウィジェットタイプのデータ構造が無効です。"
},
+ "widgets": {
+ "date-range-navigator": {
+ "localizationMap": {
+ "Sun": "日",
+ "Mon": "月",
+ "Tue": "火",
+ "Wed": "水",
+ "Thu": "木",
+ "Fri": "金",
+ "Sat": "土",
+ "Jan": "1月",
+ "Feb": "2月",
+ "Mar": "3月",
+ "Apr": "4月",
+ "May": "5月",
+ "Jun": "6月",
+ "Jul": "7月",
+ "Aug": "8月",
+ "Sep": "9月",
+ "Oct": "10月",
+ "Nov": "11月",
+ "Dec": "12月",
+ "January": "1月",
+ "February": "2月",
+ "March": "行進",
+ "April": "4月",
+ "June": "六月",
+ "July": "7月",
+ "August": "8月",
+ "September": "9月",
+ "October": "10月",
+ "November": "11月",
+ "December": "12月",
+ "Custom Date Range": "カスタム期間",
+ "Date Range Template": "日付範囲テンプレート",
+ "Today": "今日",
+ "Yesterday": "昨日",
+ "This Week": "今週",
+ "Last Week": "先週",
+ "This Month": "今月",
+ "Last Month": "先月",
+ "Year": "年",
+ "This Year": "今年",
+ "Last Year": "昨年",
+ "Date picker": "日付ピッカー",
+ "Hour": "時",
+ "Day": "日",
+ "Week": "週間",
+ "2 weeks": "2週間",
+ "Month": "月",
+ "3 months": "3ヶ月",
+ "6 months": "6ヵ月",
+ "Custom interval": "カスタム間隔",
+ "Interval": "間隔",
+ "Step size": "刻み幅",
+ "Ok": "Ok"
+ }
+ }
+ },
"icon": {
"icon": "アイコン",
"select-icon": "選択アイコン",
@@ -1460,7 +1519,8 @@
"es_ES": "スペイン語",
"ja_JA": "日本語",
"tr_TR": "トルコ語",
- "fa_IR": "ペルシャ語"
+ "fa_IR": "ペルシャ語",
+ "uk_UA": "ウクライナ語"
}
}
}
\ No newline at end of file
diff --git a/ui/src/app/locale/locale.constant-ko_KR.json b/ui/src/app/locale/locale.constant-ko_KR.json
index 87f92dc3e4..e2186b2c32 100644
--- a/ui/src/app/locale/locale.constant-ko_KR.json
+++ b/ui/src/app/locale/locale.constant-ko_KR.json
@@ -1308,6 +1308,65 @@
"widget-type-file": "위젯 타입 파일",
"invalid-widget-type-file-error": "위젯 타입을 가져오기 할 수 없습니다.: 잘못된 위젯 타입 데이터 구조입니다."
},
+ "widgets": {
+ "date-range-navigator": {
+ "localizationMap": {
+ "Sun": "일",
+ "Mon": "월",
+ "Tue": "화",
+ "Wed": "수",
+ "Thu": "목",
+ "Fri": "금",
+ "Sat": "토",
+ "Jan": "1월",
+ "Feb": "2월",
+ "Mar": "3월",
+ "Apr": "4월",
+ "May": "5월",
+ "Jun": "6월",
+ "Jul": "7월",
+ "Aug": "8월",
+ "Sep": "9월",
+ "Oct": "10월",
+ "Nov": "11월",
+ "Dec": "12월",
+ "January": "일월",
+ "February": "이월",
+ "March": "행진",
+ "April": "4 월",
+ "June": "유월",
+ "July": "칠월",
+ "August": "팔월",
+ "September": "구월",
+ "October": "십월",
+ "November": "십일월",
+ "December": "12 월",
+ "Custom Date Range": "맞춤 기간",
+ "Date Range Template": "기간 템플릿",
+ "Today": "오늘",
+ "Yesterday": "어제",
+ "This Week": "이번 주",
+ "Last Week": "지난주",
+ "This Month": "이번 달",
+ "Last Month": "지난 달",
+ "Year": "년",
+ "This Year": "올해",
+ "Last Year": "작년",
+ "Date picker": "날짜 선택기",
+ "Hour": "시간",
+ "Day": "일",
+ "Week": "주",
+ "2 weeks": "이주",
+ "Month": "달",
+ "3 months": "3 개월",
+ "6 months": "6 개월",
+ "Custom interval": "사용자 지정 간격",
+ "Interval": "간격",
+ "Step size": "단계 크기",
+ "Ok": "Ok"
+ }
+ }
+ },
"icon": {
"icon": "Icon",
"select-icon": "Select icon",
@@ -1336,7 +1395,8 @@
"it_IT": "이탈리아 사람",
"ja_JA": "일본어",
"tr_TR": "터키어",
- "fa_IR": "페르시아 인"
+ "fa_IR": "페르시아 인",
+ "uk_UA": "우크라이나의"
}
}
}
\ No newline at end of file
diff --git a/ui/src/app/locale/locale.constant-ru_RU.json b/ui/src/app/locale/locale.constant-ru_RU.json
index 3ad4371cc1..a69a094403 100644
--- a/ui/src/app/locale/locale.constant-ru_RU.json
+++ b/ui/src/app/locale/locale.constant-ru_RU.json
@@ -1288,7 +1288,8 @@
"metadata-required": "Метаданные объекта не могут быть пустыми.",
"output": "Выход",
"test": "Протестировать",
- "help": "Помощь"
+ "help": "Помощь",
+ "reset-debug-mode": "Сбросить режим отладки во всех правилах"
},
"tenant": {
"tenant": "Владелец",
@@ -1547,6 +1548,65 @@
"widget-type-file": "Файл типа виджета",
"invalid-widget-type-file-error": "Не удалось импортировать виджет: неизвестная схема данных типа виджета."
},
+ "widgets": {
+ "date-range-navigator": {
+ "localizationMap": {
+ "Sun": "Вс",
+ "Mon": "Пн",
+ "Tue": "Вт",
+ "Wed": "Ср",
+ "Thu": "Чт",
+ "Fri": "Пт",
+ "Sat": "Сб",
+ "Jan": "Янв.",
+ "Feb": "Февр.",
+ "Mar": "Март",
+ "Apr": "Апр.",
+ "May": "Май",
+ "Jun": "Июнь",
+ "Jul": "Июль",
+ "Aug": "Авг.",
+ "Sep": "Сент.",
+ "Oct": "Окт.",
+ "Nov": "Нояб.",
+ "Dec": "Дек.",
+ "January": "Январь",
+ "February": "Февраль",
+ "March": "Март",
+ "April": "Апрель",
+ "June": "Июнь",
+ "July": "Июль",
+ "August": "Август",
+ "September": "Сентябрь",
+ "October": "Октября",
+ "November": "Ноябрь",
+ "December": "Декабрь",
+ "Custom Date Range": "Пользовательский диапазон дат",
+ "Date Range Template": "Шаблон диапазона дат",
+ "Today": "Сегодня",
+ "Yesterday": "Вчера",
+ "This Week": "На этой неделе",
+ "Last Week": "Прошлая неделя",
+ "This Month": "Этот месяц",
+ "Last Month": "Прошлый месяц",
+ "Year": "Год",
+ "This Year": "В этом году",
+ "Last Year": "Прошлый год",
+ "Date picker": "Выбор даты",
+ "Hour": "Час",
+ "Day": "День",
+ "Week": "Неделю",
+ "2 weeks": "2 Недели",
+ "Month": "Месяц",
+ "3 months": "3 Месяца",
+ "6 months": "6 Месяцев",
+ "Custom interval": "Пользовательский интервал",
+ "Interval": "Интервал",
+ "Step size": "Размер шага",
+ "Ok": "Ok"
+ }
+ }
+ },
"icon": {
"icon": "Иконка",
"select-icon": "Выбрать иконку",
@@ -1575,7 +1635,8 @@
"tr_TR": "Турецкий",
"fr_FR": "Французский",
"ja_JA": "Японский",
- "fa_IR": "Персидский"
+ "fa_IR": "Персидский",
+ "uk_UA": "Украинский"
}
}
}
\ No newline at end of file
diff --git a/ui/src/app/locale/locale.constant-tr_TR.json b/ui/src/app/locale/locale.constant-tr_TR.json
index e65d07bd83..2652ba5359 100644
--- a/ui/src/app/locale/locale.constant-tr_TR.json
+++ b/ui/src/app/locale/locale.constant-tr_TR.json
@@ -1285,10 +1285,10 @@
"tenant-required": "Tenant gerekli"
},
"timeinterval": {
- "seconds-interval": "{ seconds, select, 1 {1 saniye} other {# saniye} }",
- "minutes-interval": "{ minutes, select, 1 {1 dakika} other {# dakika} }",
- "hours-interval": "{ hours, select, 1 {1 saat} other {# saat} }",
- "days-interval": "{ days, select, 1 {1 gün} other {# gün} }",
+ "seconds-interval": "{ seconds, plural, 1 {1 saniye} other {# saniye} }",
+ "minutes-interval": "{ minutes, plural, 1 {1 dakika} other {# dakika} }",
+ "hours-interval": "{ hours, plural, 1 {1 saat} other {# saat} }",
+ "days-interval": "{ days, plural, 1 {1 gün} other {# gün} }",
"days": "Gün",
"hours": "Saat",
"minutes": "Dakika",
@@ -1296,10 +1296,10 @@
"advanced": "İleri düzey"
},
"timewindow": {
- "days": "{ days, select, 1 { gün } other {# gün } }",
- "hours": "{ hours, select, 0 { saat } 1 {1 saat } other {# saat } }",
- "minutes": "{ minutes, select, 0 { dakika } 1 {1 dakika } other {# dakika } }",
- "seconds": "{ seconds, select, 0 { saniye } 1 {1 saniye } other {# saniye } }",
+ "days": "{ days, plural, 1 { gün } other {# gün } }",
+ "hours": "{ hours, plural, 0 { saat } 1 {1 saat } other {# saat } }",
+ "minutes": "{ minutes, plural, 0 { dakika } 1 {1 dakika } other {# dakika } }",
+ "seconds": "{ seconds, plural, 0 { saniye } 1 {1 saniye } other {# saniye } }",
"realtime": "Gerçek zaman",
"history": "Tarih",
"last-prefix": "son",
@@ -1514,6 +1514,65 @@
"widget-type-file": "Gösterge türü dosyası",
"invalid-widget-type-file-error": "Gösterge türü içe aktarılamadı: Geçersiz gösterge türü veri yapısı."
},
+ "widgets": {
+ "date-range-navigator": {
+ "localizationMap": {
+ "Sun": "Paz",
+ "Mon": "Pzt",
+ "Tue": "Sal",
+ "Wed": "Çar",
+ "Thu": "Per",
+ "Fri": "Cum",
+ "Sat": "Cmt",
+ "Jan": "Oca",
+ "Feb": "Şub",
+ "Mar": "Mar",
+ "Apr": "Nis",
+ "May": "May",
+ "Jun": "Haz",
+ "Jul": "Tem",
+ "Aug": "Ağu",
+ "Sep": "Eyl",
+ "Oct": "Eki",
+ "Nov": "Kas",
+ "Dec": "Ara",
+ "January": "Ocak",
+ "February": "Şubat",
+ "March": "Mart",
+ "April": "Nisan",
+ "June": "Haziran",
+ "July": "Temmuz",
+ "August": "Ağustos",
+ "September": "Eylül",
+ "October": "Ekim",
+ "November": "Kasım",
+ "December": "Aralık",
+ "Custom Date Range": "Özel Tarih Aralığı",
+ "Date Range Template": "Tarih Aralığı Şablonu",
+ "Today": "Bugün",
+ "Yesterday": "Dün",
+ "This Week": "Bu hafta",
+ "Last Week": "Geçen hafta",
+ "This Month": "Bu ay",
+ "Last Month": "Geçen ay",
+ "Year": "Yıl",
+ "This Year": "Bu yıl",
+ "Last Year": "Geçen yıl",
+ "Date picker": "Tarih seçici",
+ "Hour": "Saat",
+ "Day": "Gün",
+ "Week": "Hafta",
+ "2 weeks": "2 Hafta",
+ "Month": "Ay",
+ "3 months": "3 Ay",
+ "6 months": "6 Ay",
+ "Custom interval": "Özel aralık",
+ "Interval": "Aralık",
+ "Step size": "Adım boyutu",
+ "Ok": "Ok"
+ }
+ }
+ },
"icon": {
"icon": "İkon",
"select-icon": "İkon seç",
@@ -1542,7 +1601,8 @@
"es_ES": "İspanyol",
"ja_JA": "Japonca",
"tr_TR": "Türkçe",
- "fa_IR": "Farsça"
+ "fa_IR": "Farsça",
+ "uk_UA": "Ukrayna"
}
}
}
\ No newline at end of file
diff --git a/ui/src/app/locale/locale.constant-uk_UA.json b/ui/src/app/locale/locale.constant-uk_UA.json
new file mode 100644
index 0000000000..4eb59a2d40
--- /dev/null
+++ b/ui/src/app/locale/locale.constant-uk_UA.json
@@ -0,0 +1,2183 @@
+ {
+ "access": {
+ "unauthorized": "Неавторизований",
+ "unauthorized-access": "Неавторизований доступ",
+ "unauthorized-access-text": "Щоб отримати доступ до цього ресурсу, потрібно ввійти в систему!",
+ "access-forbidden": "Доступ заборонено",
+ "access-forbidden-text": "Недостатньо прав для доступу!
Спробуйте увійти як інший користувач, якщо ви все ще хочете отримати доступ до цього ресурсу.",
+ "refresh-token-expired": "Дані про сесію застарілі",
+ "refresh-token-failed": "Не вдається відновити сеанс"
+ },
+ "action": {
+ "activate": "Активувати",
+ "suspend": "Призупинити",
+ "save": "Зберегти",
+ "saveAs": "Зберегти як",
+ "cancel": "Скасувати",
+ "ok": "OK",
+ "delete": "Видалити",
+ "add": "Додати",
+ "yes": "Так",
+ "no": "Ні",
+ "update": "Оновити",
+ "remove": "Видалити",
+ "search": "Пошук",
+ "clear-search": "Очистити пошук",
+ "assign": "Надати",
+ "unassign": "Позбавити",
+ "share": "Поділитися",
+ "make-private": "Зробити приватним",
+ "apply": "Застосувати",
+ "apply-changes": "Застосувати зміни",
+ "edit-mode": "Режим редагування",
+ "enter-edit-mode": "Ввійти в режим редагування",
+ "decline-changes": "Відхилити зміни",
+ "close": "Закрити",
+ "back": "Назад",
+ "run": "Запустити",
+ "sign-in": "Увійти!",
+ "edit": "Редагувати",
+ "view": "Переглянути",
+ "create": "Створити",
+ "drag": "Перетягнути",
+ "refresh": "Оновити",
+ "undo": "Скасувати",
+ "copy": "Скопіювати",
+ "paste": "Вставити",
+ "copy-reference": "Копіювати посилання",
+ "paste-reference": "Вставити посилання",
+ "import": "Імпортувати",
+ "export": "Експортувати",
+ "share-via": "Поділитися через {{provider}}",
+ "move": "Перемістити",
+ "select": "Вибрати"
+ },
+ "aggregation": {
+ "aggregation": "Агрегація",
+ "function": "Функція агрегації даних",
+ "limit": "Максимальні значення",
+ "group-interval": "Інтервал групування",
+ "min": "Мінімальний",
+ "max": "Максимальний",
+ "avg": "Середній",
+ "sum": "Сума",
+ "count": "Рахувати",
+ "none": "Відсутня"
+ },
+ "admin": {
+ "general": "Загальне",
+ "general-settings": "Загальні налаштування",
+ "outgoing-mail": "Поштовий сервер",
+ "outgoing-mail-settings": "Налаштування сервера вихідної пошти",
+ "system-settings": "Налаштування системи",
+ "test-mail-sent": "Тестовий лист успішно відправлено!",
+ "base-url": "Базова URL-адреса",
+ "base-url-required": "Базова URL-адреса обов'язкова.",
+ "mail-from": "Електронна адреса",
+ "mail-from-required": "Електронна адреса обов'язкова.",
+ "smtp-protocol": "Протокол SMTP",
+ "smtp-host": "Хост SMTP",
+ "smtp-host-required": "Хост SMTP обов'язковий.",
+ "smtp-port": "SMTP-порт",
+ "smtp-port-required": "Ви повинні надати SMTP-порт.",
+ "smtp-port-invalid": "Це не схоже на дійсний SMTP-порт.",
+ "timeout-msec": "Час очікування (msec)",
+ "timeout-required": "Необхідно задати час очікування.",
+ "timeout-invalid": "Це не схоже на правильний час очікування.",
+ "enable-tls": "Увімкнути TLS",
+ "send-test-mail": "Надіслати тестове повідомлення",
+ "use-system-mail-settings": "Використовувати параметри системного поштового сервера",
+ "mail-templates": "Шаблони електронної пошти",
+ "mail-template-settings": "Налаштування шаблонів електронної пошти",
+ "use-system-mail-template-settings": "Використовувати шаблони системної електронної пошти",
+ "mail-template": {
+ "mail-template": "Шаблон електронної пошти",
+ "test": "Тестове повідомлення",
+ "activation": "Повідомлення про активацію рахунку",
+ "account-activated": "Обліковий запис активовано",
+ "reset-password": "Відновити повідомлення пароля",
+ "password-was-reset": "Пароль було надіслано повідомленням"
+ },
+ "mail-subject": "Тема повідомлення",
+ "mail-body": "Вміст повідомлення"
+ },
+ "alarm": {
+ "alarm": "Сигнал тривоги",
+ "alarms": "Сигнали тривоги",
+ "select-alarm": "Вибрати сигнал тривоги",
+ "no-alarms-matching": "Сигналів тривоги '{{entity}}' не знайдено.",
+ "alarm-required": "Сигнал тривоги необхідний",
+ "alarm-status": "Статус сигналу тривоги",
+ "search-status": {
+ "ANY": "Будь які",
+ "ACTIVE": "Активні",
+ "CLEARED": "Неактивні",
+ "ACK": "Прийняті",
+ "UNACK": "Неприйняті"
+ },
+ "display-status": {
+ "ACTIVE_UNACK": "Активні та неприйняті",
+ "ACTIVE_ACK": "Активні та прийняті",
+ "CLEARED_UNACK": "Неактивні та неприйняті",
+ "CLEARED_ACK": "Неактивні та прийняті"
+ },
+ "no-alarms-prompt": "Сигналів тривоги не знайдено",
+ "created-time": "Час створення",
+ "type": "Тип",
+ "severity": "Серйозність",
+ "originator": "Ініціатор",
+ "originator-type": "Тип ініціатору",
+ "details": "Деталі",
+ "status": "Статус",
+ "alarm-details": "Деталі сигналу тривоги",
+ "start-time": "Початок",
+ "end-time": "Кінець",
+ "ack-time": "Час прийняття",
+ "clear-time": "Час деактивації",
+ "severity-critical": "Критичні",
+ "severity-major": "Важливі",
+ "severity-minor": "Неважливі",
+ "severity-warning": "Попередження",
+ "severity-indeterminate": "Невизначені",
+ "acknowledge": "Прийняти",
+ "clear": "Деактивувати",
+ "search": "Шукати сигнали тривоги",
+ "selected-alarms": "{ count, plural, 1 {1 сигнал тривоги} other {# сигнали тривоги} } вибрані",
+ "no-data": "Немає даних для відображення",
+ "polling-interval": "Інтервал опитування (сек)",
+ "polling-interval-required": "Необхідно задати інтервал опитування.",
+ "min-polling-interval-message": "Дозволяється щонайменше 1 секунда інтервалу очікування.",
+ "aknowledge-alarms-title": "Підтвердити { count, plural, 1 {1 сигнал тривоги} other {# сигнали тривоги} }",
+ "aknowledge-alarms-text": "Ви впевнені, що хочете підтвердити { count, plural, 1 {1 сигнал тривоги} other {# сигнали тривоги} }?",
+ "aknowledge-alarm-title": "Підтвердити сигнал тривоги",
+ "aknowledge-alarm-text": "Ви впевнені, що хочете підтвердити сигнал тривоги?",
+ "clear-alarms-title": "Деактивувати { count, plural, 1 {1 сигнал тривоги} other {# сигнали тривоги} }",
+ "clear-alarms-text": "Ви впевнені, що хочете деактивувати { count, plural, 1 {1 сигнал тривоги} other {# сигнали тривоги} }?",
+ "clear-alarm-title": "Деактивувати сигнал тривоги",
+ "clear-alarm-text": "Ви впевнені, що хочете деактивувати сигнал тривоги?",
+ "alarm-status-filter": "Фільтр статусу сигналу тривоги"
+ },
+ "alias": {
+ "add": "Додати псевдонім ",
+ "edit": "Редагувати псевдонім",
+ "name": "Ім'я",
+ "name-required": "Необхідно вказати псевдонім",
+ "duplicate-alias": "Псевдонім з такою назвою вже існує.",
+ "filter-type-single-entity": "Єдина сутність",
+ "filter-type-entity-group": "Група сутностей",
+ "filter-type-entity-list": "Список сутностей",
+ "filter-type-entity-name": "Назва сутності",
+ "filter-type-entity-group-list": "Список груп сутностей",
+ "filter-type-entity-group-name": "Назва групи сутностей",
+ "filter-type-state-entity": "Сутність з стану панелі пристроїв",
+ "filter-type-state-entity-description": "Сутність, взята з параметрів стану панелі пристроїв",
+ "filter-type-asset-type": "Тип активу",
+ "filter-type-asset-type-description": "Тип активів '{{assetType}}'",
+ "filter-type-asset-type-and-name-description": "Тип активів '{{assetType}}' і ім'я, що починаються з '{{prefix}}'",
+ "filter-type-device-type": "Тип пристрою",
+ "filter-type-device-type-description": "Тип пристроїв '{{deviceType}}'",
+ "filter-type-device-type-and-name-description": "Тип пристроїв '{{deviceType}}' і ім'я, що починаються з '{{prefix}}'",
+ "filter-type-entity-view-type": "Тип перегляду сутності",
+ "filter-type-entity-view-type-description": "Перегляд сутності з типом '{{entityView}}'",
+ "filter-type-entity-view-type-and-name-description": "Перегляд сутності з типом'{{entityView}}' і іменем, що починаються з '{{prefix}}'",
+ "filter-type-relations-query": "Запит відносин",
+ "filter-type-relations-query-description": "{{entities}}, які мають {{relationType}} відношення {{direction}} {{rootEntity}}",
+ "filter-type-asset-search-query": "Запит пошуку активу",
+ "filter-type-asset-search-query-description": "Активи з типами {{assetTypes}}, які мають {{relationType}} відношення {{direction}} {{rootEntity}}",
+ "filter-type-device-search-query": "Запит пошуку пристрою",
+ "filter-type-device-search-query-description": "Пристрої з типами {{deviceTypes}}, які мають {{relationType}} відношення {{direction}} {{rootEntity}}",
+ "filter-type-entity-view-search-query": "Запит пошуку переглядів сутностей",
+ "filter-type-entity-view-search-query-description": "Перегляд сутності з типами {{entityViewTypes}}, які мають {{relationType}} відношення {{direction}} {{rootEntity}}",
+ "entity-filter": "Фільтр сутності",
+ "resolve-multiple": "Як декілька сутностей",
+ "filter-type": "Тип фільтра",
+ "filter-type-required": "Необхідно вказати тип фільтра.",
+ "entity-filter-no-entity-matched": "Не знайдено жодних сутностей, які відповідають вказаному фільтру.",
+ "no-entity-filter-specified": "No entity filter specified",
+ "root-state-entity": "Use dashboard state entity as root",
+ "group-state-entity": "Use dashboard state entity as entity group",
+ "root-entity": "Root entity",
+ "state-entity-parameter-name": "State entity parameter name",
+ "default-state-entity": "Default state entity",
+ "default-state-entity-group": "Default state entity group",
+ "default-entity-parameter-name": "By default",
+ "max-relation-level": "Max relation level",
+ "unlimited-level": "Unlimited level",
+ "state-entity": "Dashboard state entity",
+ "entities-of-group-state-entity": "Entities from dashboard state entity group",
+ "all-entities": "All entities",
+ "any-relation": "any"
+ },
+ "asset": {
+ "asset": "Актив",
+ "assets": "Активи",
+ "management": "Управління активами",
+ "view-assets": "Переглянути активи",
+ "add": "Додати активи",
+ "assign-to-customer": "Надати клієнту",
+ "assign-asset-to-customer": "Надати активи клієнту",
+ "assign-asset-to-customer-text": "Будь ласка, виберіть ресурси, призначені для клієнта",
+ "no-assets-text": "Не знайдено активів",
+ "assign-to-customer-text": "Будь ласка, виберіть клієнта, щоб надати активи",
+ "public": "Публічно",
+ "assignedToCustomer": "Наданий клієнту",
+ "make-public": "Зробити актив(и) публічним(и)",
+ "make-private": "Зробити актив(и) приватним(и)",
+ "unassign-from-customer": "Позбавити клієнта",
+ "delete": "Видалити актив",
+ "asset-public": "Актив є загальнодоступним",
+ "asset-type": "Тип активу",
+ "asset-type-required": "Тип активу обов'язковий.",
+ "select-asset-type": "Виберіть тип активу",
+ "enter-asset-type": "Введіть тип активу",
+ "any-asset": "Будь-який актив",
+ "no-asset-types-matching": "Не знайдено жодних активів, що відповідають даному типу '{{entitySubtype}}'.",
+ "asset-type-list-empty": "Не вибрано жодного типу активів.",
+ "asset-types": "Типи активів",
+ "name": "Ім'я",
+ "name-required": "Ім'я обов'язкове.",
+ "description": "Опис",
+ "type": "Тип",
+ "type-required": "Тип обов'язковий.",
+ "details": "Подробиці",
+ "events": "Події",
+ "add-asset-text": "Додати новий актив",
+ "asset-details": "Інформація про актив",
+ "assign-assets": "Надати активи",
+ "assign-assets-text": "Надати { count, plural, 1 {1 актив} other {# активи} } клієнту",
+ "delete-assets": "Видалити активи",
+ "unassign-assets": "Позбавити активів",
+ "unassign-assets-action-title": "Позбавити { count, plural, 1 {1 актив} other {# активи} } клієнта",
+ "assign-new-asset": "Надати новий актив",
+ "delete-asset-title": "Ви впевнені, що хочете видалити актив '{{assetName}}'?",
+ "delete-asset-text": "Будьте обережні, після підтвердження, актив і всі пов'язані з ним дані буде втрачено",
+ "delete-assets-title": "Ви впевнені, що хочете видалити { count, plural, 1 {1 актив} other {# активи} }?",
+ "delete-assets-action-title": "Видалити{ count, plural, 1 {1 актив} other {# активи} }",
+ "delete-assets-text": "Будьте обережні, після підтвердження всі вибрані об'єкти буде видалено, і всі пов'язані з ними дані буде втрачено.",
+ "make-public-asset-title": "Ви дійсно хочете, щоб актив '{{assetName}}' був загальнодоступним?",
+ "make-public-asset-text": "Після підтвердження, актив і всі його дані будуть доступними для інших.",
+ "make-private-asset-title": "Ви впевнені, що хочете зробити актив {{assetName}} приватним?",
+ "make-private-asset-text": "Після підтвердження, актив та всі його дані будуть приватними та не будуть доступні іншим.",
+ "unassign-asset-title": "Ви впевнені, що хочете позбавити активу '{{assetName}}'?",
+ "unassign-asset-text": "Після підтвердження клієнт буде позбавлений активу. Дані активу не будуть доступні клієнту.",
+ "unassign-asset": "Позбавити активу",
+ "unassign-assets-title": "Ви впевнені, що хочете позбавити активів { count, plural, 1 {1 актив} other {# активи} }?",
+ "unassign-assets-text": "Після підтвердження, клієнт буде позбавлений усіх вибраних активів. Дані активів не будуть доступні клієнту.",
+ "copyId": "Копіювати Id активу",
+ "idCopiedMessage": "Id активу був скопійований у буфер обміну",
+ "select-asset": "Виберіть актив",
+ "no-assets-matching": "Не знайдено жодних активів, що відповідають'{{entity}}'.",
+ "asset-required": "Необхідно задати актив",
+ "name-starts-with": "Назва активу починається з",
+ "selected-assets": "{ count, plural, 1 {1 актив} other {# активи} } selected",
+ "search": "Пошук активів",
+ "select-group-to-add": "Виберіть цільову групу, щоб додати вибрані активи",
+ "select-group-to-move": "Виберіть цільову групу для переміщення вибраних активів",
+ "remove-assets-from-group": "Ви впевнені, що хочете видалити { count, plural, 1 {1 актив} other {# актив} } з групи '{entityGroup}'?",
+ "group": "Група активів",
+ "list-of-groups": "{ count, plural, 1 {Одна група активів} other {Список # груп активів} }",
+ "group-name-starts-with": "Групи активів, чиї імена починаються з '{{prefix}}'"
+ },
+ "attribute": {
+ "attributes": "Атрибути",
+ "latest-telemetry": "Остання телеметрія",
+ "attributes-scope": "Область видимості атрибутів",
+ "scope-latest-telemetry": "Остання телеметрія",
+ "scope-client": "Клієнтські атрибути",
+ "scope-server": "Серверні атрибути",
+ "scope-shared": "Спільні атрибути",
+ "add": "Додати атрибут",
+ "add-attribute-prompt": "Будь ласка, додайте атрибут",
+ "key": "Ключ",
+ "last-update-time": "Останнє оновлення",
+ "key-required": "Ключ атрибута обов'язковий.",
+ "value": "Значення",
+ "value-required": "Значення атрибута обов'язкове.",
+ "delete-attributes-title": "Ви впевнені, що хочете видалити { count, plural, 1 {1 attribute} other {# attributes} }?",
+ "delete-attributes-text": "Будьте обережні, після підтвердження, всі виділені атрибути будуть видалені.",
+ "delete-attributes": "Видалити атрибути",
+ "enter-attribute-value": "Введіть значення атрибута",
+ "show-on-widget": "Показати на віджеті",
+ "widget-mode": "Режим віджетів",
+ "next-widget": "Наступний віджет",
+ "prev-widget": "Попередній віджет",
+ "add-to-dashboard": "Додати до інформаційної панелі",
+ "add-widget-to-dashboard": "Додати віджет до інформаційної панелі",
+ "selected-attributes": "{ count, plural, 1 {1 attribute} other {# attributes} } selected ...вибрані вибрати",
+ "selected-telemetry": "{ count, plural, 1 {1 telemetry unit} other {# telemetry units} } selected"
+ },
+ "audit-log": {
+ "audit": "Операція",
+ "audit-logs": "Журнал операцій",
+ "timestamp": "Тимчасова позначка",
+ "entity-type": "Тип одиниці",
+ "entity-name": "Назва організації",
+ "user": "Користувач",
+ "type": "Тип",
+ "status": "Статус",
+ "details": "Подробиці",
+ "type-added": "Додано",
+ "type-deleted": "Вилучено",
+ "type-updated": "Оновлено",
+ "type-attributes-updated": "Атрибути оновлені",
+ "type-attributes-deleted": "Атрибути видалені",
+ "type-rpc-call": "RPC дзвінок",
+ "type-credentials-updated": "Авторизаційні дані оновлено",
+ "type-assigned-to-customer": "Призначено клієнту",
+ "type-unassigned-from-customer": "Позбавлено від клієнта",
+ "type-activated": "Активовано",
+ "type-suspended": "Призупинено",
+ "type-credentials-read": "Авторизаційні дані прочитані",
+ "type-attributes-read": "Атрибути читаються",
+ "type-added-to-entity-group": "Додано до групи",
+ "type-removed-from-entity-group": "Вилучено з групи",
+ "type-relation-add-or-update": "Відношення оновлено",
+ "type-relation-delete": "Відношення видалено",
+ "type-relations-delete": "Всі відношення видалено",
+ "type-alarm-ack": "Визнано",
+ "type-alarm-clear": "Очищено",
+ "type-rest-api-rule-engine-call": "Rule engine REST API call",
+ "status-success": "Успішно",
+ "status-failure": "Невдало",
+ "audit-log-details": "Подробиці журналу операцій",
+ "no-audit-logs-prompt": "Жодних журналів операцій не знайдено",
+ "action-data": "Дані про дії",
+ "failure-details": "Невдалі подробиці",
+ "search": "Пошук журналів перевірки",
+ "clear-search": "Очистити пошук"
+ },
+ "confirm-on-exit": {
+ "message": "У вас є незбережені зміни. Ви впевнені, що хочете залишити цю сторінку?",
+ "html-message": "У вас є незбережені зміни.
Ви впевнені, що хочете залишити цю сторінку?",
+ "title": "Незбережені зміни"
+ },
+ "contact": {
+ "country": "Країна",
+ "city": "Місто",
+ "state": "Штат / Провінція",
+ "postal-code": "Поштовий індекс",
+ "postal-code-invalid": "Неправильний формат поштового індексу.",
+ "address": "Адреса",
+ "address2": "Адреса 2",
+ "phone": "Телефон",
+ "email": "Електронна пошта",
+ "no-address": "Немає адреси"
+ },
+ "common": {
+ "username": "Ім'я користувача",
+ "password": "Пароль",
+ "enter-username": "Введіть ім'я користувача",
+ "enter-password": "Введіть пароль",
+ "enter-search": "Введіть пошук"
+ },
+ "converter": {
+ "converter": "Перетворювач даних",
+ "converters": "Перетворювачі даних",
+ "select-converter": "Виберіть перетворювач даних",
+ "no-converters-matching": "Не має перетворювачів даних, які відповідають '{{entity}}'.",
+ "converter-required": "Необхідно вказати перетворювач даних",
+ "delete": "Видалити перетворювач даних",
+ "management": "Управління перетворювачами даних",
+ "add-converter-text": "Додати новий перетворювач даних",
+ "no-converters-text": "Перетворювачів даних не знайдено",
+ "selected-converters": "{ count, plural, 1 {1 перетворювач даних} other {# перетворювачі даних} } вибраний",
+ "delete-converter-title": "Ви впевнені, що хочете видалити перетворювач даних '{{converterName}}'?",
+ "delete-converter-text": "Будьте обережні, після підтвердження, перетворювач даних та всі пов'язані з ним дані,стануть недоступними).",
+ "delete-converters-title": "Ви впевнені, що хочете видалити{ count, plural, 1 {1 перетворювач даних} other {# перетворювачі даних} }?",
+ "delete-converters-action-title": "Видалити { count, plural, 1 {1 перетворювач даних} other {# перетворювачі даних} }",
+ "delete-converters-text": "Будьте обережні, після підтвердження всі вибрані перетворювачі даних буде видалено, і всі пов'язані з ними дані буде втрачено.",
+ "events": "Події",
+ "add": "Додати перетворювач даних",
+ "converter-details": "Подробиці про перетворювач даних",
+ "details": "Подробиці",
+ "copyId": "Копіювати Id перетворювача даних",
+ "idCopiedMessage": "Id перетворювача даних було скопійовано у буфер обміну",
+ "debug-mode": "Режим налагодження",
+ "name": "Ім'я",
+ "name-required": "Ім'я обов'язкове.",
+ "description": "Опис",
+ "decoder": "Декодер",
+ "encoder": "Кодер",
+ "test-decoder-fuction": "Тестування функції декодера",
+ "test-encoder-fuction": "Тестування функції кодера",
+ "decoder-input-params": "Параметри введення декодера",
+ "encoder-input-params": "Параметри введення кодера",
+ "payload": "Вхідне повідомлення",
+ "payload-content-type": "Тип контенту вхідного повідомлення",
+ "payload-content": "Зміст вхідного повідомлення",
+ "message": "Повідомлення",
+ "message-type": "Тип повідомлення",
+ "message-type-required": "Необхідно задати тип повідомлення",
+ "test": "Тест",
+ "metadata": "Метадані",
+ "metadata-required": "Записи метаданих не можуть бути порожніми.",
+ "integration-metadata": "Інтеграція метаданих",
+ "integration-metadata-required": "Записи інтеграції метаданих не можуть бути порожніми.",
+ "output": "Вихідні дані",
+ "import": "Імпорт перетворювача даних",
+ "export": "Експорт перетворювача даних",
+ "export-failed-error": "Неможливо експортувати перетворювач даних: {{помилка}}",
+ "create-new-converter": "Створити новий перетворювач даних",
+ "converter-file": "Файл перетворювача даних(конвектер файл)",
+ "invalid-converter-file-error": "Неможливо імпортувати перетворювач даних: недійсна структура даних перетворювача.",
+ "type": "Тип",
+ "type-required": "Необхідно задати тип.",
+ "type-uplink": "Від пристрою",
+ "type-downlink": "До пристрою"
+ },
+ "content-type": {
+ "json": "Json",
+ "text": "Текст",
+ "binary": "Бінарний (Base64)"
+ },
+ "customer": {
+ "customer": "Клієнт",
+ "customers": "Клієнти",
+ "management": "Клієнтський менеджмент",
+ "dashboard": "Інформаційна панель клієнта",
+ "dashboards": "Інформаційні панелі клієнта",
+ "devices": "Пристрої клієнта",
+ "entity-views": "Представлення сутностей",
+ "assets": "Клієнтські активи",
+ "public-dashboards": "Публічні інформаційні панелі",
+ "public-devices": "Публічні пристрої",
+ "public-assets": "Публічні активи",
+ "public-entity-views": "Публічне представлення сутностей 440",
+ "add": "Додати клієнта",
+ "delete": "Видалити клієнта",
+ "manage-customer-users": "Керування користувачами клієнта",
+ "manage-customer-devices": "Керування пристроями клієнта",
+ "manage-customer-dashboards": "Керування інформаційними панелями клієнта",
+ "manage-public-devices": "Керувати загальнодоступними пристроями",
+ "manage-public-dashboards": "Керування загальнодоступними інформаційними панелями",
+ "manage-customer-assets": "Керування активами клієнта",
+ "manage-public-assets": "Керування загальнодоступними активами",
+ "add-customer-text": "Додати нового клієнта",
+ "no-customers-text": "Клієнтів не знайдено",
+ "customer-details": "Інформація про клієнта",
+ "delete-customer-title": "Ви впевнені, що хочете видалити клієнта '{{customerTitle}}'?",
+ "delete-customer-text": "Будьте обережні, після підтвердження, клієнт та всі пов'язані з ним дані, стануть недоступними.",
+ "delete-customers-title": "Ви впевнені, що хочете видалити {count, plural, 1 {1 клієнт}, інші {# клієнти}}?",
+ "delete-customers-action-title": "Видалити{ count, plural, 1 {1 клієнт} other {# клієнти} }",
+ "delete-customers-text": "Будьте обережні, після підтвердження, всі вибрані клієнти будуть видалені і всі пов'язані з ними дані, стануть недоступними.",
+ "manage-users": "Керування користувачами",
+ "manage-assets": "Керування активами",
+ "manage-devices": "Керування пристроями",
+ "manage-dashboards": "Керування інформаційними панелями",
+ "title": "Назва",
+ "title-required": "Необхідно задати назву.",
+ "description": "Опис",
+ "details": "Подробиці",
+ "events": "Події",
+ "copyId": "Копіювати Id клієнта",
+ "idCopiedMessage": "Id клієнта було скопійовано в буфер обміну",
+ "select-customer": "Виберіть клієнта",
+ "no-customers-matching": "Клієнтів, які відповідають '{{entity}}' не знайдено.",
+ "customer-required": "Необхідно задати клієнта",
+ "selected-customers": "{ count, plural, 1 {1 клієнт} інші {# клієнти} } вибрано",
+ "search": "Пошук клієнтів",
+ "select-group-to-add": "Виберіть цільову групу, щоб додати вибраних клієнтів",
+ "select-group-to-move": "Виберіть цільову групу для переміщення вибраних клієнтів",
+ "remove-customers-from-group": "Ви впевнені, що хочете видалити{ count, plural, 1 {1 клієнт} other {# клієнти} } з групи'{entityGroup}'?",
+ "group": "Група клієнтів",
+ "list-of-groups": "{ count, plural, 1 {Одна група клієнтів} other {Список # груп клієнтів} }",
+ "group-name-starts-with": "Групи клієнтів, імена яких починаються з '{{prefix}}'",
+ "select-default-customer": "Виберати клієнта за замовчуванням",
+ "default-customer": "Клієнт за замовчуванням",
+ "default-customer-required": "Необхідно вказати клієнта за замовчуванням для налагодження панелі візуалізації на рівні замовника",
+ "allow-white-labeling": "Дозволити брендування"
+ },
+ "custom-translation": {
+ "custom-translation": "Переклад для користувача",
+ "translation-map": "Карта перекладу",
+ "key": "Ключ перекладу",
+ "import": "Імпорт перекладу",
+ "export": "Експорт перекладу",
+ "export-data": "Дані про експорт перекладу",
+ "import-data": "Дані про імпорт перекладу",
+ "translation-file": "Файл перекладу",
+ "invalid-translation-file-error": "Неможливо імпортувати файл перекладу: недійсна структура даних перекладу.",
+ "custom-translation-hint": "Визначте індивідуальний переклад в JSON нижче. Цей JSON перезапише переклад за замовчуванням. Натисніть 'Завантажити файл перекладу', щоб отримати існуючий переклад. Ви також можете скористатись завантаженим файлом як посиланням на наявні пари параметрів перекладу ключ-значення.",
+ "download-locale-file": "Завантажити файл перекладу"
+ },
+ "datetime": {
+ "date-from": "Дата від",
+ "time-from": "Час від",
+ "date-to": "Дата до",
+ "time-to": "Час до"
+ },
+ "dashboard": {
+ "dashboard": "Панель приладів",
+ "dashboards": "Панелі приладів",
+ "management": "Управління панеллю приладів",
+ "view-dashboards": "Переглянути панелі приладів",
+ "add": "Додати панель приладів",
+ "assign-dashboard-to-customer": "Призначити панель(і) приладів замовнику",
+ "assign-dashboard-to-customer-text": "Будь ласка, виберіть панелі пристроїв, щоб призначити їх клієнту",
+ "assign-to-customer-text": "Виберіть клієнта, щоб призначити панелі пристроїв",
+ "assign-to-customer": "Призначити клієнту",
+ "unassign-from-customer": "Позбавити клієнта",
+ "make-public": "Зробити панель приладів публічною",
+ "make-private": "Зробити панель приладів приватною",
+ "manage-assigned-customers": "Керування призначеними клієнтами",
+ "assigned-customers": "Призначені клієнтам",
+ "assign-to-customers": "Призначити панелі приладів клієнтам",
+ "assign-to-customers-text": "Виберіть клієнтів для призначення панелей приладів",
+ "unassign-from-customers": "Позбавити клієнтів призначенних панелей приладів",
+ "unassign-from-customers-text": "Виберіть клієнтів для позбавлення їх призначених панелей приладів",
+ "no-dashboards-text": "Панелі приладів не знайдені",
+ "no-widgets": "Не налаштовано жодних віджетів",
+ "add-widget": "Додати новий віджет",
+ "title": "Назва",
+ "select-widget-title": "Вибрати віджет",
+ "select-widget-subtitle": "Список доступних типів віджетів",
+ "delete": "Видалити панель приладів",
+ "title-required": "Необхідно задати назву.",
+ "description": "Опис",
+ "details": "подробиці",
+ "dashboard-details": "Подробиці панелі приладів",
+ "add-dashboard-text": "Додати нову панель приладів",
+ "assign-dashboards": "Призначити панель приладів",
+ "assign-new-dashboard": "Призначити нову панель приладів",
+ "assign-dashboards-text": "Призначити { count, plural, 1 {1 панель приладів} other {# панелі приладів} } користувачам",
+ "unassign-dashboards-action-text": "Позбавити { count, plural, 1 {1 палелі приладів} other {# панелей приладів} } клієнтів",
+ "delete-dashboards": "Видалити панель приладів",
+ "unassign-dashboards": "Позбавити панелей приладів",
+ "unassign-dashboards-action-title": "Позбавити { count, plural, 1 {1 палелі приладів} other {# панелей приладів} } клієнтів",
+ "delete-dashboard-title": "Ви впевнені, що хочете видалити панель приладів '{{назва панелі приладів}}'?",
+ "delete-dashboard-text": "Будьте обережні, після підтвердження, панель приладів і всі пов'язані з нею дані стануть недоступними.",
+ "delete-dashboards-title": "Ви впевнені, що хочете видалити { count, plural, 1 {1 панель приладів} other {# панелі приладів} }?",
+ "delete-dashboards-action-title": "Видалити { count, plural, 1 {1 панель приладів} other {# панелі приладів} }",
+ "delete-dashboards-text": "Будьте обережні, після підтвердження, всі вибрані панелі приладів буде видалено, і всі пов'язані з ними дані стануть недоступними.",
+ "unassign-dashboard-title": "Ви впевнені, що хочете позбавити панелі приладів '{{назва інформаційної панелі}}'?",
+ "unassign-dashboard-text": "Після підтвердження, клієнт буде позбавлений панелі приладів. Панель приладів і пов'язані з нею дані будуть недоступні клієнтові.",
+ "unassign-dashboard": "Позбавити панелі приладів",
+ "unassign-dashboards-title": "Ви впевнені, що хочете позбавити { count, plural, 1 {1 панелі приладів} other {# панелей приладів} }?",
+ "unassign-dashboards-text": "Після підтвердження, клієтн буде позбавлений усіх вибраних панелей приладів і даних, які з ними пов'язані.",
+ "public-dashboard-title": "Панель приладів тепер публічна",
+ "public-dashboard-text": "Ваша панель приладів {{dashboardTitle}} тепер публічна і доступна іншим link:",
+ "public-dashboard-notice": "Note: Не забудьте зробити спільні пристрої загальнодоступними, щоб отримати доступ до їхніх даних.",
+ "make-private-dashboard-title": "Ви впевнені, що хочете зробити панель приладів '{{назва панелі приладів}}' приватною?",
+ "make-private-dashboard-text": "Після підтвердження панель приладів стане приватною і не буде доступною іншим.",
+ "make-private-dashboard": "Зробити панель приладів приватною",
+ "socialshare-text": "'{{dashboardTitle}}' powered by ThingsBoard",
+ "socialshare-title": "'{{dashboardTitle}}' powered by ThingsBoard",
+ "select-dashboard": "Вибрати панель приладів",
+ "no-dashboards-matching": "Не знайдено жодних панелей прилодів'{{entity}}' які відповідають.",
+ "dashboard-required": "Необхідно задати панель приладів.",
+ "select-existing": "Виберіть існуючу панель приладів",
+ "create-new": "Створити нову панель приладів",
+ "new-dashboard-title": "Нова назва панелі приладів",
+ "open-dashboard": "Відрити панель приладів",
+ "set-background": "Встановити фон",
+ "background-color": "Колір фону",
+ "background-image": "Фонове зображення",
+ "background-size-mode": "Режим фонового розміру",
+ "no-image": "Не вибрано жодного зображення",
+ "drop-image": "Перетягніть зображення або клацніть, щоб вибрати файл для завантаження.",
+ "settings": "Налаштування",
+ "columns-count": "Кількість стовпців",
+ "columns-count-required": "Необхідно вказати кількість стовпців.",
+ "min-columns-count-message": "Дозволений мінімум -10 стовпців.",
+ "max-columns-count-message": "Дозволений максимум - 1000 стовпців.",
+ "widgets-margins": "Відступ між віджетами",
+ "horizontal-margin": "Горизонтальний відступ",
+ "horizontal-margin-required": "Необхідно вказати горизонтальний відступ.",
+ "min-horizontal-margin-message": "Допустиме мінімальне значення горизонтального відступу - 0.",
+ "max-horizontal-margin-message": "Допустиме максимальне значення горизонтального відступу - 50.",
+ "vertical-margin": "Вертикальний відступ",
+ "vertical-margin-required": "Необхідно вказати вертикальний відступ.",
+ "min-vertical-margin-message": "Допустиме мінімальне значення вертикального відступу - 0.",
+ "max-vertical-margin-message": "Допустиме максимальне значення вертикального відступу - 50.",
+ "autofill-height": "Висота автоматичного заповнення макета",
+ "mobile-layout": "Налаштування макета для мобільних пристроїв",
+ "mobile-row-height": "Висота рядка для мобільних пристроїв, px",
+ "mobile-row-height-required": "Потрібно вказати значення висоти рядка для мобільних пристроїв.",
+ "min-mobile-row-height-message": "Допустиме мінімальне значення висоти рядка для мобільних пристроїв - 5 пікселів.",
+ "max-mobile-row-height-message": "Допустиме максимальне значення висоти рядка для мобільних пристроїв - 200 пікселів.",
+ "display-title": "Відображати назву панелі візуалізації",
+ "toolbar-always-open": "Тримайте панель візуалізації відкритою",
+ "title-color": "Колір назви",
+ "display-dashboards-selection": "Відображення вибору панелей візуалізації",
+ "display-entities-selection": "Вибір відображення сутності",
+ "display-dashboard-timewindow": "Відобразити налаштування часового проміжку",
+ "display-dashboard-export": "Відображення експорту",
+ "import": "Імпортувати панель візуалізації",
+ "export": "Експортувати панель візуалізації",
+ "export-failed-error": "Неможливо експортувати панель візуалізації: {{error}}",
+ "export-pdf": "Експортувати як PDF",
+ "export-png": "Експортувати як PNG",
+ "export-jpg": "Експортувати як JPEG",
+ "export-json-config": "Експортувати конфігурацію JSON",
+ "download-dashboard-progress": "Генерування панелі візуалізації {{reportType}} ...",
+ "create-new-dashboard": "Створити нову панель візуалізації",
+ "dashboard-file": "Файл панелі візуалізації",
+ "invalid-dashboard-file-error": "Неможливо імпортувати панель візуалізації: неправильна структура даних панелі візуалізації.",
+ "dashboard-import-missing-aliases-title": "Configure aliases used by imported dashboard Налаштування псевдонімів, що використовуються імпортованою панеллю візуалізації",
+ "create-new-widget": "Створити новий віджет",
+ "import-widget": "Імпортувати віджет",
+ "widget-file": "Файл віджета",
+ "invalid-widget-file-error": "Неможливо імпортувати віджет: неправильна структура даних віджета.",
+ "widget-import-missing-aliases-title": "Налаштувати псевдоніми, що використовуються імпортованим віджетом",
+ "open-toolbar": "Відкрити панель інструменів ",
+ "close-toolbar": "Закрити панель інструменів",
+ "configuration-error": "Помилка конфігурації",
+ "alias-resolution-error-title": "Помилка конфігурації псевдонімів панелі візуалізації",
+ "invalid-aliases-config": "Неможливо знайти пристрої, які відповідають певному фільтру псевдонімів.
Зверніться до свого адміністратора, щоб вирішити цю проблему.",
+ "select-devices": "Вибрати пристрої",
+ "assignedToCustomer": "Призначений клієнту",
+ "assignedToCustomers": "Призначений клієнтам",
+ "public": "Публічно",
+ "public-link": "Публічне посилання",
+ "copy-public-link": "Копіювати публічне посилання",
+ "public-link-copied-message": "Публічне посилання було скопійоване в буфер обміну панелі візуалізації",
+ "manage-states": "Керування станами панелі візуалізації",
+ "states": "Стани панелі візуалізації",
+ "search-states": "Пошук станів панелі візуалізації",
+ "selected-states": "{ count, plural, 1 {1 dashboard state} other {# dashboard states} } вибрано",
+ "edit-state": "Редагувати стан панелі візуалізації",
+ "delete-state": "Видалити стан панелі візуалізації ",
+ "add-state": "Додати стан панелі візуалізації",
+ "state": "Стан панелі візуалізації",
+ "state-name": "Ім'я",
+ "state-name-required": "Необхідно вказати назву стану панелі візуалізації.",
+ "state-id": "Стан Id",
+ "state-id-required": "Необхідно вказати id стану панелі візуалізації.",
+ "state-id-exists": "Стан інформаційної панелі з таким id вже існує.",
+ "is-root-state": "Основний стан",
+ "delete-state-title": "Видалити стан панелі візуалізації",
+ "delete-state-text": "Ви впевнені, що хочете видалити стан панелі візуалізації з іменем '{{stateName}}'?",
+ "show-details": "Показати деталі",
+ "hide-details": "Приховати деталі",
+ "select-state": "Виберіть цільовий стан",
+ "state-controller": "Контроль стану"
+ },
+ "datakey": {
+ "settings": "Налаштування",
+ "advanced": "Додатково",
+ "label": "Мітка",
+ "color": "Колір",
+ "units": "Спеціальний символ, який показує наступне значення",
+ "decimals": "Кількість цифр після плаваючої точки",
+ "data-generation-func": "Функція генерації даних",
+ "use-data-post-processing-func": "Використовувати функцію пост-обробки даних",
+ "configuration": "Конфігурація ключа даних",
+ "timeseries": "Телеметрія",
+ "attributes": "Атрибути",
+ "alarm": "Поля сигнала тривоги",
+ "timeseries-required": "Необхідно вказати Телеметрія.",
+ "timeseries-or-attributes-required": "Необхідно вказати телеметрію/атрибути.",
+ "maximum-timeseries-or-attributes": "Максимальні { count, plural, 1 {1 телеметрія/атрибут дозволені.} other {# телеметрія/атрибути дозволені} }",
+ "alarm-fields-required": "Необхідно вказати поля сигнала тривоги.",
+ "function-types": "Типи функцій",
+ "function-types-required": "Необхідно вказати типи функцій.",
+ "maximum-function-types": "Maximum { count, plural, 1 {1 function type is allowed.} other {# function types are allowed} }",
+ "time-description": "мітка часу поточного значення;",
+ "value-description": "поточне значення;",
+ "prev-value-description": "результат попереднього виклику функції;",
+ "time-prev-description": "мітка часу попереднього значення;",
+ "prev-orig-value-description": "оригінальне попереднє значення;"
+ },
+ "datasource": {
+ "type": "Тип джерела даних",
+ "name": "Ім'я",
+ "add-datasource-prompt": "Додайте джерело даних"
+ },
+ "details": {
+ "details": "Деталі",
+ "edit-mode": "Режим редагування",
+ "toggle-edit-mode": "Перемкнути режим редагування"
+ },
+ "device": {
+ "device": "Пристрій",
+ "device-required": "Необхідно задати пристрій.",
+ "devices": "Пристрої",
+ "management": "Управління пристроєм",
+ "view-devices": "Перегляд пристроїв",
+ "device-alias": "Псевдонім пристрою",
+ "aliases": "Псевдонім пристроїв",
+ "no-alias-matching": "'{{alias}}' не знайдено.",
+ "no-aliases-found": "Псевдонімів не знайдено.",
+ "no-key-matching": "'{{key}}' не знайдено.",
+ "no-keys-found": "Ключі не знайдено.",
+ "create-new-alias": "Створити новий!",
+ "create-new-key": "Створити новий!",
+ "duplicate-alias-error": "Псевдонім з таким іменем '{{alias}}' вже існює.
Псевдоніми пристроїв повинні бути унікальними на панелі візуалізації.",
+ "configure-alias": "Налаштувати псевдонім '{{alias}}'",
+ "no-devices-matching": "Не знайдено жодних пристроїв, які відповідають '{{entity}}'.",
+ "alias": "Псевдонім",
+ "alias-required": "Необхідно задати псевдонім пристрою.",
+ "remove-alias": "Видалити псевдонім пристрою",
+ "add-alias": "Додати псевдонім пристрою",
+ "name-starts-with": "Ім'я пристрою починається з",
+ "device-list": "Список пристроїв",
+ "use-device-name-filter": "Використати фільтр",
+ "device-list-empty": "Не вибрано жодного пристрою.",
+ "device-name-filter-required": "Необхідно задати назву фільтра пристрою.",
+ "device-name-filter-no-device-matched": "Не знайдено жодних пристроїв, що починаються з '{{device}}'.",
+ "add": "Додати пристрій",
+ "assign-to-customer": "Призначити клієнту",
+ "assign-device-to-customer": "Призначити пристрій (ої) клієнту",
+ "assign-device-to-customer-text": "Виберіть пристрої, які слід призначити клієнту",
+ "make-public": "Зробити пристрій публічним",
+ "make-private": "Зробити пристрій приватним",
+ "no-devices-text": "Не знайдено жодного пристрою",
+ "assign-to-customer-text": "Виберіть клієнта для призначення пристрою (їв)",
+ "device-details": "Деталі пристрою",
+ "add-device-text": "Додати новий пристрій",
+ "credentials": "Авторизаційні дані",
+ "manage-credentials": "Керування авторизаційними даними",
+ "delete": "Видалити пристрій",
+ "assign-devices": "Призначити пристрої",
+ "assign-devices-text": "Призначити { count, plural, 1 {1 пристрій} other {# пристрої} } клієнту",
+ "delete-devices": "Видалити пристрої",
+ "unassign-from-customer": "Позбавити клієнта пристроїв",
+ "unassign-devices": "Позбавити пристроїв",
+ "unassign-devices-action-title": "Позбавити клієнта { count, plural, 1 {1 пристрою} other {# пристроїв} }",
+ "assign-new-device": "Призначити новий пристрій",
+ "make-public-device-title": "Ви впевнені, що хочете зробити пристрій '{{deviceName}}' публічним?",
+ "make-public-device-text": "Після підтвердження пристрій і всі його дані будуть публічними та доступними для інших.",
+ "make-private-device-title": "Ви впевнені, що хочете зробити пристрій '{{deviceName}}' приватним?",
+ "make-private-device-text": "Після підтвердження пристрій і всі його дані будуть приватними та недоступними для інших.",
+ "view-credentials": "Переглянути авторизаційні дані",
+ "delete-device-title": "Ви впевнені, що хочете видалити пристрій '{{deviceName}}'?",
+ "delete-device-text": "Будьте обережні, після підтвердження, пристрій і всі пов'язані з ним дані стануть недоступними.",
+ "delete-devices-title": "Ви впевнені, що хочете видалити { count, plural, 1 {1 пристрій} other {# пристрої} }?",
+ "delete-devices-action-title": "Видалити { count, plural, 1 {1 пристрій} other {# пристрої} }",
+ "delete-devices-text": "Будьте обережні, після підтвердження, всі вибрані пристрої будуть видалені, і всі пов'язані з ними дані стануть недоступними.",
+ "unassign-device-title": "Ви впевнені, що хочете позбавити пристрою '{{deviceName}}'?",
+ "unassign-device-text": "Після підтвердження, клієнт буде позбавлений пристрою.",
+ "unassign-device": "Позбавити пристою",
+ "unassign-devices-title": "Ви впевненені, що хочете позбавити { count, plural, 1 {1 пристрою} other {# пристроїв} }?",
+ "unassign-devices-text": "Після підтвердження, клієнт буде позбавлений пристрою і пристрій стане не доступним клієнту",
+ "device-credentials": "Авторизаційні дані прстрою",
+ "credentials-type": "Тип авторизаційних даних",
+ "access-token": "Маркер доступу",
+ "access-token-required": "Необхідно вказати маркер доступу.",
+ "access-token-invalid": "Маркер доступу має бути від 1 до 20 символів.",
+ "rsa-key": "Публічний ключ RSA",
+ "rsa-key-required": "Необхідно вказати публічний ключ RSA.",
+ "secret": "Секрет",
+ "secret-required": "Необхідно вказати секрет.",
+ "device-type": "Тип пристрою",
+ "device-type-required": "Необхідно вказати тип пристрою.",
+ "select-device-type": "Виберіть тип пристрою",
+ "enter-device-type": "Введіть тип пристрою",
+ "any-device": "Будь-який пристрій",
+ "no-device-types-matching": "Не знайдено типів пристроїв, які відповідають '{{entitySubtype}}'.",
+ "device-type-list-empty": "Не вибрано типів пристроїв.",
+ "device-types": "Типи пристрою",
+ "name": "Ім'я",
+ "name-required": "Необхідно вказати ім'я.",
+ "description": "Опис",
+ "events": "Події",
+ "details": "Деталі",
+ "copyId": "Копіювати Id пристрою",
+ "copyAccessToken": "Копіювати маркер доступу",
+ "idCopiedMessage": "Id пристрою скопійовано в буфер обміну",
+ "accessTokenCopiedMessage": "Маркер доступу до пристрою скопійовано в буфер обміну",
+ "assignedToCustomer": "Призначений клієнту",
+ "unable-delete-device-alias-title": "Неможливо видалити псевдонім пристрою",
+ "unable-delete-device-alias-text": "Псевдонім пристрою '{{deviceAlias}}' не може бути видалений, оскільки він використовується наступним(и) віджетом(ами):
{{widgetsList}}",
+ "is-gateway": "Шлюз",
+ "public": "Публічно",
+ "device-public": "Пристрій є публічним",
+ "select-device": "Виберіть пристрій",
+ "selected-devices": "{ count, plural, 1 {1 пристрій} other {# пристрої} } вибрано",
+ "search": "Шукати пристрої",
+ "select-group-to-add": "Виберіть цільову групу, щоб додати вибраний пристрій",
+ "select-group-to-move": "Виберіть цільову групу для переміщення вибраних пристроїв",
+ "remove-devices-from-group": "Ви впевнені, що хочете видалити { count, plural, 1 {1 пристрій} other {# пристрої} } з групи '{entityGroup}'?",
+ "group": "Група пристроїв",
+ "list-of-groups": "{ count, plural, 1 {Одна група пристроїв} other {Список # груп пристроїв} }",
+ "group-name-starts-with": "Групи пристроїв, імена яких починаються з '{{prefix}}'"
+ },
+ "dialog": {
+ "close": "Закрити діалогове вікно"
+ },
+ "error": {
+ "unable-to-connect": "Неможливо підключитися до сервера! Перевірте підключення до Інтернету.",
+ "unhandled-error-code": "Неопрацьований помилковий код: {{errorCode}}",
+ "unknown-error": "Невідома помилка"
+ },
+ "entity": {
+ "entity": "Сутність",
+ "entities": "Сутності",
+ "aliases": "Псевдоніми сутності",
+ "entity-alias": "Псевдонім сутності",
+ "unable-delete-entity-alias-title": "Неможливо видалити псевдонім сутності",
+ "unable-delete-entity-alias-text": "Псевдонім сутності'{{entityAlias}}' неможливо видалити, так як це використовується наступним віджетом(s):
{{widgetsList}}",
+ "duplicate-alias-error": "Знайдено повторюваний псевдонім '{{alias}}'.
Псевдоніми сутностей повинні бути унікальними на панелі візуалізації.",
+ "missing-entity-filter-error": "Відсутній фільтр для псевдоніма '{{alias}}'.",
+ "configure-alias": "Налаштувати '{{alias}}' псевдонім",
+ "alias": "Псевдонім",
+ "alias-required": "Необхідно вказати псевдонім сутності.",
+ "remove-alias": "Видалити псевдонім сутності",
+ "add-alias": "Додати псевдонім сутності",
+ "entity-list": "Список сутності",
+ "entity-type": "Тип сутності",
+ "entity-types": "Типи сутності",
+ "entity-type-list": "Список типу сутності",
+ "any-entity": "Будь-яка сутність",
+ "enter-entity-type": "Введіть тип сутності",
+ "no-entities-matching": "Не знайдено жожних сутностей, що відповідають '{{entity}}' що відповідають.",
+ "no-entity-types-matching": "Не знайдено жожних типів сутностей, що відповідають '{{entityType}}'.",
+ "name-starts-with": "Назва починається з",
+ "use-entity-name-filter": "Використовуйте фільтр",
+ "entity-list-empty": "Не вибрано жодних сутностей.",
+ "entity-type-list-empty": "Не вибрано жодних типів сутностей.",
+ "entity-name-filter-required": "Необхідно задати фільтр по імені.",
+ "entity-name-filter-no-entity-matched": "Не знайдено жодних сутностей, що починаються з '{{entity}}'.",
+ "all-subtypes": "Всі",
+ "select-entities": "Виберіть сутність",
+ "no-aliases-found": "Псевдонімів не знайдено.",
+ "no-alias-matching": "'{{alias}}' не знайдено.",
+ "create-new-alias": "Створити новий псевдонім!",
+ "key": "Ключ",
+ "key-name": "Ім'я ключа",
+ "no-keys-found": "No keys found.",
+ "no-key-matching": "'{{key}}' не знайдено.",
+ "create-new-key": "Створити новий ключ!",
+ "type": "Тип",
+ "type-required": "Необхідно задати тип сутності.",
+ "type-device": "Пристрій",
+ "type-devices": "Пристрої",
+ "list-of-devices": "{ count, plural, 1 {Один пристрій} other {Список # пристроїв} }",
+ "device-name-starts-with": "Пристрої, імена яких починаються з '{{prefix}}'",
+ "type-asset": "Актив",
+ "type-assets": "Активи",
+ "list-of-assets": "{ count, plural, 1 {Один актив} other {Список # активів} }",
+ "asset-name-starts-with": "Активи, імена яких починаються з '{{prefix}}'",
+ "type-entity-view": "Перегляд сутності",
+ "type-entity-views": "Перегляди сутності",
+ "list-of-entity-views": "{ count, plural, 1 {Один перегляд сутності} other {Список # переглядів сутності} }",
+ "entity-view-name-starts-with": "Перегляди сутностей, імена яких починаються з '{{prefix}}'",
+ "type-rule": "Правило",
+ "type-rules": "Правила",
+ "list-of-rules": "{ count, plural, 1 {Одне правило} other {Список # правил} }",
+ "rule-name-starts-with": "Правила, імена яких починаються з '{{prefix}}'",
+ "type-plugin": "Плагін",
+ "type-plugins": "Плагіни",
+ "list-of-plugins": "{ count, plural, 1 {Один плагін} other {Список # плагінів} }",
+ "plugin-name-starts-with": "Плагіни, імена яких починаються з '{{prefix}}'",
+ "type-tenant": "Власник",
+ "type-tenants": "Власники",
+ "list-of-tenants": "{ count, plural, 1 {Один власник} other {Список # власників} }",
+ "tenant-name-starts-with": "Власники, імена яких починаються з '{{prefix}}'",
+ "type-customer": "Клієнт",
+ "type-customers": "Клієнти",
+ "list-of-customers": "{ count, plural, 1 {Один клієнт} other {Список # клієнтів} }",
+ "customer-name-starts-with": "Клієнти, імена яких починаються з '{{prefix}}'",
+ "type-user": "Користувач",
+ "type-users": "Користувачі",
+ "list-of-users": "{ count, plural, 1 {Один користувач} other {Список # користувачів } }",
+ "user-name-starts-with": "Користувачі, імена яких починаються з '{{prefix}}'",
+ "type-dashboard": "Панель візуалізації",
+ "type-dashboards": "Панелі візуалізації",
+ "list-of-dashboards": "{ count, plural, 1 {Одна панель візуалізації} other {Список # панелей візуалізації} }",
+ "dashboard-name-starts-with": "Панелі візуалізації, імена яких починаються з '{{prefix}}'",
+ "type-alarm": "Сигнал тривоги",
+ "type-alarms": "Сигнали тривоги",
+ "list-of-alarms": "{ count, plural, 1 {Один сигнал тривоги} other {Список # сигналів тривоги} }",
+ "alarm-name-starts-with": "Сигнали тривоги, імена яких починаються '{{prefix}}'",
+ "type-rulechain": "Правило ланцюжка",
+ "type-rulechains": "Правило ланцюжків",
+ "list-of-rulechains": "{ count, plural, 1 {Одне правило ланцюжка} other {Список # правил ланцюжків} }",
+ "rulechain-name-starts-with": "Правило ланцюжків, імена яких починаються '{{prefix}}'",
+ "type-scheduler-event": "Scheduler event",
+ "type-scheduler-events": "Scheduler events",
+ "list-of-scheduler-events": "{ count, plural, 1 {One scheduler event} other {List of # scheduler events} }",
+ "scheduler-event-name-starts-with": "Scheduler events whose names start with '{{prefix}}'",
+ "type-blob-entity": "Blob entity",
+ "type-blob-entities": "Blob entities",
+ "list-of-blob-entities": "{ count, plural, 1 {One blob entity} other {List of # blob entities} }",
+ "blob-entity-name-starts-with": "Blob entities whose names start with '{{prefix}}'",
+ "type-rulenode": "Правило",
+ "type-rulenodes": "Правила",
+ "list-of-rulenodes": "{ count, plural, 1 {Одне правило} other {Список # правил} }",
+ "rulenode-name-starts-with": "Список правил, імена яких починаються '{{prefix}}'",
+ "type-current-customer": "Поточний клієнт",
+ "search": "Пошук сутностей",
+ "selected-entities": "{ count, plural, 1 {1 сутність} other {# сутності} } вибрано",
+ "entity-name": "Ім'я сутності",
+ "details": "Подробиці сутності",
+ "no-entities-prompt": "Сутності не знайдено",
+ "no-data": "Немає даних для відображення",
+ "columns-to-display": "Стовпці для відображення",
+ "type-entity-group": "Група сутностей",
+ "type-converter": "Перетворювач даних",
+ "type-converters": "Перетворювачі даних",
+ "list-of-converters": "{ count, plural, 1 {Однин перетворювач даних} other {Список # перетворювачів даних} }",
+ "converter-name-starts-with": "Перетворювачі даних, імена яких починаються з '{{prefix}}'",
+ "type-integration": "Інтеграція",
+ "type-integrations": "Інтеграції",
+ "list-of-integrations": "{ count, plural, 1 {Одна інтеграція} other {Список # інтеграцій} }",
+ "integration-name-starts-with": "Інтеграції, імена яких починаються з '{{prefix}}'"
+ },
+ "entity-group": {
+ "entity-group": "Група сутності",
+ "details": "Деталі",
+ "columns": "Стовпці",
+ "add-column": "Додати стовпець",
+ "column-value": "Значення",
+ "column-value-required": "Необхідно вказати значення.",
+ "column-title": "Назва",
+ "default-sort-order": "Основний порядок сортування",
+ "default-sort-order-required": "Необхідно вказати основний порядок сортування.",
+ "hide-in-mobile-view": "Мобільний приховано",
+ "use-cell-style-function": "Використовувати функцію стилю комірки",
+ "use-cell-content-function": "Use cell content function",
+ "edit-column": "Редагувати стовпець",
+ "column-details": "Деталі стовпця",
+ "actions": "Дії",
+ "settings": "Налаштування",
+ "delete": "Видалити групу сутностей",
+ "name": "Ім'я",
+ "name-required": "Необхідно вказати ім'я.",
+ "description": "Опис",
+ "add": "Додати групу сутностей",
+ "add-entity-group-text": "Додати нову групу сутностей",
+ "no-entity-groups-text": "Не знайдено жодних груп сутності",
+ "entity-group-details": "Деталі групи сутності",
+ "delete-entity-groups": "Видалити групи сутностей",
+ "delete-entity-group-title": "Ви впевнені, що хочете видалити групу сутності '{{entityGroupName}}'?",
+ "delete-entity-group-text": "Будьте обережні, після підтвердження, група сутностей і всі пов'язані з нею дані стануть недоступними.",
+ "delete-entity-groups-title": "Ви впевнені, що хочете видалити { count, plural, 1 {1 групу сутності} other {# групи сутностей} }?",
+ "delete-entity-groups-action-title": "Видалити { count, plural, 1 {1 групу сутності} other {# групи сутностей} }",
+ "delete-entity-groups-text": "Будьте обережні, після підтвердження, всі виділені групи сутностей і пов'язані з ними дані, стануть недоступними.",
+ "device-groups": "Групи пристроїв",
+ "asset-groups": "Групи активів",
+ "customer-groups": "Групи клієнтів",
+ "device-group": "Група пристроїв",
+ "asset-group": "Група активів",
+ "customer-group": "Група клієнтів",
+ "fetch-more": "Отримати більше",
+ "column-type": {
+ "column-type": "Тип стовпця",
+ "client-attribute": "Атрибут клієнта",
+ "shared-attribute": "Спільний атрибут",
+ "server-attribute": "Атрибут сервера",
+ "timeseries": "Телеметрія",
+ "entity-field": "Поле сутності"
+ },
+ "column-type-required": "Необхідно вказати тип стовпця.",
+ "entity-field": {
+ "created-time": "Створений час",
+ "name": "Ім'я",
+ "type": "Тип",
+ "assigned_customer": "Призначений клієнт",
+ "authority": "Авторитет",
+ "first_name": "Ім'я",
+ "last_name": "Прізвище",
+ "email": "Електронна пошта",
+ "title": "Назва",
+ "country": "Країна",
+ "state": "Штат",
+ "city": "Місто",
+ "address": "Адреса",
+ "address2": "Адреса 2",
+ "zip": "Zip",
+ "phone": "Телефон"
+ },
+ "sort-order": {
+ "asc": "У порядку зростання",
+ "desc": "У порядку зменшення",
+ "none": "Не має"
+ },
+ "details-mode": {
+ "on-row-click": "Клацніть на рядок",
+ "on-action-button-click": "Клацніть на кнопку детелі",
+ "disabled": "Вимкнено"
+ },
+ "add-to-group": "Додати до групи",
+ "move-to-group": "Перемістити до групи",
+ "select-entity-group": "Виберати групу сутностей",
+ "no-entity-groups-matching": "Не знайдено жодних груп сутностей, що відповідають '{{entityGroup}}'.",
+ "target-entity-group-required": "Необхідно вказати цільову групу сутності.",
+ "remove-from-group": "Видалити з групи",
+ "group-table-title": "Group table title",
+ "enable-search": "Увімкнути пошук сутностей",
+ "enable-add": "Увімкнути додавання сутностей",
+ "enable-delete": "Увімкнути видалення сутностей",
+ "enable-selection": "Увімкнути вибір сутностей",
+ "enable-group-transfer": "Увімкнути дії групового перенесення",
+ "display-pagination": "Відображення сторінок",
+ "default-page-size": "Розмір сторінки за замовчуванням",
+ "enable-assignment-actions": "Увімкнути дії призначення",
+ "enable-credentials-management": "Увімкнути керування авторизаційними даними",
+ "enable-users-management": "Увімкнути керування користувачами",
+ "enable-assets-management": "Увімкнути керування активами",
+ "enable-devices-management": "Увімкнути керування пристроями",
+ "enable-dashboards-management": "Увімкнути керування панелями візуалізації",
+ "open-details-on": "Відкрити деталі сутності",
+ "select-existing": "Виберіть існуючу групу сутностей",
+ "create-new": "Створити нову групу сутностей",
+ "new-entity-group-name": "Нове ім'я групи сутностей",
+ "entity-group-list": "Список групи сутностей",
+ "entity-group-list-empty": "Не вибрано жодної групи сутностей.",
+ "name-starts-with": "Назва групи сутностей починається з",
+ "entity-group-name-filter-required": "Необхідно задати назву групи сутностей."
+ },
+ "entity-view": {
+ "entity-view": "Перегляд сутності",
+ "entity-view-required": "Необхідно вказати перегляд сутності.",
+ "entity-views": "Перегляди сутностей",
+ "management": "Керування переглядом сутностей",
+ "view-entity-views": "Переглянути перегляд сутностей",
+ "entity-view-alias": "Псевдонім перегляду сутності",
+ "aliases": "Псевдоніми перегляду сутності",
+ "no-alias-matching": "Псевдонім'{{alias}}' не знайдено.",
+ "no-aliases-found": "Псевдоніми не знайдено.",
+ "no-key-matching": "'Ключ {{key}}' не знайдено.",
+ "no-keys-found": "Ключі не знайдено.",
+ "create-new-alias": "Створити новий!",
+ "create-new-key": "Створити новий!",
+ "duplicate-alias-error": "Псевдонім з такою назвою вже існує '{{alias}}'.
Псевдоніми перегляду повинні бути унікальними на панелі візуалізації.",
+ "configure-alias": "Налаштувати псевдонім '{{alias}}'",
+ "no-entity-views-matching": "Сутності, які відповідають '{{entity}}' не знайдені.",
+ "alias": "Псевдонім",
+ "alias-required": "Необхідно вказати псевдонім перегляду сутності.",
+ "remove-alias": "Видалити псевдонім перегляду сутності",
+ "add-alias": "Додати псевдонім перегляду сутності",
+ "name-starts-with": "Ім'я перегляду сутності починається з",
+ "entity-view-list": "Список перегляду сутності",
+ "use-entity-view-name-filter": "Використати фільтр",
+ "entity-view-list-empty": "Не вибрано жодного перегляду сутності.",
+ "entity-view-name-filter-required": "Необхідно вказвти фільтр назв представлення сутності.",
+ "entity-view-name-filter-no-entity-view-matched": "Перегляди сутностей, назви яких починаються з '{{entityView}}' не знайдено.",
+ "add": "Додати перегляд сутності",
+ "assign-to-customer": "Призначити клієнту",
+ "assign-entity-view-to-customer": "Призначити перегляд(и) сутності(ей) клієнту",
+ "assign-entity-view-to-customer-text": "Будь ласка, виберіть перегляд сутності для призначення клієнту",
+ "no-entity-views-text": "Перегляду сутності не знайдено",
+ "assign-to-customer-text": "Будь ласка, виберіть клієнта, для призначиення перегляду(ів) сутності(ей)",
+ "entity-view-details": "Деталі перегляду сутності",
+ "add-entity-view-text": "Додати новий перегляд сутносі",
+ "delete": "Видалити перегляд сутності",
+ "assign-entity-views": "Призначити перегляд сутності",
+ "assign-entity-views-text": "Призначити { count, plural, 1 {1 перегляд сутності} other {# перегляди сутностей } } клієнту",
+ "delete-entity-views": "Видалити перегляди сутностей",
+ "unassign-from-customer": "Позбавити клієнта",
+ "unassign-entity-views": "Позбавити переглядів сутностей",
+ "unassign-entity-views-action-title": "Позбавити { count, plural, 1 {1 перегляду сутності} other {# переглядів сутностей} } клієнта",
+ "assign-new-entity-view": "Призначити новий перегляд сутності",
+ "delete-entity-view-title": "Ви впевнені, що хочете видалити перегляд сутності'{{entityViewName}}'?",
+ "delete-entity-view-text": "Будьте обережні, після підтвердження, перегляд сутності та всі пов'язані з нею дані стануть недоступними.",
+ "delete-entity-views-title": "Ви впевнені, що хочете видалити перегляд сутності { count, plural, 1 {1 перегляд сутності } other {# перегляди сутностей } }?",
+ "delete-entity-views-action-title": "Видалити { count, plural, 1 {1 перегляд сутності } other {# перегляди сутностей } }",
+ "delete-entity-views-text": "Будьте обережні, після підтвердження, всі виділені перегляди сутностей та дні, пов'язані з ними стануть недоступними.",
+ "unassign-entity-view-title": "Ви впевнені, що хочете позбавити перегляду сутності '{{entityViewName}}'?",
+ "unassign-entity-view-text": "Після підтвердження клієнт буде позбавлений перегляду сутності. Дані перегляду сутності не будуть доступні клієнту.",
+ "unassign-entity-view": "Позбавити перегляду сутності",
+ "unassign-entity-views-title": "Ви впевнені, що хочете позбавити { count, plural, 1 {1 перегляду сутності} other {# переглядів сутностей} }?",
+ "unassign-entity-views-text": "Після підтвердження, клієнта буде позбавлено всіх виділених переглядів сутності. Дані переглядів сутностей не будуть доступні клієнту .",
+ "entity-view-type": "Тип перегляду сутності",
+ "entity-view-type-required": "Необхідно вказати тип перегляду сутності.",
+ "select-entity-view-type": "Виберіть тип перегляду сутності",
+ "enter-entity-view-type": "Введіть тип перегляду сутності",
+ "any-entity-view": "Будь-який перегляд сутності",
+ "no-entity-view-types-matching": "Не знайдено жодних типів перегляду сутності, що відповідають '{{entitySubtype}}'.",
+ "entity-view-type-list-empty": "Не вибрано тип перегляду сутності.",
+ "entity-view-types": "Типи перегляду сутності",
+ "name": "Ім'я",
+ "name-required": "Необхідно вказати ім'я.",
+ "description": "Опис",
+ "events": "Події",
+ "details": "Деталі",
+ "copyId": "Скопіювати Id перегляду сутності",
+ "assignedToCustomer": "Призначений клієнту",
+ "unable-entity-view-device-alias-title": "Неможливо видалити псевдонім перегляду сутності",
+ "unable-entity-view-device-alias-text": "Не вдалося видалити псевдонім пристрою'{{entityViewAlias}}', так як він використовується наступним(и) віджетом(ами):
{{widgetsList}}",
+ "select-entity-view": "Виберати перегляд сутності",
+ "make-public": "Зробити перегляд сутності публічним",
+ "start-date": "Дата початку",
+ "start-ts": "Час початку",
+ "end-date": "Дата закінчення",
+ "end-ts": "Час завершення",
+ "date-limits": "Обмеження дати",
+ "client-attributes": "Атрибути клієнта",
+ "shared-attributes": "Спільні атрибути",
+ "server-attributes": "Атрибути сервера",
+ "timeseries": "Телеметрія",
+ "client-attributes-placeholder": "Атрибути клієнта",
+ "shared-attributes-placeholder": "Спільні атрибути",
+ "server-attributes-placeholder": "Атрибути сервера",
+ "timeseries-placeholder": "Телеметрія",
+ "target-entity": "Цільова сутність",
+ "attributes-propagation": "Поширення атрибутів",
+ "attributes-propagation-hint": "Перегляд сутностей автоматично копіюватиме вказані атрибути з цільової сутності кожного разу, коли ви зберігаєте або оновлюєте ці перегляди. В цілях продуктивності, атрибути цільової сутності не поширюються на представлення сутності на кожній зміні їх атрибутів. Можна ввімкнути автоматичне поширення, налаштувавши у вашому ланцюжку правило \"copy to view\" і пов'язуючи його з повідомленнями типу \"Post attributes\" і \"Attributes Updated\"..",
+ "timeseries-data": "Дані телеметрії",
+ "timeseries-data-hint": "Налаштуйте ключі даних телеметрії цільової сутності, які будуть доступні перегляду сутності. Ці дані доступні лише для читання."
+ },
+ "event": {
+ "events": "Події",
+ "event-type": "Тип події",
+ "type-error": "Помилка",
+ "type-lc-event": "Подія життєвого циклу",
+ "type-stats": "Статистика",
+ "type-debug-converter": "Налагоджувати",
+ "type-debug-integration": "Налагоджувати",
+ "type-debug-rule-node": "Налагоджувати",
+ "type-debug-rule-chain": "Налагоджувати",
+ "no-events-prompt": "Не знайдено жодних подій",
+ "error": "Помилка",
+ "alarm": "Сигнал тривоги",
+ "event-time": "Час події",
+ "server": "Сервер",
+ "body": "Тіло",
+ "method": "Метод",
+ "type": "Тип",
+ "in": "In",
+ "out": "Out",
+ "metadata": "Метадані",
+ "message": "Повідомлення",
+ "entity": "Сутність",
+ "message-id": "Id повідомлення",
+ "message-type": "Тип повідомлення",
+ "data-type": "Тип даних",
+ "relation-type": "Тип зв'язку",
+ "data": "Дані",
+ "event": "Подія",
+ "status": "Статус",
+ "success": "Успіх",
+ "failed": "Невдача",
+ "messages-processed": "Повідомлення опрацьовані",
+ "errors-occurred": "Виникли помилки"
+ },
+ "extension": {
+ "extensions": "Розширення",
+ "selected-extensions": " вибрано { count, plural, 1 {1 розширення} other {# розширення} }",
+ "type": "Тип",
+ "key": "Ключ",
+ "value": "Значення",
+ "id": "Id",
+ "extension-id": "Id розширення",
+ "extension-type": "Тип розширення",
+ "transformer-json": "JSON *",
+ "unique-id-required": "Таке Id розширення вже існує.",
+ "delete": "Видалити розширення",
+ "add": "Додати розширення",
+ "edit": "Редагувати розширення",
+ "delete-extension-title": "Ви дійсно бажаєте видалити розширення '{{extensionId}}'?",
+ "delete-extension-text": "Будьте обережні, після підтвердження, розширення та всі пов'язані з ним дані стануть недоступними.",
+ "delete-extensions-title": "Ви дійсно бажаєте видалити { count, plural, 1 {1 розширення} other {# розширення} }?",
+ "delete-extensions-text": "Будьте обережні, після підтвердження, всі вибрані розширення будуть видалені.",
+ "converters": "Перетворювачі",
+ "converter-id": "Id перетворювача",
+ "configuration": "Конфігурація",
+ "converter-configurations": "Конфігурації перетворювача",
+ "token": "Маркер безпеки",
+ "add-converter": "Додати конвертер",
+ "add-config": "Додати конфігурацію конвертера",
+ "device-name-expression": "Маска імені пристрою",
+ "device-type-expression": "Маска типу пристрою",
+ "custom": "Користувач",
+ "to-double": "Подвоїти",
+ "transformer": "Трансформатор",
+ "json-required": "Необхідно вказати json трансформатора.",
+ "json-parse": "Неможливо проаналізувати json трансформатора.",
+ "attributes": "Атрибути",
+ "add-attribute": "Додати атрибут",
+ "add-map": "Додати елемент відображення",
+ "timeseries": "Телеметрія",
+ "add-timeseries": "Додати параметри телеметрії",
+ "field-required": "Field is required",
+ "brokers": "Брокери",
+ "add-broker": "Додати брокера",
+ "host": "Хост",
+ "port": "Порт",
+ "port-range": "Значення порту має бути в діапазоні від 1 до 65535.",
+ "ssl": "Ssl",
+ "credentials": "Авторизаційні дані",
+ "username": "Ім'я користувача",
+ "password": "Пароль",
+ "retry-interval": "Інтервал повтору в мілісекундах",
+ "anonymous": "Анонімний",
+ "basic": "Основний",
+ "pem": "PEM",
+ "ca-cert": "Файл CA сертифіката *",
+ "private-key": "Файл приватного ключа *",
+ "cert": "Файл сертифіката *",
+ "no-file": "Не вибрано жодного файлу.",
+ "drop-file": "Перетягніть файл, або клацніть, щоб вибрати файл для завантаження.",
+ "mapping": "Зіставлення",
+ "topic-filter": "Фільтр тем",
+ "converter-type": "Тип конвертера",
+ "converter-json": "Json",
+ "json-name-expression": " Json вираз для назви пристрою",
+ "topic-name-expression": "Вираз для назви пристрою в назві теми",
+ "json-type-expression": "Json вираз для типу пристрою",
+ "topic-type-expression": "Вираз для типу пристрою в назві теми",
+ "attribute-key-expression": "Вираз для ключа атрибута",
+ "attr-json-key-expression": " Json вираз для ключа атрибута",
+ "attr-topic-key-expression": "Вираз для ключа атрибута в назві теми",
+ "request-id-expression": "Вираз для id запиту",
+ "request-id-json-expression": "Json вираз для id запиту",
+ "request-id-topic-expression": "Вираз для id запиту в назві теми",
+ "response-topic-expression": "Вираз для теми відповідей",
+ "value-expression": "Вираз для значення",
+ "topic": "Тема",
+ "timeout": "Час очікування в мілісекундах",
+ "converter-json-required": "Необхідно вказати json конвертер.",
+ "converter-json-parse": "Неможливо проаналізувати json конвертера.",
+ "filter-expression": "Вираз для фільтра",
+ "connect-requests": "Запити на підключення",
+ "add-connect-request": "Додати запит на підключення",
+ "disconnect-requests": "Відключення запитів",
+ "add-disconnect-request": "Додати запит на відключення",
+ "attribute-requests": "Запити атрибутів",
+ "add-attribute-request": "Додати запит атрибута",
+ "attribute-updates": "Оновлення атрибутів",
+ "add-attribute-update": "Додати оновлення атрибутів",
+ "server-side-rpc": "Серверна сторона RPC",
+ "add-server-side-rpc-request": "Додати RPC-запит на стороні сервера",
+ "device-name-filter": "Фільтр назви пристрою",
+ "attribute-filter": "Фільтр атрибутів",
+ "method-filter": "Фільтр методів",
+ "request-topic-expression": "Вираз для теми запитів",
+ "response-timeout": "Час очікування відповіді в мілісекундах",
+ "topic-expression": "Вираз для назви теми",
+ "client-scope": "Обсяг клієнта",
+ "add-device": "Додати пристрій",
+ "opc-server": "Сервери",
+ "opc-add-server": "Додати сервер",
+ "opc-add-server-prompt": "Будь ласка, додайте сервер",
+ "opc-application-name": "Назва програми",
+ "opc-application-uri": "URI програми",
+ "opc-scan-period-in-seconds": "Період сканування в секундах",
+ "opc-security": "Безпека",
+ "opc-identity": "Ідентифікація",
+ "opc-keystore": "Сховище ключів",
+ "opc-type": "Тип",
+ "opc-keystore-type": "Тип",
+ "opc-keystore-location": "Розташування *",
+ "opc-keystore-password": "Пароль",
+ "opc-keystore-alias": "Псевдонім",
+ "opc-keystore-key-password": "Пароль для ключа",
+ "opc-device-node-pattern": "Патерн OPC вузла пристрою",
+ "opc-device-name-pattern": "Патерн назви пристрою",
+ "modbus-server": "Сервери/ведені пристрої",
+ "modbus-add-server": "Додати сервер/ведений пристрій",
+ "modbus-add-server-prompt": "Будь ласка, додайте сервер/ведений пристрій",
+ "modbus-transport": "Транспорт",
+ "modbus-port-name": "Ім'я послідовного порту",
+ "modbus-encoding": "Кодування",
+ "modbus-parity": "Паритет",
+ "modbus-baudrate": "Швидкість передачі даних",
+ "modbus-databits": "Біти даних",
+ "modbus-stopbits": "Стоп-біти",
+ "modbus-databits-range": "Біти даних повинні знаходитися в діапазоні від 7 до 8.",
+ "modbus-stopbits-range": "Стоп-біти повинні знаходитися в діапазоні від 1 до 2.",
+ "modbus-unit-id": "Unit ID",
+ "modbus-unit-id-range": "Unit ID should be in a range from 1 to 247.",
+ "modbus-device-name": "Ім'я пристрою",
+ "modbus-poll-period": "Період опитування (мс)",
+ "modbus-attributes-poll-period": "Період опитування атрибутів (мс)",
+ "modbus-timeseries-poll-period": "Період опитування телеметрії (мс)",
+ "modbus-poll-period-range": "Період опитування повинен бути більше 0.",
+ "modbus-tag": "Тег",
+ "modbus-function": "Modbus функція",
+ "modbus-register-address": "Адреса регістру ",
+ "modbus-register-address-range": "Адреса регістру повинна бути в діапазоні від 0 до 65535.",
+ "modbus-register-bit-index": "Номер бітів",
+ "modbus-register-bit-index-range": "Номер бітів повинен знаходитися в діапазоні від 0 до 15.",
+ "modbus-register-count": "Рахунок регістру",
+ "modbus-register-count-range": "Рахунок регістру повинен бути більше 0.",
+ "modbus-byte-order": "Порядок байтів",
+
+ "sync": {
+ "status": "Статус",
+ "sync": "Синхронізований",
+ "not-sync": "Не синхронізований",
+ "last-sync-time": "Час останньої синхронізації",
+ "not-available": "Недоступний"
+ },
+
+ "export-extensions-configuration": "Експортувати конфігурацію розширень",
+ "import-extensions-configuration": "Імпортувати конфігурацію розширень",
+ "import-extensions": "Імпортувати розширення",
+ "import-extension": "Імпортувати розширення",
+ "export-extension": "Експортувати розширення",
+ "file": "Файл розширень",
+ "invalid-file-error": "Не правильний формат файла"
+ },
+ "fullscreen": {
+ "expand": "Відкрити у повноекранному режимі",
+ "exit": "Вийти з повноекранного режиму",
+ "toggle": "Перемкнути повноекранний режим",
+ "fullscreen": "Повноекранний режим"
+ },
+ "function": {
+ "function": "Функція"
+ },
+ "grid": {
+ "delete-item-title": "Ви впенені, що хочете видалити цей елемент?",
+ "delete-item-text": "Будьте обережні, після підтвердження, цей елемент і всі пов'язані з ним дані, стануть недоступними.",
+ "delete-items-title": "Ви впенені, що хочете видалити { count, plural, 1 {1 елемент} other {# елементи} }?",
+ "delete-items-action-title": "Видалити{ count, plural, 1 {1 елемент} other {# елементи} }",
+ "delete-items-text": "Будьте обережні, після підтвердження, всі виділені елементи і пов'язані з ними дані, стануть недоступними.",
+ "add-item-text": "Додати новий елемент",
+ "no-items-text": "Не знайдено жодного елемента",
+ "item-details": "Деталі елемента",
+ "delete-item": "Видалити елементи",
+ "scroll-to-top": "Перейти угору"
+ },
+ "help": {
+ "goto-help-page": "Перейти на сторінку довідки"
+ },
+ "home": {
+ "home": "Домашня сторінка",
+ "profile": "Профіль",
+ "logout": "Вийти",
+ "menu": "Меню",
+ "avatar": "Аватар",
+ "open-user-menu": "Відкрити меню користувача"
+ },
+ "import": {
+ "no-file": "Не вибрано жодного файлу",
+ "drop-file": "Перетягніть JSON файл, або клацніть, щоб вибрати файл для завантаження.",
+ "drop-csv-file": "Перетягніть CSV файл, або клацніть, щоб вибрати файл для завантаження."
+ },
+ "integration": {
+ "integration": "Інтеграція",
+ "integrations": "Інтеграції",
+ "select-integration": "Виберіть інтеграцію",
+ "no-integrations-matching": "Не знайдено жодних інтеграцій, які відповідають '{{entity}}'.",
+ "integration-required": "Необхідно вказати інтеграцію",
+ "delete": "Видалити інтеграцію",
+ "management": "Управління інтеграціями",
+ "add-integration-text": "Додати нову інтеграцію",
+ "no-integrations-text": "Не знайдено жодної інтеграції",
+ "selected-integrations": "{ count, plural, 1 {1 інтеграція} other {# інтеграції} } вибрано",
+ "delete-integration-title": "Ви впевнені, що хочете видалити інтеграцію '{{integrationName}}'?",
+ "delete-integration-text": "Будьте обережні, після підтвердження інтеграція та всі пов'язані з нею дані стануть недоступними.",
+ "delete-integrations-title": "Ви впевнені, що хочете видалити { count, plural, 1 {1 інтеграцію} other {# інтеграції} }?",
+ "delete-integrations-action-title": "Видалити { count, plural, 1 {1 інтеграцію} other {# інтеграції} }",
+ "delete-integrations-text": "Будьте обережні, після підтвердження всі вибрані інтеграції будуть видалені, і всі пов'язані з ними дані стануть недоступними.",
+ "events": "Події",
+ "add": "Додати інтеграцію",
+ "integration-details": "Деталі інтеграції",
+ "details": "Деталі",
+ "copyId": "Копіювати Id інтеграції",
+ "idCopiedMessage": "Id інтеграції скопійовано в буфер обміну",
+ "debug-mode": "Режим налагодження",
+ "enable-security": "Увімкнути безпеку",
+ "headers-filter": "Заголовки фільтра",
+ "header": "Заголовок",
+ "no-headers-filter": "Немає фільтрів заголовків",
+ "downlink-url": "Downlink URL",
+ "application-uri": "URI програми",
+ "as-id": "AS ID",
+ "as-id-required": "Необхідно вказати AS ID.",
+ "as-key": "AS ключ",
+ "as-key-required": "Необхідно вказати AS ключ.",
+ "max-time-diff-in-seconds": "Максимальна різниця в часі (секунди)",
+ "max-time-diff-in-seconds-required": "Необхідно вказати максимальну різницю в часі.",
+ "name": "Ім'я",
+ "name-required": "Необхідно вказати ім'я.",
+ "description": "Опис",
+ "base-url": "Базова URL-адреса",
+ "base-url-required": "Необхідно вказати базову URL-адресу",
+ "security-key": "Ключ захисту",
+ "http-endpoint": "URL кінцевої точки HTTP",
+ "copy-http-endpoint-url": "Скопіювати URL-адресу кінцевої точки HTTP",
+ "http-endpoint-url-copied-message": "URL кінцевої точки HTTP скопійовано в буфер обміну",
+ "host": "Хост",
+ "host-required": "Необхідно вказати хост.",
+ "host-type": "Тип хоста",
+ "host-type-required": "Необхідно вказати тип хоста.",
+ "custom-host": "Хост користувача",
+ "custom-host-required": "Необхідний спеціальний хост.",
+ "port": "Порт",
+ "port-required": "Необхідно вказати порт.",
+ "port-range": "Порт має бути в діапазоні від 1 до 65535.",
+ "connect-timeout": "Час очікування з'єднання (сек)",
+ "connect-timeout-required": " Необхідно вказати час з'єднання підключення.",
+ "connect-timeout-range": "Час очікування з'єднання має бути в діапазоні від 1 до 200.",
+ "client-id": "ID клієнта",
+ "clean-session": "Очистити сеанс",
+ "enable-ssl": "Увімкнути SSL",
+ "credentials": "Авторизаційні дані",
+ "credentials-type": "Тип авторизаційних даних",
+ "credentials-type-required": "Необхідно вказати тип авторизаційних даних.",
+ "username": "Ім'я користувача",
+ "username-required": "Необхідно вказати ім'я користувача.",
+ "password": "Пароль",
+ "password-required": "Необхідно вказати пароль.",
+ "ca-cert": "Файл сертифіката CA *",
+ "private-key": "Файл приватного ключа *",
+ "private-key-password": "Пароль приватного ключа",
+ "cert": "Файл сертифіката*",
+ "no-file": "Не вибрано жодного файлу.",
+ "drop-file": "Перетягніть файл, або клацніть, щоб вибрати файл для завантаження.",
+ "topic-filters": "Тематичні фільтри",
+ "remove-topic-filter": "Видалити фільтр тем",
+ "add-topic-filter": "Додати фільтр тем",
+ "add-topic-filter-prompt": "Будь ласка, додайте фільтр тем",
+ "topic": "Тема",
+ "mqtt-qos": "QoS",
+ "mqtt-qos-at-most-once": "Не більше одного разу",
+ "mqtt-qos-at-least-once": "Принаймні, один раз",
+ "mqtt-qos-exactly-once": "Точно один раз",
+ "downlink-topic-pattern": "Downlink topic pattern",
+ "downlink-topic-pattern-required": "Downlink topic pattern is required.",
+ "aws-iot-endpoint": "AWS IoT Endpoint",
+ "aws-iot-endpoint-required": "AWS IoT Endpoint is required.",
+ "aws-iot-credentials": "Авторизаційні дані AWS IoT",
+ "application-credentials": "Авторизаційні дані додатків",
+ "api-key": "API ключ",
+ "api-key-required": "Необхідно вказати API ключ.",
+ "auth-token": "Маркер аутентифікації",
+ "auth-token-required": "Необхідно вказати маркер аутентифікації.",
+ "region": "Регіон",
+ "region-required": "Необхідно вказати регіон.",
+ "application-id": "ID програми",
+ "application-id-required": "Необхідно вказати ID програми.",
+ "access-key": "Ключ доступу",
+ "access-key-required": "Необхідно вказати ключ доступу.",
+ "connection-parameters": "Параметри підключення",
+ "service-bus-namespace-name": "Service Bus Namespace Name",
+ "service-bus-namespace-name-required": "Необхідно вказати Service Bus Namespace Name is required.",
+ "event-hub-name": "Event Hub Name",
+ "event-hub-name-required": "Необхідно вказати Event Hub Name is required.",
+ "sas-key-name": "Назва ключа SAS",
+ "sas-key-name-required": "Необхідно вказати назву ключа SAS.",
+ "sas-key": "Ключ SAS",
+ "sas-key-required": "SAS Key is required.",
+ "iot-hub-name": "IoT Hub Name (required for downlink)",
+ "metadata": "Метадані",
+ "type": "Тип",
+ "type-required": "Необхідно вказати тип.",
+ "uplink-converter": "Конвертер передачі даних",
+ "uplink-converter-required": "Необхідно вказати конвертер передачі даних.",
+ "downlink-converter": "Downlink data converter",
+ "type-http": "HTTP",
+ "type-ocean-connect": "OceanConnect",
+ "type-sigfox": "SigFox",
+ "type-thingpark": "ThingPark",
+ "type-tmobile-iot-cdp": "T-Mobile – IoT CDP",
+ "type-mqtt": "MQTT",
+ "type-aws-iot": "AWS IoT",
+ "type-ibm-watson-iot": "IBM Watson IoT",
+ "type-ttn": "TheThingsNetwork",
+ "type-azure-event-hub": "Azure Event Hub",
+ "type-opc-ua": "OPC-UA",
+ "type-ffb": "FFB",
+ "opc-ua-application-name": "Назва програми",
+ "opc-ua-application-uri": "Application uri",
+ "opc-ua-scan-period-in-seconds": "Період сканування в секундах",
+ "opc-ua-scan-period-in-seconds-required": "Необхідно вказати період сканування в секундах",
+ "opc-ua-timeout": "Час очікування в мілісекундах",
+ "opc-ua-timeout-required": "Необхідно вказати час очікування в мілісекундах",
+ "opc-ua-security": "Безпека",
+ "opc-ua-security-required": "Необхідно задати безпеку",
+ "opc-ua-identity": "Ідентифікація",
+ "opc-ua-identity-required": "Необхідно вказати ідентифікацію",
+ "opc-ua-keystore": "Сховище ключів",
+ "add-opc-ua-keystore-prompt": "Будь ласка, додайте файл сховища ключів",
+ "opc-ua-keystore-required": "Необхідно вказати сховище ключів",
+ "opc-ua-type": "Тип",
+ "opc-ua-keystore-type":"Тип сховища ключів",
+ "opc-ua-keystore-type-required":"Необхідно вказати тип",
+ "opc-ua-keystore-location":"Розташування *",
+ "opc-ua-keystore-password":"Пароль",
+ "opc-ua-keystore-password-required":"Необхідно вказати пароль",
+ "opc-ua-keystore-alias":"Псевдонім",
+ "opc-ua-keystore-alias-required":"Необхідно вказати псевдонім",
+ "opc-ua-keystore-key-password":"Пароль ключа",
+ "opc-ua-keystore-key-password-required":"Необхідно вказати пароль ключа",
+ "opc-ua-mapping":"Зіставлення",
+ "add-opc-ua-mapping-prompt": "Будь ласка, додайте зіставлення",
+ "opc-ua-mapping-type":"Тип зіставлення",
+ "opc-ua-mapping-type-required":"Необхідно вказати тип зіставлення",
+ "opc-ua-device-node-pattern":"Шаблон вузла пристрою",
+ "opc-ua-device-node-pattern-required":"Необхідно вказати шаблон вузла пристрою",
+ "opc-ua-add-map": "Додати елемент зіставлення",
+ "subscription-tags": "Теги передплати Теги підписки",
+ "remove-subscription-tag": "Видалити тег підписки",
+ "add-subscription-tag": "Додати тег підписки",
+ "add-subscription-tag-prompt": "Будь ласка, додайте тег підписки",
+ "key": "Ключ",
+ "path": "Шлях",
+ "required": "Необхідно"
+ },
+ "item": {
+ "selected": "Вибрані"
+ },
+ "js-func": {
+ "no-return-error": "Функція повинна повертати значення!",
+ "return-type-mismatch": "Функція повинна повернути значення типу '{{type}}'!",
+ "tidy": "Tidy"
+ },
+ "key-val": {
+ "key": "Ключ",
+ "value": "Значення",
+ "remove-entry": "Видалити елемент",
+ "add-entry": "Додати елемент",
+ "no-data": "Елементи відсутні"
+ },
+ "layout": {
+ "layout": "Макет",
+ "manage": "Керування макетами",
+ "settings": "Налаштування макета",
+ "color": "Колір",
+ "main": "Основний",
+ "right": "Правий",
+ "select": "Вибрати макет"
+ },
+ "legend": {
+ "position": "Розташування легенди",
+ "show-max": "Показати максимальне значення",
+ "show-min": "Показати мінімальне значення ",
+ "show-avg": "Показати середнє значення",
+ "show-total": "Показати суму",
+ "settings": "Налаштування легенди",
+ "min": "мін",
+ "max": "макс",
+ "avg": "середнє",
+ "total": "Сума"
+ },
+ "login": {
+ "login": "Вхід",
+ "request-password-reset": "Запит скидання пароля",
+ "reset-password": "Скинути пароль",
+ "create-password": "Створити пароль",
+ "passwords-mismatch-error": "Введені паролі повинні бути однаковими!",
+ "password-again": "Введіть пароль ще раз",
+ "sign-in": "Будь ласка, увійдіть в систему",
+ "username": "Ім'я користувача (ел. пошта)",
+ "remember-me": "Запам'ятати мене",
+ "forgot-password": "Забули пароль?",
+ "password-reset": "Скидання пароля",
+ "new-password": "Новий пароль",
+ "new-password-again": "Повторіть новий пароль",
+ "password-link-sent-message": "Посилання для скидання пароля було успішно надіслано!",
+ "email": "Електронна пошта"
+ },
+ "position": {
+ "top": "Угорі",
+ "bottom": "Знизу",
+ "left": "Ліворуч",
+ "right": "Праворуч"
+ },
+ "profile": {
+ "profile": "Профіль",
+ "change-password": "Змінити пароль",
+ "current-password": "Поточний пароль"
+ },
+ "relation": {
+ "relations": "Відношення",
+ "direction": "Напрямок",
+ "search-direction": {
+ "FROM": "З",
+ "TO": "До"
+ },
+ "direction-type": {
+ "FROM": "з",
+ "TO": "до"
+ },
+ "from-relations": "Вихідні відношення",
+ "to-relations": "Вхідні відношення",
+ "selected-relations": "Вибрано { count, plural, 1 {1 відношення} other {# відношення} }",
+ "type": "Тип",
+ "to-entity-type": "До типу сутності",
+ "to-entity-name": "До імені сутності",
+ "from-entity-type": "Від типу сутності",
+ "from-entity-name": "Від імені сутності",
+ "to-entity": "До сутності",
+ "from-entity": "Від сутності",
+ "delete": "Видалити відношення",
+ "relation-type": "Тип відношення",
+ "relation-type-required": "Необхідно вказати тип відношення.",
+ "any-relation-type": "Будь-який тип",
+ "add": "Додати відношення",
+ "edit": "Редагувати відношення",
+ "delete-to-relation-title": "Ви впевнені, що хочете видалити відношення до сутності '{{entityName}}'?",
+ "delete-to-relation-text": "Будьте обережні, після підтвердження, сутність '{{entityName}}' не буде пов'язана з поточним об'єктом.",
+ "delete-to-relations-title": "Ви впевнені, що хочете видалити { count, plural, 1 {1 відношення} other {# відношення} }?",
+ "delete-to-relations-text": "Будьте обережні, після підтвердження, всі вибрані відношення стануть не пов'язані з поточною сутністю.",
+ "delete-from-relation-title": "Ви впевнені, що хочете видалити зв'язок, який йде від сутності '{{entityName}}'?",
+ "delete-from-relation-text": "Будьте обережні, після підтвердження поточна сутність буде відв'язана від сутності '{{entityName}}'.",
+ "delete-from-relations-title": "Ви впевнені, що хочете видалити { count, plural, 1 {1 відношення} other {# відношення} }?",
+ "delete-from-relations-text": "Будьте обережні, після підтвердження, всі вибрані відношення будуть видалені, а поточна сутність стане не зв'язаною з відповідними сутностями.",
+ "remove-relation-filter": "Видалити фільтр відношення",
+ "add-relation-filter": "Додати фільтр відношення",
+ "any-relation": "Будь-яке відношення",
+ "relation-filters": "Фільтри відношення",
+ "additional-info": "Додаткова інформація (JSON)",
+ "invalid-additional-info": "Не вдалося розібрати JSON з додатковою інформацією ."
+ },
+ "rulechain": {
+ "rulechain": "Ланцюг правил",
+ "rulechains": "Ланцюги правил",
+ "root": "Основний",
+ "delete": "Видалити ланцюг правил",
+ "name": "Ім'я",
+ "name-required": "Необхідно вказати ім'я.",
+ "description": "Опис",
+ "add": "Додати ланцюг правил",
+ "set-root": "Зробити ланцюг правил основним",
+ "set-root-rulechain-title": "Ви впевнені, що хочете зробити ланцюг правил '{{ruleChainName}}' основним?",
+ "set-root-rulechain-text": "Після підтвердження ланцюг правил стане основним і буде обробляти всі вхідні транспортні повідомлення.",
+ "delete-rulechain-title": "Ви впевнені, що хочете видалити ланцюг правил '{{ruleChainName}}'?",
+ "delete-rulechain-text": "Будьте обережні, після підтвердження ланцюг правил і всі пов'язані з ним дані стануть недоступними.",
+ "delete-rulechains-title": "Ви впевнені, що хочете видалити { count, plural, 1 {1 ланцюг правил} other {# ланцюги правил} }?",
+ "delete-rulechains-action-title": "Видалити{ count, plural, 1 {1 ланцюг правил} other {# ланцюги правил} }",
+ "delete-rulechains-text": "Будьте обережні, після підтвердження, вибрані ланцюги правил і всі пов'язані з ними дані стануть недоступними.",
+ "add-rulechain-text": "Додати новий ланцюг правил",
+ "no-rulechains-text": "Ланцюг правил не знайдено",
+ "rulechain-details": "Деталі ланцюга правил",
+ "details": "Деталі",
+ "events": "Події",
+ "system": "Система",
+ "import": "Імпортувати ланцюг правил",
+ "export": "Експортувати ланцюг правил",
+ "export-failed-error": "Не вдалося експортувати ланцюг правил: {{error}}",
+ "create-new-rulechain": "Створити новий ланцюг правил",
+ "rulechain-file": "Файл ланцюга правил",
+ "invalid-rulechain-file-error": "Неможливо імпортувати ланцюг правил: недійсна структуру даних ланцюга правил.",
+ "copyId": "Копіювати Id ланцюга правил",
+ "idCopiedMessage": "Id ланцюга правил скопійовано в буфер обміну",
+ "select-rulechain": "Вибрати ланцюг правил",
+ "no-rulechains-matching": "Не знайдено жодних ланцюгів правил, які відповідають '{{entity}}'.",
+ "rulechain-required": "Необхідно вказати ланцюг правил",
+ "management": "Управління ланцюгами правил",
+ "debug-mode": "Режим налагодження"
+ },
+ "rulenode": {
+ "details": "Деталі",
+ "events": "Події",
+ "search": "Пошук вузлів",
+ "open-node-library": "Відкрити бібліотеку вузлів",
+ "add": "Додати вузол правил",
+ "name": "Ім'я",
+ "name-required": "Необхідно вказати ім'я.",
+ "type": "Тип",
+ "description": "Опис",
+ "delete": "Видалити вузол правил",
+ "select-all-objects": "Вибрати усі вузли та з'єднання",
+ "deselect-all-objects": "Зняти виділення з усіх вузлів і з'єднань",
+ "delete-selected-objects": "Видалити вибрані вузли та з'єднання",
+ "delete-selected": "Видалити вибране",
+ "select-all": "Вибрати все",
+ "copy-selected": "Копіювати вибране",
+ "deselect-all": "Відмінити вибране",
+ "rulenode-details": "Деталі вузла правил",
+ "debug-mode": "Режим налагодження",
+ "configuration": "Конфігурація",
+ "link": "Посилання",
+ "link-details": "Деталі посилання про вузол правил",
+ "add-link": "Додати посилання",
+ "link-label": "Мітка посилання",
+ "link-label-required": "Необхідно вказати мітку посилання.",
+ "custom-link-label": "Мітка посилання користувача",
+ "custom-link-label-required": "Необхідно вказати мітку посилання користувача.",
+ "link-labels": "Мітки посилання",
+ "link-labels-required": "Необхідно вказати мітки посилання.",
+ "no-link-labels-found": "Не знайдено жодних міток посилання",
+ "no-link-label-matching": "Мітка'{{label}}' не знайдена.",
+ "create-new-link-label": "Створити нову!",
+ "type-filter": "Filter",
+ "type-filter-details": "Фільтрувати вхідні повідомлення з заданими умовами",
+ "type-enrichment": "Насичення",
+ "type-enrichment-details": "Додати додаткову інформацію до метаданих повідомлень",
+ "type-transformation": "Трансформація",
+ "type-transformation-details": "Змінити склад повідомлення та його метадані",
+ "type-action": "Дія",
+ "type-action-details": "Виконати задану дію",
+ "type-analytics": "Аналітика",
+ "type-analytics-details": "Виконати аналіз потокових або збережених даних",
+ "type-external": "Зовнішній",
+ "type-external-details": "Взаємодіє з зовнішньою системою",
+ "type-rule-chain": "Ланцюг правил",
+ "type-rule-chain-details": "Перенаправити вхідне повідомлення на вказаний ланцюг правил",
+ "type-input": "Вхід",
+ "type-input-details": "Логічний вхід ланцюга правил, перенаправляє вхідні повідомлення на наступний пов'язаний вузол правил",
+ "type-unknown": "Невідомий",
+ "type-unknown-details": "Невизначений вузол правил",
+ "directive-is-not-loaded": "Вказана директива конфігурації '{{directiveName}}' недоступна.",
+ "ui-resources-load-error": "Не вдалося завантажити UI ресурси.",
+ "invalid-target-rulechain": "Не вдається визначити цільовий ланцюг правил!",
+ "test-script-function": "Протестувати скрипт",
+ "message": "Повідомлення",
+ "message-type": "Тип повідомлення",
+ "select-message-type": "Вибрати тип повідомлення",
+ "message-type-required": "Необхідно вказати тип повідомлення",
+ "metadata": "Метадані",
+ "metadata-required": "Записи метаданих не можуть бути порожніми.",
+ "output": "Вихід",
+ "test": "Тест",
+ "help": "Допомога"
+ },
+ "scheduler": {
+ "scheduler": "Планувальник",
+ "scheduler-event": "Scheduler event Планування події. Запланувати подію. Подія планувальника",
+ "select-scheduler-event": "Виберати подію",
+ "no-scheduler-events-matching": "Не знайдено жодних подій, які відповідають '{{entity}}'.",
+ "scheduler-event-required": "Необхвдно вказати заплановану подію",
+ "management": "Управління планувальником",
+ "scheduler-events": "Планування подій",
+ "add-scheduler-event": "Додати подію",
+ "search-scheduler-events": "Пошук події",
+ "created-time": "Час створення",
+ "name": "Ім'я",
+ "type": "Тип",
+ "assigned_customer": "Призначений клієнт",
+ "edit-scheduler-event": "Редагувати подію",
+ "delete-scheduler-event": "Видалити подію",
+ "no-scheduler-events": "Не знайдено жодних запланованих подій",
+ "selected-scheduler-events": "{ count, plural, 1 {1 запланована подія} other {# заплановані події} } вибрано",
+ "delete-scheduler-event-title": "Ви впевнені, що хочете видалити подію '{{schedulerEventName}}'?",
+ "delete-scheduler-event-text": "Будьте обережні, після підтвердження подія і всі пов'язані з нею дані стануть недоступними.",
+ "delete-scheduler-events-title": "Ви впевнені, що хочете видалити { count, plural, 1 {1 запланована подія} other {# заплановані події} }?",
+ "delete-scheduler-events-text": "Будьте обережні, після підтвердження всі вибрані події будуть видалені, і всі пов'язані з ними дані стануть недоступними.",
+ "create": "Створити подію планувальника",
+ "edit": "Змінити подію планувальника",
+ "name-required": "Необхідно задати ім'я",
+ "configuration": "Конфігурація",
+ "schedule": "Розклад",
+ "start": "Початок",
+ "date": "Дата",
+ "time": "Час",
+ "repeat": "Повтор",
+ "repeats": "Повтори",
+ "daily": "Щодня",
+ "weekly": "Щотижня",
+ "repeats-required": "Потрібно вказати повторення.",
+ "repeat-on": "Повторити на",
+ "ends-on": "Завершити на",
+ "sunday-label": "Нд",
+ "monday-label": "Пн",
+ "tuesday-label": "Вт",
+ "wednesday-label": "Ср",
+ "thursday-label": "Чт",
+ "friday-label": "Пт",
+ "saturday-label": "Сб",
+ "repeat-on-sunday": "Повторити у неділю",
+ "repeat-on-monday": "Повторити в понеділок",
+ "repeat-on-tuesday": "Повторити у вівторок",
+ "repeat-on-wednesday": "Повторити в середу",
+ "repeat-on-thursday": "Повторити в червер",
+ "repeat-on-friday": "Повторити в п'ятницю",
+ "repeat-on-saturday": "Повторити в суботу",
+ "event-type": "Тип події",
+ "select-event-type": "Вибрати тип події",
+ "event-type-required": "Необхідно вказати типи події.",
+ "list-mode": "Перегляд списку",
+ "calendar-mode": "Перегляд календаря",
+ "calendar-view-type": "Тип перегляду календаря",
+ "month": "Місяць",
+ "week": "Тиждень",
+ "day": "День",
+ "agenda-week": "Порядок тижня",
+ "agenda-day": "Порялок дня",
+ "list-year": "Список року",
+ "list-month": "Список місяця",
+ "list-week": "Список тижня",
+ "list-day": "Список дня",
+ "today": "Сьогодні",
+ "navigate-before": "Перейти до",
+ "navigate-next": "Перейти далі",
+ "starting-from": "Починаючи з",
+ "until": "до",
+ "on": "на",
+ "sunday": "Неділя",
+ "monday": "Понеділок",
+ "tuesday": "Вівторок",
+ "wednesday": "Середа",
+ "thursday": "Четвер",
+ "friday": "П'ятниця",
+ "saturday": "Субота",
+ "originator": "Засновник",
+ "single-entity": "Самостійна сутність",
+ "group-of-entities": "Група сутностей",
+ "single-device": "Один пристрій",
+ "group-of-devices": "Група пристроїв",
+ "message-body": "Тіло повідомлення",
+ "target": "Ціль",
+ "rpc-method": "Метод",
+ "rpc-method-required": "Необхідно вказати метод",
+ "rpc-params": "Парами. Парні.",
+ "select-dashboard-state": "Виберіть стан панелі візуалізації"
+ },
+ "report": {
+ "report-config": "Конфігурація звіту",
+ "email-config": "Конфігурація електронної пошти",
+ "dashboard-state-param": "Значення параметра стану панелі візуалізації",
+ "base-url": "Базова URL-адреса",
+ "base-url-required": "Необхідно вказати базову URL-адресу.",
+ "use-dashboard-timewindow": "Використовуйте вікно часу на панелі інструментів",
+ "timewindow": "Вікно часу",
+ "name-pattern": "Шаблон імені звіту",
+ "name-pattern-required": "Необхідно задати шаблон назви звіту",
+ "type": "Report type",
+ "use-current-user-credentials": "Використовувати поточні авторизаційні дані користувача",
+ "customer-user-credentials": "Авторизаційні дані користувачів",
+ "customer-user-credentials-required": "Необхідно задати авторизаційні дані користувачів",
+ "generate-test-report": "Створити звіт про перевірку",
+ "send-email": "Відправити лист",
+ "from": "Від",
+ "from-required": "Необхідно вказати від кого.",
+ "to": "До",
+ "to-required": "Необхідно вказати до кого.",
+ "cc": "Cc",
+ "bcc": "Bcc",
+ "subject": "Тема",
+ "subject-required": "Необхідно вказати тему.",
+ "body": "Тіло",
+ "body-required": "Необідно вказати тіло."
+ },
+ "blob-entity": {
+ "blob-entity": "Blob сутності",
+ "select-blob-entity": "Вибрати blob сутності",
+ "no-blob-entities-matching": "Не знайдено жодних сутностей blob, які відповідають '{{entity}}'.",
+ "blob-entity-required": "Необхідно вказати blob сутності",
+ "files": "Файли",
+ "search": "Пошук файлів",
+ "clear-search": "Очистити пошук",
+ "no-blob-entities-prompt": "Файлів не знайдено",
+ "report": "Звіт",
+ "created-time": "Створено час",
+ "name": "Ім'я",
+ "type": "Тип",
+ "assigned_customer": "Призначений клієнт",
+ "download-blob-entity": "Завантажити файл",
+ "delete-blob-entity": "Видалити файл",
+ "delete-blob-entity-title": "Ви впевнені, що хочете видалити файл '{{blobEntityName}}'?",
+ "delete-blob-entity-text": "Будьте обережні, після підствердження, дані файлу стануть недоступними."
+ },
+ "timezone": {
+ "timezone": "Часовий пояс",
+ "select-timezone": "Виберати часовий пояс ",
+ "no-timezones-matching": "Не знайдено жодних часових поясів, які відповідають '{{timezone}}'.",
+ "timezone-required": "Необхідно вказати часовий пояс."
+ },
+ "tenant": {
+ "tenant": "Власник",
+ "tenants": "Власники",
+ "management": "Управління власниками",
+ "add": "Додати власника",
+ "admins": "Адміністратори",
+ "manage-tenant-admins": "Керування адміністраторами власника",
+ "delete": "Видалити власника",
+ "add-tenant-text": "Додати нового власника",
+ "no-tenants-text": "Не знайдено жодного власника",
+ "tenant-details": "Подробиці про власника",
+ "delete-tenant-title": "Ви впевнені, що хочете видалити власника'{{tenantTitle}}'?",
+ "delete-tenant-text": "Будьте обережні, після підтвердження власник і всі пов'язані з ним дані стануть недоступними.",
+ "delete-tenants-title": "Ви впевнені, що хочете видалити { count, plural, 1 {1 власник} other {# власники} }?",
+ "delete-tenants-action-title": "Видалити { count, plural, 1 {1 власник} other {# власники} }",
+ "delete-tenants-text": "Будьте обережні, після підтвердження, усі вибрані власники будуть видалені, і всі пов'язані з ними дані стануть недоступними.",
+ "title": "Назва",
+ "title-required": "Необхідно вказати назву.",
+ "description": "Опис",
+ "details": "Деталі",
+ "events": "Події",
+ "copyId": "Крпіювати Id власника",
+ "idCopiedMessage": "Id власника скопійовано в буфер обміну",
+ "select-tenant": "Вибрати власника",
+ "no-tenants-matching": "Не знайдено жодних власників, які відповідають '{{entity}}'.",
+ "tenant-required": "Необхідно вказати власника",
+ "selected-tenants": "{ count, plural, 1 {1 власник} other {# власники} } вибрано",
+ "search": "Пошук власників"
+ },
+ "timeinterval": {
+ "seconds-interval": "{ seconds, plural, 1 {1 секунда} other {# секунди} }",
+ "minutes-interval": "{ minutes, plural, 1 {1 хвилина} other {# хвилини} }",
+ "hours-interval": "{ hours, plural, 1 {1 година} other {# години} }",
+ "days-interval": "{ days, plural, 1 {1 день} other {# дні} }",
+ "days": "Дні",
+ "hours": "Години",
+ "minutes": "Хвилини",
+ "seconds": "Секунди",
+ "advanced": "Додатково"
+ },
+ "timewindow": {
+ "days": "{ days, plural, 1 { день } other {# дні } }",
+ "hours": "{ hours, plural, 0 { годин } 1 {1 година } other {# години } }",
+ "minutes": "{ minutes, plural, 0 { хвилин } 1 {1 хвилина } other {# хвилини } }",
+ "seconds": "{ seconds, plural, 0 { секунд } 1 {1 секунда } other {# секунди } }",
+ "realtime": "Реальний час",
+ "history": "Історія",
+ "last-prefix": "Останнє",
+ "period": "з {{ startTime }} до {{ endTime }}",
+ "edit": "Редагувати вікно часу",
+ "date-range": "Проміжок часу",
+ "last": "Останнє",
+ "time-period": "Період часу"
+ },
+ "user": {
+ "user": "Користувач",
+ "users": "Користувачі",
+ "customer-users": "Користувачі клієнта",
+ "tenant-admins": "Адміністратори власників",
+ "sys-admin": "Системний адміністратор",
+ "tenant-admin": "Адміністратор власника",
+ "customer": "Клієнт",
+ "anonymous": "Анонім",
+ "add": "Додати користувача",
+ "delete": "Видалити користувача",
+ "add-user-text": "Додати нового користувача",
+ "no-users-text": "Не знайдено жодного користувача",
+ "user-details": "Подробиці про користувача",
+ "delete-user-title": "Ви впевнені, що хочете видалити користувача'{{userEmail}}'?",
+ "delete-user-text": "Будьте обережні, після підтвердження, користувач і всі пов'язані з ним дані стануть недоступними.",
+ "delete-users-title": "Ви впевнені, що хочете видалити { count, plural, 1 {1 користувача} other {# користувачів} }?",
+ "delete-users-action-title": "Видалити { count, plural, 1 {1 користувача} other {# користувачів} }",
+ "delete-users-text": "Будьте обережні, після підтвердження, усіх виділених користувачів буде видалено, і всі пов'язані з ними дані стануть недоступними.",
+ "activation-email-sent-message": "Повідомлення про активацію успішно надіслано!",
+ "resend-activation": "Повторно надіслати активацію",
+ "email": "Електронна пошта",
+ "email-required": "Необхідно вказати електронну пошту.",
+ "invalid-email-format": "Недійсний формат електронної пошти.",
+ "first-name": "Ім'я",
+ "last-name": "Прізвище",
+ "description": "Опис",
+ "default-dashboard": "Стандартна панель візуалізації",
+ "always-fullscreen": "Завжди в повноекранному режимі",
+ "select-user": "Вибрати користувача",
+ "no-users-matching": "Не знайдено жодного користувача, що відповідає '{{entity}}'.",
+ "user-required": "Необхідно вказати користувача",
+ "activation-method": "Спосіб активації",
+ "display-activation-link": "Показати посилання для активації",
+ "send-activation-mail": "Надіслати активаційного листа",
+ "activation-link": "Активаційне посилання для користувача",
+ "activation-link-text": "Для активувації користувача, скористайтеся наступним activation link :",
+ "copy-activation-link": "Скопіювати активаційне посилання ",
+ "activation-link-copied-message": "Посилання на активацію користувача було скопійовано в буфер обміну",
+ "selected-users": "{ count, plural, 1 {1 користувач} other {# користувачі} } вибрано",
+ "search": "Пошук користувачів",
+ "details": "Подробиці",
+ "login-as-tenant-admin": "Увійти як адміністратор власника",
+ "login-as-customer-user": "Увійти як користувач клієнта"
+ },
+ "value": {
+ "type": "Тип значення",
+ "string": "Рядок",
+ "string-value": "Значення рядка",
+ "integer": "Ціле",
+ "integer-value": "Ціле значення",
+ "invalid-integer-value": "Недійсне ціле значення",
+ "double": "Подвійне",
+ "double-value": "Подвійне значення",
+ "boolean": "Логічне",
+ "boolean-value": "Логічне значення",
+ "false": "Помилкове",
+ "true": "Правдиве",
+ "long": "Довге"
+ },
+ "widget": {
+ "widget-library": "Бібліотека віджетів",
+ "widget-bundle": "Пакет віджетів",
+ "select-widgets-bundle": "Виберіть пакет віджетів",
+ "management": "Керування віджетами",
+ "editor": "Редактор віджетів",
+ "widget-type-not-found": "Помилка завантаження конфігурації віджетів.
Можливо, пов'язаний з нею\n тип віджета було видалено.",
+ "widget-type-load-error": "Віджет не вдалося завантажити з наступних причин:",
+ "remove": "Видалити віджет",
+ "edit": "Відредагувати віджет",
+ "remove-widget-title": "Ви впевнені, що хочете видалити віджет '{{widgetTitle}}'?",
+ "remove-widget-text": "Після підтвердження віджет і всі пов'язані з ним дані стануть недоступними.",
+ "timeseries": "Телеметрія",
+ "search-data": "Пошук даних",
+ "no-data-found": "Даних не знайдено",
+ "latest-values": "Останні значення",
+ "rpc": "Керуючий віджет",
+ "alarm": "Віджет сигнала тривоги",
+ "static": "Статичний віджет",
+ "select-widget-type": "Вибрати тип віджета",
+ "missing-widget-title-error": "Необхідно вказати назву віджета!",
+ "widget-saved": "Віджет збережено",
+ "unable-to-save-widget-error": "Неможливо зберегти віджет! Віджет має помилки!",
+ "save": "Зберегти віджет",
+ "saveAs": "Зберегти віджет як",
+ "save-widget-type-as": "Зберегти тип віджета як",
+ "save-widget-type-as-text": "Введіть новий заголовок віджета та / або виберіть цільові віджети",
+ "toggle-fullscreen": "Перейти в повноекранний режим",
+ "run": "Запустити віджет",
+ "title": "Назва віджета",
+ "title-required": "Необхідно вказати назву віджета.",
+ "type": "Тип віджета",
+ "resources": "Ресурси",
+ "resource-url": "JavaScript/CSS URL",
+ "remove-resource": "Видалити ресурс",
+ "add-resource": "Додати ресурс",
+ "html": "HTML",
+ "tidy": "Форматувати",
+ "css": "CSS",
+ "settings-schema": "Схема налаштувань",
+ "datakey-settings-schema": "Схема налаштувань ключів даних",
+ "javascript": "Javascript",
+ "remove-widget-type-title": "Ви впевнені, що хочете видалити тип віджета '{{widgetName}}'?",
+ "remove-widget-type-text": "Будьте обережні, після підтвердження, тип віджета і всі пов'язані з ним дані стануть недоступними.",
+ "remove-widget-type": "Видалити тип віджета",
+ "add-widget-type": "Додати новий тип віджета",
+ "widget-type-load-failed-error": "Не вдалося завантажити тип віджета!",
+ "widget-template-load-failed-error": "Не вдалося завантажити шаблон віджета!",
+ "add": "Додати віджет",
+ "undo": "Скасувати зміни віджета",
+ "export": "Експртувати віджет",
+ "export-data": "Експортувати дані віджетів",
+ "export-to-csv": "Експортувати дані в CSV...",
+ "export-to-excel": "Експортувати дані в XLS..."
+ },
+ "widget-action": {
+ "header-button": "Кнопка заголовка віджета",
+ "open-dashboard-state": "Перейти до нового стану панелі візуалізації",
+ "update-dashboard-state": "Оновити поточний стан панелі візуалізації",
+ "open-dashboard": "Перейти до іншої панелі візуалізації",
+ "custom": "Дії користувачів",
+ "target-dashboard-state": "Цільовий стан панелі візуалізації",
+ "target-dashboard-state-required": "Необхідно вказати цільовий стан панелі візуалізації",
+ "set-entity-from-widget": "Встановити сутність із віджета",
+ "target-dashboard": "Цільова панель візуалізації",
+ "open-right-layout": "Відкрити мобільний режим панелі візуалізації"
+ },
+ "widgets-bundle": {
+ "current": "Поточний зв'язок",
+ "widgets-bundles": "Пакети віджетів",
+ "add": "Додати пакет віджетів",
+ "delete": "Видалити пакет віджетів",
+ "title": "Назва",
+ "title-required": "Необхідно вказати назву віджета.",
+ "add-widgets-bundle-text": "Додати новий пакет віджетів",
+ "no-widgets-bundles-text": "Не знайдено жодних пакетів віджетів",
+ "empty": "Пакет віджетів порожній",
+ "details": "Подробиці",
+ "widgets-bundle-details": "Деталі пакетів віджетів",
+ "delete-widgets-bundle-title": "Ви впевнені, що хочете видалити пакет віджетів '{{widgetsBundleTitle}}'?",
+ "delete-widgets-bundle-text": "Будьте обережні, після підтвердження, пакети віджетів і всі пов'язані з ними дані стануть недоступними.",
+ "delete-widgets-bundles-title": "Ви впевнені, що хочете видалити { count, plural, 1 {пакет віджетів} other {# пакети віджетів} }?",
+ "delete-widgets-bundles-action-title": "Видалити { count, plural, 1 {1 пакет віджетів} other {# пакет віджетів} }",
+ "delete-widgets-bundles-text": "Будьте обережні, після підтвердження, всі виділені пакети віджетів і всі пов'язані з ними дані стануть недоступними.",
+ "no-widgets-bundles-matching": "Не знайдено жодних пакетів віджетів, які відповідають '{{widgetsBundle}}'.",
+ "widgets-bundle-required": "Необхідно вказати пакет віджетів.",
+ "system": "Системний",
+ "import": "Імпортувати пакет віджетів",
+ "export": "Експортувати пакет віджетів",
+ "export-failed-error": "Неможливо експортувати пакет віджетів: {{error}}",
+ "create-new-widgets-bundle": "Створити новий пакет віджетів",
+ "widgets-bundle-file": "Файл набору віджетів",
+ "invalid-widgets-bundle-file-error": "Неможливо імпортувати пакет віджетів: недійсна структура даних пакету віджетів."
+ },
+ "widget-config": {
+ "data": "Дані",
+ "settings": "Налаштування",
+ "advanced": "Додатково",
+ "title": "Назва",
+ "general-settings": "Загальні налаштування",
+ "display-title": "Відобразити назву",
+ "drop-shadow": "Тінь",
+ "enable-fullscreen": "Увімкнути повноекранний режим",
+ "enable-data-export": "Увімкнути експорт даних",
+ "background-color": "Колір фону",
+ "text-color": "Колір тексту",
+ "padding": "Відступ",
+ "margin": "Границі",
+ "widget-style": "Стиль віджетів",
+ "title-style": "Стиль заголовка",
+ "mobile-mode-settings": "Налаштування мобільного режиму",
+ "order": "Порядок",
+ "height": "Висота",
+ "units": "Спеціальний символ після значення",
+ "decimals": "Кількість цифр після коми",
+ "timewindow": "Вікно часу",
+ "use-dashboard-timewindow": "Використати вікно часу на панелі візуалізації",
+ "display-legend": "Показати легенду",
+ "datasources": "Джерела даних",
+ "maximum-datasources": "Максимально { count, plural, 1 {1 дозволене джерело даних.} other {# дозволені джерела даних } }",
+ "datasource-type": "Тип",
+ "datasource-parameters": "Параметри",
+ "remove-datasource": "Видалити джерело даних",
+ "add-datasource": "Додати джерело даних",
+ "target-device": "Цільовий пристрій",
+ "alarm-source": "Джерело сигнала тривоги",
+ "actions": "Дії",
+ "action": "Дія",
+ "add-action": "Додати дію",
+ "search-actions": "Пошук дії",
+ "action-source": "Джерело дії",
+ "action-source-required": "Необхідно вказати джерело дії.",
+ "action-name": "Ім'я дії",
+ "action-name-required": "Необхідно вказати ім'я дії.",
+ "action-name-not-unique": "Дія з такою назвою вже існує.
Назва дії має бути унікальною в межах одного джерела дії.",
+ "action-icon": "Іконка",
+ "action-type": "Тип",
+ "action-type-required": "Необхідно вказати тип дії.",
+ "edit-action": "Редагувати дію",
+ "delete-action": "Видалити дію",
+ "delete-action-title": "Видалити дію віджета",
+ "delete-action-text": "Ви впевнені, що хочете видалити дію віджета '{{actionName}}'?"
+ },
+ "widget-type": {
+ "import": "Імпортувати тип віджета",
+ "export": "Експортувати тип віджета",
+ "export-failed-error": "Неможливо експортувати тип віджета: {{error}}",
+ "create-new-widget-type": "Створити новий тип віджета",
+ "widget-type-file": "Файл типу віджета",
+ "invalid-widget-type-file-error": "Неможливо імпортувати тип віджету: неправильна структура даних типу віджета."
+ },
+ "white-labeling": {
+ "white-labeling": "Білий маркування",
+ "login-white-labeling": "Login White Labeling",
+ "preview": "Попередній перегляд",
+ "app-title": "Назва програми",
+ "favicon": "Іконка веб-сайту",
+ "favicon-description": "*.ico, *.gif or *.png image with maximum size {{kbSize}} KBytes.",
+ "favicon-size-error": "Зображення веб-сайту завелике. Максимально дозволений розмір зображення веб-сайту {{kbSize}} KBytes.",
+ "favicon-type-error": "Недійсний формат файлу зображення веб-сайту. Приймаються лише зображення ICO, GIF або PNG.",
+ "drop-favicon-image": "Зніміть зображення піктограми веб-сайту або клацніть, щоб вибрати файл для завантаження.",
+ "no-favicon-image": "Не вибрано жодної іконки",
+ "logo": "Логотип",
+ "logo-description": "Будь-яке зображення з максимальним розміром {{kbSize}} KBytes.",
+ "logo-size-error": "Зображення логотипу занадто велике. Максимально дозволений розмір зображення логотипу{{kbSize}} KBytes.",
+ "logo-type-error": "Недійсний формат файлу логотипу. Приймаються тільки зображення.",
+ "drop-logo-image": "Зніміть зображення логотипу або клацніть, щоб вибрати файл для завантаження.",
+ "no-logo-image": "Не вибрано жожного логотипу",
+ "logo-height": "Висота логотипу, px",
+ "primary-palette": "Основна палітра",
+ "accent-palette": "Палітра акцент",
+ "customize-palette": "Налаштування",
+ "edit-palette": "Редагувати палітру",
+ "save-palette": "Зберегти палітру",
+ "primary-background": "Первинний фон",
+ "secondary-background": "Вторинний фон",
+ "hue1": "HUE 1",
+ "hue2": "HUE 2",
+ "hue3": "HUE 3",
+ "page-background-color": "Колір фону сторінки",
+ "dark-foreground": "Темний передній план",
+ "domain-name": "Доменне ім'я"
+ },
+ "icon": {
+ "icon": "веб-іконка",
+ "select-icon": "Виберіть веб-іконку",
+ "material-icons": "Матеріал веб-іконки",
+ "show-all": "Показати всі веб-іконки"
+ },
+ "custom": {
+ "widget-action": {
+ "action-cell-button": "Кнопка дії клітинки",
+ "row-click": "Клацніть на рядок",
+ "marker-click": "Клацніть на маркер",
+ "tooltip-tag-action": "Дії при підказці"
+ }
+ },
+ "language": {
+ "language": "Мова",
+ "locales": {
+ "fr_FR": "Французька",
+ "zh_CN": "Китайська",
+ "en_US": "Англійська",
+ "it_IT": "Італійська",
+ "ko_KR": "Корейська",
+ "ru_RU": "Російська",
+ "es_ES": "Іспанська",
+ "ja_JA": "Японська",
+ "tr_TR": "Турецька",
+ "de_DE": "Німецька",
+ "uk_UA": "Українська",
+ "fa_IR": "Перська"
+ }
+ }
+}
diff --git a/ui/src/app/locale/locale.constant-zh_CN.json b/ui/src/app/locale/locale.constant-zh_CN.json
index eaf810c986..836908de60 100644
--- a/ui/src/app/locale/locale.constant-zh_CN.json
+++ b/ui/src/app/locale/locale.constant-zh_CN.json
@@ -589,11 +589,11 @@
"manage-credentials": "管理凭据",
"delete": "删除设备",
"assign-devices": "分配设备",
- "assign-devices-text": "将{count,select,1 {1 设备} other {# 设备}}分配给客户",
+ "assign-devices-text": "将{count,plural,1 {1 设备} other {# 设备}}分配给客户",
"delete-devices": "删除设备",
"unassign-from-customer": "取消分配客户",
"unassign-devices": "取消分配设备",
- "unassign-devices-action-title": "从客户处取消分配{count,select,1 {1 设备} other {# 设备}}",
+ "unassign-devices-action-title": "从客户处取消分配{count,plural,1 {1 设备} other {# 设备}}",
"assign-new-device": "分配新设备",
"make-public-device-title": "您确定要将设备 '{{deviceName}}' 设为公开吗?",
"make-public-device-text": "确认后,设备及其所有数据将被设为公开并可被其他人访问。",
@@ -602,13 +602,13 @@
"view-credentials": "查看凭据",
"delete-device-title": "您确定要删除设备的{{deviceName}}吗?",
"delete-device-text": "小心!确认后设备及其所有相关数据将不可恢复。",
- "delete-devices-title": "您确定要删除{count,select,1 {1 设备} other {# 设备}} 吗?",
- "delete-devices-action-title": "删除 {count,select,1 {1 设备} other {# 设备}}",
+ "delete-devices-title": "您确定要删除{count,plural,1 {1 设备} other {# 设备}} 吗?",
+ "delete-devices-action-title": "删除 {count,plural,1 {1 设备} other {# 设备}}",
"delete-devices-text": "小心!确认后所有选定的设备将被删除,所有相关数据将不可恢复。",
"unassign-device-title": "您确定要取消分配设备 '{{deviceName}}'?",
"unassign-device-text": "确认后,设备将被取消分配,客户将无法访问。",
"unassign-device": "取消分配设备",
- "unassign-devices-title": "您确定要取消分配{count,select,1 {1 设备} other {# 设备}} 吗?",
+ "unassign-devices-title": "您确定要取消分配{count,plural,1 {1 设备} other {# 设备}} 吗?",
"unassign-devices-text": "确认后,所有选定的设备将被取消分配,并且客户将无法访问。",
"device-credentials": "设备凭据",
"credentials-type": "凭据类型",
@@ -1176,7 +1176,7 @@
"tenant-details": "租客详情",
"delete-tenant-title": "您确定要删除租户'{{tenantTitle}}'吗?",
"delete-tenant-text": "小心!确认后,租户和所有相关数据将不可恢复。",
- "delete-tenants-title": "您确定要删除 {count,select,1 {1 租户} other {# 租户}} 吗?",
+ "delete-tenants-title": "您确定要删除 {count,plural,1 {1 租户} other {# 租户}} 吗?",
"delete-tenants-action-title": "删除 { count, plural, 1 {1 租户} other {# 租户} }",
"delete-tenants-text": "小心!确认后,所有选定的租户将被删除,所有相关数据将不可恢复。",
"title": "标题",
@@ -1418,6 +1418,65 @@
"widget-type-file": "部件类型文件",
"invalid-widget-type-file-error": "无法导入部件类型:无效的部件类型数据结构。"
},
+ "widgets": {
+ "date-range-navigator": {
+ "localizationMap": {
+ "Sun": "周日",
+ "Mon": "周一",
+ "Tue": "周二",
+ "Wed": "周三",
+ "Thu": "周四",
+ "Fri": "周五",
+ "Sat": "周六",
+ "Jan": "1月",
+ "Feb": "2月",
+ "Mar": "3月",
+ "Apr": "4月",
+ "May": "5月",
+ "Jun": "6月",
+ "Jul": "7月",
+ "Aug": "8月",
+ "Sep": "9月",
+ "Oct": "10月",
+ "Nov": "11月",
+ "Dec": "12月",
+ "January": "一月",
+ "February": "二月",
+ "March": "游行",
+ "April": "四月",
+ "June": "六月",
+ "July": "七月",
+ "August": "八月",
+ "September": "九月",
+ "October": "十月",
+ "November": "十一月",
+ "December": "十二月",
+ "Custom Date Range": "自定义日期范围",
+ "Date Range Template": "日期范围模板",
+ "Today": "今天",
+ "Yesterday": "昨天",
+ "This Week": "本星期",
+ "Last Week": "上个星期",
+ "This Month": "这个月",
+ "Last Month": "上个月",
+ "Year": "年",
+ "This Year": "今年",
+ "Last Year": "去年",
+ "Date picker": "日期选择器",
+ "Hour": "小时",
+ "Day": "天",
+ "Week": "周",
+ "2 weeks": "2周",
+ "Month": "月",
+ "3 months": "3个月",
+ "6 months": "6个月",
+ "Custom interval": "自定义间隔",
+ "Interval": "间隔",
+ "Step size": "一步的大小",
+ "Ok": "Ok"
+ }
+ }
+ },
"icon": {
"icon": "图标",
"select-icon": "选择图标",
@@ -1446,7 +1505,8 @@
"it_IT": "意大利",
"ja_JA": "日本",
"tr_TR": "土耳其",
- "fa_IR": "波斯语"
+ "fa_IR": "波斯语",
+ "uk_UA": "乌克兰"
}
}
}
\ No newline at end of file
diff --git a/ui/src/app/locale/translate-handler.js b/ui/src/app/locale/translate-handler.js
index a3e76a9c9b..21d80ec327 100644
--- a/ui/src/app/locale/translate-handler.js
+++ b/ui/src/app/locale/translate-handler.js
@@ -18,12 +18,12 @@
.name;
/*@ngInject*/
-function ThingsboardMissingTranslateHandler($log, types) {
+function ThingsboardMissingTranslateHandler(/*$log, types*/) {
- return function (translationId) {
- if (translationId && !translationId.startsWith(types.translate.customTranslationsPrefix)) {
+ return function (/*translationId*/) {
+ /*if (translationId && !translationId.startsWith(types.translate.customTranslationsPrefix)) {
$log.warn('Translation for ' + translationId + ' doesn\'t exist');
- }
+ }*/
};
}
\ No newline at end of file
diff --git a/ui/src/app/rulechain/rulechain.controller.js b/ui/src/app/rulechain/rulechain.controller.js
index 3744b63198..195dcffef5 100644
--- a/ui/src/app/rulechain/rulechain.controller.js
+++ b/ui/src/app/rulechain/rulechain.controller.js
@@ -108,6 +108,9 @@ export function RuleChainController($state, $scope, $compile, $q, $mdUtil, $time
vm.objectsSelected = objectsSelected;
vm.deleteSelected = deleteSelected;
+ vm.isDebugModeEnabled = isDebugModeEnabled;
+ vm.resetDebugModeInAllNodes = resetDebugModeInAllNodes;
+
vm.triggerResize = triggerResize;
vm.openRuleChainContextMenu = openRuleChainContextMenu;
@@ -1342,6 +1345,19 @@ export function RuleChainController($state, $scope, $compile, $q, $mdUtil, $time
vm.modelservice.deleteSelected();
}
+ function isDebugModeEnabled() {
+ var res = $filter('filter')(vm.ruleChainModel.nodes, {debugMode: true});
+ return (res && res.length);
+ }
+
+ function resetDebugModeInAllNodes() {
+ vm.ruleChainModel.nodes.forEach((node) => {
+ if (node.component.type != types.ruleNodeType.INPUT.value && node.component.type != types.ruleNodeType.RULE_CHAIN.value) {
+ node.debugMode = false;
+ }
+ });
+ }
+
function triggerResize() {
var w = angular.element($window);
w.triggerHandler('resize');
diff --git a/ui/src/app/rulechain/rulechain.tpl.html b/ui/src/app/rulechain/rulechain.tpl.html
index 80425e59c8..4a20947497 100644
--- a/ui/src/app/rulechain/rulechain.tpl.html
+++ b/ui/src/app/rulechain/rulechain.tpl.html
@@ -223,6 +223,15 @@
+